[
  {
    "path": ".clang-format",
    "content": "BasedOnStyle: Google\nDerivePointerAlignment: false\n"
  },
  {
    "path": ".github/workflows/build.yml",
    "content": "name: build\n\non:\n  workflow_dispatch:\n  push:\n  pull_request:\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v2\n    - name: set up JDK 21\n      uses: actions/setup-java@v1\n      with:\n        java-version: 21\n\n    - uses: pre-commit/action@v3.0.0\n\n    - name: Setup Android SDK\n      uses: android-actions/setup-android@v3\n      with:\n        packages: \"cmake;4.1.0\"\n\n    - name: build samples\n      run: |\n        ./gradlew build\n"
  },
  {
    "path": ".gitignore",
    "content": ".gradle\n.idea\n**/*.iml\nlocal.properties\nbuild\n*~\n.externalNativeBuild\nlibwebp\n.DS_Store\n**/ndkHelperBin\n**/.cxx\ndisplay-p3/third_party\n\n"
  },
  {
    "path": ".google/packaging.yaml",
    "content": "status: PUBLISHED\ntechnologies:\n  - Android\n  - NDK\n  - Platform\ncategories:\n  - NDK\nlanguages:\n  - C++\nsolutions:\n  - Mobile\ngithub: android/ndk-samples\nlicense: apache2\n"
  },
  {
    "path": ".pre-commit-config.yaml",
    "content": "repos:\n-   repo: https://github.com/pre-commit/pre-commit-hooks\n    rev: v4.4.0\n    hooks:\n    -   id: check-xml\n    -   id: check-yaml\n"
  },
  {
    "path": "ARCHITECTURE.md",
    "content": "# Architecture\n\nThis document describes the layout of the samples repository.\n\nThe top level directory is a Gradle project. This directory can be opened in\nAndroid Studio (and that will be the easiest way to work with the samples).\n\n## Directory structure\n\n### Samples\n\nMost subdirectories are the individual sample apps. These can't be opened in\nAndroid Studio individually, as they rely on common code from the top level\nproject. These subdirectories have their own `build.gradle` (the Groovy DSL) or\n`build.gradle.kts` (the Kotlin DSL) files. In Gradle terms these are \"projects\".\nAndroid Studio calls them \"modules\". The documentation in this repository will\ntypically call them \"modules\".\n\nEach sample has its own README.md that explains what features it demonstrates,\nas well as any unique requirements.\n\nTo run a sample, use the configuration selector in the top panel of Android\nStudio to select the sample and then click run. For example, to run the\nendless-tunnel sample game:\n\n![Select and run a sample][docs/run-sample.png]\n\n#### Build types\n\nAndroid Gradle modules have multiple \"build types\", sometimes called \"variants\".\nFor most of the samples, there are only two build types: debug and release. A\nfew samples, notably the sanitizers sample, have more. To view the build types\nfor the modules in this repository, in the Android Studio application menu,\nselect View -> Tool Windows -> Build Variants. A window will open that lets you\nselect the active variant for each sample.\n\n### build-logic\n\nThe `build-logic` directory contains Gradle convention plugins used by this\nrepository. This is where Gradle policy decisions that apply to the whole\nrepository are made.\n\nSee the README.md in that directory for more details.\n\n### docs\n\nDocumentation and supporting artifacts for this repository. Yes, for now it's\njust images for the READMEs and this doc.\n\n### gradle/libs.versions.toml\n\nThis is a Gradle [version catalog]. It's the central location that defines the\nlibrary and plugin dependencies for each sample.\n\nThe Android Gradle Plugin does not support evaluating version catalog fields in\nits DSL, so versions for SDK and NDK tools (`ndkVersion`, `compileSdkVersion`,\n`targetSdkVersion`, etc) are all defined by the convention plugins in\n[build-logic](#build-logic).\n\n[version catalog]: https://docs.gradle.org/current/userguide/platforms.html\n\n### Gradle wrapper\n\nThe `gradlew` and `gradlew.bat` scripts are the Gradle wrappers, macOS/Linux-\nand Windows batch-compatible respectively. They will manage the Gradle\ninstallation used by this repository for you, ensuring that the correct versions\nand environment are used. These should be used instead of running `gradle`\ndirectly.\n\n`gradle/wrapper/gradle-wrapper.properties` defines which version of Gradle will\nbe used. This should rarely be modified manually. Android Studio's Upgrade\nAssistant will manage that file and upgrade to whatever version of Gradle it\nprefers for that version of Android Studio and Android Gradle.\n\n### build.gradle and settings.gradle\n\nThe build.gradle (or build.gradle.kts) file is the top level build file. It\ndoesn't do anything interesting but declares which plugins will be used by the\nchild modules. Each sample's module has its own build.gradle file that defines\nproperties of the app.\n\nThe settings.gradle (or settings.gradle.kts) file configures repositories for\nfetching dependencies, and declares each app module.\n\n### Metadata directories\n\n#### .github\n\nThis directory contains GitHub metadata files, such as GitHub Action workflows\nand Issue templates.\n\n#### .google\n\nThe `packaging.yaml` file in this directory is used by Android Studio to enable\nthe File -> New -> Import Sample feature. As this repository is a monolithic\nsample project, it should not need to be changed.\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# How to become a contributor and submit your own code\n\n## Contributor License Agreements\n\nWe'd love to accept your sample apps and patches! Before we can take them, we\nhave to jump a couple of legal hurdles.\n\nPlease fill out either the individual or corporate Contributor License Agreement\n(CLA).\n\n- If you are an individual writing original source code and you're sure you own\n  the intellectual property, then you'll need to sign an\n  [individual CLA](http://code.google.com/legal/individual-cla-v1.0.html).\n- If you work for a company that wants to allow you to contribute your work,\n  then you'll need to sign a\n  [corporate CLA](http://code.google.com/legal/corporate-cla-v1.0.html).\n\nFollow either of the two links above to access the appropriate CLA and\ninstructions for how to sign and return it. Once we receive it, we'll be able to\naccept your pull requests.\n\n## Contributing a Patch\n\n1. Sign a Contributor License Agreement, if you have not yet done so (see\n   details above).\n1. Create your change to the repo in question.\n   - Fork the desired repo, develop and test your code changes.\n   - Ensure that your code is clear and comprehensible.\n   - Ensure that your code has an appropriate set of unit tests which all pass.\n1. Submit a pull request.\n1. The repo owner will review your request. If it is approved, the change will\n   be merged. If it needs additional work, the repo owner will respond with\n   useful comments.\n"
  },
  {
    "path": "LICENSE",
    "content": "Apache License\nVersion 2.0, January 2004\nhttp://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n\"License\" shall mean the terms and conditions for use, reproduction, and\ndistribution as defined by Sections 1 through 9 of this document.\n\n\"Licensor\" shall mean the copyright owner or entity authorized by the copyright\nowner that is granting the License.\n\n\"Legal Entity\" shall mean the union of the acting entity and all other entities\nthat control, are controlled by, or are under common control with that entity.\nFor the purposes of this definition, \"control\" means (i) the power, direct or\nindirect, to cause the direction or management of such entity, whether by\ncontract or otherwise, or (ii) ownership of fifty percent (50%) or more of the\noutstanding shares, or (iii) beneficial ownership of such entity.\n\n\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising\npermissions granted by this License.\n\n\"Source\" form shall mean the preferred form for making modifications, including\nbut not limited to software source code, documentation source, and configuration\nfiles.\n\n\"Object\" form shall mean any form resulting from mechanical transformation or\ntranslation of a Source form, including but not limited to compiled object code,\ngenerated documentation, and conversions to other media types.\n\n\"Work\" shall mean the work of authorship, whether in Source or Object form, made\navailable under the License, as indicated by a copyright notice that is included\nin or attached to the work (an example is provided in the Appendix below).\n\n\"Derivative Works\" shall mean any work, whether in Source or Object form, that\nis based on (or derived from) the Work and for which the editorial revisions,\nannotations, elaborations, or other modifications represent, as a whole, an\noriginal work of authorship. For the purposes of this License, Derivative Works\nshall not include works that remain separable from, or merely link (or bind by\nname) to the interfaces of, the Work and Derivative Works thereof.\n\n\"Contribution\" shall mean any work of authorship, including the original version\nof the Work and any modifications or additions to that Work or Derivative Works\nthereof, that is intentionally submitted to Licensor for inclusion in the Work\nby the copyright owner or by an individual or Legal Entity authorized to submit\non behalf of the copyright owner. For the purposes of this definition,\n\"submitted\" means any form of electronic, verbal, or written communication sent\nto the Licensor or its representatives, including but not limited to\ncommunication on electronic mailing lists, source code control systems, and\nissue tracking systems that are managed by, or on behalf of, the Licensor for\nthe purpose of discussing and improving the Work, but excluding communication\nthat is conspicuously marked or otherwise designated in writing by the copyright\nowner as \"Not a Contribution.\"\n\n\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf\nof whom a Contribution has been received by Licensor and subsequently\nincorporated within the Work.\n\n2. Grant of Copyright License.\n\nSubject to the terms and conditions of this License, each Contributor hereby\ngrants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\nirrevocable copyright license to reproduce, prepare Derivative Works of,\npublicly display, publicly perform, sublicense, and distribute the Work and such\nDerivative Works in Source or Object form.\n\n3. Grant of Patent License.\n\nSubject to the terms and conditions of this License, each Contributor hereby\ngrants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\nirrevocable (except as stated in this section) patent license to make, have\nmade, use, offer to sell, sell, import, and otherwise transfer the Work, where\nsuch license applies only to those patent claims licensable by such Contributor\nthat are necessarily infringed by their Contribution(s) alone or by combination\nof their Contribution(s) with the Work to which such Contribution(s) was\nsubmitted. If You institute patent litigation against any entity (including a\ncross-claim or counterclaim in a lawsuit) alleging that the Work or a\nContribution incorporated within the Work constitutes direct or contributory\npatent infringement, then any patent licenses granted to You under this License\nfor that Work shall terminate as of the date such litigation is filed.\n\n4. Redistribution.\n\nYou may reproduce and distribute copies of the Work or Derivative Works thereof\nin any medium, with or without modifications, and in Source or Object form,\nprovided that You meet the following conditions:\n\nYou must give any other recipients of the Work or Derivative Works a copy of\nthis License; and\nYou must cause any modified files to carry prominent notices stating that You\nchanged the files; and\nYou must retain, in the Source form of any Derivative Works that You distribute,\nall copyright, patent, trademark, and attribution notices from the Source form\nof the Work, excluding those notices that do not pertain to any part of the\nDerivative Works; and\nIf the Work includes a \"NOTICE\" text file as part of its distribution, then any\nDerivative Works that You distribute must include a readable copy of the\nattribution notices contained within such NOTICE file, excluding those notices\nthat do not pertain to any part of the Derivative Works, in at least one of the\nfollowing places: within a NOTICE text file distributed as part of the\nDerivative Works; within the Source form or documentation, if provided along\nwith the Derivative Works; or, within a display generated by the Derivative\nWorks, if and wherever such third-party notices normally appear. The contents of\nthe NOTICE file are for informational purposes only and do not modify the\nLicense. You may add Your own attribution notices within Derivative Works that\nYou distribute, alongside or as an addendum to the NOTICE text from the Work,\nprovided that such additional attribution notices cannot be construed as\nmodifying the License.\nYou may add Your own copyright statement to Your modifications and may provide\nadditional or different license terms and conditions for use, reproduction, or\ndistribution of Your modifications, or for any such Derivative Works as a whole,\nprovided Your use, reproduction, and distribution of the Work otherwise complies\nwith the conditions stated in this License.\n\n5. Submission of Contributions.\n\nUnless You explicitly state otherwise, any Contribution intentionally submitted\nfor inclusion in the Work by You to the Licensor shall be under the terms and\nconditions of this License, without any additional terms or conditions.\nNotwithstanding the above, nothing herein shall supersede or modify the terms of\nany separate license agreement you may have executed with Licensor regarding\nsuch Contributions.\n\n6. Trademarks.\n\nThis License does not grant permission to use the trade names, trademarks,\nservice marks, or product names of the Licensor, except as required for\nreasonable and customary use in describing the origin of the Work and\nreproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty.\n\nUnless required by applicable law or agreed to in writing, Licensor provides the\nWork (and each Contributor provides its Contributions) on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,\nincluding, without limitation, any warranties or conditions of TITLE,\nNON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are\nsolely responsible for determining the appropriateness of using or\nredistributing the Work and assume any risks associated with Your exercise of\npermissions under this License.\n\n8. Limitation of Liability.\n\nIn no event and under no legal theory, whether in tort (including negligence),\ncontract, or otherwise, unless required by applicable law (such as deliberate\nand grossly negligent acts) or agreed to in writing, shall any Contributor be\nliable to You for damages, including any direct, indirect, special, incidental,\nor consequential damages of any character arising as a result of this License or\nout of the use or inability to use the Work (including but not limited to\ndamages for loss of goodwill, work stoppage, computer failure or malfunction, or\nany and all other commercial damages or losses), even if such Contributor has\nbeen advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability.\n\nWhile redistributing the Work or Derivative Works thereof, You may choose to\noffer, and charge a fee for, acceptance of support, warranty, indemnity, or\nother liability obligations and/or rights consistent with this License. However,\nin accepting such obligations, You may act only on Your own behalf and on Your\nsole responsibility, not on behalf of any other Contributor, and only if You\nagree to indemnify, defend, and hold each Contributor harmless for any liability\nincurred by, or claims asserted against, such Contributor by reason of your\naccepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work\n\nTo apply the Apache License to your work, attach the following boilerplate\nnotice, with the fields enclosed by brackets \"[]\" replaced with your own\nidentifying information. (Don't include the brackets!) The text should be\nenclosed in the appropriate comment syntax for the file format. We also\nrecommend that a file or class name and description of purpose be included on\nthe same \"printed page\" as the copyright notice for easier identification within\nthird-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n     http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License."
  },
  {
    "path": "README.md",
    "content": "# Android NDK Samples\n\nThis repository contains sample apps that use the [Android NDK].\n\nFor an explanation of the layout of this repository, see\n[ARCHITECTURE.md](ARCHITECTURE.md).\n\n## Build and run\n\n[![build](https://github.com/android/ndk-samples/actions/workflows/build.yml/badge.svg)](https://github.com/android/ndk-samples/actions)\n\n1. Clone the repository\n2. Open the whole project in Android Studio\n3. Install CMake 4.1.0 via the SDK Manager (must be done manually until\n   https://issuetracker.google.com/443137057 is fixed).\n4. Select the sample you want to run in the top bar (you may need to sync gradle\n   first)\n5. Click the play button to run the sample\n\nYou can also build the samples from the command line if you prefer. Use\n`./gradlew build` to build everything (if you're on Windows, use `.\\gradlew.bat`\ninstead of `./gradlew`). For individual tasks, see `./gradlew tasks`. To see the\ntasks for an individual sample, run the `tasks` task for that directory. For\nexample, `./gradlew :camera:basic:tasks` will show the tasks for the\n`camera/basic` app.\n\n## I just want something to copy from as a starting point\n\nThe samples in this repository are generally not a good starting point for a\nproduction quality app. They aim to demonstrate individual NDK APIs, but often\nmake sacrifices to be succinct that make them unsuitable for a production app.\nThis is gradually changing, but for now you should not do this.\n\n[Now in Android](https://github.com/android/nowinandroid/) is an excellent\nresource for production quality apps in general, but does not touch on NDK-\nspecific issues. https://github.com/DanAlbert/ndk-app-template can help some\nwith that until this repository is able to.\n\nYou're most likely best served by using the New Project wizard in Android Studio\nto create a new app, then using those resources and the samples here as a\nreference. Android Studio's \"Native C++\" template is a good starting point for\ntypical applications that need to use some C++ via JNI. The \"Game Activity\"\ntemplate is a good starting point for game-like apps (that is, apps that do not\nuse the Android UI, but instead render their own UI using OpenGL or Vulkan).\n\n## Best practices shown here\n\nThere are a few best practices shown throughout this repository that should be\nexplained, but there's no central place to discuss those in the code, so we'll\ndiscuss those here.\n\n### `RegisterNatives`\n\nWe prefer using `RegisterNatives()` via `JNI_OnLoad()` over the name-based\nmatching that Studio's New Project Wizard will typically create, e.g. JNI\nfunctions that follow the pattern `JNIEXPORT void JNICALL\nJava_com_etc_ClassName_methodName()`. That approach to matching C/C++ functions\nto their Java `native` function (or Kotlin `external fun`) makes for a shorter\ndemo when there are only a small number of functions, but it has a number of\ndisadvantages. See the [JNI tips] guide for details.\n\n[JNI tips]: https://developer.android.com/ndk/guides/jni-tips#native-libraries\n\n### Version scripts\n\nAll of the app libraries shown here are built using a version script. This is a\nfile that explicitly lists which symbols should be exported from the library,\nand hides all the others. Version scripts function similarly to\n`-fvisibility=hidden`, but can go a step further and are capable of hiding\nsymbols in static libraries that are used by your app. Hiding as many symbols as\npossible results in smaller binaries that load faster, as there are fewer\nrelocations required and LTO can do a better job. They also run faster as\nsame-library function calls do not need to be made through the PLT. There are no\ngood reasons to not use a version script for your NDK code. See the NDK\ndocumentation on [controlling symbol visibility] for more information.\n\nYou can find these in each sample as the `lib<name>.map.txt` file (where\n`<name>` is the name of the library passed to `add_app_library()` in the\n`CMakeLists.txt` file). The build plumbing that uses the version scripts is in\nthe definition of `add_app_library()` in `cmake/AppLibrary.cmake`.\n\n[controlling symbol visibility]: https://developer.android.com/ndk/guides/symbol-visibility\n\n## Additional documentation\n\n- [Add Native Code to Your Project](https://developer.android.com/studio/projects/add-native-code.html)\n- [Configure NDK for Android Studio/Gradle Plugin](https://developer.android.com/studio/projects/configure-agp-ndk)\n- [CMake for NDK](https://developer.android.com/ndk/guides/cmake.html)\n\n## Support\n\nIf you've found an issue with a sample and you know how to fix it, please\n[send us a PR!](CONTRIBUTING.md).\n\nIf you need to report a bug, where it needs to be filed depends on the type of\nissue:\n\n- Problems with the samples themselves:\n  https://github.com/googlesamples/android-ndk/issues\n- Problems with the OS APIs: http://b.android.com (usually the Framework\n  component)\n- Problems with NDK (that is, the compiler):\n  https://github.com/android/ndk/issues\n\nFor questions about using the NDK or the platform APIs, you can ask on:\n\n- [The NDK mailing list](https://groups.google.com/g/android-ndk) (best if\n  you're not sure where else to ask)\n- The [Discussions](https://github.com/android/ndk-samples/discussions) tab of\n  this repo (best for questions about the samples themselves)\n- The NDK's [Discussions](https://github.com/android/ndk/discussions) (best for\n  questions about the NDK compilers and build systems)\n- [Stack Overflow](https://stackoverflow.com/questions/tagged/android)\n\n## Additional NDK samples:\n\n- [Google Play Game Samples with Android Studio](https://github.com/playgameservices/cpp-android-basic-samples)\n- [Google Android Vulkan Tutorials](https://github.com/googlesamples/android-vulkan-tutorials)\n- [Android Vulkan API Basic Samples](https://github.com/googlesamples/vulkan-basic-samples)\n- [Android High Performance Audio](https://github.com/googlesamples/android-audio-high-performance)\n\n## License\n\nCopyright 2015 The Android Open Source Project, Inc.\n\nLicensed to the Apache Software Foundation (ASF) under one or more contributor\nlicense agreements. See the NOTICE file distributed with this work for\nadditional information regarding copyright ownership. The ASF licenses this file\nto you under the Apache License, Version 2.0 (the \"License\"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at\n\nhttps://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed\nunder the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\nCONDITIONS OF ANY KIND, either express or implied. See the License for the\nspecific language governing permissions and limitations under the License.\n\n[LICENSE](LICENSE)\n\n[Android NDK]: https://developer.android.com/ndk\n"
  },
  {
    "path": "REFERENCE.md",
    "content": "Android Studio/Gradle DSL References\n\n| Name           | Function            | Type | Options      | Default |\n| -------------- | ------------------- | :--: | ------------ | ------- |\n| debuggable     | Debugging Java code | bool | true / false |         |\n| ndk.debuggable | Debugging JNI code  | bool | true / false |         |\n\nNotation: dot(\".\") notation is same as closure (\"{}\") notation\n"
  },
  {
    "path": "audio-echo/README.md",
    "content": "# Sample removed\n\nThis sample has been removed because the API it demonstrated (OpenSLES) is\ndeprecated. New apps should instead use [Oboe], which has its own samples.\n\n[Oboe]: https://github.com/google/oboe\n"
  },
  {
    "path": "base/.gitignore",
    "content": "/build"
  },
  {
    "path": "base/build.gradle.kts",
    "content": "plugins {\n    id(\"ndksamples.android.library\")\n}\n\nandroid {\n    namespace = \"com.android.ndk.samples.base\"\n\n    externalNativeBuild {\n        cmake {\n            path = file(\"src/main/cpp/CMakeLists.txt\")\n        }\n    }\n\n    buildFeatures {\n        prefabPublishing = true\n    }\n\n    prefab {\n        create(\"base\") {\n            headers = \"src/main/cpp/include\"\n        }\n    }\n}\n\ndependencies {\n\n    implementation(libs.appcompat)\n    implementation(libs.material)\n    testImplementation(libs.junit)\n    androidTestImplementation(libs.ext.junit)\n    androidTestImplementation(libs.espresso.core)\n}"
  },
  {
    "path": "base/src/main/cpp/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.22.1)\nproject(Base LANGUAGES CXX)\n\ninclude(AppLibrary)\n\nadd_app_library(base\n    STATIC\n    logging.cpp\n)\n\ntarget_compile_features(base PRIVATE cxx_std_23)\ntarget_compile_options(base PRIVATE -Wno-vla-cxx-extension)\ntarget_include_directories(base PUBLIC include)\ntarget_link_libraries(base PUBLIC log)\n"
  },
  {
    "path": "base/src/main/cpp/include/base/errno_restorer.h",
    "content": "/*\n * Copyright (C) 2020 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#pragma once\n\n#include <errno.h>\n\nnamespace ndksamples::base {\n\nclass ErrnoRestorer {\n public:\n  ErrnoRestorer() : saved_errno_(errno) {}\n  ErrnoRestorer(const ErrnoRestorer&) = delete;\n\n  ~ErrnoRestorer() { errno = saved_errno_; }\n\n  ErrnoRestorer& operator=(const ErrnoRestorer&) = delete;\n\n  // Allow this object to be used as part of && operation.\n  explicit operator bool() const { return true; }\n\n private:\n  const int saved_errno_;\n};\n\n}  // namespace ndksamples::base\n"
  },
  {
    "path": "base/src/main/cpp/include/base/logging.h",
    "content": "/*\n * Copyright (C) 2015 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#pragma once\n\n/**\n * @file logging.h\n * @brief Logging and assertion utilities.\n *\n * This is a modified version of AOSP's android-base/logging.h:\n * https://cs.android.com/android/platform/superproject/main/+/main:system/libbase/include/android-base/logging.h\n *\n * The original file contained a lot of dependencies for things we don't need\n * (kernel logging, support for non-Android platforms, non-logd loggers, etc).\n * That's all been removed so we don't need to pull in those dependencies.\n *\n * If you copy from this sample, you may want to replace this with something\n * like absl, which provides a very similar (if not identical) interface for all\n * platforms. absl was not used here because we didn't need much, and it was\n * preferable to avoid an additional dependency.\n */\n\n//\n// Google-style C++ logging.\n//\n\n// This header provides a C++ stream interface to logging.\n//\n// To log:\n//\n//   LOG(INFO) << \"Some text; \" << some_value;\n//\n// Replace `INFO` with any severity from `enum LogSeverity`.\n// Most devices filter out VERBOSE logs by default, run\n// `adb shell setprop log.tag.<TAG> V` to see them in adb logcat.\n//\n// To log the result of a failed function and include the string\n// representation of `errno` at the end:\n//\n//   PLOG(ERROR) << \"Write failed\";\n//\n// The output will be something like `Write failed: I/O error`.\n// Remember this as 'P' as in perror(3).\n//\n// To output your own types, simply implement operator<< as normal.\n//\n// By default, output goes to logcat on Android and stderr on the host.\n// A process can use `SetLogger` to decide where all logging goes.\n// Implementations are provided for logcat, stderr, and dmesg.\n//\n// By default, the process' name is used as the log tag.\n// Code can choose a specific log tag by defining LOG_TAG\n// before including this header.\n\n// This header also provides assertions:\n//\n//   CHECK(must_be_true);\n//   CHECK_EQ(a, b) << z_is_interesting_too;\n\n#include <base/errno_restorer.h>\n#include <base/macros.h>\n\n#include <functional>\n#include <memory>\n#include <optional>\n#include <ostream>\n#include <string_view>\n\n// Note: DO NOT USE DIRECTLY. Use LOG_TAG instead.\n#ifdef _LOG_TAG_INTERNAL\n#error \"_LOG_TAG_INTERNAL must not be defined\"\n#endif\n#ifdef LOG_TAG\n#define _LOG_TAG_INTERNAL LOG_TAG\n#else\n#define _LOG_TAG_INTERNAL nullptr\n#endif\n\nnamespace ndksamples::base {\n\nenum LogSeverity {\n  VERBOSE,\n  DEBUG,\n  INFO,\n  WARNING,\n  ERROR,\n  FATAL_WITHOUT_ABORT,  // For loggability tests, this is considered identical\n                        // to FATAL.\n  FATAL,\n};\n\nenum LogId {\n  DEFAULT,\n  MAIN,\n  SYSTEM,\n  RADIO,\n  CRASH,\n};\n\nusing LogFunction = std::function<void(\n    LogId /*log_buffer_id*/, LogSeverity /*severity*/, const char* /*tag*/,\n    const char* /*file*/, unsigned int /*line*/, const char* /*message*/)>;\nusing AbortFunction = std::function<void(const char* /*abort_message*/)>;\n\nvoid DefaultAborter(const char* abort_message);\n\nvoid SetDefaultTag(const std::string& tag);\n\n// The LogdLogger sends chunks of up to ~4000 bytes at a time to logd.  It does\n// not prevent other threads from writing to logd between sending each chunk, so\n// other threads may interleave their messages.  If preventing interleaving is\n// required, then a custom logger that takes a lock before calling this logger\n// should be provided.\nclass LogdLogger {\n public:\n  explicit LogdLogger(LogId default_log_id = ndksamples::base::MAIN);\n\n  void operator()(LogId, LogSeverity, const char* tag, const char* file,\n                  unsigned int line, const char* message);\n\n private:\n  LogId default_log_id_;\n};\n\n// Configure logging based on ANDROID_LOG_TAGS environment variable.\n// We need to parse a string that looks like\n//\n//      *:v jdwp:d dalvikvm:d dalvikvm-gc:i dalvikvmi:i\n//\n// The tag (or '*' for the global level) comes first, followed by a colon and a\n// letter indicating the minimum priority level we're expected to log.  This can\n// be used to reveal or conceal logs with specific tags.\n#define INIT_LOGGING_DEFAULT_LOGGER LogdLogger()\nvoid InitLogging(const std::optional<std::string_view> default_tag = {},\n                 std::optional<LogSeverity> log_level = {},\n                 LogFunction&& logger = INIT_LOGGING_DEFAULT_LOGGER,\n                 AbortFunction&& aborter = DefaultAborter);\n#undef INIT_LOGGING_DEFAULT_LOGGER\n\n// Replace the current logger and return the old one.\nLogFunction SetLogger(LogFunction&& logger);\n\n// Replace the current aborter and return the old one.\nAbortFunction SetAborter(AbortFunction&& aborter);\n\n// A helper macro that produces an expression that accepts both a qualified name\n// and an unqualified name for a LogSeverity, and returns a LogSeverity value.\n// Note: DO NOT USE DIRECTLY. This is an implementation detail.\n#define SEVERITY_LAMBDA(severity)                  \\\n  ([&]() {                                         \\\n    using ::ndksamples::base::VERBOSE;             \\\n    using ::ndksamples::base::DEBUG;               \\\n    using ::ndksamples::base::INFO;                \\\n    using ::ndksamples::base::WARNING;             \\\n    using ::ndksamples::base::ERROR;               \\\n    using ::ndksamples::base::FATAL_WITHOUT_ABORT; \\\n    using ::ndksamples::base::FATAL;               \\\n    return (severity);                             \\\n  }())\n\n#define ABORT_AFTER_LOG_FATAL\n#define ABORT_AFTER_LOG_EXPR_IF(c, x) (x)\n#define MUST_LOG_MESSAGE(severity) false\n#define ABORT_AFTER_LOG_FATAL_EXPR(x) ABORT_AFTER_LOG_EXPR_IF(true, x)\n\n// Defines whether the given severity will be logged or silently swallowed.\n#define WOULD_LOG(severity)                                          \\\n  (UNLIKELY(::ndksamples::base::ShouldLog(SEVERITY_LAMBDA(severity), \\\n                                          _LOG_TAG_INTERNAL)) ||     \\\n   MUST_LOG_MESSAGE(severity))\n\n// Get an ostream that can be used for logging at the given severity and to the\n// default destination.\n//\n// Notes:\n// 1) This will not check whether the severity is high enough. One should use\n// WOULD_LOG to filter\n//    usage manually.\n// 2) This does not save and restore errno.\n#define LOG_STREAM(severity)                                                \\\n  ::ndksamples::base::LogMessage(                                           \\\n      __FILE__, __LINE__, SEVERITY_LAMBDA(severity), _LOG_TAG_INTERNAL, -1) \\\n      .stream()\n\n// Logs a message to logcat on Android otherwise to stderr. If the severity is\n// FATAL it also causes an abort. For example:\n//\n//     LOG(FATAL) << \"We didn't expect to reach here\";\n#define LOG(severity) LOGGING_PREAMBLE(severity) && LOG_STREAM(severity)\n\n// Checks if we want to log something, and sets up appropriate RAII objects if\n// so.\n// Note: DO NOT USE DIRECTLY. This is an implementation detail.\n#define LOGGING_PREAMBLE(severity)                                        \\\n  (WOULD_LOG(severity) &&                                                 \\\n   ABORT_AFTER_LOG_EXPR_IF(                                               \\\n       (SEVERITY_LAMBDA(severity)) == ::ndksamples::base::FATAL, true) && \\\n   ::ndksamples::base::ErrnoRestorer())\n\n// A variant of LOG that also logs the current errno value. To be used when\n// library calls fail.\n#define PLOG(severity)                                          \\\n  LOGGING_PREAMBLE(severity) &&                                 \\\n      ::ndksamples::base::LogMessage(__FILE__, __LINE__,        \\\n                                     SEVERITY_LAMBDA(severity), \\\n                                     _LOG_TAG_INTERNAL, errno)  \\\n          .stream()\n\n// Marker that code is yet to be implemented.\n#define UNIMPLEMENTED(level) \\\n  LOG(level) << __PRETTY_FUNCTION__ << \" unimplemented \"\n\n// Check whether condition x holds and LOG(FATAL) if not. The value of the\n// expression x is only evaluated once. Extra logging can be appended using <<\n// after. For example:\n//\n//     CHECK(false == true) results in a log message of\n//       \"Check failed: false == true\".\n#define CHECK(x)                                                \\\n  LIKELY((x)) || ABORT_AFTER_LOG_FATAL_EXPR(false) ||           \\\n      ::ndksamples::base::LogMessage(__FILE__, __LINE__,        \\\n                                     ::ndksamples::base::FATAL, \\\n                                     _LOG_TAG_INTERNAL, -1)     \\\n              .stream()                                         \\\n          << \"Check failed: \" #x << \" \"\n\n// clang-format off\n// Helper for CHECK_xx(x,y) macros.\n#define CHECK_OP(LHS, RHS, OP)                                                                   \\\n  for (auto _values = ::ndksamples::base::MakeEagerEvaluator(LHS, RHS);                             \\\n       UNLIKELY(!(_values.lhs.v OP _values.rhs.v));                                              \\\n       /* empty */)                                                                              \\\n  ABORT_AFTER_LOG_FATAL                                                                          \\\n  ::ndksamples::base::LogMessage(__FILE__, __LINE__, ::ndksamples::base::FATAL, _LOG_TAG_INTERNAL, -1) \\\n          .stream()                                                                              \\\n      << \"Check failed: \" << #LHS << \" \" << #OP << \" \" << #RHS << \" (\" #LHS \"=\"                  \\\n      << ::ndksamples::base::LogNullGuard<decltype(_values.lhs.v)>::Guard(_values.lhs.v)            \\\n      << \", \" #RHS \"=\"                                                                           \\\n      << ::ndksamples::base::LogNullGuard<decltype(_values.rhs.v)>::Guard(_values.rhs.v)            \\\n      << \") \"\n// clang-format on\n\n// Check whether a condition holds between x and y, LOG(FATAL) if not. The value\n// of the expressions x and y is evaluated once. Extra logging can be appended\n// using << after. For example:\n//\n//     CHECK_NE(0 == 1, false) results in\n//       \"Check failed: false != false (0==1=false, false=false) \".\n#define CHECK_EQ(x, y) CHECK_OP(x, y, ==)\n#define CHECK_NE(x, y) CHECK_OP(x, y, !=)\n#define CHECK_LE(x, y) CHECK_OP(x, y, <=)\n#define CHECK_LT(x, y) CHECK_OP(x, y, <)\n#define CHECK_GE(x, y) CHECK_OP(x, y, >=)\n#define CHECK_GT(x, y) CHECK_OP(x, y, >)\n\n// clang-format off\n// Helper for CHECK_STRxx(s1,s2) macros.\n#define CHECK_STROP(s1, s2, sense)                                             \\\n  while (UNLIKELY((strcmp(s1, s2) == 0) != (sense)))                           \\\n    ABORT_AFTER_LOG_FATAL                                                      \\\n    ::ndksamples::base::LogMessage(__FILE__, __LINE__,  ::ndksamples::base::FATAL,   \\\n                                 _LOG_TAG_INTERNAL, -1)                        \\\n        .stream()                                                              \\\n        << \"Check failed: \" << \"\\\"\" << (s1) << \"\\\"\"                            \\\n        << ((sense) ? \" == \" : \" != \") << \"\\\"\" << (s2) << \"\\\"\"\n// clang-format on\n\n// Check for string (const char*) equality between s1 and s2, LOG(FATAL) if not.\n#define CHECK_STREQ(s1, s2) CHECK_STROP(s1, s2, true)\n#define CHECK_STRNE(s1, s2) CHECK_STROP(s1, s2, false)\n\n// Perform the pthread function call(args), LOG(FATAL) on error.\n#define CHECK_PTHREAD_CALL(call, args, what)            \\\n  do {                                                  \\\n    int rc = call args;                                 \\\n    if (rc != 0) {                                      \\\n      errno = rc;                                       \\\n      ABORT_AFTER_LOG_FATAL                             \\\n      PLOG(FATAL) << #call << \" failed for \" << (what); \\\n    }                                                   \\\n  } while (false)\n\n// DCHECKs are debug variants of CHECKs only enabled in debug builds. Generally\n// CHECK should be used unless profiling identifies a CHECK as being in\n// performance critical code.\n#if defined(NDEBUG) && !defined(__clang_analyzer__)\nstatic constexpr bool kEnableDChecks = false;\n#else\nstatic constexpr bool kEnableDChecks = true;\n#endif\n\n#define DCHECK(x) \\\n  if (::ndksamples::base::kEnableDChecks) CHECK(x)\n#define DCHECK_EQ(x, y) \\\n  if (::ndksamples::base::kEnableDChecks) CHECK_EQ(x, y)\n#define DCHECK_NE(x, y) \\\n  if (::ndksamples::base::kEnableDChecks) CHECK_NE(x, y)\n#define DCHECK_LE(x, y) \\\n  if (::ndksamples::base::kEnableDChecks) CHECK_LE(x, y)\n#define DCHECK_LT(x, y) \\\n  if (::ndksamples::base::kEnableDChecks) CHECK_LT(x, y)\n#define DCHECK_GE(x, y) \\\n  if (::ndksamples::base::kEnableDChecks) CHECK_GE(x, y)\n#define DCHECK_GT(x, y) \\\n  if (::ndksamples::base::kEnableDChecks) CHECK_GT(x, y)\n#define DCHECK_STREQ(s1, s2) \\\n  if (::ndksamples::base::kEnableDChecks) CHECK_STREQ(s1, s2)\n#define DCHECK_STRNE(s1, s2) \\\n  if (::ndksamples::base::kEnableDChecks) CHECK_STRNE(s1, s2)\n\nnamespace log_detail {\n\n// Temporary storage for a single eagerly evaluated check expression operand.\ntemplate <typename T>\nstruct Storage {\n  template <typename U>\n  explicit constexpr Storage(U&& u) : v(std::forward<U>(u)) {}\n  explicit Storage(const Storage& t) = delete;\n  explicit Storage(Storage&& t) = delete;\n  T v;\n};\n\n// Partial specialization for smart pointers to avoid copying.\ntemplate <typename T>\nstruct Storage<std::unique_ptr<T>> {\n  explicit constexpr Storage(const std::unique_ptr<T>& ptr) : v(ptr.get()) {}\n  const T* v;\n};\ntemplate <typename T>\nstruct Storage<std::shared_ptr<T>> {\n  explicit constexpr Storage(const std::shared_ptr<T>& ptr) : v(ptr.get()) {}\n  const T* v;\n};\n\n// Type trait that checks if a type is a (potentially const) char pointer.\ntemplate <typename T>\nstruct IsCharPointer {\n  using Pointee = std::remove_cv_t<std::remove_pointer_t<T>>;\n  static constexpr bool value =\n      std::is_pointer_v<T> &&\n      (std::is_same_v<Pointee, char> || std::is_same_v<Pointee, signed char> ||\n       std::is_same_v<Pointee, unsigned char>);\n};\n\n// Counterpart to Storage that depends on both operands. This is used to prevent\n// char pointers being treated as strings in the log output - they might point\n// to buffers of unprintable binary data.\ntemplate <typename LHS, typename RHS>\nstruct StorageTypes {\n  static constexpr bool voidptr =\n      IsCharPointer<LHS>::value && IsCharPointer<RHS>::value;\n  using LHSType = std::conditional_t<voidptr, const void*, LHS>;\n  using RHSType = std::conditional_t<voidptr, const void*, RHS>;\n};\n\n// Temporary class created to evaluate the LHS and RHS, used with\n// MakeEagerEvaluator to infer the types of LHS and RHS.\ntemplate <typename LHS, typename RHS>\nstruct EagerEvaluator {\n  template <typename A, typename B>\n  constexpr EagerEvaluator(A&& l, B&& r)\n      : lhs(std::forward<A>(l)), rhs(std::forward<B>(r)) {}\n  const Storage<typename StorageTypes<LHS, RHS>::LHSType> lhs;\n  const Storage<typename StorageTypes<LHS, RHS>::RHSType> rhs;\n};\n\n}  // namespace log_detail\n\n// Converts std::nullptr_t and null char pointers to the string \"null\"\n// when writing the failure message.\ntemplate <typename T>\nstruct LogNullGuard {\n  static const T& Guard(const T& v) { return v; }\n};\ntemplate <>\nstruct LogNullGuard<std::nullptr_t> {\n  static const char* Guard(const std::nullptr_t&) { return \"(null)\"; }\n};\ntemplate <>\nstruct LogNullGuard<char*> {\n  static const char* Guard(const char* v) { return v ? v : \"(null)\"; }\n};\ntemplate <>\nstruct LogNullGuard<const char*> {\n  static const char* Guard(const char* v) { return v ? v : \"(null)\"; }\n};\n\n// Helper function for CHECK_xx.\ntemplate <typename LHS, typename RHS>\nconstexpr auto MakeEagerEvaluator(LHS&& lhs, RHS&& rhs) {\n  return log_detail::EagerEvaluator<std::decay_t<LHS>, std::decay_t<RHS>>(\n      std::forward<LHS>(lhs), std::forward<RHS>(rhs));\n}\n\n// Data for the log message, not stored in LogMessage to avoid increasing the\n// stack size.\nclass LogMessageData;\n\n// A LogMessage is a temporarily scoped object used by LOG and the unlikely part\n// of a CHECK. The destructor will abort if the severity is FATAL.\nclass LogMessage {\n public:\n  // LogId has been deprecated, but this constructor must exist for prebuilts.\n  LogMessage(const char* file, unsigned int line, LogId, LogSeverity severity,\n             const char* tag, int error);\n  LogMessage(const char* file, unsigned int line, LogSeverity severity,\n             const char* tag, int error);\n\n  DISALLOW_COPY_AND_ASSIGN(LogMessage);\n\n  ~LogMessage();\n\n  // Returns the stream associated with the message, the LogMessage performs\n  // output when it goes out of scope.\n  std::ostream& stream();\n\n  // The routine that performs the actual logging.\n  static void LogLine(const char* file, unsigned int line, LogSeverity severity,\n                      const char* tag, const char* msg);\n\n private:\n  const std::unique_ptr<LogMessageData> data_;\n};\n\n// Get the minimum severity level for logging.\nLogSeverity GetMinimumLogSeverity();\n\n// Set the minimum severity level for logging, returning the old severity.\nLogSeverity SetMinimumLogSeverity(LogSeverity new_severity);\n\n// Return whether or not a log message with the associated tag should be logged.\nbool ShouldLog(LogSeverity severity, const char* tag);\n\n// Allows to temporarily change the minimum severity level for logging.\nclass ScopedLogSeverity {\n public:\n  explicit ScopedLogSeverity(LogSeverity level);\n  ~ScopedLogSeverity();\n\n private:\n  LogSeverity old_;\n};\n\n}  // namespace ndksamples::base\n\nnamespace std {  // NOLINT(cert-dcl58-cpp)\n\n// Emit a warning of ostream<< with std::string*. The intention was most likely\n// to print *string.\n//\n// Note: for this to work, we need to have this in a namespace.\n// Note: using a pragma because \"-Wgcc-compat\" (included in \"-Weverything\")\n// complains about\n//       diagnose_if.\n// Note: to print the pointer, use \"<< static_cast<const void*>(string_pointer)\"\n// instead. Note: a not-recommended alternative is to let Clang ignore the\n// warning by adding\n//       -Wno-user-defined-warnings to CPPFLAGS.\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wgcc-compat\"\n#define OSTREAM_STRING_POINTER_USAGE_WARNING \\\n  __attribute__((                            \\\n      diagnose_if(true, \"Unexpected logging of string pointer\", \"warning\")))\ninline OSTREAM_STRING_POINTER_USAGE_WARNING std::ostream& operator<<(\n    std::ostream& stream, const std::string* string_pointer) {\n  return stream << static_cast<const void*>(string_pointer);\n}\n#pragma clang diagnostic pop\n\n}  // namespace std\n"
  },
  {
    "path": "base/src/main/cpp/include/base/macros.h",
    "content": "/*\n * Copyright (C) 2015 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#pragma once\n\n#include <stddef.h>  // for size_t\n\n#include <utility>\n\n// A macro to disallow the copy constructor and operator= functions\n// This must be placed in the private: declarations for a class.\n//\n// For disallowing only assign or copy, delete the relevant operator or\n// constructor, for example:\n// void operator=(const TypeName&) = delete;\n// Note, that most uses of DISALLOW_ASSIGN and DISALLOW_COPY are broken\n// semantically, one should either use disallow both or neither. Try to\n// avoid these in new code.\n#define DISALLOW_COPY_AND_ASSIGN(TypeName) \\\n  TypeName(const TypeName&) = delete;      \\\n  void operator=(const TypeName&) = delete\n\n// A macro to disallow all the implicit constructors, namely the\n// default constructor, copy constructor and operator= functions.\n//\n// This should be used in the private: declarations for a class\n// that wants to prevent anyone from instantiating it. This is\n// especially useful for classes containing only static methods.\n#define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \\\n  TypeName() = delete;                           \\\n  DISALLOW_COPY_AND_ASSIGN(TypeName)\n\n// The arraysize(arr) macro returns the # of elements in an array arr.\n// The expression is a compile-time constant, and therefore can be\n// used in defining new arrays, for example.  If you use arraysize on\n// a pointer by mistake, you will get a compile-time error.\n//\n// One caveat is that arraysize() doesn't accept any array of an\n// anonymous type or a type defined inside a function.  In these rare\n// cases, you have to use the unsafe ARRAYSIZE_UNSAFE() macro below.  This is\n// due to a limitation in C++'s template system.  The limitation might\n// eventually be removed, but it hasn't happened yet.\n\n// This template function declaration is used in defining arraysize.\n// Note that the function doesn't need an implementation, as we only\n// use its type.\ntemplate <typename T, size_t N>\nchar (&ArraySizeHelper(T (&array)[N]))[N];  // NOLINT(readability/casting)\n\n#define arraysize(array) (sizeof(ArraySizeHelper(array)))\n\n#define SIZEOF_MEMBER(t, f) sizeof(std::declval<t>().f)\n\n// Changing this definition will cause you a lot of pain.  A majority of\n// vendor code defines LIKELY and UNLIKELY this way, and includes\n// this header through an indirect path.\n#define LIKELY(exp) (__builtin_expect((exp) != 0, true))\n#define UNLIKELY(exp) (__builtin_expect((exp) != 0, false))\n\n/// True if the (runtime) version of the OS is at least x.\n///\n/// Clang is very particular about how __builtin_available is used. Logical\n/// operations (including negation) may not be combined with\n/// __builtin_available, so to negate this check you must do:\n///\n///     if (API_AT_LEAST(x)) {\n///     } else {\n///       // do negated stuff\n///     }\n#define API_AT_LEAST(x) __builtin_available(android x, *)\n\n/// Marks a function as not callable on OS versions older than x.\n///\n/// This is a minor abuse of Clang's __attribute__((availability)), so the\n/// diagnostic for this will be a little odd, but it allows us to extract\n/// functions from code that already has an API_AT_LEAST guard without rewriting\n/// the guard in every called function.\n#define REQUIRES_API(x) __INTRODUCED_IN(x)\n"
  },
  {
    "path": "base/src/main/cpp/logging.cpp",
    "content": "/*\n * Copyright (C) 2015 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"base/logging.h\"\n\n#include <android/log.h>\n#include <android/set_abort_message.h>\n#include <fcntl.h>\n#include <inttypes.h>\n#include <libgen.h>\n#include <stdlib.h>\n#include <time.h>\n\n#include <atomic>\n#include <iostream>\n#include <limits>\n#include <mutex>\n#include <optional>\n#include <sstream>\n#include <string>\n#include <string_view>\n#include <utility>\n#include <vector>\n\n#include \"base/macros.h\"\n#include \"logging_splitters.h\"\n\nnamespace ndksamples::base {\n\nstatic const char* GetFileBasename(const char* file) {\n  // We can't use basename(3) even on Unix because the Mac doesn't\n  // have a non-modifying basename.\n  const char* last_slash = strrchr(file, '/');\n  if (last_slash != nullptr) {\n    return last_slash + 1;\n  }\n  return file;\n}\n\nstatic int32_t LogIdTolog_id_t(LogId log_id) {\n  switch (log_id) {\n    case MAIN:\n      return LOG_ID_MAIN;\n    case SYSTEM:\n      return LOG_ID_SYSTEM;\n    case RADIO:\n      return LOG_ID_RADIO;\n    case CRASH:\n      return LOG_ID_CRASH;\n    case DEFAULT:\n    default:\n      return LOG_ID_DEFAULT;\n  }\n}\n\nstatic int32_t LogSeverityToPriority(LogSeverity severity) {\n  switch (severity) {\n    case VERBOSE:\n      return ANDROID_LOG_VERBOSE;\n    case DEBUG:\n      return ANDROID_LOG_DEBUG;\n    case INFO:\n      return ANDROID_LOG_INFO;\n    case WARNING:\n      return ANDROID_LOG_WARN;\n    case ERROR:\n      return ANDROID_LOG_ERROR;\n    case FATAL_WITHOUT_ABORT:\n    case FATAL:\n    default:\n      return ANDROID_LOG_FATAL;\n  }\n}\n\nstatic LogFunction& Logger() {\n  static auto& logger = *new LogFunction(LogdLogger());\n  return logger;\n}\n\nstatic AbortFunction& Aborter() {\n  static auto& aborter = *new AbortFunction(DefaultAborter);\n  return aborter;\n}\n\n// Only used for Q fallback.\nstatic std::recursive_mutex& TagLock() {\n  static auto& tag_lock = *new std::recursive_mutex();\n  return tag_lock;\n}\n\nstatic std::string* gDefaultTag;\n\nvoid SetDefaultTag(const std::string_view tag) {\n  std::lock_guard<std::recursive_mutex> lock(TagLock());\n  if (gDefaultTag != nullptr) {\n    delete gDefaultTag;\n    gDefaultTag = nullptr;\n  }\n  if (!tag.empty()) {\n    gDefaultTag = new std::string(tag);\n  }\n}\n\nstatic bool gInitialized = false;\n\n// Only used for Q fallback.\nstatic LogSeverity gMinimumLogSeverity = INFO;\n\nvoid DefaultAborter(const char* abort_message) {\n  android_set_abort_message(abort_message);\n  abort();\n}\n\nstatic void LogdLogChunk(LogId id, LogSeverity severity, const char* tag,\n                         const char* message) {\n  int32_t lg_id = LogIdTolog_id_t(id);\n  int32_t priority = LogSeverityToPriority(severity);\n\n  __android_log_buf_print(lg_id, priority, tag, \"%s\", message);\n}\n\nLogdLogger::LogdLogger(LogId default_log_id)\n    : default_log_id_(default_log_id) {}\n\nvoid LogdLogger::operator()(LogId id, LogSeverity severity, const char* tag,\n                            const char* file, unsigned int line,\n                            const char* message) {\n  if (id == DEFAULT) {\n    id = default_log_id_;\n  }\n\n  SplitByLogdChunks(id, severity, tag, file, line, message, LogdLogChunk);\n}\n\nvoid InitLogging(const std::optional<std::string_view> default_tag,\n                 std::optional<LogSeverity> log_level, LogFunction&& logger,\n                 AbortFunction&& aborter) {\n  SetLogger(std::forward<LogFunction>(logger));\n  SetAborter(std::forward<AbortFunction>(aborter));\n\n  if (gInitialized) {\n    return;\n  }\n\n  gInitialized = true;\n\n  if (default_tag.has_value()) {\n    SetDefaultTag(default_tag.value());\n  }\n\n  const char* tags = getenv(\"ANDROID_LOG_TAGS\");\n  if (tags == nullptr) {\n    return;\n  }\n\n  if (log_level.has_value()) {\n    SetMinimumLogSeverity(log_level.value());\n  }\n}\n\nLogFunction SetLogger(LogFunction&& logger) {\n  LogFunction old_logger = std::move(Logger());\n  Logger() = std::move(logger);\n  return old_logger;\n}\n\nAbortFunction SetAborter(AbortFunction&& aborter) {\n  AbortFunction old_aborter = std::move(Aborter());\n  Aborter() = std::move(aborter);\n  return old_aborter;\n}\n\n// This indirection greatly reduces the stack impact of having lots of\n// checks/logging in a function.\nclass LogMessageData {\n public:\n  LogMessageData(const char* file, unsigned int line, LogSeverity severity,\n                 const char* tag, int error)\n      : file_(GetFileBasename(file)),\n        line_number_(line),\n        severity_(severity),\n        tag_(tag),\n        error_(error) {}\n\n  DISALLOW_COPY_AND_ASSIGN(LogMessageData);\n\n  const char* GetFile() const { return file_; }\n\n  unsigned int GetLineNumber() const { return line_number_; }\n\n  LogSeverity GetSeverity() const { return severity_; }\n\n  const char* GetTag() const { return tag_; }\n\n  int GetError() const { return error_; }\n\n  std::ostream& GetBuffer() { return buffer_; }\n\n  std::string ToString() const { return buffer_.str(); }\n\n private:\n  std::ostringstream buffer_;\n  const char* const file_;\n  const unsigned int line_number_;\n  const LogSeverity severity_;\n  const char* const tag_;\n  const int error_;\n};\n\nLogMessage::LogMessage(const char* file, unsigned int line, LogId,\n                       LogSeverity severity, const char* tag, int error)\n    : LogMessage(file, line, severity, tag, error) {}\n\nLogMessage::LogMessage(const char* file, unsigned int line,\n                       LogSeverity severity, const char* tag, int error)\n    : data_(new LogMessageData(file, line, severity, tag, error)) {}\n\nLogMessage::~LogMessage() {\n  // Check severity again. This is duplicate work wrt/ LOG macros, but not\n  // LOG_STREAM.\n  if (!WOULD_LOG(data_->GetSeverity())) {\n    return;\n  }\n\n  // Finish constructing the message.\n  if (data_->GetError() != -1) {\n    data_->GetBuffer() << \": \" << strerror(data_->GetError());\n  }\n  std::string msg(data_->ToString());\n\n  if (data_->GetSeverity() == FATAL) {\n    // Set the bionic abort message early to avoid liblog doing it\n    // with the individual lines, so that we get the whole message.\n    android_set_abort_message(msg.c_str());\n  }\n\n  LogLine(data_->GetFile(), data_->GetLineNumber(), data_->GetSeverity(),\n          data_->GetTag(), msg.c_str());\n\n  // Abort if necessary.\n  if (data_->GetSeverity() == FATAL) {\n    Aborter()(msg.c_str());\n  }\n}\n\nstd::ostream& LogMessage::stream() { return data_->GetBuffer(); }\n\nvoid LogMessage::LogLine(const char* file, unsigned int line,\n                         LogSeverity severity, const char* tag,\n                         const char* message) {\n  if (tag == nullptr) {\n    std::lock_guard<std::recursive_mutex> lock(TagLock());\n    if (gDefaultTag == nullptr) {\n      gDefaultTag = new std::string(getprogname());\n    }\n\n    Logger()(DEFAULT, severity, gDefaultTag->c_str(), file, line, message);\n  } else {\n    Logger()(DEFAULT, severity, tag, file, line, message);\n  }\n}\n\nLogSeverity GetMinimumLogSeverity() { return gMinimumLogSeverity; }\n\nbool ShouldLog(LogSeverity severity, const char*) {\n  return severity >= gMinimumLogSeverity;\n}\n\nLogSeverity SetMinimumLogSeverity(LogSeverity new_severity) {\n  LogSeverity old_severity = gMinimumLogSeverity;\n  gMinimumLogSeverity = new_severity;\n  return old_severity;\n}\n\nScopedLogSeverity::ScopedLogSeverity(LogSeverity new_severity) {\n  old_ = SetMinimumLogSeverity(new_severity);\n}\n\nScopedLogSeverity::~ScopedLogSeverity() { SetMinimumLogSeverity(old_); }\n\n}  // namespace ndksamples::base\n"
  },
  {
    "path": "base/src/main/cpp/logging_splitters.h",
    "content": "/*\n * Copyright (C) 2020 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#pragma once\n\n#include <inttypes.h>\n#include <time.h>\n\n#include <format>\n\n#include \"base/logging.h\"\n\n#define LOGGER_ENTRY_MAX_PAYLOAD 4068  // This constant is not in the NDK.\n\nnamespace ndksamples::base {\n\n// This splits the message up line by line, by calling log_function with a\n// pointer to the start of each line and the size up to the newline character.\n// It sends size = -1 for the final line.\ntemplate <typename F, typename... Args>\nstatic void SplitByLines(const char* msg, const F& log_function,\n                         Args&&... args) {\n  const char* newline = strchr(msg, '\\n');\n  while (newline != nullptr) {\n    log_function(msg, newline - msg, args...);\n    msg = newline + 1;\n    newline = strchr(msg, '\\n');\n  }\n\n  log_function(msg, -1, args...);\n}\n\n// This splits the message up into chunks that logs can process delimited by new\n// lines.  It calls log_function with the exact null terminated message that\n// should be sent to logd. Note, despite the loops and snprintf's, if severity\n// is not fatal and there are no new lines, this function simply calls\n// log_function with msg without any extra overhead.\ntemplate <typename F>\nstatic void SplitByLogdChunks(LogId log_id, LogSeverity severity,\n                              const char* tag, const char* file,\n                              unsigned int line, const char* msg,\n                              const F& log_function) {\n  // The maximum size of a payload, after the log header that logd will accept\n  // is LOGGER_ENTRY_MAX_PAYLOAD, so subtract the other elements in the payload\n  // to find the size of the string that we can log in each pass. The protocol\n  // is documented in liblog/README.protocol.md. Specifically we subtract a byte\n  // for the priority, the length of the tag + its null terminator, and an\n  // additional byte for the null terminator on the payload.  We subtract an\n  // additional 32 bytes for slack, similar to java/android/util/Log.java.\n  ptrdiff_t max_size = LOGGER_ENTRY_MAX_PAYLOAD - strlen(tag) - 35;\n  if (max_size <= 0) {\n    abort();\n  }\n  // If we're logging a fatal message, we'll append the file and line numbers.\n  bool add_file =\n      file != nullptr && (severity == FATAL || severity == FATAL_WITHOUT_ABORT);\n\n  std::string file_header;\n  if (add_file) {\n    file_header = std::format(\"{}:{}]\", file, line);\n  }\n  int file_header_size = file_header.size();\n\n  __attribute__((uninitialized)) char logd_chunk[max_size + 1];\n  ptrdiff_t chunk_position = 0;\n\n  auto call_log_function = [&]() {\n    log_function(log_id, severity, tag, logd_chunk);\n    chunk_position = 0;\n  };\n\n  auto write_to_logd_chunk = [&](const char* message, int length) {\n    int size_written = 0;\n    const char* new_line = chunk_position > 0 ? \"\\n\" : \"\";\n    if (add_file) {\n      size_written = snprintf(logd_chunk + chunk_position,\n                              sizeof(logd_chunk) - chunk_position, \"%s%s%.*s\",\n                              new_line, file_header.c_str(), length, message);\n    } else {\n      size_written = snprintf(logd_chunk + chunk_position,\n                              sizeof(logd_chunk) - chunk_position, \"%s%.*s\",\n                              new_line, length, message);\n    }\n\n    // This should never fail, if it does and we set size_written to 0, which\n    // will skip this line and move to the next one.\n    if (size_written < 0) {\n      size_written = 0;\n    }\n    chunk_position += size_written;\n  };\n\n  const char* newline = strchr(msg, '\\n');\n  while (newline != nullptr) {\n    // If we have data in the buffer and this next line doesn't fit, write the\n    // buffer.\n    if (chunk_position != 0 &&\n        chunk_position + (newline - msg) + 1 + file_header_size > max_size) {\n      call_log_function();\n    }\n\n    // Otherwise, either the next line fits or we have any empty buffer and too\n    // large of a line to ever fit, in both cases, we add it to the buffer and\n    // continue.\n    write_to_logd_chunk(msg, newline - msg);\n\n    msg = newline + 1;\n    newline = strchr(msg, '\\n');\n  }\n\n  // If we have left over data in the buffer and we can fit the rest of msg, add\n  // it to the buffer then write the buffer.\n  if (chunk_position != 0 &&\n      chunk_position + static_cast<int>(strlen(msg)) + 1 + file_header_size <=\n          max_size) {\n    write_to_logd_chunk(msg, -1);\n    call_log_function();\n  } else {\n    // If the buffer is not empty and we can't fit the rest of msg into it,\n    // write its contents.\n    if (chunk_position != 0) {\n      call_log_function();\n    }\n    // Then write the rest of the msg.\n    if (add_file) {\n      snprintf(logd_chunk, sizeof(logd_chunk), \"%s%s\", file_header.c_str(),\n               msg);\n      log_function(log_id, severity, tag, logd_chunk);\n    } else {\n      log_function(log_id, severity, tag, msg);\n    }\n  }\n}\n\n}  // namespace ndksamples::base\n"
  },
  {
    "path": "bitmap-plasma/README.md",
    "content": "# Bitmap Plasma\n\nBitmap Plasma is an Android sample that uses JNI to render a plasma effect in an\nAndroid\n[Bitmap](http://developer.android.com/reference/android/graphics/Bitmap.html)\nfrom C code.\n\n## Screenshots\n\n![screenshot](screenshot.png)\n"
  },
  {
    "path": "bitmap-plasma/app/build.gradle",
    "content": "plugins {\n    id \"ndksamples.android.application\"\n}\n\nandroid {\n    namespace 'com.example.plasma'\n    defaultConfig {\n        applicationId 'com.example.plasma'\n    }\n    externalNativeBuild {\n        cmake {\n            path 'src/main/cpp/CMakeLists.txt'\n        }\n    }\n\n    buildFeatures {\n        prefab true\n    }\n}\n\ndependencies {\n    implementation project(\":base\")\n}\n"
  },
  {
    "path": "bitmap-plasma/app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:versionCode=\"1\"\n          android:versionName=\"1.0\">\n  <application\n      android:allowBackup=\"false\"\n      android:fullBackupContent=\"false\"\n      android:icon=\"@mipmap/ic_launcher\"\n      android:label=\"@string/app_name\">\n    <activity android:name=\".Plasma\"\n              android:label=\"@string/app_name\"\n        android:exported=\"true\">\n      <intent-filter>\n        <action android:name=\"android.intent.action.MAIN\" />\n        <category android:name=\"android.intent.category.LAUNCHER\" />\n      </intent-filter>\n    </activity>\n  </application>\n</manifest>\n"
  },
  {
    "path": "bitmap-plasma/app/src/main/cpp/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.22.1)\nproject(BitmapPlasma LANGUAGES CXX)\n\ninclude(AppLibrary)\nfind_package(base CONFIG REQUIRED)\n\nadd_app_library(plasma SHARED jni.cpp plasma.cpp)\n\ntarget_link_libraries(plasma\n    base::base\n    android\n    jnigraphics\n    log\n    m\n)\n"
  },
  {
    "path": "bitmap-plasma/app/src/main/cpp/jni.cpp",
    "content": "// Copyright (C) 2025 The Android Open Source Project\n// SPDX-License-Identifier: Apache-2.0\n\n#include <base/macros.h>\n#include <jni.h>\n\n#include \"plasma.h\"\n\nextern \"C\" JNIEXPORT jint JNI_OnLoad(JavaVM* _Nonnull vm, void* _Nullable) {\n  JNIEnv* env;\n  if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {\n    return JNI_ERR;\n  }\n\n  jclass c = env->FindClass(\"com/example/plasma/PlasmaView\");\n  if (c == nullptr) return JNI_ERR;\n\n  static const JNINativeMethod methods[] = {\n      {\"renderPlasma\", \"(Landroid/graphics/Bitmap;J)V\",\n       reinterpret_cast<void*>(RenderPlasma)},\n  };\n  int rc = env->RegisterNatives(c, methods, arraysize(methods));\n  if (rc != JNI_OK) return rc;\n\n  return JNI_VERSION_1_6;\n}"
  },
  {
    "path": "bitmap-plasma/app/src/main/cpp/libplasma.map.txt",
    "content": "LIBPLASMA {\n  global:\n    JNI_OnLoad;\n  local:\n    *;\n};\n"
  },
  {
    "path": "bitmap-plasma/app/src/main/cpp/plasma.cpp",
    "content": "/*\n * Copyright (C) 2010 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include <android/bitmap.h>\n#include <android/log.h>\n#include <jni.h>\n#include <math.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <time.h>\n\n#define LOG_TAG \"libplasma\"\n#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)\n#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)\n\n/* Set to 1 to enable debug log traces. */\n#define DEBUG 0\n\n/* Set to 1 to optimize memory stores when generating plasma. */\n#define OPTIMIZE_WRITES 1\n\n/* Return current time in milliseconds */\nstatic double now_ms(void) {\n  struct timeval tv;\n  gettimeofday(&tv, NULL);\n  return tv.tv_sec * 1000. + tv.tv_usec / 1000.;\n}\n\n/* We're going to perform computations for every pixel of the target\n * bitmap. floating-point operations are very slow on ARMv5, and not\n * too bad on ARMv7 with the exception of trigonometric functions.\n *\n * For better performance on all platforms, we're going to use fixed-point\n * arithmetic and all kinds of tricks\n */\n\ntypedef int32_t Fixed;\n\n#define FIXED_BITS 16\n#define FIXED_ONE (1 << FIXED_BITS)\n#define FIXED_AVERAGE(x, y) (((x) + (y)) >> 1)\n\n#define FIXED_FROM_INT(x) ((x) << FIXED_BITS)\n#define FIXED_TO_INT(x) ((x) >> FIXED_BITS)\n\n#define FIXED_FROM_FLOAT(x) ((Fixed)((x) * FIXED_ONE))\n#define FIXED_TO_FLOAT(x) ((x) / (1. * FIXED_ONE))\n\n#define FIXED_MUL(x, y) (((int64_t)(x) * (y)) >> FIXED_BITS)\n#define FIXED_DIV(x, y) (((int64_t)(x) * FIXED_ONE) / (y))\n\n#define FIXED_DIV2(x) ((x) >> 1)\n#define FIXED_AVERAGE(x, y) (((x) + (y)) >> 1)\n\n#define FIXED_FRAC(x) ((x) & ((1 << FIXED_BITS) - 1))\n#define FIXED_TRUNC(x) ((x) & ~((1 << FIXED_BITS) - 1))\n\n#define FIXED_FROM_INT_FLOAT(x, f) (Fixed)((x) * (FIXED_ONE * (f)))\n\ntypedef int32_t Angle;\n\n#define ANGLE_BITS 9\n\n#if ANGLE_BITS < 8\n#error ANGLE_BITS must be at least 8\n#endif\n\n#define ANGLE_2PI (1 << ANGLE_BITS)\n#define ANGLE_PI (1 << (ANGLE_BITS - 1))\n#define ANGLE_PI2 (1 << (ANGLE_BITS - 2))\n#define ANGLE_PI4 (1 << (ANGLE_BITS - 3))\n\n#define ANGLE_FROM_FLOAT(x) (Angle)((x) * ANGLE_PI / M_PI)\n#define ANGLE_TO_FLOAT(x) ((x) * M_PI / ANGLE_PI)\n\n#if ANGLE_BITS <= FIXED_BITS\n#define ANGLE_FROM_FIXED(x) (Angle)((x) >> (FIXED_BITS - ANGLE_BITS))\n#define ANGLE_TO_FIXED(x) (Fixed)((x) << (FIXED_BITS - ANGLE_BITS))\n#else\n#define ANGLE_FROM_FIXED(x) (Angle)((x) << (ANGLE_BITS - FIXED_BITS))\n#define ANGLE_TO_FIXED(x) (Fixed)((x) >> (ANGLE_BITS - FIXED_BITS))\n#endif\n\nstatic Fixed angle_sin_tab[ANGLE_2PI + 1];\n\nstatic void init_angles(void) {\n  int nn;\n  for (nn = 0; nn < ANGLE_2PI + 1; nn++) {\n    double radians = nn * M_PI / ANGLE_PI;\n    angle_sin_tab[nn] = FIXED_FROM_FLOAT(sin(radians));\n  }\n}\n\nstatic __inline__ Fixed angle_sin(Angle a) {\n  return angle_sin_tab[(uint32_t)a & (ANGLE_2PI - 1)];\n}\n\nstatic __inline__ Fixed fixed_sin(Fixed f) {\n  return angle_sin(ANGLE_FROM_FIXED(f));\n}\n\n/* Color palette used for rendering the plasma */\n#define PALETTE_BITS 8\n#define PALETTE_SIZE (1 << PALETTE_BITS)\n\n#if PALETTE_BITS > FIXED_BITS\n#error PALETTE_BITS must be smaller than FIXED_BITS\n#endif\n\nstatic uint16_t palette[PALETTE_SIZE];\n\nstatic uint16_t make565(int red, int green, int blue) {\n  return (uint16_t)(((red << 8) & 0xf800) | ((green << 3) & 0x07e0) |\n                    ((blue >> 3) & 0x001f));\n}\n\nstatic void init_palette(void) {\n  int nn, mm = 0;\n  /* fun with colors */\n  for (nn = 0; nn < PALETTE_SIZE / 4; nn++) {\n    int jj = (nn - mm) * 4 * 255 / PALETTE_SIZE;\n    palette[nn] = make565(255, jj, 255 - jj);\n  }\n\n  for (mm = nn; nn < PALETTE_SIZE / 2; nn++) {\n    int jj = (nn - mm) * 4 * 255 / PALETTE_SIZE;\n    palette[nn] = make565(255 - jj, 255, jj);\n  }\n\n  for (mm = nn; nn < PALETTE_SIZE * 3 / 4; nn++) {\n    int jj = (nn - mm) * 4 * 255 / PALETTE_SIZE;\n    palette[nn] = make565(0, 255 - jj, 255);\n  }\n\n  for (mm = nn; nn < PALETTE_SIZE; nn++) {\n    int jj = (nn - mm) * 4 * 255 / PALETTE_SIZE;\n    palette[nn] = make565(jj, 0, 255);\n  }\n}\n\nstatic __inline__ uint16_t palette_from_fixed(Fixed x) {\n  if (x < 0) x = -x;\n  if (x >= FIXED_ONE) x = FIXED_ONE - 1;\n  int idx = FIXED_FRAC(x) >> (FIXED_BITS - PALETTE_BITS);\n  return palette[idx & (PALETTE_SIZE - 1)];\n}\n\n/* Angles expressed as fixed point radians */\n\nstatic void init_tables(void) {\n  init_palette();\n  init_angles();\n}\n\nstatic void fill_plasma(AndroidBitmapInfo* info, void* pixels, double t) {\n  Fixed yt1 = FIXED_FROM_FLOAT(t / 1230.);\n  Fixed yt2 = yt1;\n  Fixed xt10 = FIXED_FROM_FLOAT(t / 3000.);\n  Fixed xt20 = xt10;\n\n#define YT1_INCR FIXED_FROM_FLOAT(1 / 100.)\n#define YT2_INCR FIXED_FROM_FLOAT(1 / 163.)\n\n  for (uint32_t yy = 0; yy < info->height; yy++) {\n    uint16_t* line = (uint16_t*)pixels;\n    Fixed base = fixed_sin(yt1) + fixed_sin(yt2);\n    Fixed xt1 = xt10;\n    Fixed xt2 = xt20;\n\n    yt1 += YT1_INCR;\n    yt2 += YT2_INCR;\n\n#define XT1_INCR FIXED_FROM_FLOAT(1 / 173.)\n#define XT2_INCR FIXED_FROM_FLOAT(1 / 242.)\n\n#if OPTIMIZE_WRITES\n    /* optimize memory writes by generating one aligned 32-bit store\n     * for every pair of pixels.\n     */\n    uint16_t* line_end = line + info->width;\n\n    if (line < line_end) {\n      if (((uint32_t)(uintptr_t)line & 3) != 0) {\n        Fixed ii = base + fixed_sin(xt1) + fixed_sin(xt2);\n\n        xt1 += XT1_INCR;\n        xt2 += XT2_INCR;\n\n        line[0] = palette_from_fixed(ii >> 2);\n        line++;\n      }\n\n      while (line + 2 <= line_end) {\n        Fixed i1 = base + fixed_sin(xt1) + fixed_sin(xt2);\n        xt1 += XT1_INCR;\n        xt2 += XT2_INCR;\n\n        Fixed i2 = base + fixed_sin(xt1) + fixed_sin(xt2);\n        xt1 += XT1_INCR;\n        xt2 += XT2_INCR;\n\n        uint32_t pixel = ((uint32_t)palette_from_fixed(i1 >> 2) << 16) |\n                         (uint32_t)palette_from_fixed(i2 >> 2);\n\n        ((uint32_t*)line)[0] = pixel;\n        line += 2;\n      }\n\n      if (line < line_end) {\n        Fixed ii = base + fixed_sin(xt1) + fixed_sin(xt2);\n        line[0] = palette_from_fixed(ii >> 2);\n        line++;\n      }\n    }\n#else  /* !OPTIMIZE_WRITES */\n    int xx;\n    for (xx = 0; xx < info->width; xx++) {\n      Fixed ii = base + fixed_sin(xt1) + fixed_sin(xt2);\n\n      xt1 += XT1_INCR;\n      xt2 += XT2_INCR;\n\n      line[xx] = palette_from_fixed(ii / 4);\n    }\n#endif /* !OPTIMIZE_WRITES */\n\n    // go to next line\n    pixels = (char*)pixels + info->stride;\n  }\n}\n\n/* simple stats management */\ntypedef struct {\n  double renderTime;\n  double frameTime;\n} FrameStats;\n\n#define MAX_FRAME_STATS 200\n#define MAX_PERIOD_MS 1500\n\ntypedef struct {\n  double firstTime;\n  double lastTime;\n  double frameTime;\n\n  int firstFrame;\n  int numFrames;\n  FrameStats frames[MAX_FRAME_STATS];\n} Stats;\n\nstatic void stats_init(Stats* s) {\n  s->lastTime = now_ms();\n  s->firstTime = 0.;\n  s->firstFrame = 0;\n  s->numFrames = 0;\n}\n\nstatic void stats_startFrame(Stats* s) { s->frameTime = now_ms(); }\n\nstatic void stats_endFrame(Stats* s) {\n  double now = now_ms();\n  double renderTime = now - s->frameTime;\n  double frameTime = now - s->lastTime;\n  int nn;\n\n  if (now - s->firstTime >= MAX_PERIOD_MS) {\n    if (s->numFrames > 0) {\n      double minRender, maxRender, avgRender;\n      double minFrame, maxFrame, avgFrame;\n      int count;\n\n      nn = s->firstFrame;\n      minRender = maxRender = avgRender = s->frames[nn].renderTime;\n      minFrame = maxFrame = avgFrame = s->frames[nn].frameTime;\n      for (count = s->numFrames; count > 0; count--) {\n        nn += 1;\n        if (nn >= MAX_FRAME_STATS) nn -= MAX_FRAME_STATS;\n        double render = s->frames[nn].renderTime;\n        if (render < minRender) minRender = render;\n        if (render > maxRender) maxRender = render;\n        double frame = s->frames[nn].frameTime;\n        if (frame < minFrame) minFrame = frame;\n        if (frame > maxFrame) maxFrame = frame;\n        avgRender += render;\n        avgFrame += frame;\n      }\n      avgRender /= s->numFrames;\n      avgFrame /= s->numFrames;\n\n      LOGI(\n          \"frame/s (avg,min,max) = (%.1f,%.1f,%.1f) \"\n          \"render time ms (avg,min,max) = (%.1f,%.1f,%.1f)\\n\",\n          1000. / avgFrame, 1000. / maxFrame, 1000. / minFrame, avgRender,\n          minRender, maxRender);\n    }\n    s->numFrames = 0;\n    s->firstFrame = 0;\n    s->firstTime = now;\n  }\n\n  nn = s->firstFrame + s->numFrames;\n  if (nn >= MAX_FRAME_STATS) nn -= MAX_FRAME_STATS;\n\n  s->frames[nn].renderTime = renderTime;\n  s->frames[nn].frameTime = frameTime;\n\n  if (s->numFrames < MAX_FRAME_STATS) {\n    s->numFrames += 1;\n  } else {\n    s->firstFrame += 1;\n    if (s->firstFrame >= MAX_FRAME_STATS) s->firstFrame -= MAX_FRAME_STATS;\n  }\n\n  s->lastTime = now;\n}\n\nvoid RenderPlasma(JNIEnv* env, jclass, jobject bitmap, jlong time_ms) {\n  AndroidBitmapInfo info;\n  void* pixels;\n  int ret;\n  static Stats stats;\n  static int init;\n\n  if (!init) {\n    init_tables();\n    stats_init(&stats);\n    init = 1;\n  }\n\n  if ((ret = AndroidBitmap_getInfo(env, bitmap, &info)) < 0) {\n    LOGE(\"AndroidBitmap_getInfo() failed ! error=%d\", ret);\n    return;\n  }\n\n  if (info.format != ANDROID_BITMAP_FORMAT_RGB_565) {\n    LOGE(\"Bitmap format is not RGB_565 !\");\n    return;\n  }\n\n  if ((ret = AndroidBitmap_lockPixels(env, bitmap, &pixels)) < 0) {\n    LOGE(\"AndroidBitmap_lockPixels() failed ! error=%d\", ret);\n  }\n\n  stats_startFrame(&stats);\n\n  /* Now fill the values with a nice little plasma */\n  fill_plasma(&info, pixels, time_ms);\n\n  AndroidBitmap_unlockPixels(env, bitmap);\n\n  stats_endFrame(&stats);\n}\n"
  },
  {
    "path": "bitmap-plasma/app/src/main/cpp/plasma.h",
    "content": "// Copyright (C) 2025 The Android Open Source Project\n// SPDX-License-Identifier: Apache-2.0\n\n#pragma once\n\n#include <jni.h>\n\nvoid RenderPlasma(JNIEnv* env, jclass, jobject bitmap, jlong time_ms);\n"
  },
  {
    "path": "bitmap-plasma/app/src/main/java/com/example/plasma/Plasma.java",
    "content": "/*\n * Copyright (C) 2010 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.example.plasma;\n\nimport android.annotation.SuppressLint;\nimport android.app.Activity;\nimport android.graphics.Point;\nimport android.os.Bundle;\nimport android.content.Context;\nimport android.view.View;\nimport android.graphics.Bitmap;\nimport android.graphics.Canvas;\nimport android.view.Display;\nimport android.view.WindowManager;\n\npublic class Plasma extends Activity\n{\n    // Called when the activity is first created.\n    @Override\n    public void onCreate(Bundle savedInstanceState)\n    {\n        super.onCreate(savedInstanceState);\n        Display display = getWindowManager().getDefaultDisplay();\n        Point displaySize = new Point();\n        display.getSize(displaySize);\n        setContentView(new PlasmaView(this, displaySize.x, displaySize.y));\n    }\n\n    // load our native library\n    static {\n        System.loadLibrary(\"plasma\");\n    }\n}\n\n// Custom view for rendering plasma.\n//\n// Note: suppressing lint wrarning for ViewConstructor since it is\n//       manually set from the activity and not used in any layout.\n@SuppressLint(\"ViewConstructor\")\nclass PlasmaView extends View {\n    private Bitmap mBitmap;\n    private long mStartTime;\n\n    // implementend by libplasma.so\n    private static native void renderPlasma(Bitmap  bitmap, long time_ms);\n\n    public PlasmaView(Context context, int width, int height) {\n        super(context);\n        mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);\n        mStartTime = System.currentTimeMillis();\n    }\n\n    @Override protected void onDraw(Canvas canvas) {\n        renderPlasma(mBitmap, System.currentTimeMillis() - mStartTime);\n        canvas.drawBitmap(mBitmap, 0, 0, null);\n        // force a redraw, with a different time-based pattern.\n        invalidate();\n    }\n\n    @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) {\n        mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.RGB_565);\n    }\n\n}\n"
  },
  {
    "path": "bitmap-plasma/app/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"app_name\">Plasma</string>\n</resources>\n"
  },
  {
    "path": "build-logic/.gitignore",
    "content": "/bin\n"
  },
  {
    "path": "build-logic/README.md",
    "content": "# Convention plugins\n\nThis directory contains [convention plugins] used by the NDK samples. These are\nused to remove Gradle boiler plate from individual samples in favor of common\nconfiguration here. Using convention plugins for single module projects is\noverkill, but any non-trivial app will likely need their own eventually. See\n[Now In Android's build-logic][nia-build-logic] for a more thorough example of\nbuilding convention plugins for Android projects.\n\n[convention plugins]: https://docs.gradle.org/current/samples/sample_convention_plugins.html\n[nia-build-logic]: https://github.com/android/nowinandroid/blob/main/build-logic/README.md\n"
  },
  {
    "path": "build-logic/build.gradle.kts",
    "content": "import org.jetbrains.kotlin.gradle.tasks.KotlinCompile\n\nplugins {\n    id(\"java-gradle-plugin\")\n    `kotlin-dsl`\n    alias(libs.plugins.jetbrains.kotlin.jvm)\n}\n\njava {\n    sourceCompatibility = JavaVersion.VERSION_17\n    targetCompatibility = JavaVersion.VERSION_17\n}\n\ntasks.withType<KotlinCompile>().configureEach {\n    kotlinOptions {\n        jvmTarget = JavaVersion.VERSION_17.toString()\n    }\n}\n\ndependencies {\n    compileOnly(libs.android.gradlePlugin)\n    compileOnly(libs.kotlin.gradlePlugin)\n}\n\ngradlePlugin {\n    plugins {\n        register(\"androidApplication\") {\n            id = \"ndksamples.android.application\"\n            implementationClass = \"com.android.ndk.samples.buildlogic.AndroidApplicationConventionPlugin\"\n        }\n        register(\"androidLibrary\") {\n            id = \"ndksamples.android.library\"\n            implementationClass = \"com.android.ndk.samples.buildlogic.AndroidLibraryConventionPlugin\"\n        }\n        register(\"kotlinAndroid\") {\n            id = \"ndksamples.android.kotlin\"\n            implementationClass = \"com.android.ndk.samples.buildlogic.KotlinConventionPlugin\"\n        }\n    }\n}\n"
  },
  {
    "path": "build-logic/settings.gradle.kts",
    "content": "dependencyResolutionManagement {\n    repositories {\n        google()\n        mavenCentral()\n    }\n    versionCatalogs {\n        create(\"libs\") {\n            from(files(\"../gradle/libs.versions.toml\"))\n        }\n    }\n}\n\nrootProject.name = \"build-logic\"\n"
  },
  {
    "path": "build-logic/src/main/java/com/android/ndk/samples/buildlogic/AndroidApplicationConventionPlugin.kt",
    "content": "package com.android.ndk.samples.buildlogic\n\nimport com.android.build.api.dsl.ApplicationExtension\n\nimport org.gradle.api.Plugin\nimport org.gradle.api.Project\nimport org.gradle.kotlin.dsl.configure\n\nclass AndroidApplicationConventionPlugin : Plugin<Project> {\n    override fun apply(target: Project) {\n        with(target) {\n            with(pluginManager) {\n                apply(\"com.android.application\")\n            }\n\n            extensions.configure<ApplicationExtension> {\n                compileSdk = Versions.COMPILE_SDK\n                ndkVersion = Versions.NDK\n\n                externalNativeBuild {\n                    cmake {\n                        version = Versions.CMAKE\n                    }\n                }\n\n                defaultConfig {\n                    minSdk = Versions.MIN_SDK\n                    targetSdk = Versions.TARGET_SDK\n\n                    externalNativeBuild {\n                        cmake {\n                            arguments.add(\"-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON\")\n                            arguments.add(\"-DCMAKE_MODULE_PATH=${rootDir.resolve(\"cmake\")}\")\n                        }\n                    }\n\n                    ndk {\n                        // riscv64 isn't a supported Android ABI yet (August 2025), but we're\n                        // enabling it here as part of that experiment. Until it's a supported ABI,\n                        // don't include this in your app, as Play will block uploads of APKs which\n                        // contain riscv64 libraries.\n                        abiFilters.addAll(\n                            listOf(\n                                \"arm64-v8a\",\n                                \"armeabi-v7a\",\n                                \"riscv64\",\n                                \"x86\",\n                                \"x86_64\",\n                            )\n                        )\n                    }\n                }\n                compileOptions {\n                    sourceCompatibility = Versions.JAVA\n                    targetCompatibility = Versions.JAVA\n                }\n\n                // Studio will not automatically pass logcat through ndk-stack, so we need to avoid\n                // stripping debug binaries if we want the crash trace to be readable.\n                buildTypes {\n                    debug {\n                        packaging {\n                            jniLibs {\n                                keepDebugSymbols += \"**/*.so\"\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "build-logic/src/main/java/com/android/ndk/samples/buildlogic/AndroidLibraryConventionPlugin.kt",
    "content": "package com.android.ndk.samples.buildlogic\n\nimport com.android.build.api.dsl.LibraryExtension\nimport org.gradle.api.Plugin\nimport org.gradle.api.Project\nimport org.gradle.kotlin.dsl.configure\n\nclass AndroidLibraryConventionPlugin : Plugin<Project> {\n    override fun apply(target: Project) {\n        with(target) {\n            with(pluginManager) {\n                apply(\"com.android.library\")\n            }\n\n            extensions.configure<LibraryExtension> {\n                compileSdk = Versions.COMPILE_SDK\n                ndkVersion = Versions.NDK\n\n                externalNativeBuild {\n                    cmake {\n                        version = Versions.CMAKE\n                    }\n                }\n\n                defaultConfig {\n                    minSdk = Versions.MIN_SDK\n                    lint {\n                        targetSdk = Versions.TARGET_SDK\n                    }\n                    testOptions {\n                        targetSdk = Versions.TARGET_SDK\n                    }\n                    externalNativeBuild {\n                        cmake {\n                            arguments.add(\"-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON\")\n                            arguments.add(\"-DCMAKE_MODULE_PATH=${rootDir.resolve(\"cmake\")}\")\n                        }\n                    }\n                    ndk {\n                        // riscv64 isn't a supported Android ABI yet (August 2025), but we're\n                        // enabling it here as part of that experiment. Until it's a supported ABI,\n                        // don't include this in your app, as Play will block uploads of APKs which\n                        // contain riscv64 libraries.\n                        abiFilters.addAll(\n                            listOf(\n                                \"arm64-v8a\",\n                                \"armeabi-v7a\",\n                                \"riscv64\",\n                                \"x86\",\n                                \"x86_64\",\n                            )\n                        )\n                    }\n                }\n                compileOptions {\n                    sourceCompatibility = Versions.JAVA\n                    targetCompatibility = Versions.JAVA\n                }\n\n                // Studio will not automatically pass logcat through ndk-stack, so we need to avoid\n                // stripping debug binaries if we want the crash trace to be readable.\n                buildTypes {\n                    debug {\n                        packaging {\n                            jniLibs {\n                                keepDebugSymbols += \"**/*.so\"\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "build-logic/src/main/java/com/android/ndk/samples/buildlogic/KotlinConventionPlugin.kt",
    "content": "package com.android.ndk.samples.buildlogic\n\nimport com.android.build.api.dsl.ApplicationExtension\n\nimport org.gradle.api.Plugin\nimport org.gradle.api.Project\nimport org.gradle.kotlin.dsl.configure\nimport org.gradle.kotlin.dsl.withType\nimport org.jetbrains.kotlin.gradle.tasks.KotlinCompile\n\nclass KotlinConventionPlugin : Plugin<Project> {\n    override fun apply(target: Project) {\n        with(target) {\n            with(pluginManager) {\n                apply(\"org.jetbrains.kotlin.android\")\n            }\n\n            extensions.configure<ApplicationExtension> {\n                tasks.withType<KotlinCompile>().configureEach {\n                    kotlinOptions {\n                        jvmTarget = Versions.JAVA.toString()\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "build-logic/src/main/java/com/android/ndk/samples/buildlogic/Versions.kt",
    "content": "package com.android.ndk.samples.buildlogic\n\nimport org.gradle.api.JavaVersion\n\nobject Versions {\n    const val COMPILE_SDK = 35\n    const val TARGET_SDK = 35\n    const val MIN_SDK = 21\n    const val NDK = \"29.0.14206865\" // r29\n    const val CMAKE = \"4.1.0\"\n    val JAVA = JavaVersion.VERSION_1_8\n}\n"
  },
  {
    "path": "build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\nplugins {\n    alias(libs.plugins.android.application) apply false\n    alias(libs.plugins.android.library) apply false\n    alias(libs.plugins.jetbrainsKotlinAndroid) apply false\n}\n"
  },
  {
    "path": "camera/README.md",
    "content": "# NdkCamera Sample\n\nTwo API samples:\n\n- texture-view: Preview NDK camera image with\n  [Android TextureView](https://developer.android.com/reference/android/view/TextureView.html)\n- basic: A basic NdkCamera sample to preview camera images with AReadImage and\n  take jpeg photos. Exposure and sensitivity are adjustable for preview, however\n  capturing photos is in auto mode (it could be adjustable with similar method\n  as used for preview).\n\n## Other Resources\n\n- Getting familiar with the 5 Camera2 objects\n  ![Camera2 API Model](Camera2ProgrammingModel.png)\n\n- [Camera2 blogs](https://medium.com/androiddevelopers/camera-enumeration-on-android-9a053b910cb5)\n\n- [Camera2 Java documentation](https://developer.android.com/reference/android/hardware/camera2/package-summary)\n\n## Screenshots\n\n![screenshot](ndkCamera.png)\n"
  },
  {
    "path": "camera/basic/build.gradle",
    "content": "plugins {\n    id \"ndksamples.android.application\"\n}\n\nandroid {\n    namespace 'com.sample.camera.basic'\n    defaultConfig {\n        applicationId 'com.sample.camera.basic'\n        minSdkVersion 24\n        externalNativeBuild {\n            cmake {\n                arguments '-DANDROID_STL=c++_static'\n            }\n        }\n    }\n    externalNativeBuild {\n        cmake {\n            path 'src/main/cpp/CMakeLists.txt'\n        }\n    }\n\n    buildFeatures {\n        prefab true\n    }\n}\n\ndependencies {\n    implementation project(\":base\")\n    implementation libs.appcompat\n    implementation project(\":camera:camera-utils\")\n}\n"
  },
  {
    "path": "camera/basic/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:versionCode=\"1\"\n          android:versionName=\"1.0\">\n  <uses-feature android:name=\"android.hardware.camera\" />\n  <uses-permission android:name=\"android.permission.CAMERA\" />\n  <application\n      android:allowBackup=\"false\"\n      android:fullBackupContent=\"false\"\n      android:icon=\"@mipmap/ic_launcher\"\n      android:label=\"@string/app_name\"\n      android:screenOrientation=\"sensorLandscape\"\n      android:configChanges=\"keyboardHidden|orientation|screenSize\"\n      android:hasCode=\"true\">\n    <activity android:name=\"com.sample.camera.basic.CameraActivity\"\n              android:label=\"@string/app_name\"\n        android:exported=\"true\">\n      <meta-data android:name=\"android.app.lib_name\"\n                 android:value=\"ndk_camera\" />\n      <intent-filter>\n        <action android:name=\"android.intent.action.MAIN\" />\n        <category android:name=\"android.intent.category.LAUNCHER\" />\n      </intent-filter>\n    </activity>\n  </application>\n</manifest>\n"
  },
  {
    "path": "camera/basic/src/main/cpp/CMakeLists.txt",
    "content": "#\n# Copyright (C)  2017 The Android Open Source Project\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\ncmake_minimum_required(VERSION 3.22.1)\nproject(CameraBasic LANGUAGES C CXX)\n\ninclude(AppLibrary)\ninclude(AndroidNdkModules)\nfind_package(base REQUIRED CONFIG)\nfind_package(camera-utils REQUIRED CONFIG)\n\nandroid_ndk_import_module_native_app_glue()\n\nadd_app_library(ndk_camera SHARED\n    ${CMAKE_CURRENT_SOURCE_DIR}/android_main.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/camera_engine.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/camera_manager.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/camera_listeners.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/image_reader.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/camera_ui.cpp\n)\n\ntarget_link_libraries(ndk_camera\n    PRIVATE\n    base::base\n    camera-utils::camera-utils\n    android\n    log\n    m\n    $<LINK_LIBRARY:WHOLE_ARCHIVE,native_app_glue>\n    camera2ndk\n    mediandk\n)\n"
  },
  {
    "path": "camera/basic/src/main/cpp/android_main.cpp",
    "content": "/*\n * Copyright (C) 2017 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include <ndksamples/camera/native_debug.h>\n\n#include \"camera_engine.h\"\n\n/*\n * SampleEngine global object\n */\nstatic CameraEngine* pEngineObj = nullptr;\nCameraEngine* GetAppEngine(void) {\n  ASSERT(pEngineObj, \"AppEngine has not initialized\");\n  return pEngineObj;\n}\n\n/**\n * Teamplate function for NativeActivity derived applications\n *   Create/Delete camera object with\n *   INIT_WINDOW/TERM_WINDOW command, ignoring other event.\n */\nstatic void ProcessAndroidCmd(struct android_app* app, int32_t cmd) {\n  CameraEngine* engine = reinterpret_cast<CameraEngine*>(app->userData);\n  switch (cmd) {\n    case APP_CMD_INIT_WINDOW:\n      if (engine->AndroidApp()->window != NULL) {\n        engine->SaveNativeWinRes(ANativeWindow_getWidth(app->window),\n                                 ANativeWindow_getHeight(app->window),\n                                 ANativeWindow_getFormat(app->window));\n        engine->OnAppInitWindow();\n      }\n      break;\n    case APP_CMD_TERM_WINDOW:\n      engine->OnAppTermWindow();\n      ANativeWindow_setBuffersGeometry(\n          app->window, engine->GetSavedNativeWinWidth(),\n          engine->GetSavedNativeWinHeight(), engine->GetSavedNativeWinFormat());\n      break;\n    case APP_CMD_CONFIG_CHANGED:\n      engine->OnAppConfigChange();\n      break;\n    case APP_CMD_LOST_FOCUS:\n      break;\n  }\n}\n\nextern \"C\" void android_main(struct android_app* state) {\n  CameraEngine engine(state);\n  pEngineObj = &engine;\n\n  state->userData = reinterpret_cast<void*>(&engine);\n  state->onAppCmd = ProcessAndroidCmd;\n\n  // loop waiting for stuff to do.\n  while (!state->destroyRequested) {\n    struct android_poll_source* source = nullptr;\n    auto result = ALooper_pollOnce(0, NULL, nullptr, (void**)&source);\n    ASSERT(result != ALOOPER_POLL_ERROR, \"ALooper_pollOnce returned an error\");\n    if (source != NULL) {\n      source->process(state, source);\n    }\n    pEngineObj->DrawFrame();\n  }\n\n  LOGI(\"CameraEngine thread destroy requested!\");\n  engine.DeleteCamera();\n  pEngineObj = nullptr;\n}\n\n/**\n * Handle Android System APP_CMD_INIT_WINDOW message\n *   Request camera persmission from Java side\n *   Create camera object if camera has been granted\n */\nvoid CameraEngine::OnAppInitWindow(void) {\n  if (!cameraGranted_) {\n    // Not permitted to use camera yet, ask(again) and defer other events\n    RequestCameraPermission();\n    return;\n  }\n\n  rotation_ = GetDisplayRotation();\n\n  CreateCamera();\n  ASSERT(camera_, \"CameraCreation Failed\");\n\n  EnableUI();\n\n  // NativeActivity end is ready to display, start pulling images\n  cameraReady_ = true;\n  camera_->StartPreview(true);\n}\n\n/**\n * Handle APP_CMD_TEMR_WINDOW\n */\nvoid CameraEngine::OnAppTermWindow(void) {\n  cameraReady_ = false;\n  DeleteCamera();\n}\n\n/**\n * Handle APP_CMD_CONFIG_CHANGED\n */\nvoid CameraEngine::OnAppConfigChange(void) {\n  int newRotation = GetDisplayRotation();\n\n  if (newRotation != rotation_) {\n    OnAppTermWindow();\n\n    rotation_ = newRotation;\n    OnAppInitWindow();\n  }\n}\n\n/**\n * Retrieve saved native window width.\n * @return width of native window\n */\nint32_t CameraEngine::GetSavedNativeWinWidth(void) {\n  return savedNativeWinRes_.width;\n}\n\n/**\n * Retrieve saved native window height.\n * @return height of native window\n */\nint32_t CameraEngine::GetSavedNativeWinHeight(void) {\n  return savedNativeWinRes_.height;\n}\n\n/**\n * Retrieve saved native window format\n * @return format of native window\n */\nint32_t CameraEngine::GetSavedNativeWinFormat(void) {\n  return savedNativeWinRes_.format;\n}\n\n/**\n * Save original NativeWindow Resolution\n * @param w width of native window in pixel\n * @param h height of native window in pixel\n * @param format\n */\nvoid CameraEngine::SaveNativeWinRes(int32_t w, int32_t h, int32_t format) {\n  savedNativeWinRes_.width = w;\n  savedNativeWinRes_.height = h;\n  savedNativeWinRes_.format = format;\n}\n"
  },
  {
    "path": "camera/basic/src/main/cpp/camera_engine.cpp",
    "content": "/**\n * Copyright (C) 2017 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** Description\n *   Demonstrate NDK Camera interface added to android-24\n */\n\n#include \"camera_engine.h\"\n\n#include <ndksamples/camera/native_debug.h>\n\n#include <cstdio>\n\n/**\n * constructor and destructor for main application class\n * @param app native_app_glue environment\n * @return none\n */\nCameraEngine::CameraEngine(android_app* app)\n    : app_(app),\n      cameraGranted_(false),\n      rotation_(0),\n      cameraReady_(false),\n      camera_(nullptr),\n      yuvReader_(nullptr),\n      jpgReader_(nullptr) {\n  memset(&savedNativeWinRes_, 0, sizeof(savedNativeWinRes_));\n}\n\nCameraEngine::~CameraEngine() {\n  cameraReady_ = false;\n  DeleteCamera();\n}\n\nstruct android_app* CameraEngine::AndroidApp(void) const { return app_; }\n\n/**\n * Create a camera object for onboard BACK_FACING camera\n */\nvoid CameraEngine::CreateCamera(void) {\n  // Camera needed to be requested at the run-time from Java SDK\n  // if Not granted, do nothing.\n  if (!cameraGranted_ || !app_->window) {\n    LOGW(\"Camera Sample requires Full Camera access\");\n    return;\n  }\n\n  int32_t displayRotation = GetDisplayRotation();\n  rotation_ = displayRotation;\n\n  camera_ = new NDKCamera();\n  ASSERT(camera_, \"Failed to Create CameraObject\");\n\n  int32_t facing = 0, angle = 0, imageRotation = 0;\n  if (camera_->GetSensorOrientation(&facing, &angle)) {\n    if (facing == ACAMERA_LENS_FACING_FRONT) {\n      imageRotation = (angle + rotation_) % 360;\n      imageRotation = (360 - imageRotation) % 360;\n    } else {\n      imageRotation = (angle - rotation_ + 360) % 360;\n    }\n  }\n  LOGI(\"Phone Rotation: %d, Present Rotation Angle: %d\", rotation_,\n       imageRotation);\n  ImageFormat view{0, 0, 0}, capture{0, 0, 0};\n  camera_->MatchCaptureSizeRequest(app_->window, &view, &capture);\n\n  ASSERT(view.width && view.height, \"Could not find supportable resolution\");\n\n  // Request the necessary nativeWindow to OS\n  bool portraitNativeWindow =\n      (savedNativeWinRes_.width < savedNativeWinRes_.height);\n  ANativeWindow_setBuffersGeometry(\n      app_->window, portraitNativeWindow ? view.height : view.width,\n      portraitNativeWindow ? view.width : view.height, WINDOW_FORMAT_RGBA_8888);\n\n  yuvReader_ = new ImageReader(&view, AIMAGE_FORMAT_YUV_420_888);\n  yuvReader_->SetPresentRotation(imageRotation);\n  jpgReader_ = new ImageReader(&capture, AIMAGE_FORMAT_JPEG);\n  jpgReader_->SetPresentRotation(imageRotation);\n  jpgReader_->RegisterCallback(this, [](void* ctx, const char* str) -> void {\n    reinterpret_cast<CameraEngine*>(ctx)->OnPhotoTaken(str);\n  });\n\n  // now we could create session\n  camera_->CreateSession(yuvReader_->GetNativeWindow(),\n                         jpgReader_->GetNativeWindow(), imageRotation);\n}\n\nvoid CameraEngine::DeleteCamera(void) {\n  cameraReady_ = false;\n  if (camera_) {\n    delete camera_;\n    camera_ = nullptr;\n  }\n  if (yuvReader_) {\n    delete yuvReader_;\n    yuvReader_ = nullptr;\n  }\n  if (jpgReader_) {\n    delete jpgReader_;\n    jpgReader_ = nullptr;\n  }\n}\n\n/**\n * Initiate a Camera Run-time usage request to Java side implementation\n *  [ The request result will be passed back in function\n *    notifyCameraPermission()]\n */\nvoid CameraEngine::RequestCameraPermission() {\n  if (!app_) return;\n\n  JNIEnv* env;\n  ANativeActivity* activity = app_->activity;\n  activity->vm->GetEnv((void**)&env, JNI_VERSION_1_6);\n\n  activity->vm->AttachCurrentThread(&env, NULL);\n\n  jobject activityObj = env->NewGlobalRef(activity->clazz);\n  jclass clz = env->GetObjectClass(activityObj);\n  env->CallVoidMethod(activityObj,\n                      env->GetMethodID(clz, \"RequestCamera\", \"()V\"));\n  env->DeleteGlobalRef(activityObj);\n\n  activity->vm->DetachCurrentThread();\n}\n/**\n * Process to user's sensitivity and exposure value change\n * all values are represented in int64_t even exposure is just int32_t\n * @param code ACAMERA_SENSOR_EXPOSURE_TIME or ACAMERA_SENSOR_SENSITIVITY\n * @param val corresponding value from user\n */\nvoid CameraEngine::OnCameraParameterChanged(int32_t code, int64_t val) {\n  camera_->UpdateCameraRequestParameter(code, val);\n}\n\n/**\n * The main function rendering a frame. In our case, it is yuv to RGBA8888\n * converter\n */\nvoid CameraEngine::DrawFrame(void) {\n  if (!cameraReady_ || !yuvReader_) return;\n  AImage* image = yuvReader_->GetNextImage();\n  if (!image) {\n    return;\n  }\n\n  ANativeWindow_acquire(app_->window);\n  ANativeWindow_Buffer buf;\n  if (ANativeWindow_lock(app_->window, &buf, nullptr) < 0) {\n    yuvReader_->DeleteImage(image);\n    return;\n  }\n\n  yuvReader_->DisplayImage(&buf, image);\n  ANativeWindow_unlockAndPost(app_->window);\n  ANativeWindow_release(app_->window);\n}\n"
  },
  {
    "path": "camera/basic/src/main/cpp/camera_engine.h",
    "content": "\n/*\n * Copyright (C) 2017 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef __CAMERA_ENGINE_H__\n#define __CAMERA_ENGINE_H__\n\n#include <android/native_window.h>\n#include <android_native_app_glue.h>\n\n#include <functional>\n#include <thread>\n\n#include \"camera_manager.h\"\n\n/**\n * basic CameraAppEngine\n */\nclass CameraEngine {\n public:\n  explicit CameraEngine(android_app* app);\n  ~CameraEngine();\n\n  // Interfaces to android application framework\n  struct android_app* AndroidApp(void) const;\n  void OnAppInitWindow(void);\n  void DrawFrame(void);\n  void OnAppConfigChange(void);\n  void OnAppTermWindow(void);\n\n  // Native Window handlers\n  int32_t GetSavedNativeWinWidth(void);\n  int32_t GetSavedNativeWinHeight(void);\n  int32_t GetSavedNativeWinFormat(void);\n  void SaveNativeWinRes(int32_t w, int32_t h, int32_t format);\n\n  // UI handlers\n  void RequestCameraPermission();\n  void OnCameraPermission(jboolean granted);\n  void EnableUI(void);\n  void OnTakePhoto(void);\n  void OnCameraParameterChanged(int32_t code, int64_t val);\n\n  // Manage NDKCamera Object\n  void CreateCamera(void);\n  void DeleteCamera(void);\n\n private:\n  void OnPhotoTaken(const char* fileName);\n  int GetDisplayRotation(void);\n\n  struct android_app* app_;\n  ImageFormat savedNativeWinRes_;\n  bool cameraGranted_;\n  int rotation_;\n  volatile bool cameraReady_;\n  NDKCamera* camera_;\n  ImageReader* yuvReader_;\n  ImageReader* jpgReader_;\n};\n\n/**\n * retrieve global singleton CameraEngine instance\n * @return the only instance of CameraEngine in the app\n */\nCameraEngine* GetAppEngine(void);\n\n#endif  // __CAMERA_ENGINE_H__\n"
  },
  {
    "path": "camera/basic/src/main/cpp/camera_listeners.cpp",
    "content": "/*\n * Copyright (C) 2017 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#include <camera/NdkCameraManager.h>\n#include <ndksamples/camera/camera_utils.h>\n#include <ndksamples/camera/native_debug.h>\n\n#include <cinttypes>\n#include <queue>\n#include <thread>\n#include <utility>\n\n#include \"camera_manager.h\"\n\n/*\n * Camera Manager Listener object\n */\nvoid OnCameraAvailable(void* ctx, const char* id) {\n  reinterpret_cast<NDKCamera*>(ctx)->OnCameraStatusChanged(id, true);\n}\nvoid OnCameraUnavailable(void* ctx, const char* id) {\n  reinterpret_cast<NDKCamera*>(ctx)->OnCameraStatusChanged(id, false);\n}\n\n/**\n * OnCameraStatusChanged()\n *  handles Callback from ACameraManager\n */\nvoid NDKCamera::OnCameraStatusChanged(const char* id, bool available) {\n  if (valid_) {\n    cameras_[std::string(id)].available_ = available ? true : false;\n  }\n}\n\n/**\n * Construct a camera manager listener on the fly and return to caller\n *\n * @return ACameraManager_AvailabilityCallback\n */\nACameraManager_AvailabilityCallbacks* NDKCamera::GetManagerListener() {\n  static ACameraManager_AvailabilityCallbacks cameraMgrListener = {\n      .context = this,\n      .onCameraAvailable = ::OnCameraAvailable,\n      .onCameraUnavailable = ::OnCameraUnavailable,\n  };\n  return &cameraMgrListener;\n}\n\n/*\n * CameraDevice callbacks\n */\nvoid OnDeviceStateChanges(void* ctx, ACameraDevice* dev) {\n  reinterpret_cast<NDKCamera*>(ctx)->OnDeviceState(dev);\n}\n\nvoid OnDeviceErrorChanges(void* ctx, ACameraDevice* dev, int err) {\n  reinterpret_cast<NDKCamera*>(ctx)->OnDeviceError(dev, err);\n}\n\n#if __NDK_MAJOR__ >= 30\nvoid OnClientSharedAccessPriorityChanged(void*,\n                                         ACameraDevice*, bool) {\n    // TODO: Implement this.\n}\n#endif\n\nACameraDevice_stateCallbacks* NDKCamera::GetDeviceListener() {\n  static ACameraDevice_stateCallbacks cameraDeviceListener = {\n      .context = this,\n      .onDisconnected = ::OnDeviceStateChanges,\n      .onError = ::OnDeviceErrorChanges,\n#if __NDK_MAJOR__ >= 30\n      .onClientSharedAccessPriorityChanged = ::OnClientSharedAccessPriorityChanged\n#endif\n  };\n  return &cameraDeviceListener;\n}\n/**\n * Handle Camera DeviceStateChanges msg, notify device is disconnected\n * simply close the camera\n */\nvoid NDKCamera::OnDeviceState(ACameraDevice* dev) {\n  std::string id(ACameraDevice_getId(dev));\n  LOGW(\"device %s is disconnected\", id.c_str());\n\n  cameras_[id].available_ = false;\n  ACameraDevice_close(cameras_[id].device_);\n  cameras_.erase(id);\n}\n/**\n * Handles Camera's deviceErrorChanges message, no action;\n * mainly debugging purpose\n *\n *\n */\nvoid NDKCamera::OnDeviceError(ACameraDevice* dev, int err) {\n  std::string id(ACameraDevice_getId(dev));\n\n  LOGI(\"CameraDevice %s is in error %#x\", id.c_str(), err);\n  PrintCameraDeviceError(err);\n\n  CameraId& cam = cameras_[id];\n\n  switch (err) {\n    case ERROR_CAMERA_IN_USE:\n      cam.available_ = false;\n      cam.owner_ = false;\n      break;\n    case ERROR_CAMERA_SERVICE:\n    case ERROR_CAMERA_DEVICE:\n    case ERROR_CAMERA_DISABLED:\n    case ERROR_MAX_CAMERAS_IN_USE:\n      cam.available_ = false;\n      cam.owner_ = false;\n      break;\n    default:\n      LOGI(\"Unknown Camera Device Error: %#x\", err);\n  }\n}\n\n// CaptureSession state callbacks\nvoid OnSessionClosed(void* ctx, ACameraCaptureSession* ses) {\n  LOGW(\"session %p closed\", ses);\n  reinterpret_cast<NDKCamera*>(ctx)->OnSessionState(\n      ses, CaptureSessionState::CLOSED);\n}\nvoid OnSessionReady(void* ctx, ACameraCaptureSession* ses) {\n  LOGW(\"session %p ready\", ses);\n  reinterpret_cast<NDKCamera*>(ctx)->OnSessionState(ses,\n                                                    CaptureSessionState::READY);\n}\nvoid OnSessionActive(void* ctx, ACameraCaptureSession* ses) {\n  LOGW(\"session %p active\", ses);\n  reinterpret_cast<NDKCamera*>(ctx)->OnSessionState(\n      ses, CaptureSessionState::ACTIVE);\n}\n\nACameraCaptureSession_stateCallbacks* NDKCamera::GetSessionListener() {\n  static ACameraCaptureSession_stateCallbacks sessionListener = {\n      .context = this,\n      .onClosed = ::OnSessionClosed,\n      .onReady = ::OnSessionReady,\n      .onActive = ::OnSessionActive,\n  };\n  return &sessionListener;\n}\n\n/**\n * Handles capture session state changes.\n *   Update into internal session state.\n */\nvoid NDKCamera::OnSessionState(ACameraCaptureSession* ses,\n                               CaptureSessionState state) {\n  if (!ses || ses != captureSession_) {\n    LOGW(\"CaptureSession is %s\", (ses ? \"NOT our session\" : \"NULL\"));\n    return;\n  }\n\n  ASSERT(state < CaptureSessionState::MAX_STATE, \"Wrong state %d\",\n         static_cast<int>(state));\n\n  captureSessionState_ = state;\n}\n\n// Capture callbacks, mostly information purpose\nvoid SessionCaptureCallback_OnFailed(void* context,\n                                     ACameraCaptureSession* session,\n                                     ACaptureRequest* request,\n                                     ACameraCaptureFailure* failure) {\n  std::thread captureFailedThread(&NDKCamera::OnCaptureFailed,\n                                  static_cast<NDKCamera*>(context), session,\n                                  request, failure);\n  captureFailedThread.detach();\n}\n\nvoid SessionCaptureCallback_OnSequenceEnd(void* context,\n                                          ACameraCaptureSession* session,\n                                          int sequenceId, int64_t frameNumber) {\n  std::thread sequenceThread(&NDKCamera::OnCaptureSequenceEnd,\n                             static_cast<NDKCamera*>(context), session,\n                             sequenceId, frameNumber);\n  sequenceThread.detach();\n}\nvoid SessionCaptureCallback_OnSequenceAborted(void* context,\n                                              ACameraCaptureSession* session,\n                                              int sequenceId) {\n  std::thread sequenceThread(&NDKCamera::OnCaptureSequenceEnd,\n                             static_cast<NDKCamera*>(context), session,\n                             sequenceId, static_cast<int64_t>(-1));\n  sequenceThread.detach();\n}\n\nACameraCaptureSession_captureCallbacks* NDKCamera::GetCaptureCallback() {\n  static ACameraCaptureSession_captureCallbacks captureListener{\n      .context = this,\n      .onCaptureStarted = nullptr,\n      .onCaptureProgressed = nullptr,\n      .onCaptureCompleted = nullptr,\n      .onCaptureFailed = SessionCaptureCallback_OnFailed,\n      .onCaptureSequenceCompleted = SessionCaptureCallback_OnSequenceEnd,\n      .onCaptureSequenceAborted = SessionCaptureCallback_OnSequenceAborted,\n      .onCaptureBufferLost = nullptr,\n  };\n  return &captureListener;\n}\n\n/**\n * Process JPG capture SessionCaptureCallback_OnFailed event\n * If this is current JPG capture session, simply resume preview\n * @param session the capture session that failed\n * @param request the capture request that failed\n * @param failure for additional fail info.\n */\nvoid NDKCamera::OnCaptureFailed(ACameraCaptureSession*,\n                                ACaptureRequest* request,\n                                ACameraCaptureFailure* failure) {\n  if (valid_ && request == requests_[JPG_CAPTURE_REQUEST_IDX].request_) {\n    ASSERT(failure->sequenceId ==\n               requests_[JPG_CAPTURE_REQUEST_IDX].sessionSequenceId_,\n           \"Error jpg sequence id\")\n    StartPreview(true);\n  }\n}\n\n/**\n * Process event from JPEG capture\n *    SessionCaptureCallback_OnSequenceEnd()\n *    SessionCaptureCallback_OnSequenceAborted()\n *\n * If this is jpg capture, turn back on preview after a catpure.\n */\nvoid NDKCamera::OnCaptureSequenceEnd(ACameraCaptureSession*, int sequenceId,\n                                     int64_t) {\n  if (sequenceId != requests_[JPG_CAPTURE_REQUEST_IDX].sessionSequenceId_)\n    return;\n\n  // resume preview\n  CALL_SESSION(setRepeatingRequest(captureSession_, nullptr, 1,\n                                   &requests_[PREVIEW_REQUEST_IDX].request_,\n                                   nullptr));\n}\n"
  },
  {
    "path": "camera/basic/src/main/cpp/camera_manager.cpp",
    "content": "/*\n * Copyright (C) 2017 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#include \"camera_manager.h\"\n\n#include <camera/NdkCameraManager.h>\n#include <ndksamples/camera/camera_utils.h>\n#include <ndksamples/camera/native_debug.h>\n#include <unistd.h>\n\n#include <cinttypes>\n#include <queue>\n#include <utility>\n\n/**\n * Range of Camera Exposure Time:\n *     Camera's capability range have a very long range which may be disturbing\n *     on camera. For this sample purpose, clamp to a range showing visible\n *     video on preview: 100000ns ~ 250000000ns\n */\nstatic const int64_t kMinExposureTime = 1000000;\nstatic const int64_t kMaxExposureTime = 250000000;\n\nNDKCamera::NDKCamera()\n    : cameraMgr_(nullptr),\n      activeCameraId_(\"\"),\n      cameraFacing_(ACAMERA_LENS_FACING_BACK),\n      cameraOrientation_(0),\n      outputContainer_(nullptr),\n      captureSessionState_(CaptureSessionState::MAX_STATE),\n      exposureTime_(static_cast<int64_t>(0)) {\n  valid_ = false;\n  requests_.resize(CAPTURE_REQUEST_COUNT);\n  memset(requests_.data(), 0, requests_.size() * sizeof(requests_[0]));\n  cameras_.clear();\n  cameraMgr_ = ACameraManager_create();\n  ASSERT(cameraMgr_, \"Failed to create cameraManager\");\n\n  // Pick up a back-facing camera to preview\n  EnumerateCamera();\n  ASSERT(activeCameraId_.size(), \"Unknown ActiveCameraIdx\");\n\n  // Create back facing camera device\n  CALL_MGR(openCamera(cameraMgr_, activeCameraId_.c_str(), GetDeviceListener(),\n                      &cameras_[activeCameraId_].device_));\n\n  CALL_MGR(registerAvailabilityCallback(cameraMgr_, GetManagerListener()));\n\n  // Initialize camera controls(exposure time and sensitivity), pick\n  // up value of 2% * range + min as starting value (just a number, no magic)\n  ACameraMetadata* metadataObj;\n  CALL_MGR(getCameraCharacteristics(cameraMgr_, activeCameraId_.c_str(),\n                                    &metadataObj));\n  ACameraMetadata_const_entry val = {};\n  camera_status_t status = ACameraMetadata_getConstEntry(\n      metadataObj, ACAMERA_SENSOR_INFO_EXPOSURE_TIME_RANGE, &val);\n  if (status == ACAMERA_OK) {\n    exposureRange_.min_ = val.data.i64[0];\n    if (exposureRange_.min_ < kMinExposureTime) {\n      exposureRange_.min_ = kMinExposureTime;\n    }\n    exposureRange_.max_ = val.data.i64[1];\n    if (exposureRange_.max_ > kMaxExposureTime) {\n      exposureRange_.max_ = kMaxExposureTime;\n    }\n    exposureTime_ = exposureRange_.value(2);\n  } else {\n    LOGW(\"Unsupported ACAMERA_SENSOR_INFO_EXPOSURE_TIME_RANGE\");\n    exposureRange_.min_ = exposureRange_.max_ = 0l;\n    exposureTime_ = 0l;\n  }\n  status = ACameraMetadata_getConstEntry(\n      metadataObj, ACAMERA_SENSOR_INFO_SENSITIVITY_RANGE, &val);\n\n  if (status == ACAMERA_OK) {\n    sensitivityRange_.min_ = val.data.i32[0];\n    sensitivityRange_.max_ = val.data.i32[1];\n\n    sensitivity_ = sensitivityRange_.value(2);\n  } else {\n    LOGW(\"failed for ACAMERA_SENSOR_INFO_SENSITIVITY_RANGE\");\n    sensitivityRange_.min_ = sensitivityRange_.max_ = 0;\n    sensitivity_ = 0;\n  }\n  valid_ = true;\n}\n\n/**\n * A helper class to assist image size comparison, by comparing the absolute\n * size\n * regardless of the portrait or landscape mode.\n */\nclass DisplayDimension {\n public:\n  DisplayDimension(int32_t w, int32_t h) : w_(w), h_(h), portrait_(false) {\n    if (h > w) {\n      // make it landscape\n      w_ = h;\n      h_ = w;\n      portrait_ = true;\n    }\n  }\n  DisplayDimension(const DisplayDimension& other) {\n    w_ = other.w_;\n    h_ = other.h_;\n    portrait_ = other.portrait_;\n  }\n\n  DisplayDimension(void) {\n    w_ = 0;\n    h_ = 0;\n    portrait_ = false;\n  }\n  DisplayDimension& operator=(const DisplayDimension& other) {\n    w_ = other.w_;\n    h_ = other.h_;\n    portrait_ = other.portrait_;\n\n    return (*this);\n  }\n\n  bool IsSameRatio(DisplayDimension& other) {\n    return (w_ * other.h_ == h_ * other.w_);\n  }\n  bool operator>(DisplayDimension& other) {\n    return (w_ >= other.w_ & h_ >= other.h_);\n  }\n  bool operator==(DisplayDimension& other) {\n    return (w_ == other.w_ && h_ == other.h_ && portrait_ == other.portrait_);\n  }\n  DisplayDimension operator-(DisplayDimension& other) {\n    DisplayDimension delta(w_ - other.w_, h_ - other.h_);\n    return delta;\n  }\n  void Flip(void) { portrait_ = !portrait_; }\n  bool IsPortrait(void) { return portrait_; }\n  int32_t width(void) { return w_; }\n  int32_t height(void) { return h_; }\n  int32_t org_width(void) { return (portrait_ ? h_ : w_); }\n  int32_t org_height(void) { return (portrait_ ? w_ : h_); }\n\n private:\n  int32_t w_, h_;\n  bool portrait_;\n};\n\n/**\n * Find a compatible camera modes:\n *    1) the same aspect ration as the native display window, which should be a\n *       rotated version of the physical device\n *    2) the smallest resolution in the camera mode list\n * This is to minimize the later color space conversion workload.\n */\nbool NDKCamera::MatchCaptureSizeRequest(ANativeWindow* display,\n                                        ImageFormat* resView,\n                                        ImageFormat* resCap) {\n  DisplayDimension disp(ANativeWindow_getWidth(display),\n                        ANativeWindow_getHeight(display));\n  if (cameraOrientation_ == 90 || cameraOrientation_ == 270) {\n    disp.Flip();\n  }\n\n  ACameraMetadata* metadata;\n  CALL_MGR(\n      getCameraCharacteristics(cameraMgr_, activeCameraId_.c_str(), &metadata));\n  ACameraMetadata_const_entry entry;\n  CALL_METADATA(getConstEntry(\n      metadata, ACAMERA_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, &entry));\n  // format of the data: format, width, height, input?, type int32\n  bool foundIt = false;\n  DisplayDimension foundRes(4000, 4000);\n  DisplayDimension maxJPG(0, 0);\n\n  for (uint32_t i = 0; i < entry.count; i += 4) {\n    int32_t input = entry.data.i32[i + 3];\n    int32_t format = entry.data.i32[i + 0];\n    if (input) continue;\n\n    if (format == AIMAGE_FORMAT_YUV_420_888 || format == AIMAGE_FORMAT_JPEG) {\n      DisplayDimension res(entry.data.i32[i + 1], entry.data.i32[i + 2]);\n      if (!disp.IsSameRatio(res)) continue;\n      if (format == AIMAGE_FORMAT_YUV_420_888 && foundRes > res) {\n        foundIt = true;\n        foundRes = res;\n      } else if (format == AIMAGE_FORMAT_JPEG && res > maxJPG) {\n        maxJPG = res;\n      }\n    }\n  }\n\n  if (foundIt) {\n    resView->width = foundRes.org_width();\n    resView->height = foundRes.org_height();\n    resCap->width = maxJPG.org_width();\n    resCap->height = maxJPG.org_height();\n  } else {\n    LOGW(\"Did not find any compatible camera resolution, taking 640x480\");\n    if (disp.IsPortrait()) {\n      resView->width = 480;\n      resView->height = 640;\n    } else {\n      resView->width = 640;\n      resView->height = 480;\n    }\n    *resCap = *resView;\n  }\n  resView->format = AIMAGE_FORMAT_YUV_420_888;\n  resCap->format = AIMAGE_FORMAT_JPEG;\n  return foundIt;\n}\n\nvoid NDKCamera::CreateSession(ANativeWindow* previewWindow,\n                              ANativeWindow* jpgWindow, int32_t imageRotation) {\n  // Create output from this app's ANativeWindow, and add into output container\n  requests_[PREVIEW_REQUEST_IDX].outputNativeWindow_ = previewWindow;\n  requests_[PREVIEW_REQUEST_IDX].template_ = TEMPLATE_PREVIEW;\n  requests_[JPG_CAPTURE_REQUEST_IDX].outputNativeWindow_ = jpgWindow;\n  requests_[JPG_CAPTURE_REQUEST_IDX].template_ = TEMPLATE_STILL_CAPTURE;\n\n  CALL_CONTAINER(create(&outputContainer_));\n  for (auto& req : requests_) {\n    ANativeWindow_acquire(req.outputNativeWindow_);\n    CALL_OUTPUT(create(req.outputNativeWindow_, &req.sessionOutput_));\n    CALL_CONTAINER(add(outputContainer_, req.sessionOutput_));\n    CALL_TARGET(create(req.outputNativeWindow_, &req.target_));\n    CALL_DEV(createCaptureRequest(cameras_[activeCameraId_].device_,\n                                  req.template_, &req.request_));\n    CALL_REQUEST(addTarget(req.request_, req.target_));\n  }\n\n  // Create a capture session for the given preview request\n  captureSessionState_ = CaptureSessionState::READY;\n  CALL_DEV(createCaptureSession(cameras_[activeCameraId_].device_,\n                                outputContainer_, GetSessionListener(),\n                                &captureSession_));\n\n  ACaptureRequest_setEntry_i32(requests_[JPG_CAPTURE_REQUEST_IDX].request_,\n                               ACAMERA_JPEG_ORIENTATION, 1, &imageRotation);\n\n  /*\n   * Only preview request is in manual mode, JPG is always in Auto mode\n   * JPG capture mode could also be switch into manual mode and control\n   * the capture parameters, this sample leaves JPG capture to be auto mode\n   * (auto control has better effect than author's manual control)\n   */\n  uint8_t aeModeOff = ACAMERA_CONTROL_AE_MODE_OFF;\n  CALL_REQUEST(setEntry_u8(requests_[PREVIEW_REQUEST_IDX].request_,\n                           ACAMERA_CONTROL_AE_MODE, 1, &aeModeOff));\n  CALL_REQUEST(setEntry_i32(requests_[PREVIEW_REQUEST_IDX].request_,\n                            ACAMERA_SENSOR_SENSITIVITY, 1, &sensitivity_));\n  CALL_REQUEST(setEntry_i64(requests_[PREVIEW_REQUEST_IDX].request_,\n                            ACAMERA_SENSOR_EXPOSURE_TIME, 1, &exposureTime_));\n}\n\nNDKCamera::~NDKCamera() {\n  valid_ = false;\n  // stop session if it is on:\n  if (captureSessionState_ == CaptureSessionState::ACTIVE) {\n    ACameraCaptureSession_stopRepeating(captureSession_);\n  }\n  ACameraCaptureSession_close(captureSession_);\n\n  for (auto& req : requests_) {\n    CALL_REQUEST(removeTarget(req.request_, req.target_));\n    ACaptureRequest_free(req.request_);\n    ACameraOutputTarget_free(req.target_);\n\n    CALL_CONTAINER(remove(outputContainer_, req.sessionOutput_));\n    ACaptureSessionOutput_free(req.sessionOutput_);\n\n    ANativeWindow_release(req.outputNativeWindow_);\n  }\n\n  requests_.resize(0);\n  ACaptureSessionOutputContainer_free(outputContainer_);\n\n  for (auto& cam : cameras_) {\n    if (cam.second.device_) {\n      CALL_DEV(close(cam.second.device_));\n    }\n  }\n  cameras_.clear();\n  if (cameraMgr_) {\n    CALL_MGR(unregisterAvailabilityCallback(cameraMgr_, GetManagerListener()));\n    ACameraManager_delete(cameraMgr_);\n    cameraMgr_ = nullptr;\n  }\n}\n\n/**\n * EnumerateCamera()\n *     Loop through cameras on the system, pick up\n *     1) back facing one if available\n *     2) otherwise pick the first one reported to us\n */\nvoid NDKCamera::EnumerateCamera() {\n  ACameraIdList* cameraIds = nullptr;\n  CALL_MGR(getCameraIdList(cameraMgr_, &cameraIds));\n\n  for (int i = 0; i < cameraIds->numCameras; ++i) {\n    const char* id = cameraIds->cameraIds[i];\n\n    ACameraMetadata* metadataObj;\n    CALL_MGR(getCameraCharacteristics(cameraMgr_, id, &metadataObj));\n\n    int32_t count = 0;\n    const uint32_t* tags = nullptr;\n    ACameraMetadata_getAllTags(metadataObj, &count, &tags);\n    for (int tagIdx = 0; tagIdx < count; ++tagIdx) {\n      if (ACAMERA_LENS_FACING == tags[tagIdx]) {\n        ACameraMetadata_const_entry lensInfo = {};\n        CALL_METADATA(getConstEntry(metadataObj, tags[tagIdx], &lensInfo));\n        CameraId cam(id);\n        cam.facing_ = static_cast<acamera_metadata_enum_android_lens_facing_t>(\n            lensInfo.data.u8[0]);\n        cam.owner_ = false;\n        cam.device_ = nullptr;\n        cameras_[cam.id_] = cam;\n        if (cam.facing_ == ACAMERA_LENS_FACING_BACK) {\n          activeCameraId_ = cam.id_;\n        }\n        break;\n      }\n    }\n    ACameraMetadata_free(metadataObj);\n  }\n\n  ASSERT(cameras_.size(), \"No Camera Available on the device\");\n  if (activeCameraId_.length() == 0) {\n    // if no back facing camera found, pick up the first one to use...\n    activeCameraId_ = cameras_.begin()->second.id_;\n  }\n  ACameraManager_deleteCameraIdList(cameraIds);\n}\n\n/**\n * GetSensorOrientation()\n *     Retrieve current sensor orientation regarding to the phone device\n * orientation\n *     SensorOrientation is NOT settable.\n */\nbool NDKCamera::GetSensorOrientation(int32_t* facing, int32_t* angle) {\n  if (!cameraMgr_) {\n    return false;\n  }\n\n  ACameraMetadata* metadataObj;\n  ACameraMetadata_const_entry face, orientation;\n  CALL_MGR(getCameraCharacteristics(cameraMgr_, activeCameraId_.c_str(),\n                                    &metadataObj));\n  CALL_METADATA(getConstEntry(metadataObj, ACAMERA_LENS_FACING, &face));\n  cameraFacing_ = static_cast<int32_t>(face.data.u8[0]);\n\n  CALL_METADATA(\n      getConstEntry(metadataObj, ACAMERA_SENSOR_ORIENTATION, &orientation));\n\n  LOGI(\"====Current SENSOR_ORIENTATION: %8d\", orientation.data.i32[0]);\n\n  ACameraMetadata_free(metadataObj);\n  cameraOrientation_ = orientation.data.i32[0];\n\n  if (facing) *facing = cameraFacing_;\n  if (angle) *angle = cameraOrientation_;\n  return true;\n}\n\n/**\n * StartPreview()\n *   Toggle preview start/stop\n */\nvoid NDKCamera::StartPreview(bool start) {\n  if (start) {\n    CALL_SESSION(setRepeatingRequest(captureSession_, nullptr, 1,\n                                     &requests_[PREVIEW_REQUEST_IDX].request_,\n                                     nullptr));\n  } else if (!start && captureSessionState_ == CaptureSessionState::ACTIVE) {\n    ACameraCaptureSession_stopRepeating(captureSession_);\n  } else {\n    ASSERT(false, \"Conflict states(%s, %d)\", (start ? \"true\" : \"false\"),\n           static_cast<int>(captureSessionState_));\n  }\n}\n\n/**\n * Capture one jpg photo into\n *     /sdcard/DCIM/Camera\n * refer to WriteFile() for details\n */\nbool NDKCamera::TakePhoto(void) {\n  if (captureSessionState_ == CaptureSessionState::ACTIVE) {\n    ACameraCaptureSession_stopRepeating(captureSession_);\n  }\n\n  CALL_SESSION(capture(captureSession_, GetCaptureCallback(), 1,\n                       &requests_[JPG_CAPTURE_REQUEST_IDX].request_,\n                       &requests_[JPG_CAPTURE_REQUEST_IDX].sessionSequenceId_));\n  return true;\n}\n\nvoid NDKCamera::UpdateCameraRequestParameter(int32_t code, int64_t val) {\n  ACaptureRequest* request = requests_[PREVIEW_REQUEST_IDX].request_;\n  switch (code) {\n    case ACAMERA_SENSOR_EXPOSURE_TIME:\n      if (exposureRange_.Supported()) {\n        exposureTime_ = val;\n        CALL_REQUEST(setEntry_i64(request, ACAMERA_SENSOR_EXPOSURE_TIME, 1,\n                                  &exposureTime_));\n      }\n      break;\n\n    case ACAMERA_SENSOR_SENSITIVITY:\n      if (sensitivityRange_.Supported()) {\n        sensitivity_ = val;\n        CALL_REQUEST(setEntry_i32(request, ACAMERA_SENSOR_SENSITIVITY, 1,\n                                  &sensitivity_));\n      }\n      break;\n    default:\n      ASSERT(false, \"==ERROR==: error code for CameraParameterChange: %d\",\n             code);\n      return;\n  }\n\n  uint8_t aeModeOff = ACAMERA_CONTROL_AE_MODE_OFF;\n  CALL_REQUEST(setEntry_u8(request, ACAMERA_CONTROL_AE_MODE, 1, &aeModeOff));\n  CALL_SESSION(\n      setRepeatingRequest(captureSession_, nullptr, 1, &request,\n                          &requests_[PREVIEW_REQUEST_IDX].sessionSequenceId_));\n}\n\n/**\n * Retrieve Camera Exposure adjustable range.\n *\n * @param min Camera minimium exposure time in nanoseconds\n * @param max Camera maximum exposure tiem in nanoseconds\n *\n * @return true  min and max are loaded with the camera's exposure values\n *         false camera has not initialized, no value available\n */\nbool NDKCamera::GetExposureRange(int64_t* min, int64_t* max, int64_t* curVal) {\n  if (!exposureRange_.Supported() || !exposureTime_ || !min || !max ||\n      !curVal) {\n    return false;\n  }\n  *min = exposureRange_.min_;\n  *max = exposureRange_.max_;\n  *curVal = exposureTime_;\n\n  return true;\n}\n\n/**\n * Retrieve Camera sensitivity range.\n *\n * @param min Camera minimium sensitivity\n * @param max Camera maximum sensitivity\n *\n * @return true  min and max are loaded with the camera's sensitivity values\n *         false camera has not initialized, no value available\n */\nbool NDKCamera::GetSensitivityRange(int64_t* min, int64_t* max,\n                                    int64_t* curVal) {\n  if (!sensitivityRange_.Supported() || !sensitivity_ || !min || !max ||\n      !curVal) {\n    return false;\n  }\n  *min = static_cast<int64_t>(sensitivityRange_.min_);\n  *max = static_cast<int64_t>(sensitivityRange_.max_);\n  *curVal = sensitivity_;\n  return true;\n}\n"
  },
  {
    "path": "camera/basic/src/main/cpp/camera_manager.h",
    "content": "/*\n * Copyright (C) 2017 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef CAMERA_NATIVE_CAMERA_H\n#define CAMERA_NATIVE_CAMERA_H\n#include <camera/NdkCameraDevice.h>\n#include <camera/NdkCameraError.h>\n#include <camera/NdkCameraManager.h>\n#include <camera/NdkCameraMetadataTags.h>\n\n#include <map>\n#include <string>\n#include <vector>\n\n#include \"image_reader.h\"\n\nenum class CaptureSessionState : int32_t {\n  READY = 0,  // session is ready\n  ACTIVE,     // session is busy\n  CLOSED,     // session is closed(by itself or a new session evicts)\n  MAX_STATE\n};\n\ntemplate <typename T>\nclass RangeValue {\n public:\n  T min_, max_;\n  /**\n   * return absolute value from relative value\n   * value: in percent (50 for 50%)\n   */\n  T value(int percent) {\n    return static_cast<T>(min_ + (max_ - min_) * percent / 100);\n  }\n  RangeValue() { min_ = max_ = static_cast<T>(0); }\n\n  bool Supported(void) const { return (min_ != max_); }\n};\n\nenum PREVIEW_INDICES {\n  PREVIEW_REQUEST_IDX = 0,\n  JPG_CAPTURE_REQUEST_IDX,\n  CAPTURE_REQUEST_COUNT,\n};\n\nstruct CaptureRequestInfo {\n  ANativeWindow* outputNativeWindow_;\n  ACaptureSessionOutput* sessionOutput_;\n  ACameraOutputTarget* target_;\n  ACaptureRequest* request_;\n  ACameraDevice_request_template template_;\n  int sessionSequenceId_;\n};\n\nclass CameraId;\nclass NDKCamera {\n private:\n  ACameraManager* cameraMgr_;\n  std::map<std::string, CameraId> cameras_;\n  std::string activeCameraId_;\n  uint32_t cameraFacing_;\n  uint32_t cameraOrientation_;\n\n  std::vector<CaptureRequestInfo> requests_;\n\n  ACaptureSessionOutputContainer* outputContainer_;\n  ACameraCaptureSession* captureSession_;\n  CaptureSessionState captureSessionState_;\n\n  // set up exposure control\n  int64_t exposureTime_;\n  RangeValue<int64_t> exposureRange_;\n  int32_t sensitivity_;\n  RangeValue<int32_t> sensitivityRange_;\n  volatile bool valid_;\n\n  ACameraManager_AvailabilityCallbacks* GetManagerListener();\n  ACameraDevice_stateCallbacks* GetDeviceListener();\n  ACameraCaptureSession_stateCallbacks* GetSessionListener();\n  ACameraCaptureSession_captureCallbacks* GetCaptureCallback();\n\n public:\n  NDKCamera();\n  ~NDKCamera();\n  void EnumerateCamera(void);\n  bool MatchCaptureSizeRequest(ANativeWindow* display, ImageFormat* view,\n                               ImageFormat* capture);\n  void CreateSession(ANativeWindow* previewWindow, ANativeWindow* jpgWindow,\n                     int32_t imageRotation);\n  bool GetSensorOrientation(int32_t* facing, int32_t* angle);\n  void OnCameraStatusChanged(const char* id, bool available);\n  void OnDeviceState(ACameraDevice* dev);\n  void OnDeviceError(ACameraDevice* dev, int err);\n  void OnSessionState(ACameraCaptureSession* ses, CaptureSessionState state);\n  void OnCaptureSequenceEnd(ACameraCaptureSession* session, int sequenceId,\n                            int64_t frameNumber);\n  void OnCaptureFailed(ACameraCaptureSession* session, ACaptureRequest* request,\n                       ACameraCaptureFailure* failure);\n  void StartPreview(bool start);\n  bool TakePhoto(void);\n  bool GetExposureRange(int64_t* min, int64_t* max, int64_t* curVal);\n  bool GetSensitivityRange(int64_t* min, int64_t* max, int64_t* curVal);\n\n  void UpdateCameraRequestParameter(int32_t code, int64_t val);\n};\n\n// helper classes to hold enumerated camera\nclass CameraId {\n public:\n  ACameraDevice* device_;\n  std::string id_;\n  acamera_metadata_enum_android_lens_facing_t facing_;\n  bool available_;  // free to use ( no other apps are using\n  bool owner_;      // we are the owner of the camera\n  explicit CameraId(const char* id)\n      : device_(nullptr),\n        facing_(ACAMERA_LENS_FACING_FRONT),\n        available_(false),\n        owner_(false) {\n    id_ = id;\n  }\n\n  explicit CameraId(void) { CameraId(\"\"); }\n};\n\n#endif  // CAMERA_NATIVE_CAMERA_H\n"
  },
  {
    "path": "camera/basic/src/main/cpp/camera_ui.cpp",
    "content": "\n/*\n * Copyright (C) 2017 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include <base/macros.h>\n#include <ndksamples/camera/native_debug.h>\n\n#include \"camera_engine.h\"\n\n/**\n * Retrieve current rotation from Java side\n *\n * @return current rotation angle\n */\nint CameraEngine::GetDisplayRotation() {\n  ASSERT(app_, \"Application is not initialized\");\n\n  JNIEnv* env;\n  ANativeActivity* activity = app_->activity;\n  activity->vm->GetEnv((void**)&env, JNI_VERSION_1_6);\n\n  activity->vm->AttachCurrentThread(&env, NULL);\n\n  jobject activityObj = env->NewGlobalRef(activity->clazz);\n  jclass clz = env->GetObjectClass(activityObj);\n  jint newOrientation = env->CallIntMethod(\n      activityObj, env->GetMethodID(clz, \"getRotationDegree\", \"()I\"));\n  env->DeleteGlobalRef(activityObj);\n\n  activity->vm->DetachCurrentThread();\n  return newOrientation;\n}\n\n/**\n * Initializate UI on Java side. The 2 seekBars' values are passed in\n * array in the tuple of ( min, max, curVal )\n *   0: exposure min\n *   1: exposure max\n *   2: exposure val\n *   3: sensitivity min\n *   4: sensitivity max\n *   5: sensitivity val\n */\nconst int kInitDataLen = 6;\nvoid CameraEngine::EnableUI(void) {\n  JNIEnv* jni;\n  app_->activity->vm->AttachCurrentThread(&jni, NULL);\n  int64_t range[3];\n\n  // Default class retrieval\n  jclass clazz = jni->GetObjectClass(app_->activity->clazz);\n  jmethodID methodID = jni->GetMethodID(clazz, \"EnableUI\", \"([J)V\");\n  jlongArray initData = jni->NewLongArray(kInitDataLen);\n\n  ASSERT(initData && methodID, \"JavaUI interface Object failed(%p, %p)\",\n         methodID, initData);\n\n  if (!camera_->GetExposureRange(&range[0], &range[1], &range[2])) {\n    memset(range, 0, sizeof(int64_t) * 3);\n  }\n\n  jni->SetLongArrayRegion(initData, 0, 3, range);\n\n  if (!camera_->GetSensitivityRange(&range[0], &range[1], &range[2])) {\n    memset(range, 0, sizeof(int64_t) * 3);\n  }\n  jni->SetLongArrayRegion(initData, 3, 3, range);\n  jni->CallVoidMethod(app_->activity->clazz, methodID, initData);\n  app_->activity->vm->DetachCurrentThread();\n}\n\n/**\n * Handles UI request to take a photo into\n *   /sdcard/DCIM/Camera\n */\nvoid CameraEngine::OnTakePhoto() {\n  if (camera_) {\n    camera_->TakePhoto();\n  }\n}\n\nvoid CameraEngine::OnPhotoTaken(const char* fileName) {\n  JNIEnv* jni;\n  app_->activity->vm->AttachCurrentThread(&jni, NULL);\n\n  // Default class retrieval\n  jclass clazz = jni->GetObjectClass(app_->activity->clazz);\n  jmethodID methodID =\n      jni->GetMethodID(clazz, \"OnPhotoTaken\", \"(Ljava/lang/String;)V\");\n  jstring javaName = jni->NewStringUTF(fileName);\n\n  jni->CallVoidMethod(app_->activity->clazz, methodID, javaName);\n  app_->activity->vm->DetachCurrentThread();\n}\n/**\n * Process user camera and disk writing permission\n * Resume application initialization after user granted camera and disk usage\n * If user denied permission, do nothing: no camera\n *\n * @param granted user's authorization for camera and disk usage.\n * @return none\n */\nvoid CameraEngine::OnCameraPermission(jboolean granted) {\n  cameraGranted_ = (granted != JNI_FALSE);\n\n  // TODO: Fail gracefully.\n  ASSERT(cameraGranted_, \"required app permissions were not granted\");\n  OnAppInitWindow();\n}\n\n/**\n *  A couple UI handles ( from UI )\n *      user camera and disk permission\n *      exposure and sensitivity SeekBars\n *      takePhoto button\n */\nvoid notifyCameraPermission(JNIEnv*, jclass, jboolean permission) {\n  std::thread permissionHandler(&CameraEngine::OnCameraPermission,\n                                GetAppEngine(), permission);\n  permissionHandler.detach();\n}\n\nvoid TakePhoto(JNIEnv*, jclass) {\n  std::thread takePhotoHandler(&CameraEngine::OnTakePhoto, GetAppEngine());\n  takePhotoHandler.detach();\n}\n\nvoid OnExposureChanged(JNIEnv*, jobject, jlong exposurePercent) {\n  GetAppEngine()->OnCameraParameterChanged(ACAMERA_SENSOR_EXPOSURE_TIME,\n                                           exposurePercent);\n}\n\nvoid OnSensitivityChanged(JNIEnv*, jobject, jlong sensitivity) {\n  GetAppEngine()->OnCameraParameterChanged(ACAMERA_SENSOR_SENSITIVITY,\n                                           sensitivity);\n}\n\nextern \"C\" JNIEXPORT jint JNI_OnLoad(JavaVM* _Nonnull vm, void* _Nullable) {\n  JNIEnv* env;\n  if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {\n    return JNI_ERR;\n  }\n\n  jclass c = env->FindClass(\"com/sample/camera/basic/CameraActivity\");\n  if (c == nullptr) return JNI_ERR;\n\n  static const JNINativeMethod methods[] = {\n      {\"notifyCameraPermission\", \"(Z)V\",\n       reinterpret_cast<void*>(notifyCameraPermission)},\n      {\"TakePhoto\", \"()V\", reinterpret_cast<void*>(TakePhoto)},\n      {\"OnExposureChanged\", \"(J)V\", reinterpret_cast<void*>(OnExposureChanged)},\n      {\"OnSensitivityChanged\", \"(J)V\",\n       reinterpret_cast<void*>(OnSensitivityChanged)},\n  };\n  int rc = env->RegisterNatives(c, methods, arraysize(methods));\n  if (rc != JNI_OK) return rc;\n\n  return JNI_VERSION_1_6;\n}\n"
  },
  {
    "path": "camera/basic/src/main/cpp/image_reader.cpp",
    "content": "/*\n * Copyright (C) 2017 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#include \"image_reader.h\"\n\n#include <dirent.h>\n#include <ndksamples/camera/native_debug.h>\n\n#include <cstdlib>\n#include <ctime>\n#include <functional>\n#include <string>\n#include <thread>\n\n/*\n * For JPEG capture, captured files are saved under\n *     DirName\n * File names are incrementally appended an index number as\n *     capture0.jpg, capture1.jpg, capture2.jpg\n */\nstatic const char* kDirName = \"/sdcard/DCIM/Camera/\";\nstatic const char* kFileName = \"capture\";\n\n/**\n * MAX_BUF_COUNT:\n *   Max buffers in this ImageReader.\n */\n#define MAX_BUF_COUNT 4\n\n/**\n * ImageReader listener: called by AImageReader for every frame captured\n * We pass the event to ImageReader class, so it could do some housekeeping\n * about\n * the loaded queue. For example, we could keep a counter to track how many\n * buffers are full and idle in the queue. If camera almost has no buffer to\n * capture\n * we could release ( skip ) some frames by AImageReader_getNextImage() and\n * AImageReader_delete().\n */\nvoid OnImageCallback(void* ctx, AImageReader* reader) {\n  reinterpret_cast<ImageReader*>(ctx)->ImageCallback(reader);\n}\n\n/**\n * Constructor\n */\nImageReader::ImageReader(ImageFormat* res, enum AIMAGE_FORMATS format)\n    : presentRotation_(0), reader_(nullptr) {\n  callback_ = nullptr;\n  callbackCtx_ = nullptr;\n\n  media_status_t status = AImageReader_new(res->width, res->height, format,\n                                           MAX_BUF_COUNT, &reader_);\n  ASSERT(reader_ && status == AMEDIA_OK, \"Failed to create AImageReader\");\n\n  AImageReader_ImageListener listener{\n      .context = this,\n      .onImageAvailable = OnImageCallback,\n  };\n  AImageReader_setImageListener(reader_, &listener);\n}\n\nImageReader::~ImageReader() {\n  ASSERT(reader_, \"NULL Pointer to %s\", __FUNCTION__);\n  AImageReader_delete(reader_);\n}\n\nvoid ImageReader::RegisterCallback(\n    void* ctx, std::function<void(void* ctx, const char* fileName)> func) {\n  callbackCtx_ = ctx;\n  callback_ = func;\n}\n\nvoid ImageReader::ImageCallback(AImageReader* reader) {\n  int32_t format;\n  media_status_t status = AImageReader_getFormat(reader, &format);\n  ASSERT(status == AMEDIA_OK, \"Failed to get the media format\");\n  if (format == AIMAGE_FORMAT_JPEG) {\n    AImage* image = nullptr;\n    media_status_t status = AImageReader_acquireNextImage(reader, &image);\n    ASSERT(status == AMEDIA_OK && image, \"Image is not available\");\n\n    // Create a thread and write out the jpeg files\n    std::thread writeFileHandler(&ImageReader::WriteFile, this, image);\n    writeFileHandler.detach();\n  }\n}\n\nANativeWindow* ImageReader::GetNativeWindow(void) {\n  if (!reader_) return nullptr;\n  ANativeWindow* nativeWindow;\n  media_status_t status = AImageReader_getWindow(reader_, &nativeWindow);\n  ASSERT(status == AMEDIA_OK, \"Could not get ANativeWindow\");\n\n  return nativeWindow;\n}\n\n/**\n * GetNextImage()\n *   Retrieve the next image in ImageReader's bufferQueue, NOT the last image so\n * no image is skipped. Recommended for batch/background processing.\n */\nAImage* ImageReader::GetNextImage(void) {\n  AImage* image;\n  media_status_t status = AImageReader_acquireNextImage(reader_, &image);\n  if (status != AMEDIA_OK) {\n    return nullptr;\n  }\n  return image;\n}\n\n/**\n * GetLatestImage()\n *   Retrieve the last image in ImageReader's bufferQueue, deleting images in\n * in front of it on the queue. Recommended for real-time processing.\n */\nAImage* ImageReader::GetLatestImage(void) {\n  AImage* image;\n  media_status_t status = AImageReader_acquireLatestImage(reader_, &image);\n  if (status != AMEDIA_OK) {\n    return nullptr;\n  }\n  return image;\n}\n\n/**\n * Delete Image\n * @param image {@link AImage} instance to be deleted\n */\nvoid ImageReader::DeleteImage(AImage* image) {\n  if (image) AImage_delete(image);\n}\n\n/**\n * Helper function for YUV_420 to RGB conversion. Courtesy of Tensorflow\n * ImageClassifier Sample:\n * https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/android/jni/yuv2rgb.cc\n * The difference is that here we have to swap UV plane when calling it.\n */\n#ifndef MAX\n#define MAX(a, b)           \\\n  ({                        \\\n    __typeof__(a) _a = (a); \\\n    __typeof__(b) _b = (b); \\\n    _a > _b ? _a : _b;      \\\n  })\n#define MIN(a, b)           \\\n  ({                        \\\n    __typeof__(a) _a = (a); \\\n    __typeof__(b) _b = (b); \\\n    _a < _b ? _a : _b;      \\\n  })\n#endif\n\n// This value is 2 ^ 18 - 1, and is used to clamp the RGB values before their\n// ranges\n// are normalized to eight bits.\nstatic const int kMaxChannelValue = 262143;\n\nstatic inline uint32_t YUV2RGB(int nY, int nU, int nV) {\n  nY -= 16;\n  nU -= 128;\n  nV -= 128;\n  if (nY < 0) nY = 0;\n\n  // This is the floating point equivalent. We do the conversion in integer\n  // because some Android devices do not have floating point in hardware.\n  // nR = (int)(1.164 * nY + 1.596 * nV);\n  // nG = (int)(1.164 * nY - 0.813 * nV - 0.391 * nU);\n  // nB = (int)(1.164 * nY + 2.018 * nU);\n\n  int nR = (int)(1192 * nY + 1634 * nV);\n  int nG = (int)(1192 * nY - 833 * nV - 400 * nU);\n  int nB = (int)(1192 * nY + 2066 * nU);\n\n  nR = MIN(kMaxChannelValue, MAX(0, nR));\n  nG = MIN(kMaxChannelValue, MAX(0, nG));\n  nB = MIN(kMaxChannelValue, MAX(0, nB));\n\n  nR = (nR >> 10) & 0xff;\n  nG = (nG >> 10) & 0xff;\n  nB = (nB >> 10) & 0xff;\n\n  return 0xff000000 | (nB << 16) | (nG << 8) | nR;\n}\n\n/**\n * Convert yuv image inside AImage into ANativeWindow_Buffer\n * ANativeWindow_Buffer format is guaranteed to be\n *      WINDOW_FORMAT_RGBX_8888\n *      WINDOW_FORMAT_RGBA_8888\n * @param buf a {@link ANativeWindow_Buffer } instance, destination of\n *            image conversion\n * @param image a {@link AImage} instance, source of image conversion.\n *            it will be deleted via {@link AImage_delete}\n */\nbool ImageReader::DisplayImage(ANativeWindow_Buffer* buf, AImage* image) {\n  ASSERT(buf->format == WINDOW_FORMAT_RGBX_8888 ||\n             buf->format == WINDOW_FORMAT_RGBA_8888,\n         \"Not supported buffer format\");\n\n  int32_t srcFormat = -1;\n  AImage_getFormat(image, &srcFormat);\n  ASSERT(AIMAGE_FORMAT_YUV_420_888 == srcFormat, \"Failed to get format\");\n  int32_t srcPlanes = 0;\n  AImage_getNumberOfPlanes(image, &srcPlanes);\n  ASSERT(srcPlanes == 3, \"Is not 3 planes\");\n\n  switch (presentRotation_) {\n    case 0:\n      PresentImage(buf, image);\n      break;\n    case 90:\n      PresentImage90(buf, image);\n      break;\n    case 180:\n      PresentImage180(buf, image);\n      break;\n    case 270:\n      PresentImage270(buf, image);\n      break;\n    default:\n      ASSERT(0, \"NOT recognized display rotation: %d\", presentRotation_);\n  }\n\n  AImage_delete(image);\n\n  return true;\n}\n\n/*\n * PresentImage()\n *   Converting yuv to RGB\n *   No rotation: (x,y) --> (x, y)\n *   Refer to:\n * https://mathbits.com/MathBits/TISection/Geometry/Transformations2.htm\n */\nvoid ImageReader::PresentImage(ANativeWindow_Buffer* buf, AImage* image) {\n  AImageCropRect srcRect;\n  AImage_getCropRect(image, &srcRect);\n\n  int32_t yStride, uvStride;\n  uint8_t *yPixel, *uPixel, *vPixel;\n  int32_t yLen, uLen, vLen;\n  AImage_getPlaneRowStride(image, 0, &yStride);\n  AImage_getPlaneRowStride(image, 1, &uvStride);\n  AImage_getPlaneData(image, 0, &yPixel, &yLen);\n  AImage_getPlaneData(image, 1, &uPixel, &uLen);\n  AImage_getPlaneData(image, 2, &vPixel, &vLen);\n  int32_t uvPixelStride;\n  AImage_getPlanePixelStride(image, 1, &uvPixelStride);\n\n  int32_t height = MIN(buf->height, (srcRect.bottom - srcRect.top));\n  int32_t width = MIN(buf->width, (srcRect.right - srcRect.left));\n\n  uint32_t* out = static_cast<uint32_t*>(buf->bits);\n  for (int32_t y = 0; y < height; y++) {\n    const uint8_t* pY = yPixel + yStride * (y + srcRect.top) + srcRect.left;\n\n    int32_t uv_row_start = uvStride * ((y + srcRect.top) >> 1);\n    const uint8_t* pU = uPixel + uv_row_start + (srcRect.left >> 1);\n    const uint8_t* pV = vPixel + uv_row_start + (srcRect.left >> 1);\n\n    for (int32_t x = 0; x < width; x++) {\n      const int32_t uv_offset = (x >> 1) * uvPixelStride;\n      out[x] = YUV2RGB(pY[x], pU[uv_offset], pV[uv_offset]);\n    }\n    out += buf->stride;\n  }\n}\n\n/*\n * PresentImage90()\n *   Converting YUV to RGB\n *   Rotation image anti-clockwise 90 degree -- (x, y) --> (-y, x)\n */\nvoid ImageReader::PresentImage90(ANativeWindow_Buffer* buf, AImage* image) {\n  AImageCropRect srcRect;\n  AImage_getCropRect(image, &srcRect);\n\n  int32_t yStride, uvStride;\n  uint8_t *yPixel, *uPixel, *vPixel;\n  int32_t yLen, uLen, vLen;\n  AImage_getPlaneRowStride(image, 0, &yStride);\n  AImage_getPlaneRowStride(image, 1, &uvStride);\n  AImage_getPlaneData(image, 0, &yPixel, &yLen);\n  AImage_getPlaneData(image, 1, &uPixel, &uLen);\n  AImage_getPlaneData(image, 2, &vPixel, &vLen);\n  int32_t uvPixelStride;\n  AImage_getPlanePixelStride(image, 1, &uvPixelStride);\n\n  int32_t height = MIN(buf->width, (srcRect.bottom - srcRect.top));\n  int32_t width = MIN(buf->height, (srcRect.right - srcRect.left));\n\n  uint32_t* out = static_cast<uint32_t*>(buf->bits);\n  out += height - 1;\n  for (int32_t y = 0; y < height; y++) {\n    const uint8_t* pY = yPixel + yStride * (y + srcRect.top) + srcRect.left;\n\n    int32_t uv_row_start = uvStride * ((y + srcRect.top) >> 1);\n    const uint8_t* pU = uPixel + uv_row_start + (srcRect.left >> 1);\n    const uint8_t* pV = vPixel + uv_row_start + (srcRect.left >> 1);\n\n    for (int32_t x = 0; x < width; x++) {\n      const int32_t uv_offset = (x >> 1) * uvPixelStride;\n      // [x, y]--> [-y, x]\n      out[x * buf->stride] = YUV2RGB(pY[x], pU[uv_offset], pV[uv_offset]);\n    }\n    out -= 1;  // move to the next column\n  }\n}\n\n/*\n * PresentImage180()\n *   Converting yuv to RGB\n *   Rotate image 180 degree: (x, y) --> (-x, -y)\n */\nvoid ImageReader::PresentImage180(ANativeWindow_Buffer* buf, AImage* image) {\n  AImageCropRect srcRect;\n  AImage_getCropRect(image, &srcRect);\n\n  int32_t yStride, uvStride;\n  uint8_t *yPixel, *uPixel, *vPixel;\n  int32_t yLen, uLen, vLen;\n  AImage_getPlaneRowStride(image, 0, &yStride);\n  AImage_getPlaneRowStride(image, 1, &uvStride);\n  AImage_getPlaneData(image, 0, &yPixel, &yLen);\n  AImage_getPlaneData(image, 1, &uPixel, &uLen);\n  AImage_getPlaneData(image, 2, &vPixel, &vLen);\n  int32_t uvPixelStride;\n  AImage_getPlanePixelStride(image, 1, &uvPixelStride);\n\n  int32_t height = MIN(buf->height, (srcRect.bottom - srcRect.top));\n  int32_t width = MIN(buf->width, (srcRect.right - srcRect.left));\n\n  uint32_t* out = static_cast<uint32_t*>(buf->bits);\n  out += (height - 1) * buf->stride;\n  for (int32_t y = 0; y < height; y++) {\n    const uint8_t* pY = yPixel + yStride * (y + srcRect.top) + srcRect.left;\n\n    int32_t uv_row_start = uvStride * ((y + srcRect.top) >> 1);\n    const uint8_t* pU = uPixel + uv_row_start + (srcRect.left >> 1);\n    const uint8_t* pV = vPixel + uv_row_start + (srcRect.left >> 1);\n\n    for (int32_t x = 0; x < width; x++) {\n      const int32_t uv_offset = (x >> 1) * uvPixelStride;\n      // mirror image since we are using front camera\n      out[width - 1 - x] = YUV2RGB(pY[x], pU[uv_offset], pV[uv_offset]);\n      // out[x] = YUV2RGB(pY[x], pU[uv_offset], pV[uv_offset]);\n    }\n    out -= buf->stride;\n  }\n}\n\n/*\n * PresentImage270()\n *   Converting image from YUV to RGB\n *   Rotate Image counter-clockwise 270 degree: (x, y) --> (y, x)\n */\nvoid ImageReader::PresentImage270(ANativeWindow_Buffer* buf, AImage* image) {\n  AImageCropRect srcRect;\n  AImage_getCropRect(image, &srcRect);\n\n  int32_t yStride, uvStride;\n  uint8_t *yPixel, *uPixel, *vPixel;\n  int32_t yLen, uLen, vLen;\n  AImage_getPlaneRowStride(image, 0, &yStride);\n  AImage_getPlaneRowStride(image, 1, &uvStride);\n  AImage_getPlaneData(image, 0, &yPixel, &yLen);\n  AImage_getPlaneData(image, 1, &uPixel, &uLen);\n  AImage_getPlaneData(image, 2, &vPixel, &vLen);\n  int32_t uvPixelStride;\n  AImage_getPlanePixelStride(image, 1, &uvPixelStride);\n\n  int32_t height = MIN(buf->width, (srcRect.bottom - srcRect.top));\n  int32_t width = MIN(buf->height, (srcRect.right - srcRect.left));\n\n  uint32_t* out = static_cast<uint32_t*>(buf->bits);\n  for (int32_t y = 0; y < height; y++) {\n    const uint8_t* pY = yPixel + yStride * (y + srcRect.top) + srcRect.left;\n\n    int32_t uv_row_start = uvStride * ((y + srcRect.top) >> 1);\n    const uint8_t* pU = uPixel + uv_row_start + (srcRect.left >> 1);\n    const uint8_t* pV = vPixel + uv_row_start + (srcRect.left >> 1);\n\n    for (int32_t x = 0; x < width; x++) {\n      const int32_t uv_offset = (x >> 1) * uvPixelStride;\n      out[(width - 1 - x) * buf->stride] =\n          YUV2RGB(pY[x], pU[uv_offset], pV[uv_offset]);\n    }\n    out += 1;  // move to the next column\n  }\n}\nvoid ImageReader::SetPresentRotation(int32_t angle) {\n  presentRotation_ = angle;\n}\n\n/**\n * Write out jpeg files to kDirName directory\n * @param image point capture jpg image\n */\nvoid ImageReader::WriteFile(AImage* image) {\n  int planeCount;\n  media_status_t status = AImage_getNumberOfPlanes(image, &planeCount);\n  ASSERT(status == AMEDIA_OK && planeCount == 1,\n         \"Error: getNumberOfPlanes() planeCount = %d\", planeCount);\n  uint8_t* data = nullptr;\n  int len = 0;\n  AImage_getPlaneData(image, 0, &data, &len);\n\n  DIR* dir = opendir(kDirName);\n  if (dir) {\n    closedir(dir);\n  } else {\n    std::string cmd = \"mkdir -p \";\n    cmd += kDirName;\n    system(cmd.c_str());\n  }\n\n  struct timespec ts {\n    0, 0\n  };\n  clock_gettime(CLOCK_REALTIME, &ts);\n  struct tm localTime;\n  localtime_r(&ts.tv_sec, &localTime);\n\n  std::string fileName = kDirName;\n  std::string dash(\"-\");\n  fileName += kFileName + std::to_string(localTime.tm_mon) +\n              std::to_string(localTime.tm_mday) + dash +\n              std::to_string(localTime.tm_hour) +\n              std::to_string(localTime.tm_min) +\n              std::to_string(localTime.tm_sec) + \".jpg\";\n  FILE* file = fopen(fileName.c_str(), \"wb\");\n  if (file && data && len) {\n    fwrite(data, 1, len, file);\n    fclose(file);\n\n    if (callback_) {\n      callback_(callbackCtx_, fileName.c_str());\n    }\n  } else {\n    if (file) fclose(file);\n  }\n  AImage_delete(image);\n}\n"
  },
  {
    "path": "camera/basic/src/main/cpp/image_reader.h",
    "content": "/*\n * Copyright (C) 2017 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef CAMERA_IMAGE_READER_H\n#define CAMERA_IMAGE_READER_H\n#include <media/NdkImageReader.h>\n\n#include <functional>\n/*\n * ImageFormat:\n *     A Data Structure to communicate resolution between camera and ImageReader\n */\nstruct ImageFormat {\n  int32_t width;\n  int32_t height;\n\n  int32_t format;  // Through out this demo, the format is fixed to\n                   // YUV_420 format\n};\n\nclass ImageReader {\n public:\n  /**\n   * Ctor and Dtor()\n   */\n  explicit ImageReader(ImageFormat* res, enum AIMAGE_FORMATS format);\n\n  ~ImageReader();\n\n  /**\n   * Report cached ANativeWindow, which was used to create camera's capture\n   * session output.\n   */\n  ANativeWindow* GetNativeWindow(void);\n\n  /**\n   * Retrieve Image on the top of Reader's queue\n   */\n  AImage* GetNextImage(void);\n\n  /**\n   * Retrieve Image on the back of Reader's queue, dropping older images\n   */\n  AImage* GetLatestImage(void);\n\n  /**\n   * Delete Image\n   * @param image {@link AImage} instance to be deleted\n   */\n  void DeleteImage(AImage* image);\n\n  /**\n   * AImageReader callback handler. Called by AImageReader when a frame is\n   * captured\n   * (Internal function, not to be called by clients)\n   */\n  void ImageCallback(AImageReader* reader);\n\n  /**\n   * DisplayImage()\n   *   Present camera image to the given display buffer. Avaliable image is\n   * converted\n   *   to display buffer format. Supported display format:\n   *      WINDOW_FORMAT_RGBX_8888\n   *      WINDOW_FORMAT_RGBA_8888\n   *   @param buf {@link ANativeWindow_Buffer} for image to display to.\n   *   @param image a {@link AImage} instance, source of image conversion.\n   *            it will be deleted via {@link AImage_delete}\n   *   @return true on success, false on failure\n   */\n  bool DisplayImage(ANativeWindow_Buffer* buf, AImage* image);\n  /**\n   * Configure the rotation angle necessary to apply to\n   * Camera image when presenting: all rotations should be accumulated:\n   *    CameraSensorOrientation + Android Device Native Orientation +\n   *    Human Rotation (rotated degree related to Phone native orientation\n   */\n  void SetPresentRotation(int32_t angle);\n\n  /**\n   * regsiter a callback function for client to be notified that jpeg already\n   * written out.\n   * @param ctx is client context when callback is invoked\n   * @param callback is the actual callback function\n   */\n  void RegisterCallback(void* ctx,\n                        std::function<void(void* ctx, const char* fileName)>);\n\n private:\n  int32_t presentRotation_;\n  AImageReader* reader_;\n\n  std::function<void(void* ctx, const char* fileName)> callback_;\n  void* callbackCtx_;\n\n  void PresentImage(ANativeWindow_Buffer* buf, AImage* image);\n  void PresentImage90(ANativeWindow_Buffer* buf, AImage* image);\n  void PresentImage180(ANativeWindow_Buffer* buf, AImage* image);\n  void PresentImage270(ANativeWindow_Buffer* buf, AImage* image);\n\n  void WriteFile(AImage* image);\n};\n\n#endif  // CAMERA_IMAGE_READER_H\n"
  },
  {
    "path": "camera/basic/src/main/cpp/libndk_camera.map.txt",
    "content": "LIBNDK_CAMERA {\n  global:\n    ANativeActivity_onCreate;\n    JNI_OnLoad;\n  local:\n    *;\n};\n"
  },
  {
    "path": "camera/basic/src/main/java/com/sample/camera/basic/CameraActivity.java",
    "content": "/*\n * Copyright (C) 2017 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.sample.camera.basic;\n\nimport android.Manifest;\nimport android.annotation.SuppressLint;\nimport android.app.NativeActivity;\nimport android.content.Context;\nimport android.content.pm.PackageManager;\nimport android.hardware.camera2.CameraAccessException;\nimport android.hardware.camera2.CameraCharacteristics;\nimport android.hardware.camera2.CameraManager;\nimport androidx.annotation.NonNull;\nimport androidx.core.app.ActivityCompat;\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.view.Gravity;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.WindowManager;\nimport android.widget.ImageButton;\nimport android.widget.PopupWindow;\nimport android.widget.RelativeLayout;\nimport android.widget.SeekBar;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport static android.hardware.camera2.CameraMetadata.LENS_FACING_BACK;\n\nimport java.util.Arrays;\n\nclass CameraSeekBar {\n    int _progress;\n    long _min, _max, _absVal;\n    SeekBar _seekBar;\n    TextView _sliderPrompt;\n    CameraSeekBar() {\n        _progress = 0;\n        _min = _max = _absVal  = 0;\n    }\n\n    CameraSeekBar(SeekBar seekBar, TextView textView, long min, long max, long val) {\n        _seekBar = seekBar;\n        _sliderPrompt = textView;\n        _min = min;\n        _max = max;\n        _absVal = val;\n\n        if(_min != _max) {\n            _progress = (int) ((_absVal - _min) * _seekBar.getMax() / (_max - _min));\n            seekBar.setProgress(_progress);\n            updateProgress(_progress);\n        } else {\n            _progress = 0;\n            seekBar.setEnabled(false);\n        }\n    }\n\n    public boolean isSupported() {\n        return (_min != _max);\n    }\n    public void updateProgress(int progress) {\n        if (!isSupported())\n            return;\n\n        _progress = progress;\n        _absVal = (progress * ( _max - _min )) / _seekBar.getMax() + _min;\n        int val = (progress * (_seekBar.getWidth() - 2 * _seekBar.getThumbOffset())) / _seekBar.getMax();\n        _sliderPrompt.setText(\"\" + _absVal);\n        _sliderPrompt.setX(_seekBar.getX() + val + _seekBar.getThumbOffset() / 2);\n    }\n    public int getProgress() {\n        return _progress;\n    }\n    public void updateAbsProgress(long val) {\n        if (!isSupported())\n            return;\n        int progress = (int)((val - _min) * _seekBar.getMax() / (_max - _min));\n        updateProgress(progress);\n    }\n    public long getAbsProgress() {\n        return _absVal;\n    }\n}\n\npublic class CameraActivity extends NativeActivity\n        implements ActivityCompat.OnRequestPermissionsResultCallback {\n    volatile CameraActivity _savedInstance;\n    PopupWindow _popupWindow;\n    ImageButton _takePhoto;\n    CameraSeekBar _exposure, _sensitivity;\n    long[] _initParams;\n\n    private final String DBG_TAG = \"NDK-CAMERA-BASIC\";\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        Log.i(DBG_TAG, \"OnCreate()\");\n        // new initialization here... request for permission\n        _savedInstance  = this;\n\n        setImmersiveSticky();\n        View decorView = getWindow().getDecorView();\n        decorView.setOnSystemUiVisibilityChangeListener\n                (new View.OnSystemUiVisibilityChangeListener() {\n                    @Override\n                    public void onSystemUiVisibilityChange(int visibility) {\n                        setImmersiveSticky();\n                    }\n                });\n    }\n\n    private boolean isCamera2Device() {\n        CameraManager camMgr = (CameraManager)getSystemService(Context.CAMERA_SERVICE);\n        boolean camera2Dev = true;\n        try {\n            String[] cameraIds = camMgr.getCameraIdList();\n            if (cameraIds.length != 0 ) {\n                for (String id : cameraIds) {\n                    CameraCharacteristics characteristics = camMgr.getCameraCharacteristics(id);\n                    int deviceLevel = characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);\n                    int facing = characteristics.get(CameraCharacteristics.LENS_FACING);\n                    if (deviceLevel == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY &&\n                        facing == LENS_FACING_BACK) {\n                        camera2Dev =  false;\n                    }\n                }\n            }\n        } catch (CameraAccessException e) {\n            e.printStackTrace();\n            camera2Dev = false;\n        }\n        return camera2Dev;\n    }\n\n    // get current rotation method\n    int getRotationDegree() {\n        return 90 * ((WindowManager)(getSystemService(WINDOW_SERVICE)))\n                .getDefaultDisplay()\n                .getRotation();\n    }\n    @Override\n    protected void onResume() {\n        super.onResume();\n        setImmersiveSticky();\n    }\n    void setImmersiveSticky() {\n        View decorView = getWindow().getDecorView();\n        decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN\n                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION\n                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY\n                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN\n                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION\n                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);\n    }\n\n    @Override\n    protected void onPause() {\n        if (_popupWindow != null && _popupWindow.isShowing()) {\n            _popupWindow.dismiss();\n            _popupWindow = null;\n        }\n        super.onPause();\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n    }\n\n    private static final int PERMISSION_REQUEST_CODE_CAMERA = 1;\n    public void RequestCamera() {\n        if(!isCamera2Device()) {\n            Log.e(DBG_TAG, \"Found legacy camera Device, this sample needs camera2 device\");\n            return;\n        }\n        if (ActivityCompat.checkSelfPermission(\n                this,\n                Manifest.permission.CAMERA\n        ) != PackageManager.PERMISSION_GRANTED) {\n            ActivityCompat.requestPermissions(\n                    this,\n                    new String[]{Manifest.permission.CAMERA},\n                    PERMISSION_REQUEST_CODE_CAMERA\n            );\n            return;\n        }\n        notifyCameraPermission(true);\n    }\n\n    @Override\n    public void onRequestPermissionsResult(int requestCode,\n                                           @NonNull String[] permissions,\n                                           @NonNull int[] grantResults) {\n        if (requestCode != PERMISSION_REQUEST_CODE_CAMERA) {\n            // The permissions request isn't ours.\n            super.onRequestPermissionsResult(requestCode,\n                                             permissions,\n                                             grantResults);\n            return;\n        }\n\n        if (permissions.length == 0) {\n            // https://developer.android.com/reference/androidx/core/app/ActivityCompat.OnRequestPermissionsResultCallback#onRequestPermissionsResult(int,java.lang.String[],int[])\n            //\n            // Note: It is possible that the permissions request interaction with the user is\n            // interrupted. In this case you will receive empty permissions and results arrays which\n            // should be treated as a cancellation.\n            //\n            // The docs aren't clear about *why* it might be canceled, so it's not clear what we\n            // should do here other than restart the request.\n            RequestCamera();\n            return;\n        }\n\n        boolean granted = Arrays.stream(grantResults)\n                .allMatch(element -> element == PackageManager.PERMISSION_GRANTED);\n        if (!granted) {\n            logDeniedPermissions(permissions, grantResults);\n        }\n        notifyCameraPermission(granted);\n    }\n\n    private void logDeniedPermissions(\n            @NonNull String[] requestedPermissions,\n            @NonNull int[] grantResults\n    ) {\n        if (requestedPermissions.length != grantResults.length) {\n            throw new IllegalArgumentException(\n                    String.format(\n                            \"requestedPermissions.length (%d) != grantResults.length (%d)\",\n                            requestedPermissions.length,\n                            grantResults.length\n                    )\n            );\n        }\n\n        for (int i = 0; i < requestedPermissions.length; i++) {\n            if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {\n                Log.i(DBG_TAG, requestedPermissions[i] + \" DENIED\");\n            }\n        }\n    }\n\n    /**\n     * params[] exposure and sensitivity init values in (min, max, curVa) tuple\n     *   0: exposure min\n     *   1: exposure max\n     *   2: exposure val\n     *   3: sensitivity min\n     *   4: sensitivity max\n     *   5: sensitivity val\n     */\n    @SuppressLint(\"InflateParams\")\n    public void EnableUI(final long[] params)\n    {\n        // make our own copy\n        _initParams = new long[params.length];\n        System.arraycopy(params, 0, _initParams, 0, params.length);\n\n        runOnUiThread(new Runnable()  {\n            @Override\n            public void run()  {\n                try {\n                    if (_popupWindow != null) {\n                        _popupWindow.dismiss();\n                    }\n                    LayoutInflater layoutInflater\n                            = (LayoutInflater) getBaseContext()\n                            .getSystemService(LAYOUT_INFLATER_SERVICE);\n                    View popupView = layoutInflater.inflate(R.layout.widgets, null);\n                    _popupWindow = new PopupWindow(\n                            popupView,\n                            WindowManager.LayoutParams.MATCH_PARENT,\n                            WindowManager.LayoutParams.WRAP_CONTENT);\n\n                    RelativeLayout mainLayout = new RelativeLayout(_savedInstance);\n                    ViewGroup.MarginLayoutParams params = new ViewGroup.MarginLayoutParams(\n                            -1, -1);\n                    params.setMargins(0, 0, 0, 0);\n                    _savedInstance.setContentView(mainLayout, params);\n\n                    // Show our UI over NativeActivity window\n                    _popupWindow.showAtLocation(mainLayout, Gravity.BOTTOM | Gravity.START, 0, 0);\n                    _popupWindow.update();\n\n                    _takePhoto = (ImageButton) popupView.findViewById(R.id.takePhoto);\n                    _takePhoto.setOnClickListener(new View.OnClickListener() {\n                        @Override\n                        public void onClick(View v) {\n                            TakePhoto();\n                        }\n                    });\n                    _takePhoto.setEnabled(true);\n                    (popupView.findViewById(R.id.exposureLabel)).setEnabled(true);\n                    (popupView.findViewById(R.id.sensitivityLabel)).setEnabled(true);\n\n                    SeekBar seekBar = (SeekBar) popupView.findViewById(R.id.exposure_seekbar);\n                    _exposure = new CameraSeekBar(seekBar,\n                            (TextView) popupView.findViewById(R.id.exposureVal),\n                            _initParams[0], _initParams[1], _initParams[2]);\n                    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {\n                        @Override\n                        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {\n                            _exposure.updateProgress(progress);\n                            OnExposureChanged(_exposure.getAbsProgress());\n                        }\n\n                        @Override\n                        public void onStartTrackingTouch(SeekBar seekBar) {\n                        }\n\n                        @Override\n                        public void onStopTrackingTouch(SeekBar seekBar) {\n                        }\n                    });\n                    seekBar = ((SeekBar) popupView.findViewById(R.id.sensitivity_seekbar));\n                    _sensitivity = new CameraSeekBar(seekBar,\n                            (TextView) popupView.findViewById(R.id.sensitivityVal),\n                            _initParams[3], _initParams[4], _initParams[5]);\n                    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {\n                        @Override\n                        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {\n                            _sensitivity.updateProgress(progress);\n                            OnSensitivityChanged(_sensitivity.getAbsProgress());\n                        }\n\n                        @Override\n                        public void onStartTrackingTouch(SeekBar seekBar) {\n                        }\n\n                        @Override\n                        public void onStopTrackingTouch(SeekBar seekBar) {\n                        }\n                    });\n                } catch (WindowManager.BadTokenException e) {\n                    // UI error out, ignore and continue\n                    Log.e(DBG_TAG, \"UI Exception Happened: \" + e.getMessage());\n                }\n            }});\n    }\n    /**\n      Called from Native side to notify that a photo is taken\n     */\n    public void OnPhotoTaken(String fileName) {\n        final String name = fileName;\n        runOnUiThread(new Runnable() {\n            @Override\n            public void run() {\n                Toast.makeText(getApplicationContext(),\n                        \"Photo saved to \" + name, Toast.LENGTH_SHORT).show();\n            }\n        });\n    }\n\n    native static void notifyCameraPermission(boolean granted);\n    native static void TakePhoto();\n    native void OnExposureChanged(long exposure);\n    native void OnSensitivityChanged(long sensitivity);\n\n    static {\n        System.loadLibrary(\"ndk_camera\");\n    }\n}\n\n"
  },
  {
    "path": "camera/basic/src/main/res/layout/widgets.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:gravity=\"bottom\"\n    android:orientation=\"vertical\" >\n\n\n    <TextView\n        android:id=\"@+id/exposureLabel\"\n        android:text=\"Exposure\"\n        android:textColor=\"#FFFF00\"\n        android:textSize=\"20sp\"\n        android:layout_alignParentLeft=\"true\"\n        android:layout_marginBottom=\"60dp\"\n        android:layout_above=\"@+id/sensitivityLabel\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"/>\n    <TextView\n        android:id=\"@+id/exposureVal\"\n        android:text=\"0\"\n        android:textColor=\"#FFFF00\"\n        android:textSize=\"16sp\"\n        android:layout_toRightOf=\"@+id/exposureLabel\"\n        android:layout_above=\"@+id/exposureLabel\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"/>\n    <SeekBar\n        android:id=\"@+id/exposure_seekbar\"\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignTop=\"@+id/exposureLabel\"\n        android:layout_toRightOf=\"@+id/exposureLabel\"\n        android:minHeight=\"2dip\"\n        android:maxHeight=\"2dip\"\n        android:max=\"100\" />\n    <TextView\n        android:id=\"@+id/sensitivityLabel\"\n        android:text=\"Sensitivity\"\n        android:textColor=\"#FFFF00\"\n        android:textSize=\"20sp\"\n        android:layout_alignParentLeft=\"true\"\n        android:layout_above=\"@+id/takePhoto\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"/>\n    <TextView\n        android:id=\"@+id/sensitivityVal\"\n        android:text=\"0\"\n        android:textColor=\"#FFFF00\"\n        android:textSize=\"16sp\"\n        android:layout_toRightOf=\"@+id/sensitivityLabel\"\n        android:layout_above=\"@+id/sensitivityLabel\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"/>\n    <SeekBar\n        android:id=\"@+id/sensitivity_seekbar\"\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_toRightOf=\"@+id/sensitivityLabel\"\n        android:layout_alignTop=\"@+id/sensitivityLabel\"\n        android:minHeight=\"2dip\"\n        android:maxHeight=\"2dip\"\n        android:max=\"100\"/>\n    <ImageButton\n        android:id=\"@+id/takePhoto\"\n        android:layout_width=\"80dp\"\n        android:layout_height=\"60dp\"\n        android:layout_gravity=\"center_horizontal\"\n        android:src = \"@drawable/camera_button\"\n        android:background=\"@android:color/transparent\"\n        android:adjustViewBounds =\"true\"\n        android:scaleType=\"fitCenter\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_marginBottom=\"60dp\"/>\n</RelativeLayout>\n"
  },
  {
    "path": "camera/basic/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"app_name\">NDKCamera</string>\n</resources>\n"
  },
  {
    "path": "camera/camera-utils/build.gradle.kts",
    "content": "plugins {\n    id(\"ndksamples.android.library\")\n}\n\nandroid {\n    namespace = \"com.android.ndk.samples.camera.utils\"\n\n    defaultConfig {\n        minSdk = 24\n    }\n\n    externalNativeBuild {\n        cmake {\n            path = file(\"src/main/cpp/CMakeLists.txt\")\n        }\n    }\n\n    buildFeatures {\n        prefabPublishing = true\n    }\n\n    prefab {\n        create(\"camera-utils\") {\n            headers = \"src/main/cpp/include\"\n        }\n    }\n}\n"
  },
  {
    "path": "camera/camera-utils/src/main/cpp/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.22.1)\nproject(CameraCommon LANGUAGES CXX)\n\ninclude(AppLibrary)\n\nadd_app_library(camera-utils\n    STATIC\n    camera_utils.cpp\n)\n\ntarget_include_directories(camera-utils PUBLIC include)\ntarget_link_libraries(camera-utils PUBLIC log)\n"
  },
  {
    "path": "camera/camera-utils/src/main/cpp/camera_utils.cpp",
    "content": "/*\n * Copyright (C) 2017 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#include \"ndksamples/camera/camera_utils.h\"\n\n#include <camera/NdkCameraManager.h>\n#include <media/NdkImage.h>\n\n#include <cinttypes>\n#include <string>\n#include <typeinfo>\n#include <utility>\n#include <vector>\n\n#include \"ndksamples/camera/native_debug.h\"\n\n#define UKNOWN_TAG \"UNKNOW_TAG\"\n#define MAKE_PAIR(val) std::make_pair(val, #val)\ntemplate <typename T>\nconst char* GetPairStr(T key, std::vector<std::pair<T, const char*>>& store) {\n  typedef typename std::vector<std::pair<T, const char*>>::iterator iterator;\n  for (iterator it = store.begin(); it != store.end(); ++it) {\n    if (it->first == key) {\n      return it->second;\n    }\n  }\n  LOGW(\"(%#08x) : UNKNOWN_TAG for %s\", key, typeid(store[0].first).name());\n  return UKNOWN_TAG;\n}\n\n/*\n * camera_status_t error translation\n */\nusing ERROR_PAIR = std::pair<camera_status_t, const char*>;\nstatic std::vector<ERROR_PAIR> errorInfo{\n    MAKE_PAIR(ACAMERA_OK),\n    MAKE_PAIR(ACAMERA_ERROR_UNKNOWN),\n    MAKE_PAIR(ACAMERA_ERROR_INVALID_PARAMETER),\n    MAKE_PAIR(ACAMERA_ERROR_CAMERA_DISCONNECTED),\n    MAKE_PAIR(ACAMERA_ERROR_NOT_ENOUGH_MEMORY),\n    MAKE_PAIR(ACAMERA_ERROR_METADATA_NOT_FOUND),\n    MAKE_PAIR(ACAMERA_ERROR_CAMERA_DEVICE),\n    MAKE_PAIR(ACAMERA_ERROR_CAMERA_SERVICE),\n    MAKE_PAIR(ACAMERA_ERROR_SESSION_CLOSED),\n    MAKE_PAIR(ACAMERA_ERROR_INVALID_OPERATION),\n    MAKE_PAIR(ACAMERA_ERROR_STREAM_CONFIGURE_FAIL),\n    MAKE_PAIR(ACAMERA_ERROR_CAMERA_IN_USE),\n    MAKE_PAIR(ACAMERA_ERROR_MAX_CAMERA_IN_USE),\n    MAKE_PAIR(ACAMERA_ERROR_CAMERA_DISABLED),\n    MAKE_PAIR(ACAMERA_ERROR_PERMISSION_DENIED),\n};\nconst char* GetErrorStr(camera_status_t err) {\n  return GetPairStr<camera_status_t>(err, errorInfo);\n}\n\n/*\n * camera_metadata_tag_t translation. Useful to look at available tags\n * on the underneath platform\n */\nusing TAG_PAIR = std::pair<acamera_metadata_tag_t, const char*>;\nstatic std::vector<TAG_PAIR> tagInfo{\n    MAKE_PAIR(ACAMERA_COLOR_CORRECTION_MODE),\n    MAKE_PAIR(ACAMERA_COLOR_CORRECTION_TRANSFORM),\n    MAKE_PAIR(ACAMERA_COLOR_CORRECTION_GAINS),\n    MAKE_PAIR(ACAMERA_COLOR_CORRECTION_ABERRATION_MODE),\n    MAKE_PAIR(ACAMERA_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES),\n    MAKE_PAIR(ACAMERA_COLOR_CORRECTION_END),\n    MAKE_PAIR(ACAMERA_CONTROL_AE_ANTIBANDING_MODE),\n    MAKE_PAIR(ACAMERA_CONTROL_AE_EXPOSURE_COMPENSATION),\n    MAKE_PAIR(ACAMERA_CONTROL_AE_LOCK),\n    MAKE_PAIR(ACAMERA_CONTROL_AE_MODE),\n    MAKE_PAIR(ACAMERA_CONTROL_AE_REGIONS),\n    MAKE_PAIR(ACAMERA_CONTROL_AE_TARGET_FPS_RANGE),\n    MAKE_PAIR(ACAMERA_CONTROL_AE_PRECAPTURE_TRIGGER),\n    MAKE_PAIR(ACAMERA_CONTROL_AF_MODE),\n    MAKE_PAIR(ACAMERA_CONTROL_AF_REGIONS),\n    MAKE_PAIR(ACAMERA_CONTROL_AF_TRIGGER),\n    MAKE_PAIR(ACAMERA_CONTROL_AWB_LOCK),\n    MAKE_PAIR(ACAMERA_CONTROL_AWB_MODE),\n    MAKE_PAIR(ACAMERA_CONTROL_AWB_REGIONS),\n    MAKE_PAIR(ACAMERA_CONTROL_CAPTURE_INTENT),\n    MAKE_PAIR(ACAMERA_CONTROL_EFFECT_MODE),\n    MAKE_PAIR(ACAMERA_CONTROL_MODE),\n    MAKE_PAIR(ACAMERA_CONTROL_SCENE_MODE),\n    MAKE_PAIR(ACAMERA_CONTROL_VIDEO_STABILIZATION_MODE),\n    MAKE_PAIR(ACAMERA_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES),\n    MAKE_PAIR(ACAMERA_CONTROL_AE_AVAILABLE_MODES),\n    MAKE_PAIR(ACAMERA_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES),\n    MAKE_PAIR(ACAMERA_CONTROL_AE_COMPENSATION_RANGE),\n    MAKE_PAIR(ACAMERA_CONTROL_AE_COMPENSATION_STEP),\n    MAKE_PAIR(ACAMERA_CONTROL_AF_AVAILABLE_MODES),\n    MAKE_PAIR(ACAMERA_CONTROL_AVAILABLE_EFFECTS),\n    MAKE_PAIR(ACAMERA_CONTROL_AVAILABLE_SCENE_MODES),\n    MAKE_PAIR(ACAMERA_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES),\n    MAKE_PAIR(ACAMERA_CONTROL_AWB_AVAILABLE_MODES),\n    MAKE_PAIR(ACAMERA_CONTROL_MAX_REGIONS),\n    MAKE_PAIR(ACAMERA_CONTROL_AE_STATE),\n    MAKE_PAIR(ACAMERA_CONTROL_AF_STATE),\n    MAKE_PAIR(ACAMERA_CONTROL_AWB_STATE),\n    MAKE_PAIR(ACAMERA_CONTROL_AE_LOCK_AVAILABLE),\n    MAKE_PAIR(ACAMERA_CONTROL_AWB_LOCK_AVAILABLE),\n    MAKE_PAIR(ACAMERA_CONTROL_AVAILABLE_MODES),\n    MAKE_PAIR(ACAMERA_CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE),\n    MAKE_PAIR(ACAMERA_CONTROL_POST_RAW_SENSITIVITY_BOOST),\n    MAKE_PAIR(ACAMERA_CONTROL_END),\n    MAKE_PAIR(ACAMERA_EDGE_MODE),\n    MAKE_PAIR(ACAMERA_EDGE_AVAILABLE_EDGE_MODES),\n    MAKE_PAIR(ACAMERA_EDGE_END),\n    MAKE_PAIR(ACAMERA_FLASH_MODE),\n    MAKE_PAIR(ACAMERA_FLASH_STATE),\n    MAKE_PAIR(ACAMERA_FLASH_END),\n    MAKE_PAIR(ACAMERA_FLASH_INFO_AVAILABLE),\n    MAKE_PAIR(ACAMERA_FLASH_INFO_END),\n    MAKE_PAIR(ACAMERA_HOT_PIXEL_MODE),\n    MAKE_PAIR(ACAMERA_HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES),\n    MAKE_PAIR(ACAMERA_HOT_PIXEL_END),\n    MAKE_PAIR(ACAMERA_JPEG_GPS_COORDINATES),\n    MAKE_PAIR(ACAMERA_JPEG_GPS_PROCESSING_METHOD),\n    MAKE_PAIR(ACAMERA_JPEG_GPS_TIMESTAMP),\n    MAKE_PAIR(ACAMERA_JPEG_ORIENTATION),\n    MAKE_PAIR(ACAMERA_JPEG_QUALITY),\n    MAKE_PAIR(ACAMERA_JPEG_THUMBNAIL_QUALITY),\n    MAKE_PAIR(ACAMERA_JPEG_THUMBNAIL_SIZE),\n    MAKE_PAIR(ACAMERA_JPEG_AVAILABLE_THUMBNAIL_SIZES),\n    MAKE_PAIR(ACAMERA_JPEG_END),\n    MAKE_PAIR(ACAMERA_LENS_APERTURE),\n    MAKE_PAIR(ACAMERA_LENS_FILTER_DENSITY),\n    MAKE_PAIR(ACAMERA_LENS_FOCAL_LENGTH),\n    MAKE_PAIR(ACAMERA_LENS_FOCUS_DISTANCE),\n    MAKE_PAIR(ACAMERA_LENS_OPTICAL_STABILIZATION_MODE),\n    MAKE_PAIR(ACAMERA_LENS_FACING),\n    MAKE_PAIR(ACAMERA_LENS_POSE_ROTATION),\n    MAKE_PAIR(ACAMERA_LENS_POSE_TRANSLATION),\n    MAKE_PAIR(ACAMERA_LENS_FOCUS_RANGE),\n    MAKE_PAIR(ACAMERA_LENS_STATE),\n    MAKE_PAIR(ACAMERA_LENS_INTRINSIC_CALIBRATION),\n    MAKE_PAIR(ACAMERA_LENS_RADIAL_DISTORTION),\n    MAKE_PAIR(ACAMERA_LENS_END),\n\n    MAKE_PAIR(ACAMERA_LENS_INFO_AVAILABLE_APERTURES),\n    MAKE_PAIR(ACAMERA_LENS_INFO_AVAILABLE_FILTER_DENSITIES),\n    MAKE_PAIR(ACAMERA_LENS_INFO_AVAILABLE_FOCAL_LENGTHS),\n    MAKE_PAIR(ACAMERA_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION),\n    MAKE_PAIR(ACAMERA_LENS_INFO_HYPERFOCAL_DISTANCE),\n    MAKE_PAIR(ACAMERA_LENS_INFO_MINIMUM_FOCUS_DISTANCE),\n    MAKE_PAIR(ACAMERA_LENS_INFO_SHADING_MAP_SIZE),\n    MAKE_PAIR(ACAMERA_LENS_INFO_FOCUS_DISTANCE_CALIBRATION),\n    MAKE_PAIR(ACAMERA_LENS_INFO_END),\n\n    MAKE_PAIR(ACAMERA_NOISE_REDUCTION_MODE),\n    MAKE_PAIR(ACAMERA_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES),\n    MAKE_PAIR(ACAMERA_NOISE_REDUCTION_END),\n\n    MAKE_PAIR(ACAMERA_REQUEST_MAX_NUM_OUTPUT_STREAMS),\n    MAKE_PAIR(ACAMERA_REQUEST_PIPELINE_DEPTH),\n    MAKE_PAIR(ACAMERA_REQUEST_PIPELINE_MAX_DEPTH),\n    MAKE_PAIR(ACAMERA_REQUEST_PARTIAL_RESULT_COUNT),\n    MAKE_PAIR(ACAMERA_REQUEST_AVAILABLE_CAPABILITIES),\n    MAKE_PAIR(ACAMERA_REQUEST_AVAILABLE_REQUEST_KEYS),\n    MAKE_PAIR(ACAMERA_REQUEST_AVAILABLE_RESULT_KEYS),\n    MAKE_PAIR(ACAMERA_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS),\n    MAKE_PAIR(ACAMERA_REQUEST_END),\n\n    MAKE_PAIR(ACAMERA_SCALER_CROP_REGION),\n    MAKE_PAIR(ACAMERA_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM),\n    MAKE_PAIR(ACAMERA_SCALER_AVAILABLE_STREAM_CONFIGURATIONS),\n    MAKE_PAIR(ACAMERA_SCALER_AVAILABLE_MIN_FRAME_DURATIONS),\n    MAKE_PAIR(ACAMERA_SCALER_AVAILABLE_STALL_DURATIONS),\n    MAKE_PAIR(ACAMERA_SCALER_CROPPING_TYPE),\n    MAKE_PAIR(ACAMERA_SCALER_END),\n\n    MAKE_PAIR(ACAMERA_SENSOR_EXPOSURE_TIME),\n    MAKE_PAIR(ACAMERA_SENSOR_FRAME_DURATION),\n    MAKE_PAIR(ACAMERA_SENSOR_SENSITIVITY),\n    MAKE_PAIR(ACAMERA_SENSOR_REFERENCE_ILLUMINANT1),\n    MAKE_PAIR(ACAMERA_SENSOR_REFERENCE_ILLUMINANT2),\n    MAKE_PAIR(ACAMERA_SENSOR_CALIBRATION_TRANSFORM1),\n    MAKE_PAIR(ACAMERA_SENSOR_CALIBRATION_TRANSFORM2),\n    MAKE_PAIR(ACAMERA_SENSOR_COLOR_TRANSFORM1),\n    MAKE_PAIR(ACAMERA_SENSOR_COLOR_TRANSFORM2),\n    MAKE_PAIR(ACAMERA_SENSOR_FORWARD_MATRIX1),\n    MAKE_PAIR(ACAMERA_SENSOR_FORWARD_MATRIX2),\n    MAKE_PAIR(ACAMERA_SENSOR_BLACK_LEVEL_PATTERN),\n    MAKE_PAIR(ACAMERA_SENSOR_MAX_ANALOG_SENSITIVITY),\n    MAKE_PAIR(ACAMERA_SENSOR_ORIENTATION),\n    MAKE_PAIR(ACAMERA_SENSOR_TIMESTAMP),\n    MAKE_PAIR(ACAMERA_SENSOR_NEUTRAL_COLOR_POINT),\n    MAKE_PAIR(ACAMERA_SENSOR_NOISE_PROFILE),\n    MAKE_PAIR(ACAMERA_SENSOR_GREEN_SPLIT),\n    MAKE_PAIR(ACAMERA_SENSOR_TEST_PATTERN_DATA),\n    MAKE_PAIR(ACAMERA_SENSOR_TEST_PATTERN_MODE),\n    MAKE_PAIR(ACAMERA_SENSOR_AVAILABLE_TEST_PATTERN_MODES),\n    MAKE_PAIR(ACAMERA_SENSOR_ROLLING_SHUTTER_SKEW),\n    MAKE_PAIR(ACAMERA_SENSOR_OPTICAL_BLACK_REGIONS),\n    MAKE_PAIR(ACAMERA_SENSOR_DYNAMIC_BLACK_LEVEL),\n    MAKE_PAIR(ACAMERA_SENSOR_DYNAMIC_WHITE_LEVEL),\n    MAKE_PAIR(ACAMERA_SENSOR_END),\n\n    MAKE_PAIR(ACAMERA_SENSOR_INFO_ACTIVE_ARRAY_SIZE),\n    MAKE_PAIR(ACAMERA_SENSOR_INFO_SENSITIVITY_RANGE),\n    MAKE_PAIR(ACAMERA_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT),\n    MAKE_PAIR(ACAMERA_SENSOR_INFO_EXPOSURE_TIME_RANGE),\n    MAKE_PAIR(ACAMERA_SENSOR_INFO_MAX_FRAME_DURATION),\n    MAKE_PAIR(ACAMERA_SENSOR_INFO_PHYSICAL_SIZE),\n    MAKE_PAIR(ACAMERA_SENSOR_INFO_PIXEL_ARRAY_SIZE),\n    MAKE_PAIR(ACAMERA_SENSOR_INFO_WHITE_LEVEL),\n    MAKE_PAIR(ACAMERA_SENSOR_INFO_TIMESTAMP_SOURCE),\n    MAKE_PAIR(ACAMERA_SENSOR_INFO_LENS_SHADING_APPLIED),\n    MAKE_PAIR(ACAMERA_SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE),\n    MAKE_PAIR(ACAMERA_SENSOR_INFO_END),\n\n    MAKE_PAIR(ACAMERA_SHADING_MODE),\n    MAKE_PAIR(ACAMERA_SHADING_AVAILABLE_MODES),\n    MAKE_PAIR(ACAMERA_SHADING_END),\n\n    MAKE_PAIR(ACAMERA_STATISTICS_FACE_DETECT_MODE),\n    MAKE_PAIR(ACAMERA_STATISTICS_HOT_PIXEL_MAP_MODE),\n    MAKE_PAIR(ACAMERA_STATISTICS_FACE_IDS),\n    MAKE_PAIR(ACAMERA_STATISTICS_FACE_LANDMARKS),\n    MAKE_PAIR(ACAMERA_STATISTICS_FACE_RECTANGLES),\n    MAKE_PAIR(ACAMERA_STATISTICS_FACE_SCORES),\n    MAKE_PAIR(ACAMERA_STATISTICS_LENS_SHADING_MAP),\n    MAKE_PAIR(ACAMERA_STATISTICS_SCENE_FLICKER),\n    MAKE_PAIR(ACAMERA_STATISTICS_HOT_PIXEL_MAP),\n    MAKE_PAIR(ACAMERA_STATISTICS_LENS_SHADING_MAP_MODE),\n    MAKE_PAIR(ACAMERA_STATISTICS_END),\n\n    MAKE_PAIR(ACAMERA_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES),\n    MAKE_PAIR(ACAMERA_STATISTICS_INFO_MAX_FACE_COUNT),\n    MAKE_PAIR(ACAMERA_STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES),\n    MAKE_PAIR(ACAMERA_STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES),\n    MAKE_PAIR(ACAMERA_STATISTICS_INFO_END),\n\n    MAKE_PAIR(ACAMERA_TONEMAP_CURVE_BLUE),\n    MAKE_PAIR(ACAMERA_TONEMAP_CURVE_GREEN),\n    MAKE_PAIR(ACAMERA_TONEMAP_CURVE_RED),\n    MAKE_PAIR(ACAMERA_TONEMAP_MODE),\n    MAKE_PAIR(ACAMERA_TONEMAP_MAX_CURVE_POINTS),\n    MAKE_PAIR(ACAMERA_TONEMAP_AVAILABLE_TONE_MAP_MODES),\n    MAKE_PAIR(ACAMERA_TONEMAP_GAMMA),\n    MAKE_PAIR(ACAMERA_TONEMAP_PRESET_CURVE),\n    MAKE_PAIR(ACAMERA_TONEMAP_END),\n\n    MAKE_PAIR(ACAMERA_INFO_SUPPORTED_HARDWARE_LEVEL),\n    MAKE_PAIR(ACAMERA_INFO_END),\n    MAKE_PAIR(ACAMERA_BLACK_LEVEL_LOCK),\n    MAKE_PAIR(ACAMERA_BLACK_LEVEL_END),\n    MAKE_PAIR(ACAMERA_SYNC_FRAME_NUMBER),\n    MAKE_PAIR(ACAMERA_SYNC_MAX_LATENCY),\n    MAKE_PAIR(ACAMERA_SYNC_END),\n    MAKE_PAIR(ACAMERA_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS),\n\n    MAKE_PAIR(ACAMERA_DEPTH_AVAILABLE_DEPTH_MIN_FRAME_DURATIONS),\n    MAKE_PAIR(ACAMERA_DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS),\n    MAKE_PAIR(ACAMERA_DEPTH_DEPTH_IS_EXCLUSIVE),\n    MAKE_PAIR(ACAMERA_DEPTH_END),\n};\nconst char* GetTagStr(acamera_metadata_tag_t tag) {\n  return GetPairStr<acamera_metadata_tag_t>(tag, tagInfo);\n}\n\nusing FORMAT_PAIR = std::pair<int, const char*>;\nstatic std::vector<FORMAT_PAIR> formatInfo{\n    MAKE_PAIR(AIMAGE_FORMAT_YUV_420_888),\n    MAKE_PAIR(AIMAGE_FORMAT_JPEG),\n    MAKE_PAIR(AIMAGE_FORMAT_RAW16),\n    MAKE_PAIR(AIMAGE_FORMAT_RAW_PRIVATE),\n    MAKE_PAIR(AIMAGE_FORMAT_RAW10),\n    MAKE_PAIR(AIMAGE_FORMAT_RAW12),\n    MAKE_PAIR(AIMAGE_FORMAT_DEPTH16),\n    MAKE_PAIR(AIMAGE_FORMAT_DEPTH_POINT_CLOUD),\n    MAKE_PAIR(AIMAGE_FORMAT_PRIVATE),\n};\nconst char* GetFormatStr(int fmt) { return GetPairStr<int>(fmt, formatInfo); }\n\nvoid PrintMetadataTags(int32_t entries, const uint32_t* pTags) {\n  LOGI(\"MetadataTag (start):\");\n  for (int32_t idx = 0; idx < entries; ++idx) {\n    const char* name =\n        GetTagStr(static_cast<acamera_metadata_tag_t>(pTags[idx]));\n    LOGI(\"(%#08x) : %s\", pTags[idx], name);\n  }\n  LOGI(\"MetadataTag (end)\");\n}\n\nvoid PrintLensFacing(ACameraMetadata_const_entry& lens) {\n  ASSERT(lens.tag == ACAMERA_LENS_FACING, \"Wrong tag(%#x) of %s to %s\",\n         lens.tag, GetTagStr((acamera_metadata_tag_t)lens.tag), __FUNCTION__);\n  LOGI(\"LensFacing: tag(%#x), type(%d), count(%d), val(%#x)\", lens.tag,\n       lens.type, lens.count, lens.data.u8[0]);\n}\n\n/*\n * Stream_Configuration is in format of:\n *    format, width, height, input?\n *    ACAMERA_TYPE_INT32 type\n */\nvoid PrintStreamConfigurations(ACameraMetadata_const_entry& val) {\n#define MODE_LABLE \"ModeInfo:\"\n  const char* tagName = GetTagStr(static_cast<acamera_metadata_tag_t>(val.tag));\n  ASSERT(!(val.count & 0x3), \"STREAM_CONFIGURATION (%d) should multiple of 4\",\n         val.count);\n  ASSERT(val.type == ACAMERA_TYPE_INT32,\n         \"STREAM_CONFIGURATION TYPE(%d) is not ACAMERA_TYPE_INT32(1)\",\n         val.type);\n  LOGI(\"%s -- %s:\", tagName, MODE_LABLE);\n  for (uint32_t i = 0; i < val.count; i += 4) {\n    LOGI(\"%s: %08d x %08d  %s\", GetFormatStr(val.data.i32[i]),\n         val.data.i32[i + 1], val.data.i32[i + 2],\n         val.data.i32[i + 3] ? \"INPUT\" : \"OUTPUT\");\n  }\n#undef MODE_LABLE\n}\nvoid PrintTagVal(const char* printLabel, ACameraMetadata_const_entry& val) {\n  if (val.tag == ACAMERA_SCALER_AVAILABLE_STREAM_CONFIGURATIONS) {\n    PrintStreamConfigurations(val);\n    return;\n  }\n  const char* name = GetTagStr(static_cast<acamera_metadata_tag_t>(val.tag));\n  for (uint32_t i = 0; i < val.count; ++i) {\n    switch (val.type) {\n      case ACAMERA_TYPE_INT32:\n        LOGI(\"%s %s: %08d\", printLabel, name, val.data.i32[i]);\n        break;\n      case ACAMERA_TYPE_BYTE:\n        LOGI(\"%s %s: %#02x\", printLabel, name, val.data.u8[i]);\n        break;\n      case ACAMERA_TYPE_INT64:\n        LOGI(\"%s %s: %\" PRIu64, printLabel, name, (int64_t)val.data.i64[i]);\n        break;\n      case ACAMERA_TYPE_FLOAT:\n        LOGI(\"%s %s: %f\", printLabel, name, val.data.f[i]);\n        break;\n      case ACAMERA_TYPE_DOUBLE:\n        LOGI(\"%s %s: %\" PRIx64, printLabel, name, val.data.i64[i]);\n        break;\n      case ACAMERA_TYPE_RATIONAL:\n        LOGI(\"%s %s: %08x, %08x\", printLabel, name, val.data.r[i].numerator,\n             val.data.r[i].denominator);\n        break;\n      default:\n        ASSERT(false, \"Unknown tag value type: %d\", val.type);\n    }\n  }\n}\n\n/*\n * PrintCamera():\n *   Enumerate existing camera and its metadata.\n */\nvoid PrintCameras(ACameraManager* cmrMgr) {\n  if (!cmrMgr) return;\n\n  ACameraIdList* cameraIds = nullptr;\n  camera_status_t status = ACameraManager_getCameraIdList(cmrMgr, &cameraIds);\n  LOGI(\"camera Status = %d, %s\", status, GetErrorStr(status));\n\n  for (int i = 0; i < cameraIds->numCameras; ++i) {\n    const char* id = cameraIds->cameraIds[i];\n    LOGI(\"=====cameraId = %d, cameraName = %s=====\", i, id);\n    ACameraMetadata* metadataObj;\n    CALL_MGR(getCameraCharacteristics(cmrMgr, id, &metadataObj));\n\n    int32_t count = 0;\n    const uint32_t* tags = nullptr;\n    ACameraMetadata_getAllTags(metadataObj, &count, &tags);\n\n    for (int tagIdx = 0; tagIdx < count; ++tagIdx) {\n      ACameraMetadata_const_entry val = {};\n      camera_status_t status =\n          ACameraMetadata_getConstEntry(metadataObj, tags[tagIdx], &val);\n      if (status != ACAMERA_OK) {\n        LOGW(\"Unsupported Tag: %s\",\n             GetTagStr(static_cast<acamera_metadata_tag_t>(tags[tagIdx])));\n        continue;\n      }\n\n      PrintTagVal(\"Camera Tag:\", val);\n\n      if (ACAMERA_LENS_FACING == tags[tagIdx]) {\n        PrintLensFacing(val);\n      }\n    }\n    ACameraMetadata_free(metadataObj);\n  }\n\n  ACameraManager_deleteCameraIdList(cameraIds);\n}\n\nvoid PrintRequestMetadata(ACaptureRequest* req) {\n  if (!req) return;\n  int32_t count;\n  const uint32_t* tags;\n  CALL_REQUEST(getAllTags(req, &count, &tags));\n  for (int32_t idx = 0; idx < count; ++idx) {\n    ACameraMetadata_const_entry val;\n    CALL_REQUEST(getConstEntry(req, tags[idx], &val));\n    const char* name =\n        GetTagStr(static_cast<acamera_metadata_tag_t>(tags[idx]));\n\n    for (uint32_t i = 0; i < val.count; ++i) {\n      switch (val.type) {\n        case ACAMERA_TYPE_INT32:\n          LOGI(\"Capture Tag %s: %08d\", name, val.data.i32[i]);\n          break;\n        case ACAMERA_TYPE_BYTE:\n          LOGI(\"Capture Tag %s: %#08x\", name, val.data.u8[i]);\n          break;\n        case ACAMERA_TYPE_INT64:\n          LOGI(\"Capture Tag %s: %\" PRIu64, name, (int64_t)val.data.i64[i]);\n          break;\n        case ACAMERA_TYPE_FLOAT:\n          LOGI(\"Capture Tag %s: %f\", name, val.data.f[i]);\n          break;\n        case ACAMERA_TYPE_DOUBLE:\n          LOGI(\"Capture Tag %s: %\" PRIx64, name, val.data.i64[i]);\n          break;\n        case ACAMERA_TYPE_RATIONAL:\n          LOGI(\"Capture Tag %s: %08x, %08x\", name, val.data.r[i].numerator,\n               val.data.r[i].denominator);\n          break;\n        default:\n          ASSERT(false, \"Unknown tag value type: %d\", val.type);\n      }\n    }\n  }\n}\n\n/*\n * CameraDevice error state translation, used in\n *     ACameraDevice_ErrorStateCallback\n */\nusing DEV_ERROR_PAIR = std::pair<int, const char*>;\nstatic std::vector<DEV_ERROR_PAIR> devErrors{\n    MAKE_PAIR(ERROR_CAMERA_IN_USE),   MAKE_PAIR(ERROR_MAX_CAMERAS_IN_USE),\n    MAKE_PAIR(ERROR_CAMERA_DISABLED), MAKE_PAIR(ERROR_CAMERA_DEVICE),\n    MAKE_PAIR(ERROR_CAMERA_SERVICE),\n};\n\nconst char* GetCameraDeviceErrorStr(int err) {\n  return GetPairStr<int>(err, devErrors);\n}\nvoid PrintCameraDeviceError(int err) {\n  LOGI(\"CameraDeviceError(%#x): %s\", err, GetCameraDeviceErrorStr(err));\n}\n"
  },
  {
    "path": "camera/camera-utils/src/main/cpp/include/ndksamples/camera/camera_utils.h",
    "content": "/*\n * Copyright (C) 2017 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef __CAMERA_CAMERA_UTILS_H__\n#define __CAMERA_CAMERA_UTILS_H__\n\n#include <camera/NdkCameraError.h>\n#include <camera/NdkCameraManager.h>\n\n/*\n * A set of macros to call into Camera APIs. The API is grouped with a few\n * objects, with object name as the prefix of function names.\n */\n#define CALL_CAMERA(func)                                             \\\n  {                                                                   \\\n    camera_status_t status = func;                                    \\\n    ASSERT(status == ACAMERA_OK, \"%s call failed with code: %#x, %s\", \\\n           __FUNCTION__, status, GetErrorStr(status));                \\\n  }\n#define CALL_MGR(func) CALL_CAMERA(ACameraManager_##func)\n#define CALL_DEV(func) CALL_CAMERA(ACameraDevice_##func)\n#define CALL_METADATA(func) CALL_CAMERA(ACameraMetadata_##func)\n#define CALL_CONTAINER(func) CALL_CAMERA(ACaptureSessionOutputContainer_##func)\n#define CALL_OUTPUT(func) CALL_CAMERA(ACaptureSessionOutput_##func)\n#define CALL_TARGET(func) CALL_CAMERA(ACameraOutputTarget_##func)\n#define CALL_REQUEST(func) CALL_CAMERA(ACaptureRequest_##func)\n#define CALL_SESSION(func) CALL_CAMERA(ACameraCaptureSession_##func)\n\n/*\n * A few debugging functions for error code strings etc\n */\nconst char* GetErrorStr(camera_status_t err);\nconst char* GetTagStr(acamera_metadata_tag_t tag);\nvoid PrintMetadataTags(int32_t entries, const uint32_t* pTags);\nvoid PrintLensFacing(ACameraMetadata_const_entry& lensData);\nvoid PrintCameras(ACameraManager* cameraMgr);\nvoid PrintCameraDeviceError(int err);\n\nvoid PrintRequestMetadata(ACaptureRequest* req);\n#endif  // __CAMERA_CAMERA_UTILS_H__"
  },
  {
    "path": "camera/camera-utils/src/main/cpp/include/ndksamples/camera/native_debug.h",
    "content": "#include <android/log.h>\n\n#define LOG_TAG \"CAMERA-SAMPLE\"\n#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)\n#define LOGW(...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)\n#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)\n#define ASSERT(cond, fmt, ...)                                \\\n  if (!(cond)) {                                              \\\n    __android_log_assert(#cond, LOG_TAG, fmt, ##__VA_ARGS__); \\\n  }\n"
  },
  {
    "path": "camera/texture-view/build.gradle",
    "content": "plugins {\n    id \"ndksamples.android.application\"\n}\n\nandroid {\n    namespace 'com.sample.textureview'\n    defaultConfig {\n        applicationId \"com.sample.textureview\"\n        minSdkVersion 24\n        externalNativeBuild {\n            cmake {\n                arguments '-DANDROID_STL=c++_static'\n            }\n        }\n    }\n\n    externalNativeBuild {\n        cmake {\n            path 'src/main/cpp/CMakeLists.txt'\n        }\n    }\n\n    buildFeatures {\n        prefab true\n    }\n}\n\ndependencies {\n    implementation libs.androidx.core\n    implementation project(\":base\")\n    implementation project(\":camera:camera-utils\")\n}\n"
  },
  {
    "path": "camera/texture-view/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:versionCode=\"1\"\n    android:versionName=\"1.0\" >\n\n    <uses-permission android:name=\"android.permission.CAMERA\" />\n\n    <uses-feature android:name=\"android.hardware.camera\" />\n    <uses-feature android:name=\"android.hardware.camera.autofocus\" />\n\n    <application\n        android:allowBackup=\"false\"\n        android:icon=\"@drawable/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:screenOrientation=\"portrait\"\n        android:configChanges=\"keyboardHidden|orientation|screenSize\">\n        <activity\n            android:name=\"com.sample.textureview.ViewActivity\"\n            android:label=\"@string/app_name\"\n            android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "camera/texture-view/src/main/cpp/CMakeLists.txt",
    "content": "#\n# Copyright (C)  2017 The Android Open Source Project\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\ncmake_minimum_required(VERSION 3.22.1)\nproject(CameraTextureView LANGUAGES CXX)\n\ninclude(AppLibrary)\nfind_package(base REQUIRED CONFIG)\nfind_package(camera-utils REQUIRED CONFIG)\n\nadd_app_library(camera_textureview SHARED\n    android_main.cpp\n    camera_manager.cpp\n    camera_engine.cpp\n    camera_listeners.cpp\n)\n\ntarget_link_libraries(camera_textureview\n    PRIVATE\n    base::base\n    camera-utils::camera-utils\n    dl\n    android\n    log\n    m\n    camera2ndk\n)\n"
  },
  {
    "path": "camera/texture-view/src/main/cpp/android_main.cpp",
    "content": "/**\n * Copyright (C) 2017 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/* Description\n *     Demonstrate NDKCamera's PREVIEW mode -- hooks camera directly into\n *     display.\n *     Control:\n *         Double-Tap on Android device's screen to toggle start/stop preview\n *     Tested:\n *         Google Pixel and Nexus 6 phones\n */\n#include <base/macros.h>\n#include <jni.h>\n#include <ndksamples/camera/native_debug.h>\n\n#include <cstring>\n\n#include \"camera_engine.h\"\n#include \"camera_manager.h\"\n\n/**\n * Application object:\n *   the top level camera application object, maintained by native code only\n */\nCameraAppEngine* pEngineObj = nullptr;\n\n/**\n * createCamera() Create application instance and NDK camera object\n * @param  width is the texture view window width\n * @param  height is the texture view window height\n * In this sample, it takes the simplest approach in that:\n * the android system display size is used to view full screen\n * preview camera images. Onboard Camera most likely to\n * support the onboard panel size on that device. Camera is most likely\n * to be oriented as landscape mode, the input width/height is in\n * landscape mode. TextureView on Java side handles rotation for\n * portrait mode.\n * @return application object instance ( not used in this sample )\n */\njlong CreateCamera(JNIEnv* env, jobject, jint width, jint height) {\n  pEngineObj = new CameraAppEngine(env, width, height);\n  return reinterpret_cast<jlong>(pEngineObj);\n}\n\n/**\n * deleteCamera():\n *   releases native application object, which\n *   triggers native camera object be released\n */\nvoid DeleteCamera(JNIEnv*, jobject, jlong ndkCameraObj) {\n  if (!pEngineObj || !ndkCameraObj) {\n    return;\n  }\n  CameraAppEngine* pApp = reinterpret_cast<CameraAppEngine*>(ndkCameraObj);\n  ASSERT(pApp == pEngineObj, \"NdkCamera Obj mismatch\");\n\n  delete pApp;\n\n  // also reset the private global object\n  pEngineObj = nullptr;\n}\n\n/**\n * getCameraCompatibleSize()\n * @returns minimium camera preview window size for the given\n * requested camera size in CreateCamera() function, with the same\n * ascpect ratio. essentially,\n *   1) Display device size decides NDKCamera object preview size\n *   2) Chosen NDKCamera preview size passed to TextView to\n *      reset textureView size\n *   3) textureView size is stretched when previewing image\n *      on display device\n */\njobject GetMinimumCompatiblePreviewSize(JNIEnv* env, jobject,\n                                        jlong ndkCameraObj) {\n  if (!ndkCameraObj) {\n    return nullptr;\n  }\n  CameraAppEngine* pApp = reinterpret_cast<CameraAppEngine*>(ndkCameraObj);\n  jclass cls = env->FindClass(\"android/util/Size\");\n  jobject previewSize =\n      env->NewObject(cls, env->GetMethodID(cls, \"<init>\", \"(II)V\"),\n                     pApp->GetCompatibleCameraRes().width,\n                     pApp->GetCompatibleCameraRes().height);\n  return previewSize;\n}\n\n/**\n * OnPreviewSurfaceCreated()\n *   Notification to native camera that java TextureView is ready\n *   to preview video. Simply create cameraSession and\n *   start camera preview\n */\nvoid OnPreviewSurfaceCreated(JNIEnv*, jobject, jlong ndkCameraObj,\n                             jobject surface) {\n  ASSERT(ndkCameraObj && (jlong)pEngineObj == ndkCameraObj,\n         \"NativeObject should not be null Pointer\");\n  CameraAppEngine* pApp = reinterpret_cast<CameraAppEngine*>(ndkCameraObj);\n  pApp->CreateCameraSession(surface);\n  pApp->StartPreview(true);\n}\n\n/**\n * OnPreviewSurfaceDestroyed()\n *   Notification to native camera that java TextureView is destroyed\n *   Native camera would:\n *      * stop preview\n */\nvoid OnPreviewSurfaceDestroyed(JNIEnv* env, jobject, jlong ndkCameraObj,\n                               jobject surface) {\n  CameraAppEngine* pApp = reinterpret_cast<CameraAppEngine*>(ndkCameraObj);\n  ASSERT(ndkCameraObj && pEngineObj == pApp,\n         \"NativeObject should not be null Pointer\");\n  jclass cls = env->FindClass(\"android/view/Surface\");\n  jmethodID toString =\n      env->GetMethodID(cls, \"toString\", \"()Ljava/lang/String;\");\n\n  jstring destroyObjStr =\n      reinterpret_cast<jstring>(env->CallObjectMethod(surface, toString));\n  const char* destroyObjName = env->GetStringUTFChars(destroyObjStr, nullptr);\n\n  jstring appObjStr = reinterpret_cast<jstring>(\n      env->CallObjectMethod(pApp->GetSurfaceObject(), toString));\n  const char* appObjName = env->GetStringUTFChars(appObjStr, nullptr);\n\n  ASSERT(!strcmp(destroyObjName, appObjName), \"object Name MisMatch\");\n\n  env->ReleaseStringUTFChars(destroyObjStr, destroyObjName);\n  env->ReleaseStringUTFChars(appObjStr, appObjName);\n\n  pApp->StartPreview(false);\n}\n\nextern \"C\" JNIEXPORT jint JNI_OnLoad(JavaVM* _Nonnull vm, void* _Nullable) {\n  JNIEnv* env;\n  if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {\n    return JNI_ERR;\n  }\n\n  jclass c = env->FindClass(\"com/sample/textureview/ViewActivity\");\n  if (c == nullptr) return JNI_ERR;\n\n  static const JNINativeMethod methods[] = {\n      {\"createCamera\", \"(II)J\", reinterpret_cast<void*>(CreateCamera)},\n      {\"deleteCamera\", \"(JLandroid/view/Surface;)V\",\n       reinterpret_cast<void*>(DeleteCamera)},\n      {\"getMinimumCompatiblePreviewSize\", \"(J)Landroid/util/Size;\",\n       reinterpret_cast<void*>(GetMinimumCompatiblePreviewSize)},\n      {\"onPreviewSurfaceCreated\", \"(JLandroid/view/Surface;)V\",\n       reinterpret_cast<void*>(OnPreviewSurfaceCreated)},\n      {\"onPreviewSurfaceDestroyed\", \"(JLandroid/view/Surface;)V\",\n       reinterpret_cast<void*>(OnPreviewSurfaceDestroyed)},\n  };\n  int rc = env->RegisterNatives(c, methods, arraysize(methods));\n  if (rc != JNI_OK) return rc;\n\n  return JNI_VERSION_1_6;\n}\n"
  },
  {
    "path": "camera/texture-view/src/main/cpp/camera_engine.cpp",
    "content": "/**\n * Copyright (C) 2017 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** Description\n *   Demonstrate NDK Camera interface added to android-24\n */\n\n#include \"camera_engine.h\"\n\n#include <ndksamples/camera/native_debug.h>\n\n#include <cstdio>\n#include <cstring>\n\nCameraAppEngine::CameraAppEngine(JNIEnv* env, jint w, jint h)\n    : env_(env),\n      requestWidth_(w),\n      requestHeight_(h),\n      surface_(nullptr),\n      camera_(nullptr) {\n  memset(&compatibleCameraRes_, 0, sizeof(compatibleCameraRes_));\n  camera_ = new NDKCamera();\n  ASSERT(camera_, \"Failed to Create CameraObject\");\n  camera_->MatchCaptureSizeRequest(requestWidth_, requestHeight_,\n                                   &compatibleCameraRes_);\n}\n\nCameraAppEngine::~CameraAppEngine() {\n  if (camera_) {\n    delete camera_;\n    camera_ = nullptr;\n  }\n\n  if (surface_) {\n    env_->DeleteGlobalRef(surface_);\n    surface_ = nullptr;\n  }\n}\n\n/**\n * Create a capture session with given Java Surface Object\n * @param surface a {@link Surface} object.\n */\nvoid CameraAppEngine::CreateCameraSession(jobject surface) {\n  surface_ = env_->NewGlobalRef(surface);\n  camera_->CreateSession(ANativeWindow_fromSurface(env_, surface));\n}\n\n/**\n * @return cached {@link Surface} object\n */\njobject CameraAppEngine::GetSurfaceObject() { return surface_; }\n\n/**\n *\n * @return saved camera preview resolution for this session\n */\nconst ImageFormat& CameraAppEngine::GetCompatibleCameraRes() const {\n  return compatibleCameraRes_;\n}\n\nint CameraAppEngine::GetCameraSensorOrientation(int32_t requestFacing) {\n  ASSERT(requestFacing == ACAMERA_LENS_FACING_BACK,\n         \"Only support rear facing camera\");\n  int32_t facing = 0, angle = 0;\n  if (camera_->GetSensorOrientation(&facing, &angle) ||\n      facing == requestFacing) {\n    return angle;\n  }\n  ASSERT(false, \"Failed for GetSensorOrientation()\");\n  return 0;\n}\n\n/**\n *\n * @param start is true to start preview, false to stop preview\n * @return  true if preview started, false when error happened\n */\nvoid CameraAppEngine::StartPreview(bool start) { camera_->StartPreview(start); }\n"
  },
  {
    "path": "camera/texture-view/src/main/cpp/camera_engine.h",
    "content": "\n/*\n * Copyright (C) 2017 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef __CAMERA_ENGINE_H__\n#define __CAMERA_ENGINE_H__\n#include <android/native_activity.h>\n#include <android/native_window.h>\n#include <android/native_window_jni.h>\n#include <jni.h>\n\n#include <functional>\n#include <thread>\n\n#include \"camera_manager.h\"\n\n/**\n * CameraAppEngine\n */\nclass CameraAppEngine {\n public:\n  explicit CameraAppEngine(JNIEnv* env, jint w, jint h);\n  ~CameraAppEngine();\n\n  // Manage NDKCamera Object\n  void CreateCameraSession(jobject surface);\n  void StartPreview(bool start);\n  const ImageFormat& GetCompatibleCameraRes() const;\n  int32_t GetCameraSensorOrientation(int32_t facing);\n  jobject GetSurfaceObject();\n\n private:\n  JNIEnv* env_;\n  int32_t requestWidth_;\n  int32_t requestHeight_;\n  jobject surface_;\n  NDKCamera* camera_;\n  ImageFormat compatibleCameraRes_;\n};\n#endif  // __CAMERA_ENGINE_H__\n"
  },
  {
    "path": "camera/texture-view/src/main/cpp/camera_listeners.cpp",
    "content": "/*\n * Copyright (C) 2017 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#include <camera/NdkCameraManager.h>\n#include <ndksamples/camera/camera_utils.h>\n#include <ndksamples/camera/native_debug.h>\n\n#include <cinttypes>\n#include <queue>\n#include <thread>\n#include <utility>\n\n#include \"camera_manager.h\"\n\n/*\n * Camera Manager Listener object\n */\nvoid OnCameraAvailable(void* ctx, const char* id) {\n  reinterpret_cast<NDKCamera*>(ctx)->OnCameraStatusChanged(id, true);\n}\nvoid OnCameraUnavailable(void* ctx, const char* id) {\n  reinterpret_cast<NDKCamera*>(ctx)->OnCameraStatusChanged(id, false);\n}\n\n/**\n * OnCameraStatusChanged()\n *  handles Callback from ACameraManager\n */\nvoid NDKCamera::OnCameraStatusChanged(const char* id, bool available) {\n  if (valid_) {\n    cameras_[std::string(id)].available_ = available ? true : false;\n  }\n}\n\n/**\n * Construct a camera manager listener on the fly and return to caller\n *\n * @return ACameraManager_AvailabilityCallback\n */\nACameraManager_AvailabilityCallbacks* NDKCamera::GetManagerListener() {\n  static ACameraManager_AvailabilityCallbacks cameraMgrListener = {\n      .context = this,\n      .onCameraAvailable = ::OnCameraAvailable,\n      .onCameraUnavailable = ::OnCameraUnavailable,\n  };\n  return &cameraMgrListener;\n}\n\n/*\n * CameraDevice callbacks\n */\nvoid OnDeviceStateChanges(void* ctx, ACameraDevice* dev) {\n  reinterpret_cast<NDKCamera*>(ctx)->OnDeviceState(dev);\n}\n\nvoid OnDeviceErrorChanges(void* ctx, ACameraDevice* dev, int err) {\n  reinterpret_cast<NDKCamera*>(ctx)->OnDeviceError(dev, err);\n}\n\n#if __NDK_MAJOR__ >= 30\nvoid OnClientSharedAccessPriorityChanged(void*,\n                                         ACameraDevice*, bool) {\n    // TODO: Implement this.\n}\n#endif\n\nACameraDevice_stateCallbacks* NDKCamera::GetDeviceListener() {\n  static ACameraDevice_stateCallbacks cameraDeviceListener = {\n      .context = this,\n      .onDisconnected = ::OnDeviceStateChanges,\n      .onError = ::OnDeviceErrorChanges,\n#if __NDK_MAJOR__ >= 30\n      .onClientSharedAccessPriorityChanged = ::OnClientSharedAccessPriorityChanged\n#endif\n  };\n  return &cameraDeviceListener;\n}\n/**\n * Handle Camera DeviceStateChanges msg, notify device is disconnected\n * simply close the camera\n */\nvoid NDKCamera::OnDeviceState(ACameraDevice* dev) {\n  std::string id(ACameraDevice_getId(dev));\n  LOGW(\"device %s is disconnected\", id.c_str());\n\n  cameras_[id].available_ = false;\n  ACameraDevice_close(cameras_[id].device_);\n  cameras_.erase(id);\n}\n/**\n * Handles Camera's deviceErrorChanges message, no action;\n * mainly debugging purpose\n *\n *\n */\nvoid NDKCamera::OnDeviceError(ACameraDevice* dev, int err) {\n  std::string id(ACameraDevice_getId(dev));\n\n  LOGI(\"CameraDevice %s is in error %#x\", id.c_str(), err);\n  PrintCameraDeviceError(err);\n\n  CameraId& cam = cameras_[id];\n\n  switch (err) {\n    case ERROR_CAMERA_IN_USE:\n      cam.available_ = false;\n      cam.owner_ = false;\n      break;\n    case ERROR_CAMERA_SERVICE:\n    case ERROR_CAMERA_DEVICE:\n    case ERROR_CAMERA_DISABLED:\n    case ERROR_MAX_CAMERAS_IN_USE:\n      cam.available_ = false;\n      cam.owner_ = false;\n      break;\n    default:\n      LOGI(\"Unknown Camera Device Error: %#x\", err);\n  }\n}\n\n// CaptureSession state callbacks\nvoid OnSessionClosed(void* ctx, ACameraCaptureSession* ses) {\n  LOGW(\"session %p closed\", ses);\n  reinterpret_cast<NDKCamera*>(ctx)->OnSessionState(\n      ses, CaptureSessionState::CLOSED);\n}\nvoid OnSessionReady(void* ctx, ACameraCaptureSession* ses) {\n  LOGW(\"session %p ready\", ses);\n  reinterpret_cast<NDKCamera*>(ctx)->OnSessionState(ses,\n                                                    CaptureSessionState::READY);\n}\nvoid OnSessionActive(void* ctx, ACameraCaptureSession* ses) {\n  LOGW(\"session %p active\", ses);\n  reinterpret_cast<NDKCamera*>(ctx)->OnSessionState(\n      ses, CaptureSessionState::ACTIVE);\n}\n\nACameraCaptureSession_stateCallbacks* NDKCamera::GetSessionListener() {\n  static ACameraCaptureSession_stateCallbacks sessionListener = {\n      .context = this,\n      .onClosed = ::OnSessionClosed,\n      .onReady = ::OnSessionReady,\n      .onActive = ::OnSessionActive,\n  };\n  return &sessionListener;\n}\n\n/**\n * Handles capture session state changes.\n *   Update into internal session state.\n */\nvoid NDKCamera::OnSessionState(ACameraCaptureSession* ses,\n                               CaptureSessionState state) {\n  if (!ses || ses != captureSession_) {\n    LOGW(\"CaptureSession is %s\", (ses ? \"NOT our session\" : \"NULL\"));\n    return;\n  }\n\n  ASSERT(state < CaptureSessionState::MAX_STATE, \"Wrong state %d\",\n         static_cast<int>(state));\n\n  captureSessionState_ = state;\n}\n\n// Capture callbacks, mostly information purpose\nvoid SessionCaptureCallback_OnFailed(void* context,\n                                     ACameraCaptureSession* session,\n                                     ACaptureRequest* request,\n                                     ACameraCaptureFailure* failure) {\n  std::thread captureFailedThread(&NDKCamera::OnCaptureFailed,\n                                  static_cast<NDKCamera*>(context), session,\n                                  request, failure);\n  captureFailedThread.detach();\n}\n\nvoid SessionCaptureCallback_OnSequenceEnd(void* context,\n                                          ACameraCaptureSession* session,\n                                          int sequenceId, int64_t frameNumber) {\n  std::thread sequenceThread(&NDKCamera::OnCaptureSequenceEnd,\n                             static_cast<NDKCamera*>(context), session,\n                             sequenceId, frameNumber);\n  sequenceThread.detach();\n}\nvoid SessionCaptureCallback_OnSequenceAborted(void* context,\n                                              ACameraCaptureSession* session,\n                                              int sequenceId) {\n  std::thread sequenceThread(&NDKCamera::OnCaptureSequenceEnd,\n                             static_cast<NDKCamera*>(context), session,\n                             sequenceId, static_cast<int64_t>(-1));\n  sequenceThread.detach();\n}\n\nACameraCaptureSession_captureCallbacks* NDKCamera::GetCaptureCallback() {\n  static ACameraCaptureSession_captureCallbacks captureListener{\n      .context = this,\n      .onCaptureStarted = nullptr,\n      .onCaptureProgressed = nullptr,\n      .onCaptureCompleted = nullptr,\n      .onCaptureFailed = SessionCaptureCallback_OnFailed,\n      .onCaptureSequenceCompleted = SessionCaptureCallback_OnSequenceEnd,\n      .onCaptureSequenceAborted = SessionCaptureCallback_OnSequenceAborted,\n      .onCaptureBufferLost = nullptr,\n  };\n  return &captureListener;\n}\n\n/**\n * Process JPG capture SessionCaptureCallback_OnFailed event\n * If this is current JPG capture session, simply resume preview\n * @param session the capture session that failed\n * @param request the capture request that failed\n * @param failure for additional fail info.\n */\nvoid NDKCamera::OnCaptureFailed(ACameraCaptureSession*,\n                                ACaptureRequest* request,\n                                ACameraCaptureFailure* failure) {\n  if (valid_ && request == requests_[JPG_CAPTURE_REQUEST_IDX].request_) {\n    ASSERT(failure->sequenceId ==\n               requests_[JPG_CAPTURE_REQUEST_IDX].sessionSequenceId_,\n           \"Error jpg sequence id\")\n    StartPreview(true);\n  }\n}\n\n/**\n * Process event from JPEG capture\n *    SessionCaptureCallback_OnSequenceEnd()\n *    SessionCaptureCallback_OnSequenceAborted()\n *\n * If this is jpg capture, turn back on preview after a catpure.\n */\nvoid NDKCamera::OnCaptureSequenceEnd(ACameraCaptureSession*, int sequenceId,\n                                     int64_t) {\n  if (sequenceId != requests_[JPG_CAPTURE_REQUEST_IDX].sessionSequenceId_)\n    return;\n\n  // resume preview\n  CALL_SESSION(setRepeatingRequest(captureSession_, nullptr, 1,\n                                   &requests_[PREVIEW_REQUEST_IDX].request_,\n                                   nullptr));\n}\n"
  },
  {
    "path": "camera/texture-view/src/main/cpp/camera_manager.cpp",
    "content": "/*\n * Copyright (C) 2017 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#include \"camera_manager.h\"\n\n#include <camera/NdkCameraManager.h>\n#include <media/NdkImage.h>\n#include <ndksamples/camera/camera_utils.h>\n#include <ndksamples/camera/native_debug.h>\n#include <unistd.h>\n\n#include <cinttypes>\n#include <cstring>\n#include <queue>\n#include <utility>\n\n/**\n * Range of Camera Exposure Time:\n *     Camera's capability range have a very long range which may be disturbing\n *     on camera. For this sample purpose, clamp to a range showing visible\n *     video on preview: 100000ns ~ 250000000ns\n */\nstatic const uint64_t kMinExposureTime = static_cast<uint64_t>(1000000);\nstatic const uint64_t kMaxExposureTime = static_cast<uint64_t>(250000000);\n\nNDKCamera::NDKCamera()\n    : cameraMgr_(nullptr),\n      activeCameraId_(\"\"),\n      cameraFacing_(ACAMERA_LENS_FACING_BACK),\n      cameraOrientation_(0),\n      outputContainer_(nullptr),\n      captureSessionState_(CaptureSessionState::MAX_STATE),\n      exposureTime_(static_cast<int64_t>(0)) {\n  valid_ = false;\n  requests_.resize(CAPTURE_REQUEST_COUNT);\n  memset(requests_.data(), 0, requests_.size() * sizeof(requests_[0]));\n  cameras_.clear();\n  cameraMgr_ = ACameraManager_create();\n  ASSERT(cameraMgr_, \"Failed to create cameraManager\");\n\n  // Pick up a back-facing camera to preview\n  EnumerateCamera();\n  ASSERT(activeCameraId_.size(), \"Unknown ActiveCameraIdx\");\n\n  // Create back facing camera device\n  CALL_MGR(openCamera(cameraMgr_, activeCameraId_.c_str(), GetDeviceListener(),\n                      &cameras_[activeCameraId_].device_));\n\n  CALL_MGR(registerAvailabilityCallback(cameraMgr_, GetManagerListener()));\n\n  // Initialize camera controls(exposure time and sensitivity), pick\n  // up value of 2% * range + min as starting value (just a number, no magic)\n  ACameraMetadata* metadataObj;\n  CALL_MGR(getCameraCharacteristics(cameraMgr_, activeCameraId_.c_str(),\n                                    &metadataObj));\n  ACameraMetadata_const_entry val = {};\n  camera_status_t status = ACameraMetadata_getConstEntry(\n      metadataObj, ACAMERA_SENSOR_INFO_EXPOSURE_TIME_RANGE, &val);\n  if (status == ACAMERA_OK) {\n    exposureRange_.min_ = val.data.i64[0];\n    if (exposureRange_.min_ < kMinExposureTime) {\n      exposureRange_.min_ = kMinExposureTime;\n    }\n    exposureRange_.max_ = val.data.i64[1];\n    if (exposureRange_.max_ > kMaxExposureTime) {\n      exposureRange_.max_ = kMaxExposureTime;\n    }\n    exposureTime_ = exposureRange_.value(2);\n  } else {\n    LOGW(\"Unsupported ACAMERA_SENSOR_INFO_EXPOSURE_TIME_RANGE\");\n    exposureRange_.min_ = exposureRange_.max_ = 0l;\n    exposureTime_ = 0l;\n  }\n  status = ACameraMetadata_getConstEntry(\n      metadataObj, ACAMERA_SENSOR_INFO_SENSITIVITY_RANGE, &val);\n\n  if (status == ACAMERA_OK) {\n    sensitivityRange_.min_ = val.data.i32[0];\n    sensitivityRange_.max_ = val.data.i32[1];\n\n    sensitivity_ = sensitivityRange_.value(2);\n  } else {\n    LOGW(\"failed for ACAMERA_SENSOR_INFO_SENSITIVITY_RANGE\");\n    sensitivityRange_.min_ = sensitivityRange_.max_ = 0;\n    sensitivity_ = 0;\n  }\n  valid_ = true;\n}\n\n/**\n * A helper class to assist image size comparison, by comparing the absolute\n * size\n * regardless of the portrait or landscape mode.\n */\nclass DisplayDimension {\n public:\n  DisplayDimension(int32_t w, int32_t h) : w_(w), h_(h), portrait_(false) {\n    if (h > w) {\n      // make it landscape\n      w_ = h;\n      h_ = w;\n      portrait_ = true;\n    }\n  }\n  DisplayDimension(const DisplayDimension& other) {\n    w_ = other.w_;\n    h_ = other.h_;\n    portrait_ = other.portrait_;\n  }\n\n  DisplayDimension(void) {\n    w_ = 0;\n    h_ = 0;\n    portrait_ = false;\n  }\n  DisplayDimension& operator=(const DisplayDimension& other) {\n    w_ = other.w_;\n    h_ = other.h_;\n    portrait_ = other.portrait_;\n\n    return (*this);\n  }\n\n  bool IsSameRatio(DisplayDimension& other) {\n    return (w_ * other.h_ == h_ * other.w_);\n  }\n  bool operator>(DisplayDimension& other) {\n    return (w_ >= other.w_ & h_ >= other.h_);\n  }\n  bool operator==(DisplayDimension& other) {\n    return (w_ == other.w_ && h_ == other.h_ && portrait_ == other.portrait_);\n  }\n  DisplayDimension operator-(DisplayDimension& other) {\n    DisplayDimension delta(w_ - other.w_, h_ - other.h_);\n    return delta;\n  }\n  void Flip(void) { portrait_ = !portrait_; }\n  bool IsPortrait(void) { return portrait_; }\n  int32_t width(void) { return w_; }\n  int32_t height(void) { return h_; }\n  int32_t org_width(void) { return (portrait_ ? h_ : w_); }\n  int32_t org_height(void) { return (portrait_ ? w_ : h_); }\n\n private:\n  int32_t w_, h_;\n  bool portrait_;\n};\n\n/**\n * Find a compatible camera modes:\n *    1) the same aspect ration as the native display window, which should be a\n *       rotated version of the physical device\n *    2) the smallest resolution in the camera mode list\n * This is to minimize the later color space conversion workload.\n */\nbool NDKCamera::MatchCaptureSizeRequest(int32_t requestWidth,\n                                        int32_t requestHeight,\n                                        ImageFormat* view) {\n  return MatchCaptureSizeRequest(requestWidth, requestHeight, view, nullptr);\n}\n\nbool NDKCamera::MatchCaptureSizeRequest(int32_t requestWidth,\n                                        int32_t requestHeight,\n                                        ImageFormat* resView,\n                                        ImageFormat* resCap) {\n  DisplayDimension disp(requestWidth, requestHeight);\n  if (cameraOrientation_ == 90 || cameraOrientation_ == 270) {\n    disp.Flip();\n  }\n  ACameraMetadata* metadata;\n  CALL_MGR(\n      getCameraCharacteristics(cameraMgr_, activeCameraId_.c_str(), &metadata));\n  ACameraMetadata_const_entry entry;\n  CALL_METADATA(getConstEntry(\n      metadata, ACAMERA_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, &entry));\n  // format of the data: format, width, height, input?, type int32\n  bool foundIt = false;\n  DisplayDimension foundRes(4000, 4000);\n  DisplayDimension maxJPG(0, 0);\n\n  for (uint32_t i = 0; i < entry.count; i += 4) {\n    int32_t input = entry.data.i32[i + 3];\n    int32_t format = entry.data.i32[i + 0];\n    if (input) continue;\n\n    if (format == AIMAGE_FORMAT_YUV_420_888 || format == AIMAGE_FORMAT_JPEG) {\n      DisplayDimension res(entry.data.i32[i + 1], entry.data.i32[i + 2]);\n      if (!disp.IsSameRatio(res)) continue;\n      if (format == AIMAGE_FORMAT_YUV_420_888 && foundRes > res) {\n        foundIt = true;\n        foundRes = res;\n      } else if (format == AIMAGE_FORMAT_JPEG && res > maxJPG) {\n        maxJPG = res;\n      }\n    }\n  }\n\n  if (foundIt) {\n    resView->width = foundRes.org_width();\n    resView->height = foundRes.org_height();\n    if (resCap) {\n      resCap->width = maxJPG.org_width();\n      resCap->height = maxJPG.org_height();\n    }\n  } else {\n    LOGW(\"Did not find any compatible camera resolution, taking 640x480\");\n    if (disp.IsPortrait()) {\n      resView->width = 480;\n      resView->height = 640;\n    } else {\n      resView->width = 640;\n      resView->height = 480;\n    }\n    if (resCap) *resCap = *resView;\n  }\n  resView->format = AIMAGE_FORMAT_YUV_420_888;\n  if (resCap) resCap->format = AIMAGE_FORMAT_JPEG;\n  return foundIt;\n}\n\nvoid NDKCamera::CreateSession(ANativeWindow* previewWindow,\n                              ANativeWindow* jpgWindow, bool manualPreview,\n                              int32_t imageRotation) {\n  // Create output from this app's ANativeWindow, and add into output container\n  requests_[PREVIEW_REQUEST_IDX].outputNativeWindow_ = previewWindow;\n  requests_[PREVIEW_REQUEST_IDX].template_ = TEMPLATE_PREVIEW;\n  requests_[JPG_CAPTURE_REQUEST_IDX].outputNativeWindow_ = jpgWindow;\n  requests_[JPG_CAPTURE_REQUEST_IDX].template_ = TEMPLATE_STILL_CAPTURE;\n\n  CALL_CONTAINER(create(&outputContainer_));\n  for (auto& req : requests_) {\n    if (!req.outputNativeWindow_) continue;\n\n    ANativeWindow_acquire(req.outputNativeWindow_);\n    CALL_OUTPUT(create(req.outputNativeWindow_, &req.sessionOutput_));\n    CALL_CONTAINER(add(outputContainer_, req.sessionOutput_));\n    CALL_TARGET(create(req.outputNativeWindow_, &req.target_));\n    CALL_DEV(createCaptureRequest(cameras_[activeCameraId_].device_,\n                                  req.template_, &req.request_));\n    CALL_REQUEST(addTarget(req.request_, req.target_));\n  }\n\n  // Create a capture session for the given preview request\n  captureSessionState_ = CaptureSessionState::READY;\n  CALL_DEV(createCaptureSession(cameras_[activeCameraId_].device_,\n                                outputContainer_, GetSessionListener(),\n                                &captureSession_));\n\n  if (jpgWindow) {\n    ACaptureRequest_setEntry_i32(requests_[JPG_CAPTURE_REQUEST_IDX].request_,\n                                 ACAMERA_JPEG_ORIENTATION, 1, &imageRotation);\n  }\n\n  if (!manualPreview) {\n    return;\n  }\n  /*\n   * Only preview request is in manual mode, JPG is always in Auto mode\n   * JPG capture mode could also be switch into manual mode and control\n   * the capture parameters, this sample leaves JPG capture to be auto mode\n   * (auto control has better effect than author's manual control)\n   */\n  uint8_t aeModeOff = ACAMERA_CONTROL_AE_MODE_OFF;\n  CALL_REQUEST(setEntry_u8(requests_[PREVIEW_REQUEST_IDX].request_,\n                           ACAMERA_CONTROL_AE_MODE, 1, &aeModeOff));\n  CALL_REQUEST(setEntry_i32(requests_[PREVIEW_REQUEST_IDX].request_,\n                            ACAMERA_SENSOR_SENSITIVITY, 1, &sensitivity_));\n  CALL_REQUEST(setEntry_i64(requests_[PREVIEW_REQUEST_IDX].request_,\n                            ACAMERA_SENSOR_EXPOSURE_TIME, 1, &exposureTime_));\n}\n\nvoid NDKCamera::CreateSession(ANativeWindow* previewWindow) {\n  CreateSession(previewWindow, nullptr, false, 0);\n}\n\nNDKCamera::~NDKCamera() {\n  valid_ = false;\n  // stop session if it is on:\n  if (captureSessionState_ == CaptureSessionState::ACTIVE) {\n    ACameraCaptureSession_stopRepeating(captureSession_);\n  }\n  ACameraCaptureSession_close(captureSession_);\n\n  for (auto& req : requests_) {\n    if (!req.outputNativeWindow_) continue;\n\n    CALL_REQUEST(removeTarget(req.request_, req.target_));\n    ACaptureRequest_free(req.request_);\n    ACameraOutputTarget_free(req.target_);\n\n    CALL_CONTAINER(remove(outputContainer_, req.sessionOutput_));\n    ACaptureSessionOutput_free(req.sessionOutput_);\n\n    ANativeWindow_release(req.outputNativeWindow_);\n  }\n  requests_.resize(0);\n  ACaptureSessionOutputContainer_free(outputContainer_);\n\n  for (auto& cam : cameras_) {\n    if (cam.second.device_) {\n      CALL_DEV(close(cam.second.device_));\n    }\n  }\n  cameras_.clear();\n  if (cameraMgr_) {\n    CALL_MGR(unregisterAvailabilityCallback(cameraMgr_, GetManagerListener()));\n    ACameraManager_delete(cameraMgr_);\n    cameraMgr_ = nullptr;\n  }\n}\n\n/**\n * EnumerateCamera()\n *     Loop through cameras on the system, pick up\n *     1) back facing one if available\n *     2) otherwise pick the first one reported to us\n */\nvoid NDKCamera::EnumerateCamera() {\n  ACameraIdList* cameraIds = nullptr;\n  CALL_MGR(getCameraIdList(cameraMgr_, &cameraIds));\n\n  for (int i = 0; i < cameraIds->numCameras; ++i) {\n    const char* id = cameraIds->cameraIds[i];\n\n    ACameraMetadata* metadataObj;\n    CALL_MGR(getCameraCharacteristics(cameraMgr_, id, &metadataObj));\n\n    int32_t count = 0;\n    const uint32_t* tags = nullptr;\n    ACameraMetadata_getAllTags(metadataObj, &count, &tags);\n    for (int tagIdx = 0; tagIdx < count; ++tagIdx) {\n      if (ACAMERA_LENS_FACING == tags[tagIdx]) {\n        ACameraMetadata_const_entry lensInfo = {};\n        CALL_METADATA(getConstEntry(metadataObj, tags[tagIdx], &lensInfo));\n        CameraId cam(id);\n        cam.facing_ = static_cast<acamera_metadata_enum_android_lens_facing_t>(\n            lensInfo.data.u8[0]);\n        cam.owner_ = false;\n        cam.device_ = nullptr;\n        cameras_[cam.id_] = cam;\n        if (cam.facing_ == ACAMERA_LENS_FACING_BACK) {\n          activeCameraId_ = cam.id_;\n        }\n        break;\n      }\n    }\n    ACameraMetadata_free(metadataObj);\n  }\n\n  ASSERT(cameras_.size(), \"No Camera Available on the device\");\n  if (activeCameraId_.length() == 0) {\n    // if no back facing camera found, pick up the first one to use...\n    activeCameraId_ = cameras_.begin()->second.id_;\n  }\n  ACameraManager_deleteCameraIdList(cameraIds);\n}\n\n/**\n * GetSensorOrientation()\n *     Retrieve current sensor orientation regarding to the phone device\n * orientation\n *     SensorOrientation is NOT settable.\n */\nbool NDKCamera::GetSensorOrientation(int32_t* facing, int32_t* angle) {\n  if (!cameraMgr_) {\n    return false;\n  }\n\n  ACameraMetadata* metadataObj;\n  ACameraMetadata_const_entry face, orientation;\n  CALL_MGR(getCameraCharacteristics(cameraMgr_, activeCameraId_.c_str(),\n                                    &metadataObj));\n  CALL_METADATA(getConstEntry(metadataObj, ACAMERA_LENS_FACING, &face));\n  cameraFacing_ = static_cast<int32_t>(face.data.u8[0]);\n\n  CALL_METADATA(\n      getConstEntry(metadataObj, ACAMERA_SENSOR_ORIENTATION, &orientation));\n\n  LOGI(\"====Current SENSOR_ORIENTATION: %8d\", orientation.data.i32[0]);\n\n  ACameraMetadata_free(metadataObj);\n  cameraOrientation_ = orientation.data.i32[0];\n\n  if (facing) *facing = cameraFacing_;\n  if (angle) *angle = cameraOrientation_;\n  return true;\n}\n\n/**\n * StartPreview()\n *   Toggle preview start/stop\n */\nvoid NDKCamera::StartPreview(bool start) {\n  if (start) {\n    CALL_SESSION(setRepeatingRequest(captureSession_, nullptr, 1,\n                                     &requests_[PREVIEW_REQUEST_IDX].request_,\n                                     nullptr));\n  } else if (!start && captureSessionState_ == CaptureSessionState::ACTIVE) {\n    ACameraCaptureSession_stopRepeating(captureSession_);\n  }\n}\n\n/**\n * Capture one jpg photo into\n *     /sdcard/DCIM/Camera\n * refer to WriteFile() for details\n */\nbool NDKCamera::TakePhoto(void) {\n  if (captureSessionState_ == CaptureSessionState::ACTIVE) {\n    ACameraCaptureSession_stopRepeating(captureSession_);\n  }\n\n  CALL_SESSION(capture(captureSession_, GetCaptureCallback(), 1,\n                       &requests_[JPG_CAPTURE_REQUEST_IDX].request_,\n                       &requests_[JPG_CAPTURE_REQUEST_IDX].sessionSequenceId_));\n  return true;\n}\n\nvoid NDKCamera::UpdateCameraRequestParameter(int32_t code, int64_t val) {\n  ACaptureRequest* request = requests_[PREVIEW_REQUEST_IDX].request_;\n  switch (code) {\n    case ACAMERA_SENSOR_EXPOSURE_TIME:\n      exposureTime_ = val;\n      CALL_REQUEST(setEntry_i64(request, ACAMERA_SENSOR_EXPOSURE_TIME, 1,\n                                &exposureTime_));\n      break;\n\n    case ACAMERA_SENSOR_SENSITIVITY:\n      sensitivity_ = val;\n      CALL_REQUEST(\n          setEntry_i32(request, ACAMERA_SENSOR_SENSITIVITY, 1, &sensitivity_));\n      break;\n    default:\n      ASSERT(false, \"==ERROR==: error code for CameraParameterChange: %d\",\n             code);\n      return;\n  }\n\n  uint8_t aeModeOff = ACAMERA_CONTROL_AE_MODE_OFF;\n  CALL_REQUEST(setEntry_u8(request, ACAMERA_CONTROL_AE_MODE, 1, &aeModeOff));\n  CALL_SESSION(\n      setRepeatingRequest(captureSession_, nullptr, 1, &request,\n                          &requests_[PREVIEW_REQUEST_IDX].sessionSequenceId_));\n}\n\n/**\n * Retrieve Camera Exposure adjustable range.\n *\n * @param min Camera minimium exposure time in nanoseconds\n * @param max Camera maximum exposure tiem in nanoseconds\n *\n * @return true  min and max are loaded with the camera's exposure values\n *         false camera has not initialized, no value available\n */\nbool NDKCamera::GetExposureRange(int64_t* min, int64_t* max, int64_t* curVal) {\n  if (!exposureTime_ || !min || !max || !curVal) {\n    return false;\n  }\n  *min = exposureRange_.min_;\n  *max = exposureRange_.max_;\n  *curVal = exposureTime_;\n\n  return true;\n}\n\n/**\n * Retrieve Camera sensitivity range.\n *\n * @param min Camera minimium sensitivity\n * @param max Camera maximum sensitivity\n *\n * @return true  min and max are loaded with the camera's sensitivity values\n *         false camera has not initialized, no value available\n */\nbool NDKCamera::GetSensitivityRange(int64_t* min, int64_t* max,\n                                    int64_t* curVal) {\n  if (!sensitivity_ || !min || !max || !curVal) {\n    return false;\n  }\n  *min = static_cast<int64_t>(sensitivityRange_.min_);\n  *max = static_cast<int64_t>(sensitivityRange_.max_);\n  *curVal = sensitivity_;\n  return true;\n}\n"
  },
  {
    "path": "camera/texture-view/src/main/cpp/camera_manager.h",
    "content": "/*\n * Copyright (C) 2017 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef CAMERA_NATIVE_CAMERA_H\n#define CAMERA_NATIVE_CAMERA_H\n#include <camera/NdkCameraDevice.h>\n#include <camera/NdkCameraError.h>\n#include <camera/NdkCameraManager.h>\n#include <camera/NdkCameraMetadataTags.h>\n\n#include <map>\n#include <string>\n#include <vector>\n\nenum class CaptureSessionState : int32_t {\n  READY = 0,  // session is ready\n  ACTIVE,     // session is busy\n  CLOSED,     // session is closed(by itself or a new session evicts)\n  MAX_STATE\n};\n\n/*\n * ImageFormat:\n *     A Data Structure to communicate resolution between camera and ImageReader\n */\nstruct ImageFormat {\n  int32_t width;\n  int32_t height;\n\n  int32_t format;  // Through out this demo, the format is fixed to\n                   // YUV_420 format\n};\n\ntemplate <typename T>\nclass RangeValue {\n public:\n  T min_, max_;\n  /**\n   * return absolute value from relative value\n   * value: in percent (50 for 50%)\n   */\n  T value(int percent) {\n    return static_cast<T>(min_ + (max_ - min_) * percent / 100);\n  }\n  RangeValue() { min_ = max_ = static_cast<T>(0); }\n\n  bool Supported(void) const { return (min_ != max_); }\n};\n\nenum PREVIEW_INDICES {\n  PREVIEW_REQUEST_IDX = 0,\n  JPG_CAPTURE_REQUEST_IDX,\n  CAPTURE_REQUEST_COUNT,\n};\n\nstruct CaptureRequestInfo {\n  ANativeWindow* outputNativeWindow_;\n  ACaptureSessionOutput* sessionOutput_;\n  ACameraOutputTarget* target_;\n  ACaptureRequest* request_;\n  ACameraDevice_request_template template_;\n  int sessionSequenceId_;\n};\n\nclass CameraId;\nclass NDKCamera {\n private:\n  ACameraManager* cameraMgr_;\n  std::map<std::string, CameraId> cameras_;\n  std::string activeCameraId_;\n  uint32_t cameraFacing_;\n  uint32_t cameraOrientation_;\n\n  std::vector<CaptureRequestInfo> requests_;\n\n  ACaptureSessionOutputContainer* outputContainer_;\n  ACameraCaptureSession* captureSession_;\n  CaptureSessionState captureSessionState_;\n\n  // set up exposure control\n  int64_t exposureTime_;\n  RangeValue<uint64_t> exposureRange_;\n  int32_t sensitivity_;\n  RangeValue<int32_t> sensitivityRange_;\n  volatile bool valid_;\n\n  ACameraManager_AvailabilityCallbacks* GetManagerListener();\n  ACameraDevice_stateCallbacks* GetDeviceListener();\n  ACameraCaptureSession_stateCallbacks* GetSessionListener();\n  ACameraCaptureSession_captureCallbacks* GetCaptureCallback();\n\n public:\n  NDKCamera();\n  ~NDKCamera();\n  void EnumerateCamera(void);\n  bool MatchCaptureSizeRequest(int32_t requestWidth, int32_t requestHeight,\n                               ImageFormat* view);\n  bool MatchCaptureSizeRequest(int32_t requestWidth, int32_t requestHeight,\n                               ImageFormat* view, ImageFormat* capture);\n  void CreateSession(ANativeWindow* previewWindow, ANativeWindow* jpgWindow,\n                     bool manaulPreview, int32_t imageRotation);\n  void CreateSession(ANativeWindow* previewWindow);\n\n  bool GetSensorOrientation(int32_t* facing, int32_t* angle);\n  void OnCameraStatusChanged(const char* id, bool available);\n  void OnDeviceState(ACameraDevice* dev);\n  void OnDeviceError(ACameraDevice* dev, int err);\n  void OnSessionState(ACameraCaptureSession* ses, CaptureSessionState state);\n  void OnCaptureSequenceEnd(ACameraCaptureSession* session, int sequenceId,\n                            int64_t frameNumber);\n  void OnCaptureFailed(ACameraCaptureSession* session, ACaptureRequest* request,\n                       ACameraCaptureFailure* failure);\n\n  void StartPreview(bool start);\n  bool TakePhoto(void);\n  bool GetExposureRange(int64_t* min, int64_t* max, int64_t* curVal);\n  bool GetSensitivityRange(int64_t* min, int64_t* max, int64_t* curVal);\n\n  void UpdateCameraRequestParameter(int32_t code, int64_t val);\n};\n\n// helper classes to hold enumerated camera\nclass CameraId {\n public:\n  ACameraDevice* device_;\n  std::string id_;\n  acamera_metadata_enum_android_lens_facing_t facing_;\n  bool available_;  // free to use ( no other apps are using\n  bool owner_;      // we are the owner of the camera\n  explicit CameraId(const char* id)\n      : device_(nullptr),\n        facing_(ACAMERA_LENS_FACING_FRONT),\n        available_(false),\n        owner_(false) {\n    id_ = id;\n  }\n\n  explicit CameraId(void) { CameraId(\"\"); }\n};\n\n#endif  // CAMERA_NATIVE_CAMERA_H\n"
  },
  {
    "path": "camera/texture-view/src/main/cpp/libcamera_textureview.map.txt",
    "content": "LIBCAMERA_TEXTUREVIEW {\n  global:\n    JNI_OnLoad;\n  local:\n    *;\n};\n"
  },
  {
    "path": "camera/texture-view/src/main/java/com/sample/textureview/ViewActivity.java",
    "content": "/*\n * Copyright (C) 2017 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.sample.textureview;\n\nimport android.Manifest;\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.pm.PackageManager;\nimport android.graphics.Matrix;\nimport android.graphics.SurfaceTexture;\nimport android.hardware.camera2.CameraAccessException;\nimport android.hardware.camera2.CameraCharacteristics;\nimport android.hardware.camera2.CameraManager;\nimport android.os.Bundle;\nimport androidx.annotation.NonNull;\nimport androidx.core.app.ActivityCompat;\nimport android.util.Log;\nimport android.view.Display;\nimport android.view.Gravity;\nimport android.view.Surface;\nimport android.view.TextureView;\nimport android.view.View;\nimport android.util.Size;\nimport android.widget.FrameLayout;\n\nimport static android.hardware.camera2.CameraMetadata.LENS_FACING_BACK;\n\npublic class ViewActivity extends Activity\n        implements TextureView.SurfaceTextureListener,\n        ActivityCompat.OnRequestPermissionsResultCallback {\n    long ndkCamera_;\n    private TextureView textureView_;\n    Surface surface_ = null;\n    private Size cameraPreviewSize_;\n\n    @Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        onWindowFocusChanged(true);\n        setContentView(R.layout.activity_main);\n        if (isCamera2Device()) {\n            RequestCamera();\n        } else {\n            Log.e(\"CameraSample\", \"Found legacy camera device, this sample needs camera2 device\");\n        }\n    }\n\n    @Override\n    public void onWindowFocusChanged(boolean hasFocus) {\n        super.onWindowFocusChanged(hasFocus);\n        if (hasFocus) {\n            getWindow().getDecorView().setSystemUiVisibility(\n                    View.SYSTEM_UI_FLAG_LAYOUT_STABLE\n                            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION\n                            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN\n                            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION\n                            | View.SYSTEM_UI_FLAG_FULLSCREEN\n                            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);\n        }\n    }\n    private boolean isCamera2Device() {\n        CameraManager camMgr = (CameraManager)getSystemService(Context.CAMERA_SERVICE);\n        boolean camera2Dev = true;\n        try {\n            String[] cameraIds = camMgr.getCameraIdList();\n            if (cameraIds.length != 0 ) {\n                for (String id : cameraIds) {\n                    CameraCharacteristics characteristics = camMgr.getCameraCharacteristics(id);\n                    int deviceLevel = characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);\n                    int facing = characteristics.get(CameraCharacteristics.LENS_FACING);\n                    if (deviceLevel == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY &&\n                            facing == LENS_FACING_BACK) {\n                        camera2Dev =  false;\n                    }\n                }\n            }\n        } catch (CameraAccessException e) {\n            e.printStackTrace();\n            camera2Dev = false;\n        }\n        return camera2Dev;\n    }\n    private void createTextureView() {\n        textureView_ = (TextureView) findViewById(R.id.texturePreview);\n        textureView_.setSurfaceTextureListener(this);\n        if (textureView_.isAvailable()) {\n            onSurfaceTextureAvailable(textureView_.getSurfaceTexture(),\n                    textureView_.getWidth(), textureView_.getHeight());\n        }\n    }\n\n    public void onSurfaceTextureAvailable(SurfaceTexture surface,\n                                          int width, int height) {\n        createNativeCamera();\n\n        resizeTextureView(width, height);\n        surface.setDefaultBufferSize(cameraPreviewSize_.getWidth(),\n                cameraPreviewSize_.getHeight());\n        surface_ = new Surface(surface);\n        onPreviewSurfaceCreated(ndkCamera_, surface_);\n    }\n\n    private void resizeTextureView(int textureWidth, int textureHeight) {\n        int rotation = getWindowManager().getDefaultDisplay().getRotation();\n        int newWidth = textureWidth;\n        int newHeight = textureWidth * cameraPreviewSize_.getWidth() / cameraPreviewSize_.getHeight();\n\n        if (Surface.ROTATION_90 == rotation || Surface.ROTATION_270 == rotation) {\n            newHeight = (textureWidth * cameraPreviewSize_.getHeight()) / cameraPreviewSize_.getWidth();\n        }\n        textureView_.setLayoutParams(\n                new FrameLayout.LayoutParams(newWidth, newHeight, Gravity.CENTER));\n        configureTransform(newWidth, newHeight);\n    }\n\n    /**\n     * configureTransform()\n     * Courtesy to https://github.com/google/cameraview/blob/master/library/src/main/api14/com/google/android/cameraview/TextureViewPreview.java#L108\n     *\n     * @param width  TextureView width\n     * @param height is TextureView height\n     */\n    void configureTransform(int width, int height) {\n        int mDisplayOrientation = getWindowManager().getDefaultDisplay().getRotation() * 90;\n        Matrix matrix = new Matrix();\n        if (mDisplayOrientation % 180 == 90) {\n            //final int width = getWidth();\n            //final int height = getHeight();\n            // Rotate the camera preview when the screen is landscape.\n            matrix.setPolyToPoly(\n                    new float[]{\n                            0.f, 0.f, // top left\n                            width, 0.f, // top right\n                            0.f, height, // bottom left\n                            width, height, // bottom right\n                    }, 0,\n                    mDisplayOrientation == 90 ?\n                            // Clockwise\n                            new float[]{\n                                    0.f, height, // top left\n                                    0.f, 0.f,    // top right\n                                    width, height, // bottom left\n                                    width, 0.f, // bottom right\n                            } : // mDisplayOrientation == 270\n                            // Counter-clockwise\n                            new float[]{\n                                    width, 0.f, // top left\n                                    width, height, // top right\n                                    0.f, 0.f, // bottom left\n                                    0.f, height, // bottom right\n                            }, 0,\n                    4);\n        } else if (mDisplayOrientation == 180) {\n            matrix.postRotate(180, width / 2, height / 2);\n        }\n        textureView_.setTransform(matrix);\n    }\n\n    public void onSurfaceTextureSizeChanged(SurfaceTexture surface,\n                                            int width, int height) {\n    }\n\n    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {\n        onPreviewSurfaceDestroyed(ndkCamera_, surface_);\n        deleteCamera(ndkCamera_, surface_);\n        ndkCamera_ = 0;\n        surface_ = null;\n        return true;\n    }\n\n    public void onSurfaceTextureUpdated(SurfaceTexture surface) {\n    }\n\n    private static final int PERMISSION_REQUEST_CODE_CAMERA = 1;\n\n    public void RequestCamera() {\n        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) !=\n                PackageManager.PERMISSION_GRANTED) {\n            ActivityCompat.requestPermissions(\n                    this,\n                    new String[]{Manifest.permission.CAMERA},\n                    PERMISSION_REQUEST_CODE_CAMERA);\n            return;\n        }\n        createTextureView();\n    }\n\n    @Override\n    public void onRequestPermissionsResult(int requestCode,\n                                           @NonNull String[] permissions,\n                                           @NonNull int[] grantResults) {\n        /*\n         * if any permission failed, the sample could not play\n         */\n        if (PERMISSION_REQUEST_CODE_CAMERA != requestCode) {\n            super.onRequestPermissionsResult(requestCode,\n                    permissions,\n                    grantResults);\n            return;\n        }\n\n        if (grantResults.length == 1 &&\n            grantResults[0] == PackageManager.PERMISSION_GRANTED) {\n            Thread initCamera = new Thread(new Runnable() {\n                public void run() {\n                    runOnUiThread(new Runnable() {\n                        @Override\n                        public void run() {\n                            createTextureView();\n                        }\n                    });\n                }\n            });\n            initCamera.start();\n        }\n    }\n\n    private void createNativeCamera() {\n        Display display = getWindowManager().getDefaultDisplay();\n        int height = display.getMode().getPhysicalHeight();\n        int width = display.getMode().getPhysicalWidth();\n\n        ndkCamera_ = createCamera(width, height);\n\n        cameraPreviewSize_ = getMinimumCompatiblePreviewSize(ndkCamera_);\n\n    }\n\n    /*\n     * Functions calling into NDKCamera side to:\n     *     CreateCamera / DeleteCamera object\n     *     Start/Stop Preview\n     *     Pulling Camera Parameters\n     */\n    private native long createCamera(int width, int height);\n\n    private native Size getMinimumCompatiblePreviewSize(long ndkCamera);\n\n    private native void onPreviewSurfaceCreated(long ndkCamera, Surface surface);\n\n    private native void onPreviewSurfaceDestroyed(long ndkCamera, Surface surface);\n\n    private native void deleteCamera(long ndkCamera, Surface surface);\n\n    static {\n        System.loadLibrary(\"camera_textureview\");\n    }\n\n}\n"
  },
  {
    "path": "camera/texture-view/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n             android:layout_width=\"match_parent\"\n             android:layout_height=\"match_parent\"\n             android:layout_centerHorizontal=\"true\"\n             android:layout_centerVertical=\"true\">\n    <TextureView\n        android:id=\"@+id/texturePreview\"\n        android:layout_gravity=\"center\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"/>\n\n</FrameLayout>\n"
  },
  {
    "path": "camera/texture-view/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<resources>\r\n\r\n    <string name=\"app_name\">texture-view</string>\r\n\r\n</resources>\r\n"
  },
  {
    "path": "cmake/AppLibrary.cmake",
    "content": "include_guard()\n\n# Wrapper for add_library which enables common options we want for all\n# libraries.\nfunction(add_app_library name)\n    cmake_parse_arguments(PARSE_ARGV 1 arg \"NO_VERSION_SCRIPT\" \"\" \"\")\n    add_library(${name} ${arg_UNPARSED_ARGUMENTS})\n\n    target_compile_options(${name}\n        PRIVATE\n        -Wall\n        -Wextra\n        -Werror\n    )\n\n    if(NOT arg_NO_VERSION_SCRIPT)\n        target_link_options(${name}\n            PRIVATE\n            -Wl,--no-undefined-version\n            -Wl,--version-script,${CMAKE_SOURCE_DIR}/lib${name}.map.txt\n        )\n\n        set_target_properties(${name}\n            PROPERTIES\n            LINK_DEPENDS ${CMAKE_SOURCE_DIR}/lib${name}.map.txt\n        )\n    endif()\nendfunction()\n"
  },
  {
    "path": "endless-tunnel/README.md",
    "content": "# Endless Tunnel\n\nEndless Tunnel is a sample game that shows how to:\n\n- use the Android Studio C++ support\n- implement a game using Android native glue\n- implement joystick support, including robust DPAD navigation for non-touch\n  screens\n\nIt is NOT the goal of this sample to show the best way to write the game logic,\nload resources, etc. The game itself was intentionally kept rudimentary in order\nto keep the focus on the Android Studio C++ integration. For example, this game\ncontains textures and geometry hard-coded in code, which works for small demo\ngames like this one, but doesn't scale well to real games.\n\n## Screenshots\n\n![screenshot](screenshot.png)\n\n## Dependencies\n\n### GLM LIBRARY\n\nThis project uses the OpenGL Mathematics (GLM) library, available at:\n\n```\nhttps://github.com/g-truc/glm\n```\n\nFor more information about this library and its license, please see\n[readme.md](https://github.com/g-truc/glm/blob/master/readme.md) and\n[copying](https://github.com/g-truc/glm/blob/master/copying.txt).\n\n## Walkthrough\n\nSource code is under app, it only contains C++ code, which is sitting at its\ndefault location (same as for other samples) at app/cpp.\n\nThe game starts at the android_main function, defined in android_main.cpp, like\nany standard NDK game.\n\n### Scenes And The Scene Manager\n\nWe have a singleton class called SceneManager. As the name says, it's the class\nthat manages scenes. There's always an active Scene, and the scene determines\nwhat's visible onscreen and how the game reacts to input. The main menu is a\nscene, the gameplay is another scene.\n\nAs the game runs, the display might be initialized and terminated multiple\ntimes, corresponding, for example, to the app losing focus and being brought\nback into focus. This is why the SceneManager (and the Scene's) have the notion\nof StartGraphics() and KillGraphics(). These two methods may be called multiple\ntimes along the lifetime of a scene. So everything that has to do with graphics\ncontext (like shaders, textures, etc) has to be initialized in StartGraphics(),\nand has to be torn down in KillGraphics().\n\nThe NativeEngine::InitDisplay function is where we set up OpenGL for our game,\nand call StartGraphics() on the active scene. The NativeEngine::KillGLObjects is\nwhere we call KillGraphics() on the active scene.\n\nInput arrives by way of the NativeEngine::HandleInput function, which does some\nbasic input classification and delivers the input to the scene manager.\nIncidentally, here we also synthesise DPAD events based on the joystick hat axes\n(many game controllers generate hat events when you press the directional pad),\nbecause that way we can use that directional pad to drive UI navigation in the\nmain screen.\n\nTake a look at scene_manager.cpp, scene.cpp, etc to familiarize yourself with\nthem.\n\n### Geometry And Rendering\n\nThe game's geometry is represented by VBOs and IBOs. A VBO is represented by the\nVertexBuf class, and an IBO is represented by an IndexBuf. A shader is\nrepresented by the Shader class, of which TrivialShader is a concrete example.\n\nNow, onto rendering. Everything in the game is rendered by a Shader.\n\nNormally, to use a Shader, you call BeginRender() and give it a VertexBuf. This\nmeans you will be rendering one or more subsets of that geometry. After that,\ncall Render(ibuf, mat) where ibuf is the IndexBuffer that represents the part of\nthe geometry you want to render, and mat is the transformation matrix. You can\ncall Render() multiple times to render different subsets of the geometry with\ndifferent matrices. When you're done, you call the shader's EndRender() method.\n\nAs a simpler alternative when you only want to render a single copy of an object\nthat's defined by a VertexBuffer and IndexBuffer pair, just call\nRenderSimpleGeom(), which takes a matrix and a SimpleGeom object (which, in\nturn, is just a pair of VertexBuffer and IndexBuffer).\n\nThe shader subclass is responsible for knowing what to do to render a geometry.\nFor example, if the shader needs texture coordinates, it will query the geometry\nfor texture coordinates as necessary -- if it doesn't have them, it will throw\nan error (that being just an euphemism for an ugly native crash). So, yes, you\nhave to be careful that the geometry you're feeding to a shader has the data\nthat's needed by that shader.\n\nParticularly, TrivialShader only needs position and color info for each vertex.\nThe more complex OurShader class (in jni/our_shader.cpp) needs texture\ncoordinates.\n\n### The Normalized 2d Coord System\n\nFor all 2D rendering, we use a normalized coordinate system where the\nbottom-left of the screen is (0,0), the X coordinate increases to the right and\nthe Y coordinate increases upwards. The Y coordinate of the top of the screen is\ndefined to be 1.0. The X coordinate of the right side of the screen is the\nscreen's aspect ratio. So, on a 4:3 screen, these are the coordinates of the\nfour corners of the screen:\n\n```\n(0.000,1.000)       (1.333,1.000)\n       +--------------+\n       |              |\n       |              |\n       |              |\n       |              |\n       +--------------+\n(0.000,0.000)       (1.333,0.000)\n```\n\nWhat this means is that Y=0.5 is always the vertical center of the screen\nregardless of the screen size, and that X=aspect/2 is always the horizontal\ncenter of the screen, regardless of physical screen size.\n\nThis coordinate system is set up like this:\n\n```\n    glm::mat4 modelMat, mat;\n\n    // set up projection matrix\n    float aspect = SceneManager::GetInstance()->GetScreenAspect();\n    glm::mat4 orthoMat = glm::ortho(0.0f, aspect, 0.0f, 1.0f);\n\n    // ... (set up modelMat as needed)\n\n    // determine final matrix for rendering\n    mat = orthoMat * modelMat;\n\n    // render something\n    mShader->RenderSimpleGeom(&mat, mGeom);\n```\n\n### The Main Menu\n\nThe game's main menu scene is in welcome_scene.cpp. It renders all the buttons\non the interface and manages the navigation. It can also show popups (\"About\",\n\"Story\", \"Play\").\n\n### Game Logic\n\nThe whole game logic is contained in play_scene.cpp. We won't dive into a full\ndiscussion of it, but start reading from the PlayScene::DoFrame() method and it\nshould become clear. It's a standard game loop that handles input, updates the\nworld, checks for collisions and renders.\n"
  },
  {
    "path": "endless-tunnel/app/build.gradle",
    "content": "/*\n * Copyright (C) 2015 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nplugins {\n    id \"ndksamples.android.application\"\n}\n\nandroid {\n    namespace 'com.google.sample.tunnel'\n    defaultConfig {\n        applicationId 'com.google.sample.tunnel'\n        versionCode     1\n        versionName    '1.0'\n        externalNativeBuild {\n            cmake {\n                arguments '-DANDROID_STL=c++_static'\n            }\n        }\n    }\n    externalNativeBuild {\n        cmake {\n            path 'src/main/cpp/CMakeLists.txt'\n        }\n    }\n}\n\n"
  },
  {
    "path": "endless-tunnel/app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n   Copyright (C) 2013 Google Inc.\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n      http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n\n<!-- TODO: when building this sample, replace the package name below\n     (com.google.example.games.tunnel) by your own package name -->\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n  <application\n      android:allowBackup=\"false\"\n      android:fullBackupContent=\"false\"\n      android:icon=\"@mipmap/ic_launcher\"\n      android:label=\"@string/app_name\">\n    <activity android:name=\"android.app.NativeActivity\"\n              android:label=\"@string/app_name\"\n              android:configChanges=\"orientation|keyboardHidden|keyboard|screenSize\"\n              android:screenOrientation=\"landscape\"\n              android:theme=\"@style/AppTheme\"\n        android:exported=\"true\">\n      <meta-data android:name=\"android.app.lib_name\"\n                 android:value=\"game\" />\n      <intent-filter>\n        <action android:name=\"android.intent.action.MAIN\" />\n        <category android:name=\"android.intent.category.LAUNCHER\" />\n      </intent-filter>\n    </activity>\n  </application>\n</manifest>\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/CMakeLists.txt",
    "content": "#\n# Copyright (C) The Android Open Source Project\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\ncmake_minimum_required(VERSION 3.22.1)\nproject(EndlessTunnel LANGUAGES C CXX)\n\ninclude(AppLibrary)\ninclude(AndroidNdkModules)\n\nandroid_ndk_import_module_native_app_glue()\n\n# Set common compiler options\nadd_definitions(\"-DGLM_FORCE_SIZE_T_LENGTH -DGLM_FORCE_RADIANS\")\n\n# Import the CMakeLists.txt for the glm library\nadd_subdirectory(glm)\n\n# now build app's shared lib\nadd_app_library(game SHARED\n    android_main.cpp\n    anim.cpp\n    ascii_to_geom.cpp\n    dialog_scene.cpp\n    indexbuf.cpp\n    input_util.cpp\n    jni_util.cpp\n    native_engine.cpp\n    obstacle.cpp\n    obstacle_generator.cpp\n    our_shader.cpp\n    play_scene.cpp\n    scene.cpp\n    scene_manager.cpp\n    sfxman.cpp\n    shader.cpp\n    shape_renderer.cpp\n    tex_quad.cpp\n    text_renderer.cpp\n    texture.cpp\n    ui_scene.cpp\n    util.cpp\n    vertexbuf.cpp\n    welcome_scene.cpp\n)\n\nif(ANDROID_ABI STREQUAL riscv64)\n    # This sample uses OpenSLES, which was deprecated in API 26. Our\n    # minSdkVersion is 21, but we also build for riscv64, which isn't a\n    # supported ABI yet and so that configuration is built for the latest API\n    # level supported by the NDK.\n    #\n    # Longer term, this sample should migrate to Oboe.\n    target_compile_options(game PRIVATE -Wno-deprecated-declarations)\nendif()\n\ntarget_include_directories(game PRIVATE\n    ${CMAKE_CURRENT_SOURCE_DIR}\n    ${CMAKE_CURRENT_SOURCE_DIR}/data\n)\n\n# add lib dependencies\ntarget_link_libraries(game\n    android\n    $<LINK_LIBRARY:WHOLE_ARCHIVE,native_app_glue>\n    atomic\n    EGL\n    GLESv2\n    glm\n    log\n    OpenSLES\n)\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/android_main.cpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"native_engine.hpp\"\n\nextern \"C\" {\nvoid android_main(struct android_app* state);\n};\n\nvoid android_main(struct android_app* app) {\n  NativeEngine* engine = new NativeEngine(app);\n  engine->GameLoop();\n  delete engine;\n}\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/anim.cpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#include \"anim.hpp\"\n\n#include \"util.hpp\"\n\nvoid RenderBackgroundAnimation(ShapeRenderer* r) {\n  float aspect = SceneManager::GetInstance()->GetScreenAspect();\n  static const int BG_RECTS = 50;\n  static const float RECT_W = 0.3f;\n  static const float RECT_H = 0.1f;\n  static float rectX[BG_RECTS];\n  static float rectY[BG_RECTS];\n  static bool rectsInitted = false;\n  int i;\n\n  if (!rectsInitted) {\n    for (i = 0; i < BG_RECTS; i++) {\n      rectX[i] = aspect * (Random(100) / 100.0f);\n      rectY[i] = Random(100) / 100.0f;\n    }\n    rectsInitted = true;\n  }\n\n  glClear(GL_COLOR_BUFFER_BIT);\n\n  for (i = 0; i < BG_RECTS; i++) {\n    float c = 0.1f + 0.1f * (i % 4);\n    r->SetColor(c, c, c);\n    r->RenderRect(rectX[i], rectY[i], RECT_W, RECT_H);\n\n    rectX[i] -= (0.01f + 0.01f * (i % 4));\n    if (rectX[i] < -RECT_W * 0.5f) {\n      rectX[i] = aspect + RECT_W * 0.5f;\n      rectY[i] = Random(100) / 100.0f;\n    }\n  }\n}\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/anim.hpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef endlesstunnel_anim_hpp\n#define endlesstunnel_anim_hpp\n\n#include \"shape_renderer.hpp\"\n\n/* Renders a the background animation seen on the main screen and menus (the\n * parallax rectangles scrolling by). */\nvoid RenderBackgroundAnimation(ShapeRenderer *r);\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/ascii_to_geom.cpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#include \"ascii_to_geom.hpp\"\n\n#define GEOM_DEBUG LOGD\n// #define GEOM_DEBUG\n\nSimpleGeom* AsciiArtToGeom(const char* art, float scale) {\n  // figure out width and height\n  LOGD(\"Creating geometry from ASCII art.\");\n  GEOM_DEBUG(\"Ascii art source:\\n%s\", art);\n  int rows = 1;\n  int curCols = 0, cols = 0;\n  int r, c;\n  const char* p;\n  for (p = art; *p; ++p) {\n    if (*p == '\\n') {\n      rows++;\n      curCols = 0;\n    } else {\n      curCols++;\n      cols = curCols > cols ? curCols : cols;\n    }\n  }\n\n  GEOM_DEBUG(\"Ascii art has %d rows, %d cols.\", rows, cols);\n  GEOM_DEBUG(\"Making working array.\");\n\n  // allocate a rows x cols array that we will use as working space\n  unsigned int** v = new unsigned int*[rows];\n  for (r = 0; r < rows; r++) {\n    v[r] = new unsigned int[cols];\n    memset(v[r], 0, cols * sizeof(unsigned int));\n  }\n\n  // copy the input into the array\n  r = c = 0;\n  for (p = art; *p; ++p) {\n    if (*p == '\\n') {\n      r++, c = 0;\n    } else {\n      MY_ASSERT(r >= 0 && r < rows);\n      MY_ASSERT(c >= 0 && c < cols);\n      v[r][c++] = static_cast<unsigned int>(*p);\n    }\n  }\n\n  GEOM_DEBUG(\"Removing redundant line markers.\");\n\n  // remove redundant line markers\n  for (r = 0; r < rows; r++) {\n    for (c = 0; c < cols; c++) {\n      if (c + 1 < cols && v[r][c] == '-' && v[r][c + 1] == '-') {\n        v[r][c] = ' ';\n      }\n      if (r + 1 < rows && v[r][c] == '|' && v[r + 1][c] == '|') {\n        v[r][c] = ' ';\n      }\n      if (r + 1 < rows && c + 1 < cols && v[r][c] == '`' &&\n          v[r + 1][c + 1] == '`') {\n        v[r][c] = ' ';\n      }\n      if (r + 1 < rows && c > 0 && v[r][c] == '/' && v[r + 1][c - 1] == '/') {\n        v[r][c] = ' ';\n      }\n    }\n  }\n\n  // count how many vertices and indices we will have\n  int vertices = 0, indices = 0;\n  for (r = 0; r < rows; r++) {\n    for (c = 0; c < cols; c++) {\n      char t = static_cast<char>(v[r][c]);\n      if (t == '+') {\n        vertices++;\n      } else if (t == '-' || t == '|' || t == '`' || t == '/') {\n        indices += 2;  // each line requires 2 indices\n      }\n    }\n  }\n\n  GEOM_DEBUG(\"Total vertices: %d, total indices %d\", vertices, indices);\n\n  // allocate arrays for the vertices and lines\n  const int VERTICES_STRIDE = sizeof(GLfloat) * 7;\n  const int VERTICES_COLOR_OFFSET = sizeof(GLfloat) * 3;\n  GLfloat* verticesArray = new GLfloat[vertices * VERTICES_STRIDE];\n  GLushort* indicesArray = new GLushort[indices];\n  vertices = indices = 0;  // current count of vertices and lines\n\n  float left = (-cols / 2) * scale;\n  if (cols % 2 == 0) left += scale * 0.5f;\n  float top = (rows / 2) * scale;\n  if (rows % 2 == 0) top += scale * 0.5f;\n\n  const int VERTEX_BIT = 0x1000;\n  const int VERTEX_INDEX_MASK = 0x0fff;\n\n  // process vertices\n  for (r = 0; r < rows; r++) {\n    for (c = 0; c < cols; c++) {\n      unsigned t = v[r][c];\n      if (t == '+') {\n        GEOM_DEBUG(\"Found vertex at %d,%d, index %d\", r, c, vertices);\n        verticesArray[vertices * 7] = left + c * scale;\n        verticesArray[vertices * 7 + 1] = top - r * scale;\n        verticesArray[vertices * 7 + 2] = 0.0f;  // z coord is always 0\n        verticesArray[vertices * 7 + 3] = 1.0f;  // red\n        verticesArray[vertices * 7 + 4] = 1.0f;  // green\n        verticesArray[vertices * 7 + 5] = 1.0f;  // blue\n        verticesArray[vertices * 7 + 6] = 1.0f;  // alpha\n        // mark which vertex this is\n        v[r][c] = static_cast<unsigned int>(VERTEX_BIT | vertices);\n        vertices++;\n      }\n    }\n  }\n\n  // process lines\n  int col_dir, row_dir;\n  int start_c, start_r, end_c, end_r;\n\n  GEOM_DEBUG(\"Now processing lines.\");\n  for (r = 0; r < rows; r++) {\n    for (c = 0; c < cols; c++) {\n      int t = v[r][c];\n      if (t == '-') {\n        // horizontal line\n        GEOM_DEBUG(\"Horizontal line found at %d,%d\", r, c);\n        col_dir = -1, row_dir = 0;\n      } else if (t == '|') {\n        // vertical line\n        GEOM_DEBUG(\"Vertical line found at %d,%d\", r, c);\n        col_dir = 0, row_dir = -1;\n      } else if (t == '`') {\n        // horizontal line, slanting down\n        GEOM_DEBUG(\"Downward diagonal line found at %d,%d\", r, c);\n        col_dir = -1, row_dir = -1;\n      } else if (t == '/') {\n        // horizontal line, slanting down\n        GEOM_DEBUG(\"Upward diagonal line found at %d,%d\", r, c);\n        col_dir = -1, row_dir = 1;\n      } else {\n        continue;\n      }\n\n      // look for the vertex that starts the line:\n      start_c = c;\n      start_r = r;\n      while (!(v[start_r][start_c] & VERTEX_BIT)) {\n        start_c += col_dir;\n        start_r += row_dir;\n        if (start_c < 0 || start_r < 0 || start_c >= cols || start_r >= rows) {\n          LOGE(\"Invalid line in ascii-art: no start. At position %d,%d\", r, c);\n          ABORT_GAME;\n        }\n      }\n      GEOM_DEBUG(\"Start vertex is at %d,%d, index %d\", start_r, start_c,\n                 v[start_r][start_c] & VERTEX_INDEX_MASK);\n\n      // look for the vertex that ends the line\n      end_c = c;\n      end_r = r;\n      while (!(v[end_r][end_c] & VERTEX_BIT)) {\n        end_c -= col_dir;\n        end_r -= row_dir;\n        if (end_c < 0 || end_r < 0 || end_c >= cols || end_r >= rows) {\n          LOGE(\"Invalid line in ascii-art: no end. At position %d,%d\", r, c);\n          ABORT_GAME;\n        }\n      }\n\n      GEOM_DEBUG(\"End vertex is at %d,%d, index %d\", end_r, end_c,\n                 v[end_r][end_c] & VERTEX_INDEX_MASK);\n\n      indicesArray[indices] =\n          static_cast<GLushort>(v[start_r][start_c] & VERTEX_INDEX_MASK);\n      indicesArray[indices + 1] =\n          static_cast<GLushort>(v[end_r][end_c] & VERTEX_INDEX_MASK);\n      indices += 2;\n      GEOM_DEBUG(\"We now have %d indices.\", indices);\n    }\n  }\n\n  GEOM_DEBUG(\"Deallocating working space.\");\n  // get rid of the working arrays\n  for (r = 0; r < rows; r++) {\n    delete v[r];\n  }\n  delete[] v;\n\n  for (int i = 0; i < indices; i++) {\n    GEOM_DEBUG(\"indices[%d] = %d\\n\", i, indicesArray[i]);\n  }\n  for (int i = 0; i < vertices; i++) {\n    GEOM_DEBUG(\"vertices[%d]\", i * 7);\n    for (int j = 0; j < 7; j++) {\n      GEOM_DEBUG(\"vertices[%d+%d=%d] = %f\\n\", i * 7, j, i * 7 + j,\n                 verticesArray[i * 7 + j]);\n    }\n  }\n\n  // create the buffers\n  GEOM_DEBUG(\"Creating output VBO (%d vertices) and IBO (%d indices).\",\n             vertices, indices);\n  SimpleGeom* out = new SimpleGeom(\n      new VertexBuf(verticesArray, vertices * sizeof(GLfloat) * VERTICES_STRIDE,\n                    VERTICES_STRIDE),\n      new IndexBuf(indicesArray, indices * sizeof(GLushort)));\n  out->vbuf->SetPrimitive(GL_LINES);  // draw as lines\n  out->vbuf->SetColorsOffset(VERTICES_COLOR_OFFSET);\n\n  // clean up our work buffers\n  delete[] verticesArray;\n  verticesArray = NULL;\n  delete[] indicesArray;\n  indicesArray = NULL;\n\n  LOGD(\"Created geometry from ascii art: %d vertices, %d indices\", vertices,\n       indices);\n\n  return out;\n}\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/ascii_to_geom.hpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef endlesstunnel_ascii_to_geom_hpp\n#define endlesstunnel_ascii_to_geom_hpp\n\n#include \"engine.hpp\"\n\n/* Converts ASCII art into a Vbo/Ibo pair. Useful for retro-looking\n * drawings/text! scale is the size of each character. The center of the\n * rendering will be 0,0.\n *\n * Examples:\n *\n * Square:\n *     +---+\n *     |   |\n *     +---+\n *\n * Triangle:\n *     +-----+\n *      `   /\n *       ` /\n *        +\n *\n * The + sign represents a vertex; lines are represented by -, /, ` and |.\n */\nSimpleGeom* AsciiArtToGeom(const char* art, float scale);\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/common.hpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef endlesstunnel_common_hpp\n#define endlesstunnel_common_hpp\n\nextern \"C\" {\n#include <EGL/egl.h>\n#include <GLES2/gl2.h>\n#include <android/log.h>\n#include <android/sensor.h>\n#include <android_native_app_glue.h>\n#include <errno.h>\n#include <jni.h>\n#include <stdlib.h>\n#include <unistd.h>\n}\n#include \"glm/glm.hpp\"\n#include \"glm/gtc/matrix_transform.hpp\"\n#include \"glm/gtc/type_ptr.hpp\"\n\n#define DEBUG_TAG \"EndlessTunnel:Native\"\n#define LOGD(...) \\\n  ((void)__android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, __VA_ARGS__))\n#define LOGI(...) \\\n  ((void)__android_log_print(ANDROID_LOG_INFO, DEBUG_TAG, __VA_ARGS__))\n#define LOGW(...) \\\n  ((void)__android_log_print(ANDROID_LOG_WARN, DEBUG_TAG, __VA_ARGS__))\n#define LOGE(...) \\\n  ((void)__android_log_print(ANDROID_LOG_ERROR, DEBUG_TAG, __VA_ARGS__))\n#define ABORT_GAME              \\\n  {                             \\\n    LOGE(\"*** GAME ABORTING.\"); \\\n    *((volatile char*)0) = 'a'; \\\n  }\n#define DEBUG_BLIP LOGD(\"[ BLIP ]: %s:%d\", __FILE__, __LINE__)\n\n#define MY_ASSERT(cond)                    \\\n  {                                        \\\n    if (!(cond)) {                         \\\n      LOGE(\"ASSERTION FAILED: %s\", #cond); \\\n      ABORT_GAME;                          \\\n    }                                      \\\n  }\n\n#include \"our_key_codes.hpp\"\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/data/alphabet.inl",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef _mygame_alphabet_inl\n#define _mygame_alphabet_inl\n\n#define ALPHABET_GLYPH_COLS 5\n#define ALPHABET_GLYPH_ROWS 9\n\nstatic const char *ALPHABET_ART[] = {\n    NULL,      // chr 0\n    NULL,      // chr 1\n    NULL,      // chr 2\n    NULL,      // chr 3\n    NULL,      // chr 4\n    NULL,      // chr 5\n    NULL,      // chr 6\n    NULL,      // chr 7\n    NULL,      // chr 8\n    NULL,      // chr 9\n    NULL,      // chr 10\n    NULL,      // chr 11\n    NULL,      // chr 12\n    NULL,      // chr 13\n    NULL,      // chr 14\n    NULL,      // chr 15\n    NULL,      // chr 16\n    NULL,      // chr 17\n    NULL,      // chr 18\n    NULL,      // chr 19\n    NULL,      // chr 20\n    NULL,      // chr 21\n    NULL,      // chr 22\n    NULL,      // chr 23\n    NULL,      // chr 24\n    NULL,      // chr 25\n    NULL,      // chr 26\n    NULL,      // chr 27\n    NULL,      // chr 28\n    NULL,      // chr 29\n    NULL,      // chr 30\n    NULL,      // chr 31\n    NULL,      // chr 32\n    \"+---+\\n\"  // chr 33, !\n    \"|   |\\n\"\n    \"+   +\\n\"\n    \" ` / \\n\"\n    \"  +  \\n\"\n    \" +-+ \\n\"\n    \" | | \\n\"\n    \" +-+ \\n\"\n    \"     \\n\",\n    NULL,      // chr 34, \"\n    NULL,      // chr 35, #\n    NULL,      // chr 36, $\n    NULL,      // chr 37, %\n    NULL,      // chr 38, &\n    \"  +  \\n\"  // chr 39, '\n    \"  |  \\n\"\n    \"  +  \\n\"\n    \"     \\n\"\n    \"     \\n\"\n    \"     \\n\"\n    \"     \\n\"\n    \"     \\n\"\n    \"     \\n\",\n    NULL,      // chr 40, (\n    NULL,      // chr 41, )\n    NULL,      // chr 42, *\n    \"     \\n\"  // chr 43, +\n    \"  +  \\n\"\n    \"  |  \\n\"\n    \"+-+-+\\n\"\n    \"  |  \\n\"\n    \"  +  \\n\"\n    \"     \\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"     \\n\"  // chr 44, ,\n    \"     \\n\"\n    \"     \\n\"\n    \"     \\n\"\n    \"     \\n\"\n    \"   + \\n\"\n    \"  /  \\n\"\n    \" +   \\n\"\n    \"     \\n\",\n    \"     \\n\"  // chr 45, -\n    \"     \\n\"\n    \"     \\n\"\n    \"+---+\\n\"\n    \"     \\n\"\n    \"     \\n\"\n    \"     \\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"     \\n\"  // chr 46, .\n    \"     \\n\"\n    \"     \\n\"\n    \"     \\n\"\n    \"     \\n\"\n    \" +-+ \\n\"\n    \" | | \\n\"\n    \" +-+ \\n\"\n    \"     \\n\",\n    \"     \\n\"  // chr 47, /\n    \"     \\n\"\n    \"    +\\n\"\n    \"   / \\n\"\n    \"  /  \\n\"\n    \" /   \\n\"\n    \"+    \\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+---+\\n\"  // chr 48, 0\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"+---+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"   + \\n\"  // chr 49, 1\n    \"   | \\n\"\n    \"   | \\n\"\n    \"   | \\n\"\n    \"   | \\n\"\n    \"   | \\n\"\n    \"   + \\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+---+\\n\"  // chr 50, 2\n    \"    |\\n\"\n    \"    |\\n\"\n    \"+---+\\n\"\n    \"|    \\n\"\n    \"|    \\n\"\n    \"+---+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+---+\\n\"  // chr 51, 3\n    \"    |\\n\"\n    \"    |\\n\"\n    \"+---+\\n\"\n    \"    |\\n\"\n    \"    |\\n\"\n    \"+---+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+   +\\n\"  // chr 52, 4\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"+---+\\n\"\n    \"    |\\n\"\n    \"    |\\n\"\n    \"    +\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+---+\\n\"  // chr 53, 5\n    \"|    \\n\"\n    \"|    \\n\"\n    \"+---+\\n\"\n    \"    |\\n\"\n    \"    |\\n\"\n    \"+---+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+---+\\n\"  // chr 54, 6\n    \"|    \\n\"\n    \"|    \\n\"\n    \"+---+\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"+---+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+---+\\n\"  // chr 55, 7\n    \"    |\\n\"\n    \"    |\\n\"\n    \"    |\\n\"\n    \"    |\\n\"\n    \"    |\\n\"\n    \"    +\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+---+\\n\"  // chr 56, 8\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"+---+\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"+---+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+---+\\n\"  // chr 57, 9\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"+---+\\n\"\n    \"    |\\n\"\n    \"    |\\n\"\n    \"+---+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \" +-+ \\n\"  // chr 58, :\n    \" | | \\n\"\n    \" +-+ \\n\"\n    \"     \\n\"\n    \" +-+ \\n\"\n    \" | | \\n\"\n    \" +-+ \\n\"\n    \"     \\n\"\n    \"     \\n\",\n    NULL,      // chr 59, ;\n    NULL,      // chr 60, <\n    NULL,      // chr 61, =\n    NULL,      // chr 62, >\n    \"+---+\\n\"  // chr 63, ?\n    \"    |\\n\"\n    \"  +-+\\n\"\n    \"  |  \\n\"\n    \"  +  \\n\"\n    \" +-+ \\n\"\n    \" | | \\n\"\n    \" +-+ \\n\"\n    \"     \\n\",\n    NULL,      // chr 64, @\n    \"+---+\\n\"  // chr 65, A\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"+---+\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"+   +\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+---+\\n\"  // chr 66, B\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"+---+\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"+---+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+---+\\n\"  // chr 67, C\n    \"|    \\n\"\n    \"|    \\n\"\n    \"|    \\n\"\n    \"|    \\n\"\n    \"|    \\n\"\n    \"+---+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+-+  \\n\"  // chr 68, D\n    \"|  ` \\n\"\n    \"|   +\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"+---+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+---+\\n\"  // chr 69, E\n    \"|    \\n\"\n    \"|    \\n\"\n    \"+--+ \\n\"\n    \"|    \\n\"\n    \"|    \\n\"\n    \"+---+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+---+\\n\"  // chr 70, F\n    \"|    \\n\"\n    \"|    \\n\"\n    \"+--+ \\n\"\n    \"|    \\n\"\n    \"|    \\n\"\n    \"+    \\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+---+\\n\"  // chr 71, G\n    \"|    \\n\"\n    \"|    \\n\"\n    \"| +-+\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"+---+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+   +\\n\"  // chr 72, H\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"+---+\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"+   +\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+-+-+\\n\"  // chr 73, I\n    \"  |  \\n\"\n    \"  |  \\n\"\n    \"  |  \\n\"\n    \"  |  \\n\"\n    \"  |  \\n\"\n    \"+-+-+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+-+-+\\n\"  // chr 74, J\n    \"  |  \\n\"\n    \"  |  \\n\"\n    \"  |  \\n\"\n    \"+ |  \\n\"\n    \"| |  \\n\"\n    \"+-+  \\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+  + \\n\"  // chr 75, K\n    \"| /  \\n\"\n    \"|/   \\n\"\n    \"+    \\n\"\n    \"|`   \\n\"\n    \"| `  \\n\"\n    \"+  + \\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+    \\n\"  // chr 76, L\n    \"|    \\n\"\n    \"|    \\n\"\n    \"|    \\n\"\n    \"|    \\n\"\n    \"|    \\n\"\n    \"+---+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+-+-+\\n\"  // chr 77, M\n    \"| | |\\n\"\n    \"| | |\\n\"\n    \"| | |\\n\"\n    \"| + |\\n\"\n    \"|   |\\n\"\n    \"+   +\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+-+  \\n\"  // chr 78, N\n    \"|  ` \\n\"\n    \"|   +\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"+   +\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"  +  \\n\"  // chr 79, O\n    \" / ` \\n\"\n    \"+   +\\n\"\n    \"|   |\\n\"\n    \"+   +\\n\"\n    \" ` / \\n\"\n    \"  +  \\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+---+\\n\"  // chr 80, P\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"+---+\\n\"\n    \"|    \\n\"\n    \"|    \\n\"\n    \"+    \\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+---+\\n\"  // chr 81, Q\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"| + |\\n\"\n    \"|  `|\\n\"\n    \"+---+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+---+\\n\"  // chr 82, R\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"+---+\\n\"\n    \"|`   \\n\"\n    \"| `  \\n\"\n    \"+  + \\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+---+\\n\"  // chr 83, S\n    \"|    \\n\"\n    \"|    \\n\"\n    \"+---+\\n\"\n    \"    |\\n\"\n    \"    |\\n\"\n    \"+---+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+-+-+\\n\"  // chr 84, T\n    \"  |  \\n\"\n    \"  |  \\n\"\n    \"  |  \\n\"\n    \"  |  \\n\"\n    \"  |  \\n\"\n    \"  +  \\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+   +\\n\"  // chr 85, U\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"+---+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+   +\\n\"  // chr 86, V\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"+   +\\n\"\n    \" ` / \\n\"\n    \"  +  \\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+   +\\n\"  // chr 87, W\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"| + |\\n\"\n    \"| | |\\n\"\n    \"| | |\\n\"\n    \"+-+-+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+   +\\n\"  // chr 88, X\n    \" ` / \\n\"\n    \"  +  \\n\"\n    \"  |  \\n\"\n    \"  +  \\n\"\n    \" / ` \\n\"\n    \"+   +\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+   +\\n\"  // chr 89, Y\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"+-+-+\\n\"\n    \"  |  \\n\"\n    \"  |  \\n\"\n    \"  +  \\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+---+\\n\"  // chr 90, Z\n    \"   / \\n\"\n    \"  /  \\n\"\n    \" /   \\n\"\n    \"+    \\n\"\n    \"|    \\n\"\n    \"+---+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+-+  \\n\"  // chr 91, [\n    \"|    \\n\"\n    \"|    \\n\"\n    \"|    \\n\"\n    \"|    \\n\"\n    \"|    \\n\"\n    \"+-+  \\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"     \\n\"  // chr 92, backslash\n    \"+    \\n\"\n    \" `   \\n\"\n    \"  `  \\n\"\n    \"   ` \\n\"\n    \"    +\\n\"\n    \"     \\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"  +-+\\n\"  // chr 93, ]\n    \"    |\\n\"\n    \"    |\\n\"\n    \"    |\\n\"\n    \"    |\\n\"\n    \"    |\\n\"\n    \"  +-+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"  +  \\n\"  // chr 94, ^\n    \" / ` \\n\"\n    \"+   +\\n\"\n    \"     \\n\"\n    \"     \\n\"\n    \"     \\n\"\n    \"     \\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"     \\n\"  // chr 95, _\n    \"     \\n\"\n    \"     \\n\"\n    \"     \\n\"\n    \"     \\n\"\n    \"     \\n\"\n    \"+---+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    NULL,      // chr 96, `\n    \"     \\n\"  // chr 97, a\n    \"     \\n\"\n    \"+---+\\n\"\n    \"    |\\n\"\n    \"+---+\\n\"\n    \"|   |\\n\"\n    \"+---+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+    \\n\"  // chr 98, b\n    \"|    \\n\"\n    \"+---+\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"+---+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"     \\n\"  // chr 99, c\n    \"     \\n\"\n    \"+---+\\n\"\n    \"|    \\n\"\n    \"|    \\n\"\n    \"|    \\n\"\n    \"+---+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"    +\\n\"  // chr 100, d\n    \"    |\\n\"\n    \"+---+\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"+---+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"     \\n\"  // chr 101, e\n    \"     \\n\"\n    \"+---+\\n\"\n    \"|   |\\n\"\n    \"+---+\\n\"\n    \"|    \\n\"\n    \"+---+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+--+ \\n\"  // chr 102, f\n    \"|    \\n\"\n    \"|    \\n\"\n    \"+-+  \\n\"\n    \"|    \\n\"\n    \"|    \\n\"\n    \"+    \\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"     \\n\"  // chr 103, g\n    \"     \\n\"\n    \"+---+\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"+---+\\n\"\n    \"    |\\n\"\n    \"+---+\\n\",\n    \"+    \\n\"  // chr 104, h\n    \"|    \\n\"\n    \"+---+\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"+   +\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"     \\n\"  // chr 105, i\n    \"     \\n\"\n    \"  +  \\n\"\n    \"  |  \\n\"\n    \"  |  \\n\"\n    \"  |  \\n\"\n    \"  +  \\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"     \\n\"  // chr 106, j\n    \"     \\n\"\n    \"  +  \\n\"\n    \"  |  \\n\"\n    \"  |  \\n\"\n    \"  |  \\n\"\n    \"+ |  \\n\"\n    \"| |  \\n\"\n    \"+-+  \\n\",\n    \" +   \\n\"  // chr 107, k\n    \" |   \\n\"\n    \" | + \\n\"\n    \" |/  \\n\"\n    \" +   \\n\"\n    \" |`  \\n\"\n    \" + + \\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"  +  \\n\"  // chr 108, l\n    \"  |  \\n\"\n    \"  |  \\n\"\n    \"  |  \\n\"\n    \"  |  \\n\"\n    \"  |  \\n\"\n    \"  +  \\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"     \\n\"  // chr 109, m\n    \"     \\n\"\n    \"+-+-+\\n\"\n    \"| | |\\n\"\n    \"| | |\\n\"\n    \"| | |\\n\"\n    \"+ + +\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"     \\n\"  // chr 110, n\n    \"     \\n\"\n    \"+---+\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"+   +\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"     \\n\"  // chr 111, o\n    \"     \\n\"\n    \"+---+\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"+---+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"     \\n\"  // chr 112, p\n    \"     \\n\"\n    \"+---+\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"+---+\\n\"\n    \"|    \\n\"\n    \"+    \\n\",\n    \"     \\n\"  // chr 113, q\n    \"     \\n\"\n    \"+---+\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"+---+\\n\"\n    \"    |\\n\"\n    \"    +\\n\",\n    \"     \\n\"  // chr 114, r\n    \"     \\n\"\n    \"+---+\\n\"\n    \"|    \\n\"\n    \"|    \\n\"\n    \"|    \\n\"\n    \"+    \\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"     \\n\"  // chr 115, s\n    \"     \\n\"\n    \"+---+\\n\"\n    \"|    \\n\"\n    \"+---+\\n\"\n    \"    |\\n\"\n    \"+---+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"+    \\n\"  // chr 116, t\n    \"|    \\n\"\n    \"+--+ \\n\"\n    \"|    \\n\"\n    \"|    \\n\"\n    \"|    \\n\"\n    \"+---+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"     \\n\"  // chr 117, u\n    \"     \\n\"\n    \"+   +\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"+---+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"     \\n\"  // chr 118, v\n    \"     \\n\"\n    \"+   +\\n\"\n    \"|   |\\n\"\n    \"+   +\\n\"\n    \" ` / \\n\"\n    \"  +  \\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"     \\n\"  // chr 119, w\n    \"     \\n\"\n    \"+   +\\n\"\n    \"| + |\\n\"\n    \"+ | +\\n\"\n    \"| | |\\n\"\n    \"+-+-+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"     \\n\"  // chr 120, x\n    \"     \\n\"\n    \"+   +\\n\"\n    \" ` / \\n\"\n    \"     \\n\"\n    \" / ` \\n\"\n    \"+   +\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    \"     \\n\"  // chr 121, y\n    \"     \\n\"\n    \"+   +\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"|   |\\n\"\n    \"+---+\\n\"\n    \"    |\\n\"\n    \"+---+\\n\",\n    \"     \\n\"  // chr 122, z\n    \"     \\n\"\n    \"+---+\\n\"\n    \"   / \\n\"\n    \"  /  \\n\"\n    \" /   \\n\"\n    \"+---+\\n\"\n    \"     \\n\"\n    \"     \\n\",\n    NULL,  // chr 123, {\n    NULL,  // chr 124, |\n    NULL,  // chr 125, }\n    NULL,  // chr 126, ~\n    NULL   // chr 127, weird DEL thing\n};\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/data/ascii_art.inl",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef _mygame_ascii_art_inl\n#define _mygame_ascii_art_inl\n\n#define ART_LIFE     \\\n  \"   +-+   +-+  \\n\" \\\n  \"  /   ` /   ` \\n\" \\\n  \" +     +     +\\n\" \\\n  \"  `         / \\n\" \\\n  \"   `       /  \\n\" \\\n  \"    `     /   \\n\" \\\n  \"     `   /    \\n\" \\\n  \"      ` /     \\n\" \\\n  \"       +      \\n\"\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/data/blurb.inl",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#define BLURB_ABOUT                              \\\n  \"ABOUT THIS GAME\\n\\n\"                          \\\n  \"This game is written in C++\\n\"                \\\n  \"to showcase Android Studio NDK support, \\n\"   \\\n  \"Find out more about the Android Studio at:\\n\" \\\n  \"http://tools.android.com\"\n\n#define BLURB_STORY                      \\\n  \"STORY\\n\\n\"                            \\\n  \"A messenger from the king rushes\\n\"   \\\n  \"into the tavern and asks for the\\n\"   \\\n  \"highest level character. That's\\n\"    \\\n  \"you so he gives you a quest: fly\\n\"   \\\n  \"to the end of that endless tunnel\\n\"  \\\n  \"collecting white cubes. At the end\\n\" \\\n  \"you will receive cake.\"\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/data/cube_geom.inl",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef _mygame_obstacle_geom_hpp\n#define _mygame_obstacle_geom_hpp\n\n#include \"engine.hpp\"\n\n/*\n    H+-------+G\n    /.      /|\n D / .    C/ |\n  +-------+..+F\n  | /E    | /\n  |/      |/\n A+-------+B\n\n*/\n#define V_A -0.5f, -0.5f, 0.5f\n#define V_B 0.5f, -0.5f, 0.5f\n#define V_C 0.5f, 0.5f, 0.5f\n#define V_D -0.5f, 0.5f, 0.5f\n#define V_E -0.5f, -0.5f, -0.5f\n#define V_F 0.5f, -0.5f, -0.5f\n#define V_G 0.5f, 0.5f, -0.5f\n#define V_H -0.5f, 0.5f, -0.5f\n#define COLOR_1 1.0f, 1.0f, 1.0f, 1.0f\n#define COLOR_2 0.8f, 0.8f, 0.8f, 1.0f\n#define COLOR_3 0.6f, 0.6f, 0.6f, 1.0f\n\n// max tex coordinate (i.e. texture repeats across cube)\n#define TC_R 3.0f\n\nstatic GLfloat CUBE_GEOM[] = {\n    // front face of cube:\n    V_A, COLOR_2, 0.0f, 0.0f, V_B, COLOR_2, TC_R, 0.0f, V_D, COLOR_2, 0.0f,\n    TC_R, V_D, COLOR_2, 0.0f, TC_R, V_B, COLOR_2, TC_R, 0.0f, V_C, COLOR_2,\n    TC_R, TC_R,\n    // right face of cube:\n    V_B, COLOR_3, 0.0f, 0.0f, V_F, COLOR_3, TC_R, 0.0f, V_C, COLOR_3, 0.0f,\n    TC_R, V_C, COLOR_3, 0.0f, TC_R, V_F, COLOR_3, TC_R, 0.0f, V_G, COLOR_3,\n    TC_R, TC_R,\n    // left face of cube\n    V_A, COLOR_3, 0.0f, TC_R, V_D, COLOR_3, TC_R, TC_R, V_E, COLOR_3, 0.0f,\n    0.0f, V_E, COLOR_3, 0.0f, 0.0f, V_D, COLOR_3, TC_R, TC_R, V_H, COLOR_3,\n    0.0f, TC_R,\n    // back face of cube\n    V_E, COLOR_2, TC_R, 0.0f, V_H, COLOR_2, TC_R, TC_R, V_F, COLOR_2, 0.0f,\n    0.0f, V_F, COLOR_2, 0.0f, 0.0f, V_H, COLOR_2, TC_R, TC_R, V_G, COLOR_2,\n    0.0f, TC_R,\n    // bottom of cube\n    V_A, COLOR_1, 0.0f, TC_R, V_E, COLOR_1, 0.0f, 0.0f, V_B, COLOR_1, TC_R,\n    TC_R, V_B, COLOR_1, TC_R, TC_R, V_E, COLOR_1, 0.0f, 0.0f, V_F, COLOR_1,\n    TC_R, 0.0f,\n    // top of cube\n    V_D, COLOR_1, 0.0f, 0.0f, V_C, COLOR_1, TC_R, 0.0f, V_H, COLOR_1, 0.0f,\n    TC_R, V_H, COLOR_1, 0.0f, TC_R, V_C, COLOR_1, TC_R, 0.0f, V_G, COLOR_1,\n    TC_R, TC_R};\nstatic const int CUBE_GEOM_COLOR_OFFSET = 3 * sizeof(GLfloat);\nstatic const int CUBE_GEOM_TEXCOORD_OFFSET = 7 * sizeof(GLfloat);\nstatic const int CUBE_GEOM_STRIDE = 9 * sizeof(GLfloat);\n\n/* this is something of a trivial index buffer (and could just as well be\n   replaced by an array), but we have it here for demonstration purposes:\nstatic unsigned short CUBE_GEOM_INDICES[] = {\n    0, 1, 2, 3, 4, 5,\n    6, 7, 8, 9, 10, 11,\n    12, 13, 14, 15, 16, 17,\n    18, 19, 20, 21, 22, 23,\n    24, 25, 26, 27, 28, 29,\n    30, 31, 32, 33, 34, 35\n};\n*/\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/data/our_shader.inl",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef _mygame_our_shader_inl\n#define _mygame_our_shader_inl\n\n#define OUR_VERTEX_SHADER_SOURCE                                           \\\n  \"uniform mat4 u_MVP;            \\n\"                                      \\\n  \"uniform vec4 u_PointLightPos;  \\n\"                                      \\\n  \"uniform mediump vec4 u_PointLightColor; \\n\"                             \\\n  \"attribute vec4 a_Position;     \\n\"                                      \\\n  \"attribute vec4 a_Color;        \\n\"                                      \\\n  \"attribute vec2 a_TexCoord;     \\n\"                                      \\\n  \"varying vec4 v_Color;          \\n\"                                      \\\n  \"varying vec4 v_Pos;            \\n\"                                      \\\n  \"varying float v_FogFactor;     \\n\"                                      \\\n  \"varying vec2 v_TexCoord;      \\n\"                                       \\\n  \"float FOG_START = 100.0;        \\n\"                                     \\\n  \"float FOG_END = 200.0;         \\n\"                                      \\\n  \"varying vec4 v_PointLightPos;  \\n\"                                      \\\n  \"void main()                    \\n\"                                      \\\n  \"{                              \\n\"                                      \\\n  \"   v_Color = a_Color;          \\n\"                                      \\\n  \"   gl_Position = u_MVP         \\n\"                                      \\\n  \"               * a_Position;   \\n\"                                      \\\n  \"   v_Pos = u_MVP * a_Position; \\n\"                                      \\\n  \"   v_PointLightPos = u_MVP * u_PointLightPos; \\n\"                       \\\n  \"   v_TexCoord = a_TexCoord;    \\n\"                                      \\\n  \"   v_FogFactor = clamp((v_Pos.z - FOG_START) / (FOG_END - FOG_START), \" \\\n  \"0.0, 1.0); \\n\"                                                          \\\n  \"}                              \\n\";\n\n#define OUR_FRAG_SHADER_SOURCE                                                 \\\n  \"precision mediump float;       \\n\"                                          \\\n  \"varying vec4 v_Color;          \\n\"                                          \\\n  \"varying vec4 v_Pos;          \\n\"                                            \\\n  \"varying vec2 v_TexCoord;      \\n\"                                           \\\n  \"varying float v_FogFactor;     \\n\"                                          \\\n  \"uniform vec4 u_Tint;           \\n\"                                          \\\n  \"uniform sampler2D u_Sampler;   \\n\"                                          \\\n  \"uniform vec4 u_PointLightColor; \\n\"                                         \\\n  \"varying vec4 v_PointLightPos;   \\n\"                                         \\\n  \"float ATT_FACT_2 = 0.005;          \\n\"                                      \\\n  \"float ATT_FACT_1 = 0.00;          \\n\"                                       \\\n  \"void main()                    \\n\"                                          \\\n  \"{                              \\n\"                                          \\\n  \"   float d = distance(v_PointLightPos, v_Pos);\\n\"                           \\\n  \"   float att = 1.0/(ATT_FACT_1 * d + ATT_FACT_2 * d * d);\\n\"                \\\n  \"   gl_FragColor = mix(v_Color * u_Tint * texture2D(u_Sampler, v_TexCoord) \" \\\n  \"+ u_PointLightColor * att, vec4(0), v_FogFactor);\\n\"                        \\\n  \"}\";\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/data/strings.inl",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef _mygame_strings_inl\n#define _mygame_strings_inl\n\n#define S_HOWTO_WITHOUT_JOY \"Drag to steer\"\n\n#define S_GOT_BONUS \"+ 50\"\n#define S_GAME_OVER \"Game Over\"\n#define S_OUCH \"Ouch\"\n#define S_CHECKPOINT_SAVED \"Checkpoint saved\"\n\n#define S_UNPAUSE \"Resume\"\n#define S_QUIT \"Quit\"\n#define S_START_OVER \"Start Over\"\n#define S_RESUME \"Start from checkpoint\"\n\n#define S_TITLE \"Endless Tunnel\"\n#define S_PLAY \"Play!\"\n\n#define S_PLEASE_WAIT \"Please wait...\"\n\n#define S_STORY \"Story\"\n#define S_ABOUT \"About\"\n\n#define S_OK \"OK\"\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/data/tunnel_geom.inl",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef _mygame_tunnel_geom_hpp\n#define _mygame_tunnel_geom_hpp\n\n#include \"engine.hpp\"\n#include \"game_consts.hpp\"\n\n// shorthand to make it simpler to hand-code the geometry below:\n// (first char is the coord, second is 'B'ottom, 'R'ight, 'L'eft or 'T'op,\n// 'N'ear or 'F'ar)\n// and third is whether this accounts for the 'S'pacing or 'N'ot.\n#define ZB -TUNNEL_HALF_H\n#define ZT TUNNEL_HALF_H\n#define XL -TUNNEL_HALF_W\n#define XR TUNNEL_HALF_W\n#define YN (TUNNEL_SECTION_LENGTH * -0.5f)\n#define YF (TUNNEL_SECTION_LENGTH * 0.5f)\n#define TCOLOR_M 0.10f, 0.10f, 0.10f, 1.0f\n#define TCOLOR_D 0.07f, 0.07f, 0.07f, 1.0f\n\n// max texture coord along X and Z axis (i.e. repetitions)\n#define REPN 10.0f\n\n// max texture coord along Y axis (i.e. repetitions)\n#define REPF (REPN * TUNNEL_SECTION_LENGTH / (2 * TUNNEL_HALF_W))\n\n// note: the color data is temporary (will be replaced with texture once texture\n// is implemented)\nstatic GLfloat TUNNEL_GEOM[] = {\n    /* vert  0: x,y,z:*/ XL, YN,   ZB,\n    /*tex u,v*/ 0.0f,        0.0f, /*color:*/ TCOLOR_M,\n    /* vert  1: x,y,z:*/ XR, YN,   ZB,\n    /*tex u,v*/ REPN,        0.0f, /*color:*/ TCOLOR_M,\n    /* vert  2: x,y,z:*/ XR, YF,   ZB,\n    /*tex u,v*/ REPN,        REPF, /*color:*/ TCOLOR_M,\n    /* vert  3: x,y,z:*/ XL, YF,   ZB,\n    /*tex u,v*/ 0.0f,        REPF, /*color:*/ TCOLOR_M,\n    /* vert  4: x,y,z:*/ XL, YN,   ZB,\n    /*tex u,v*/ 0.0f,        0.0f, /*color:*/ TCOLOR_D,\n    /* vert  5: x,y,z:*/ XL, YF,   ZB,\n    /*tex u,v*/ REPF,        0.0f, /*color:*/ TCOLOR_D,\n    /* vert  6: x,y,z:*/ XL, YF,   ZT,\n    /*tex u,v*/ REPF,        REPN, /*color:*/ TCOLOR_D,\n    /* vert  7: x,y,z:*/ XL, YN,   ZT,\n    /*tex u,v*/ 0.0f,        REPN, /*color:*/ TCOLOR_D,\n    /* vert  8: x,y,z:*/ XR, YN,   ZB,\n    /*tex u,v*/ REPF,        0.0f, /*color:*/ TCOLOR_D,\n    /* vert  9: x,y,z:*/ XR, YN,   ZT,\n    /*tex u,v*/ REPF,        REPN, /*color:*/ TCOLOR_D,\n    /* vert 10: x,y,z:*/ XR, YF,   ZT,\n    /*tex u,v*/ 0.0f,        REPN, /*color:*/ TCOLOR_D,\n    /* vert 11: x,y,z:*/ XR, YF,   ZB,\n    /*tex u,v*/ 0.0f,        0.0f, /*color:*/ TCOLOR_D,\n    /* vert 12: x,y,z:*/ XL, YF,   ZT,\n    /*tex u,v*/ 0.0f,        0.0f, /*color:*/ TCOLOR_M,\n    /* vert 13: x,y,z:*/ XR, YF,   ZT,\n    /*tex u,v*/ REPN,        0.0f, /*color:*/ TCOLOR_M,\n    /* vert 14: x,y,z:*/ XR, YN,   ZT,\n    /*tex u,v*/ REPN,        REPF, /*color:*/ TCOLOR_M,\n    /* vert 15: x,y,z:*/ XL, YN,   ZT,\n    /*tex u,v*/ 0.0f,        REPF, /*color:*/ TCOLOR_M,\n};\n\nstatic GLushort TUNNEL_GEOM_INDICES[] = {\n    0,  1,  2,  0,  2,  3,   // floor\n    8,  9,  11, 11, 9,  10,  // right wall\n    4,  5,  7,  7,  5,  6,   // left wall\n    12, 13, 15, 15, 13, 14   // ceiling\n};\n\n#define TUNNEL_GEOM_STRIDE (9 * sizeof(GLfloat))\n#define TUNNEL_GEOM_TEXCOORD_OFFSET (3 * sizeof(GLfloat))\n#define TUNNEL_GEOM_COLOR_OFFSET (5 * sizeof(GLfloat))\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/dialog_scene.cpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#include \"dialog_scene.hpp\"\n\n#include \"anim.hpp\"\n#include \"play_scene.hpp\"\n\n#define BUTTON_FONT_SCALE 0.6f\n#define TEXT_FONT_SCALE 0.6f\n#define BUTTON_MARGIN 0.1f\n\n#define BUTTON_WIDTH 0.4f\n#define BUTTON_HEIGHT 0.15f\n#define BUTTON_SIZE BUTTON_WIDTH, BUTTON_HEIGHT\n#define BUTTON_COLOR 0.0f, 1.0f, 0.0f\n#define BUTTON_DISCOURAGE_COLOR 0.0f, 0.4f, 0.0f\n#define LEFT_X center * 2 * 0.33f\n#define RIGHT_X center * 2 * 0.67f\n#define TEXT_Y 0.6f\n\nDialogScene::DialogScene() {\n  mLeftButtonId = mRightButtonId = -1;\n  mTextBoxId = -1;\n  mLeftButtonAction = mRightButtonAction = ACTION_RETURN;\n  mButtonY = 0.5f;\n  mText = mLeftButtonText = mRightButtonText = NULL;\n}\n\nDialogScene::~DialogScene() {}\n\nvoid DialogScene::CreateWidgetsSetText() {\n  const char* text = mText;\n  float center = 0.5f * SceneManager::GetInstance()->GetScreenAspect();\n\n  if (mTextBoxId < 0) {\n    mTextBoxId = NewWidget()->SetTransition(UiWidget::TRANS_FROM_TOP)->GetId();\n  }\n\n  GetWidgetById(mTextBoxId)\n      ->SetText(text)\n      ->SetFontScale(TEXT_FONT_SCALE)\n      ->SetCenter(center, TEXT_Y);\n\n  float height = TextRenderer::MeasureTextHeight(text, TEXT_FONT_SCALE);\n  mButtonY = TEXT_Y - height * 0.5f - BUTTON_MARGIN - 0.5f * BUTTON_HEIGHT;\n}\n\nvoid DialogScene::CreateWidgetsSingleButton() {\n  const char* text = mLeftButtonText;\n  int action = mLeftButtonAction;\n  float center = 0.5f * SceneManager::GetInstance()->GetScreenAspect();\n  mLeftButtonId = NewWidget()\n                      ->SetText(text)\n                      ->SetIsButton(true)\n                      ->SetCenter(center, mButtonY)\n                      ->SetSize(BUTTON_SIZE)\n                      ->SetTextColor(BUTTON_COLOR)\n                      ->SetFontScale(BUTTON_FONT_SCALE)\n                      ->SetTransition(UiWidget::TRANS_FROM_BOTTOM)\n                      ->GetId();\n  mLeftButtonAction = action;\n\n  SetDefaultButton(mLeftButtonId);\n}\n\nvoid DialogScene::CreateWidgetsTwoButtons() {\n  const char* leftText = mLeftButtonText;\n  int leftAction = mLeftButtonAction;\n  const char* rightText = mRightButtonText;\n  int rightAction = mRightButtonAction;\n\n  float center = 0.5f * SceneManager::GetInstance()->GetScreenAspect();\n  mLeftButtonId = NewWidget()\n                      ->SetText(leftText)\n                      ->SetIsButton(true)\n                      ->SetCenter(LEFT_X, mButtonY)\n                      ->SetSize(BUTTON_SIZE)\n                      ->SetTextColor(BUTTON_COLOR)\n                      ->SetTransition(UiWidget::TRANS_FROM_LEFT)\n                      ->GetId();\n  mLeftButtonAction = leftAction;\n  mRightButtonId = NewWidget()\n                       ->SetText(rightText)\n                       ->SetIsButton(true)\n                       ->SetCenter(RIGHT_X, mButtonY)\n                       ->SetSize(BUTTON_SIZE)\n                       ->SetTransition(UiWidget::TRANS_FROM_RIGHT)\n                       ->SetTextColor(BUTTON_COLOR)\n                       ->GetId();\n  mRightButtonAction = rightAction;\n\n  if (leftAction == ACTION_SIGN_OUT ||\n      leftAction == ACTION_PLAY_WITHOUT_SIGNIN) {\n    GetWidgetById(mLeftButtonId)->SetTextColor(BUTTON_DISCOURAGE_COLOR);\n  }\n  if (rightAction == ACTION_SIGN_OUT ||\n      rightAction == ACTION_PLAY_WITHOUT_SIGNIN) {\n    GetWidgetById(mRightButtonId)->SetTextColor(BUTTON_DISCOURAGE_COLOR);\n  }\n\n  // set up navigation between the buttons\n  AddNav(mLeftButtonId, UI_DIR_RIGHT, mRightButtonId);\n  AddNav(mRightButtonId, UI_DIR_LEFT, mLeftButtonId);\n}\n\nvoid DialogScene::OnCreateWidgets() {\n  if (mRightButtonText) {\n    CreateWidgetsSetText();\n    CreateWidgetsTwoButtons();\n  } else {\n    CreateWidgetsSetText();\n    CreateWidgetsSingleButton();\n  }\n}\n\nvoid DialogScene::RenderBackground() {\n  RenderBackgroundAnimation(mShapeRenderer);\n}\n\nbool DialogScene::OnBackKeyPressed() {\n  SceneManager* mgr = SceneManager::GetInstance();\n  mgr->RequestNewScene(new WelcomeScene());\n  return true;\n}\n\nvoid DialogScene::OnButtonClicked(int id) {\n  SceneManager* mgr = SceneManager::GetInstance();\n\n  int action;\n  if (id == mLeftButtonId) {\n    action = mLeftButtonAction;\n  } else if (id == mRightButtonId) {\n    action = mRightButtonAction;\n  } else {\n    return;\n  }\n\n  switch (action) {\n    case ACTION_RETURN:\n      mgr->RequestNewScene(new WelcomeScene());\n      break;\n    case ACTION_SIGN_IN:\n      // note: we can't start playing directly because PlayScene expects the\n      // cloud results to be ready when it constructs itself; therefore,\n      // WelcomeScene has to make sure of that. So we can't jump directly to\n      // PlayScene from here.\n      mgr->RequestNewScene(new WelcomeScene());\n      break;\n    case ACTION_PLAY_WITHOUT_SIGNIN:\n      mgr->RequestNewScene(new PlayScene());\n      break;\n    case ACTION_SIGN_OUT:\n      mgr->RequestNewScene(new WelcomeScene());\n      break;\n    default:\n      // do nothing.\n      break;\n  }\n}\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/dialog_scene.hpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef endlesstunnel_dialog_scene_hpp\n#define endlesstunnel_dialog_scene_hpp\n\n#include \"engine.hpp\"\n#include \"ui_scene.hpp\"\n#include \"welcome_scene.hpp\"\n\n/* Dialog Scene. Shows a message and buttons. When a button is clicked, performs\n * a given action. */\nclass DialogScene : public UiScene {\n protected:\n  // text to be shown\n  const char *mText;\n  const char *mLeftButtonText;\n  const char *mRightButtonText;\n\n  // IDs for buttons\n  int mLeftButtonId;\n  int mRightButtonId;\n\n  // ID for the text box\n  int mTextBoxId;\n\n  // action for left button and right button\n  int mLeftButtonAction, mRightButtonAction;\n\n  // y position of buttons\n  float mButtonY;\n\n  virtual void OnCreateWidgets();\n  virtual void RenderBackground();\n  virtual void OnButtonClicked(int id);\n  virtual bool OnBackKeyPressed();\n\n public:\n  // (action) return to main screen\n  static const int ACTION_RETURN = 1000;\n\n  // (action) sign in with Google\n  static const int ACTION_SIGN_IN = 1001;\n\n  // (action) play without signing in\n  static const int ACTION_PLAY_WITHOUT_SIGNIN = 1002;\n\n  // (action) sign out\n  static const int ACTION_SIGN_OUT = 1003;\n\n  DialogScene();\n  ~DialogScene();\n  DialogScene *SetText(const char *text) {\n    mText = text;\n    return this;\n  }\n\n  DialogScene *SetSingleButton(const char *text, int action) {\n    mLeftButtonText = text;\n    mLeftButtonAction = action;\n    mRightButtonText = NULL;\n    return this;\n  }\n\n private:\n  void CreateWidgetsSetText();\n  void CreateWidgetsSingleButton();\n  void CreateWidgetsTwoButtons();\n};\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/engine.hpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef endlesstunnel_engine_hpp\n#define endlesstunnel_engine_hpp\n\n// These are the include files that comprise the \"engine\" part of the game --\n// that is, the parts of it that are not game-specific.\n#include \"common.hpp\"\n#include \"indexbuf.hpp\"\n#include \"joystick-support.hpp\"\n#include \"native_engine.hpp\"\n#include \"our_key_codes.hpp\"\n#include \"scene.hpp\"\n#include \"scene_manager.hpp\"\n#include \"shader.hpp\"\n#include \"simplegeom.hpp\"\n#include \"texture.hpp\"\n#include \"vertexbuf.hpp\"\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/game_consts.hpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef endlesstunnel_game_consts_h\n#define endlesstunnel_game_consts_h\n\n// Render settings\n#define RENDER_FOV 45.0f\n#define RENDER_NEAR_CLIP 0.1f\n#define RENDER_FAR_CLIP 200.0f\n\n// Size of the tunnel\n#define TUNNEL_HALF_W 10.0f\n#define TUNNEL_HALF_H 10.0f\n\n// length of each tunnel section\n#define TUNNEL_SECTION_LENGTH 150.0f\n\n// number of tunnel sections to render ahead\n#define RENDER_TUNNEL_SECTION_COUNT 4\n\n// An obstacle is a grid of boxes. This indicates how many boxes by how many\n// boxes this grid is.\n#define OBS_GRID_SIZE 5\n\n// This is how wide each of the grid cells are\n#define OBS_CELL_SIZE ((2 * TUNNEL_HALF_W) / (float)OBS_GRID_SIZE)\n\n// size of each obstacle box\n#define OBS_BOX_SIZE (0.8f * OBS_CELL_SIZE)\n\n// size of bonus box\n#define OBS_BONUS_SIZE (0.3f * OBS_CELL_SIZE)\n\n// at what distance (in tunnel sections) from the start position do obstacles\n// start to appear?\n#define OBS_START_SECTION 4\n\n// once a tunnel section is this far behind the player, delete it\n#define SHIFT_THRESH 20.0f\n\n// maximum delta T between two frames\n#define MAX_DELTA_T 0.05f\n\n// player's speed\n#define PLAYER_SPEED 80.0f\n\n// how much the player's speed increases when we go up one difficulty level\n#define PLAYER_SPEED_INC_PER_LEVEL 10.0f\n\n// player's lateral speed\n#define PLAYER_MAX_LAT_SPEED 40.0f\n\n// bounds on player's movement\n#define PLAYER_MAX_X TUNNEL_HALF_W - 1.0f\n#define PLAYER_MIN_X -(PLAYER_MAX_X)\n#define PLAYER_MAX_Z TUNNEL_HALF_H - 1.0f\n#define PLAYER_MIN_Z -(PLAYER_MAX_Z)\n\n// touch control sensivity (ship displacement caused by dragging the screen by a\n// length equivalent to its height).\n#define TOUCH_CONTROL_SENSIVITY (TUNNEL_HALF_W * 5)\n\n// joystick control sensivity (maximum velocity attained per axis)\n#define JOYSTICK_CONTROL_SENSIVITY 20.0f\n\n// how many points equal a raise in difficulty level?\n#define SCORE_PER_LEVEL 500\n\n// settings for rendering the score to the screen\n#define SCORE_POS_X 0.15f\n#define SCORE_POS_Y 0.92f\n#define SCORE_FONT_SCALE 0.8f\n\n// scale of the signs that appear onscreen\n#define SIGN_FONT_SCALE 0.9f\n\n// scale of menu items\n#define MENUITEM_FONT_SCALE 0.8f\n\n// how long do signs stay onscreen\n#define SIGN_DURATION 2.0f\n#define SIGN_DURATION_BONUS 1.0f\n#define SIGN_DURATION_GAME_OVER 5.0f\n\n// duration of a text sign's zoom-in animation\n#define SIGN_ANIM_DUR 0.2f\n\n// how big the life symbol (heart) is\n#define LIFE_ICON_SCALE 0.004f\n#define LIFE_LINE_WIDTH 3\n\n// where do we start drawing the life icons? (negative to mean counting from\n// right side of screen)\n#define LIFE_POS_X -0.4f\n#define LIFE_POS_Y SCORE_POS_Y\n#define LIFE_SPACING_X 0.08f\n#define LIFE_SCALE_Y 1.5f\n\n// how many lives the player has\n#define PLAYER_LIVES 4\n\n// how many points player gets for picking up a bonus\n#define BONUS_POINTS 50\n\n// roll speeds for each level (how fast the chamber turns)\n#define ROLL_SPEEDS \\\n  { 0.0f, 0.1f, 0.0f, -0.1f, 0.0f, 0.2f, 0.0f, -0.2f }\n\n// recipes for synthesizing our very advanced sound effects:\n#define TONE_LEVEL_UP \"d100 f500. f600. f700. f600. f700. f800.\"\n#define TONE_CRASHED \\\n  \"a100 d15 f0. a40 d75 f0. a30 f0. a20 f0. a70 d100 f400. a0. a70. a0. a70.\"\n#define TONE_GAME_OVER                                                     \\\n  \"a100 d15 f0. a40 d75 f0. a30 f0. a20 f0. a70 d200 f400. a0. f350 a70. \" \\\n  \"a0. f300 a70. a0. f250 a70. a0. f200 a70.\"\n#define TONE_AMBIENT_0 \"d100 f300.\"\n#define TONE_AMBIENT_1 \"d100 f200.\"\n\n// player's acceleration, in units per second squared\n#define PLAYER_ACCELERATION_NEGATIVE_SPEED 10.0f  // used when speed is negative\n#define PLAYER_ACCELERATION_POSITIVE_SPEED 40.0f  // used when speed is positive\n\n// the speed after colliding with an obstacle\n#define PLAYER_SPEED_AFTER_COLLISION -20.0f\n\n// how far beind the obstacle the player is placed upon collision\n#define PLAYER_RECEDE_AFTER_COLLISION 2.0f\n\n// how long the heart meter blinks for when you've just lost a life\n#define BLINKING_HEART_DURATION 2.0f\n\n// how long does the game take to end after we show Game Over\n#define GAME_OVER_EXPIRE 5.0f\n\n// UI transition animation duration\n#define TRANSITION_DURATION 0.25f\n\n// for the purposes of testing for close calls with obstacles, by how much do we\n// move the player to test for collisions?\n#define CLOSE_CALL_CALC_DELTA (OBS_CELL_SIZE * 0.2f)\n\n// menu item pulse animation settings\n#define MENUITEM_PULSE_AMOUNT 1.1f\n#define MENUITEM_PULSE_PERIOD 0.5f\n\n// save file name\n#define SAVE_FILE_NAME \"tunnel.dat\"\n\n// checkpoint (save progress) every how many levels?\n#define LEVELS_PER_CHECKPOINT 4\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/CMakeLists.txt",
    "content": "#\n# Copyright (C) The Android Open Source Project\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\nadd_library(glm STATIC\n    detail/glm.cpp)\n\ntarget_include_directories(glm PRIVATE\n    ${CMAKE_CURRENT_SOURCE_DIR}/..)\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/common.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/common.hpp\n/// @date 2013-12-24 / 2013-12-24\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_COMMON_INCLUDED\n#define GLM_COMMON_INCLUDED\n\n#include \"detail/func_common.hpp\"\n\n#endif  // GLM_COMMON_INCLUDED\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/_features.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/_features.hpp\n/// @date 2013-02-20 / 2013-02-20\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_core_features\n#define glm_core_features\n\n// #define GLM_CXX98_EXCEPTIONS\n// #define GLM_CXX98_RTTI\n\n// #define GLM_CXX11_RVALUE_REFERENCES\n// Rvalue references - GCC 4.3\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2118.html\n\n// GLM_CXX11_TRAILING_RETURN\n// Rvalue references for *this - GCC not supported\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2439.htm\n\n// GLM_CXX11_NONSTATIC_MEMBER_INIT\n// Initialization of class objects by rvalues - GCC any\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1610.html\n\n// GLM_CXX11_NONSTATIC_MEMBER_INIT\n// Non-static data member initializers - GCC 4.7\n// http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2008/n2756.htm\n\n// #define GLM_CXX11_VARIADIC_TEMPLATE\n// Variadic templates - GCC 4.3\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2242.pdf\n\n//\n// Extending variadic template template parameters - GCC 4.4\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2555.pdf\n\n// #define GLM_CXX11_GENERALIZED_INITIALIZERS\n// Initializer lists - GCC 4.4\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2672.htm\n\n// #define GLM_CXX11_STATIC_ASSERT\n// Static assertions - GCC 4.3\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1720.html\n\n// #define GLM_CXX11_AUTO_TYPE\n// auto-typed variables - GCC 4.4\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1984.pdf\n\n// #define GLM_CXX11_AUTO_TYPE\n// Multi-declarator auto - GCC 4.4\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1737.pdf\n\n// #define GLM_CXX11_AUTO_TYPE\n// Removal of auto as a storage-class specifier - GCC 4.4\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2546.htm\n\n// #define GLM_CXX11_AUTO_TYPE\n// New function declarator syntax - GCC 4.4\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2541.htm\n\n// #define GLM_CXX11_LAMBDAS\n// New wording for C++0x lambdas - GCC 4.5\n// http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2927.pdf\n\n// #define GLM_CXX11_DECLTYPE\n// Declared type of an expression - GCC 4.3\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2343.pdf\n\n//\n// Right angle brackets - GCC 4.3\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1757.html\n\n//\n// Default template arguments for function templates\tDR226\tGCC 4.3\n// http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#226\n\n//\n// Solving the SFINAE problem for expressions\tDR339\tGCC 4.4\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2634.html\n\n// #define GLM_CXX11_ALIAS_TEMPLATE\n// Template aliases\tN2258\tGCC 4.7\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf\n\n//\n// Extern templates\tN1987\tYes\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1987.htm\n\n// #define GLM_CXX11_NULLPTR\n// Null pointer constant\tN2431\tGCC 4.6\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2431.pdf\n\n// #define GLM_CXX11_STRONG_ENUMS\n// Strongly-typed enums\tN2347\tGCC 4.4\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf\n\n//\n// Forward declarations for enums\tN2764\tGCC 4.6\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2764.pdf\n\n//\n// Generalized attributes\tN2761\tGCC 4.8\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2761.pdf\n\n//\n// Generalized constant expressions\tN2235\tGCC 4.6\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2235.pdf\n\n//\n// Alignment support\tN2341\tGCC 4.8\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2341.pdf\n\n// #define GLM_CXX11_DELEGATING_CONSTRUCTORS\n// Delegating constructors\tN1986\tGCC 4.7\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1986.pdf\n\n//\n// Inheriting constructors\tN2540\tGCC 4.8\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2540.htm\n\n// #define GLM_CXX11_EXPLICIT_CONVERSIONS\n// Explicit conversion operators\tN2437\tGCC 4.5\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2437.pdf\n\n//\n// New character types\tN2249\tGCC 4.4\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2249.html\n\n//\n// Unicode string literals\tN2442\tGCC 4.5\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2442.htm\n\n//\n// Raw string literals\tN2442\tGCC 4.5\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2442.htm\n\n//\n// Universal character name literals\tN2170\tGCC 4.5\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2170.html\n\n// #define GLM_CXX11_USER_LITERALS\n// User-defined literals\t\tN2765\tGCC 4.7\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2765.pdf\n\n//\n// Standard Layout Types\tN2342\tGCC 4.5\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2342.htm\n\n// #define GLM_CXX11_DEFAULTED_FUNCTIONS\n// #define GLM_CXX11_DELETED_FUNCTIONS\n// Defaulted and deleted functions\tN2346\tGCC 4.4\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2346.htm\n\n//\n// Extended friend declarations\tN1791\tGCC 4.7\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1791.pdf\n\n//\n// Extending sizeof\tN2253\tGCC 4.4\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2253.html\n\n// #define GLM_CXX11_INLINE_NAMESPACES\n// Inline namespaces\tN2535\tGCC 4.4\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2535.htm\n\n// #define GLM_CXX11_UNRESTRICTED_UNIONS\n// Unrestricted unions\tN2544\tGCC 4.6\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2544.pdf\n\n// #define GLM_CXX11_LOCAL_TYPE_TEMPLATE_ARGS\n// Local and unnamed types as template arguments\tN2657\tGCC 4.5\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2657.htm\n\n// #define GLM_CXX11_RANGE_FOR\n// Range-based for\tN2930\tGCC 4.6\n// http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2930.html\n\n// #define GLM_CXX11_OVERRIDE_CONTROL\n// Explicit virtual overrides\tN2928 N3206 N3272\tGCC 4.7\n// http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2928.htm\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3206.htm\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3272.htm\n\n//\n// Minimal support for garbage collection and reachability-based leak detection\n// N2670\tNo\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2670.htm\n\n// #define GLM_CXX11_NOEXCEPT\n// Allowing move constructors to throw [noexcept]\tN3050\tGCC 4.6 (core\n// language only)\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3050.html\n\n//\n// Defining move special member functions\tN3053\tGCC 4.6\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3053.html\n\n//\n// Sequence points\tN2239\tYes\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2239.html\n\n//\n// Atomic operations\tN2427\tGCC 4.4\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2239.html\n\n//\n// Strong Compare and Exchange\tN2748\tGCC 4.5\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2427.html\n\n//\n// Bidirectional Fences\tN2752\tGCC 4.8\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2752.htm\n\n//\n// Memory model\tN2429\tGCC 4.8\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2429.htm\n\n//\n// Data-dependency ordering: atomics and memory model\tN2664\tGCC 4.4\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2664.htm\n\n//\n// Propagating exceptions\tN2179\tGCC 4.4\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2179.html\n\n//\n// Abandoning a process and at_quick_exit\tN2440\tGCC 4.8\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2440.htm\n\n//\n// Allow atomics use in signal handlers\tN2547\tYes\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2547.htm\n\n//\n// Thread-local storage\tN2659\tGCC 4.8\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2659.htm\n\n//\n// Dynamic initialization and destruction with concurrency\tN2660\tGCC 4.3\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2660.htm\n\n//\n// __func__ predefined identifier\tN2340\tGCC 4.3\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2340.htm\n\n//\n// C99 preprocessor\tN1653\tGCC 4.3\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1653.htm\n\n//\n// long long\tN1811\tGCC 4.3\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1811.pdf\n\n//\n// Extended integral types\tN1988\tYes\n// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1988.pdf\n\n#if (GLM_COMPILER & GLM_COMPILER_GCC)\n\n#if (GLM_COMPILER >= GLM_COMPILER_GCC43)\n#define GLM_CXX11_STATIC_ASSERT\n#endif\n\n#elif (GLM_COMPILER & GLM_COMPILER_CLANG)\n#if (__has_feature(cxx_exceptions))\n#define GLM_CXX98_EXCEPTIONS\n#endif\n\n#if (__has_feature(cxx_rtti))\n#define GLM_CXX98_RTTI\n#endif\n\n#if (__has_feature(cxx_access_control_sfinae))\n#define GLM_CXX11_ACCESS_CONTROL_SFINAE\n#endif\n\n#if (__has_feature(cxx_alias_templates))\n#define GLM_CXX11_ALIAS_TEMPLATE\n#endif\n\n#if (__has_feature(cxx_alignas))\n#define GLM_CXX11_ALIGNAS\n#endif\n\n#if (__has_feature(cxx_attributes))\n#define GLM_CXX11_ATTRIBUTES\n#endif\n\n#if (__has_feature(cxx_constexpr))\n#define GLM_CXX11_CONSTEXPR\n#endif\n\n#if (__has_feature(cxx_decltype))\n#define GLM_CXX11_DECLTYPE\n#endif\n\n#if (__has_feature(cxx_default_function_template_args))\n#define GLM_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS\n#endif\n\n#if (__has_feature(cxx_defaulted_functions))\n#define GLM_CXX11_DEFAULTED_FUNCTIONS\n#endif\n\n#if (__has_feature(cxx_delegating_constructors))\n#define GLM_CXX11_DELEGATING_CONSTRUCTORS\n#endif\n\n#if (__has_feature(cxx_deleted_functions))\n#define GLM_CXX11_DELETED_FUNCTIONS\n#endif\n\n#if (__has_feature(cxx_explicit_conversions))\n#define GLM_CXX11_EXPLICIT_CONVERSIONS\n#endif\n\n#if (__has_feature(cxx_generalized_initializers))\n#define GLM_CXX11_GENERALIZED_INITIALIZERS\n#endif\n\n#if (__has_feature(cxx_implicit_moves))\n#define GLM_CXX11_IMPLICIT_MOVES\n#endif\n\n#if (__has_feature(cxx_inheriting_constructors))\n#define GLM_CXX11_INHERITING_CONSTRUCTORS\n#endif\n\n#if (__has_feature(cxx_inline_namespaces))\n#define GLM_CXX11_INLINE_NAMESPACES\n#endif\n\n#if (__has_feature(cxx_lambdas))\n#define GLM_CXX11_LAMBDAS\n#endif\n\n#if (__has_feature(cxx_local_type_template_args))\n#define GLM_CXX11_LOCAL_TYPE_TEMPLATE_ARGS\n#endif\n\n#if (__has_feature(cxx_noexcept))\n#define GLM_CXX11_NOEXCEPT\n#endif\n\n#if (__has_feature(cxx_nonstatic_member_init))\n#define GLM_CXX11_NONSTATIC_MEMBER_INIT\n#endif\n\n#if (__has_feature(cxx_nullptr))\n#define GLM_CXX11_NULLPTR\n#endif\n\n#if (__has_feature(cxx_override_control))\n#define GLM_CXX11_OVERRIDE_CONTROL\n#endif\n\n#if (__has_feature(cxx_reference_qualified_functions))\n#define GLM_CXX11_REFERENCE_QUALIFIED_FUNCTIONS\n#endif\n\n#if (__has_feature(cxx_range_for))\n#define GLM_CXX11_RANGE_FOR\n#endif\n\n#if (__has_feature(cxx_raw_string_literals))\n#define GLM_CXX11_RAW_STRING_LITERALS\n#endif\n\n#if (__has_feature(cxx_rvalue_references))\n#define GLM_CXX11_RVALUE_REFERENCES\n#endif\n\n#if (__has_feature(cxx_static_assert))\n#define GLM_CXX11_STATIC_ASSERT\n#endif\n\n#if (__has_feature(cxx_auto_type))\n#define GLM_CXX11_AUTO_TYPE\n#endif\n\n#if (__has_feature(cxx_strong_enums))\n#define GLM_CXX11_STRONG_ENUMS\n#endif\n\n#if (__has_feature(cxx_trailing_return))\n#define GLM_CXX11_TRAILING_RETURN\n#endif\n\n#if (__has_feature(cxx_unicode_literals))\n#define GLM_CXX11_UNICODE_LITERALS\n#endif\n\n#if (__has_feature(cxx_unrestricted_unions))\n#define GLM_CXX11_UNRESTRICTED_UNIONS\n#endif\n\n#if (__has_feature(cxx_user_literals))\n#define GLM_CXX11_USER_LITERALS\n#endif\n\n#if (__has_feature(cxx_variadic_templates))\n#define GLM_CXX11_VARIADIC_TEMPLATES\n#endif\n\n#endif  //(GLM_COMPILER & GLM_COMPILER_CLANG)\n\n#endif  // glm_core_features\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/_fixes.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/_fixes.hpp\n/// @date 2011-02-21 / 2011-11-22\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#include <cmath>\n\n//! Workaround for compatibility with other libraries\n#ifdef max\n#undef max\n#endif\n\n//! Workaround for compatibility with other libraries\n#ifdef min\n#undef min\n#endif\n\n//! Workaround for Android\n#ifdef isnan\n#undef isnan\n#endif\n\n//! Workaround for Android\n#ifdef isinf\n#undef isinf\n#endif\n\n//! Workaround for Chrone Native Client\n#ifdef log2\n#undef log2\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/_literals.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/_literals.hpp\n/// @date 2013-05-06 / 2013-05-06\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_core_literals\n#define glm_core_literals\n\nnamespace glm {\n#define GLM_CXX11_USER_LITERALS\n#ifdef GLM_CXX11_USER_LITERALS\n/*\n        GLM_FUNC_QUALIFIER detail::half operator \"\" _h(long double const s)\n        {\n                return detail::half(s);\n        }\n\n        GLM_FUNC_QUALIFIER float operator \"\" _f(long double const s)\n        {\n                return static_cast<float>(s);\n        }\n*/\n#endif  // GLM_CXX11_USER_LITERALS\n\n}  // namespace glm\n\n#endif  // glm_core_literals\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/_noise.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/detail/_noise.hpp\n/// @date 2013-12-24 / 2013-12-24\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_DETAIL_NOISE_INCLUDED\n#define GLM_DETAIL_NOISE_INCLUDED\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T>\nGLM_FUNC_QUALIFIER T mod289(T const& x) {\n  return x - floor(x * static_cast<T>(1.0) / static_cast<T>(289.0)) *\n                 static_cast<T>(289.0);\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER T permute(T const& x) {\n  return mod289(((x * static_cast<T>(34)) + static_cast<T>(1)) * x);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> permute(tvec2<T, P> const& x) {\n  return mod289(((x * static_cast<T>(34)) + static_cast<T>(1)) * x);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> permute(tvec3<T, P> const& x) {\n  return mod289(((x * static_cast<T>(34)) + static_cast<T>(1)) * x);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> permute(tvec4<T, P> const& x) {\n  return mod289(((x * static_cast<T>(34)) + static_cast<T>(1)) * x);\n}\n/*\n        template <typename T, precision P, template<typename> class vecType>\n        GLM_FUNC_QUALIFIER vecType<T, P> permute(vecType<T, P> const & x)\n        {\n                return mod289(((x * T(34)) + T(1)) * x);\n        }\n*/\ntemplate <typename T>\nGLM_FUNC_QUALIFIER T taylorInvSqrt(T const& r) {\n  return T(1.79284291400159) - T(0.85373472095314) * r;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<T, P> taylorInvSqrt(\n    detail::tvec2<T, P> const& r) {\n  return T(1.79284291400159) - T(0.85373472095314) * r;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> taylorInvSqrt(\n    detail::tvec3<T, P> const& r) {\n  return T(1.79284291400159) - T(0.85373472095314) * r;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> taylorInvSqrt(\n    detail::tvec4<T, P> const& r) {\n  return T(1.79284291400159) - T(0.85373472095314) * r;\n}\n/*\n        template <typename T, precision P, template<typename> class vecType>\n        GLM_FUNC_QUALIFIER vecType<T, P> taylorInvSqrt(vecType<T, P> const & r)\n        {\n                return T(1.79284291400159) - T(0.85373472095314) * r;\n        }\n*/\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<T, P> fade(detail::tvec2<T, P> const& t) {\n  return (t * t * t) * (t * (t * T(6) - T(15)) + T(10));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> fade(detail::tvec3<T, P> const& t) {\n  return (t * t * t) * (t * (t * T(6) - T(15)) + T(10));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> fade(detail::tvec4<T, P> const& t) {\n  return (t * t * t) * (t * (t * T(6) - T(15)) + T(10));\n}\n/*\n        template <typename T, precision P, template <typename> class vecType>\n        GLM_FUNC_QUALIFIER vecType<T, P> fade(vecType<T, P> const & t)\n        {\n                return (t * t * t) * (t * (t * T(6) - T(15)) + T(10));\n        }\n*/\n}  // namespace detail\n}  // namespace glm\n\n#endif  // GLM_DETAIL_NOISE_INCLUDED\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/_swizzle.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/_swizzle.hpp\n/// @date 2006-04-20 / 2011-02-16\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_core_swizzle\n#define glm_core_swizzle\n\nnamespace glm {\nnamespace detail {\n// Internal class for implementing swizzle operators\ntemplate <typename T, int N>\nstruct _swizzle_base0 {\n  typedef T value_type;\n\n protected:\n  GLM_FUNC_QUALIFIER value_type& elem(size_t i) {\n    return (reinterpret_cast<value_type*>(_buffer))[i];\n  }\n  GLM_FUNC_QUALIFIER const value_type& elem(size_t i) const {\n    return (reinterpret_cast<const value_type*>(_buffer))[i];\n  }\n\n  // Use an opaque buffer to *ensure* the compiler doesn't call a constructor.\n  // The size 1 buffer is assumed to aligned to the actual members so that the\n  // elem()\n  char _buffer[1];\n};\n\ntemplate <typename T, precision P, typename V, int E0, int E1, int E2, int E3,\n          int N>\nstruct _swizzle_base1 : public _swizzle_base0<T, N> {};\n\ntemplate <typename T, precision P, typename V, int E0, int E1>\nstruct _swizzle_base1<T, P, V, E0, E1, -1, -2, 2>\n    : public _swizzle_base0<T, 2> {\n  GLM_FUNC_QUALIFIER V operator()() const {\n    return V(this->elem(E0), this->elem(E1));\n  }\n};\n\ntemplate <typename T, precision P, typename V, int E0, int E1, int E2>\nstruct _swizzle_base1<T, P, V, E0, E1, E2, -1, 3>\n    : public _swizzle_base0<T, 3> {\n  GLM_FUNC_QUALIFIER V operator()() const {\n    return V(this->elem(E0), this->elem(E1), this->elem(E2));\n  }\n};\n\ntemplate <typename T, precision P, typename V, int E0, int E1, int E2, int E3>\nstruct _swizzle_base1<T, P, V, E0, E1, E2, E3, 4>\n    : public _swizzle_base0<T, 4> {\n  GLM_FUNC_QUALIFIER V operator()() const {\n    return V(this->elem(E0), this->elem(E1), this->elem(E2), this->elem(E3));\n  }\n};\n\n// Internal class for implementing swizzle operators\n/*\n        Template parameters:\n\n        ValueType = type of scalar values (e.g. float, double)\n        VecType   = class the swizzle is applies to (e.g. tvec3<float>)\n        N         = number of components in the vector (e.g. 3)\n        E0...3    = what index the n-th element of this swizzle refers to in the\n   unswizzled vec\n\n        DUPLICATE_ELEMENTS = 1 if there is a repeated element, 0 otherwise (used\n   to specialize swizzles containing duplicate elements so that they cannot be\n   used as r-values).\n*/\ntemplate <typename ValueType, precision P, typename VecType, int N, int E0,\n          int E1, int E2, int E3, int DUPLICATE_ELEMENTS>\nstruct _swizzle_base2\n    : public _swizzle_base1<ValueType, P, VecType, E0, E1, E2, E3, N> {\n  typedef VecType vec_type;\n  typedef ValueType value_type;\n\n  GLM_FUNC_QUALIFIER _swizzle_base2& operator=(const ValueType& t) {\n    for (int i = 0; i < N; ++i) (*this)[i] = t;\n    return *this;\n  }\n\n  GLM_FUNC_QUALIFIER _swizzle_base2& operator=(const VecType& that) {\n    struct op {\n      GLM_FUNC_QUALIFIER void operator()(value_type& e, value_type& t) {\n        e = t;\n      }\n    };\n    _apply_op(that, op());\n    return *this;\n  }\n\n  GLM_FUNC_QUALIFIER void operator-=(const VecType& that) {\n    struct op {\n      GLM_FUNC_QUALIFIER void operator()(value_type& e, value_type& t) {\n        e -= t;\n      }\n    };\n    _apply_op(that, op());\n  }\n\n  GLM_FUNC_QUALIFIER void operator+=(const VecType& that) {\n    struct op {\n      GLM_FUNC_QUALIFIER void operator()(value_type& e, value_type& t) {\n        e += t;\n      }\n    };\n    _apply_op(that, op());\n  }\n\n  GLM_FUNC_QUALIFIER void operator*=(const VecType& that) {\n    struct op {\n      GLM_FUNC_QUALIFIER void operator()(value_type& e, value_type& t) {\n        e *= t;\n      }\n    };\n    _apply_op(that, op());\n  }\n\n  GLM_FUNC_QUALIFIER void operator/=(const VecType& that) {\n    struct op {\n      GLM_FUNC_QUALIFIER void operator()(value_type& e, value_type& t) {\n        e /= t;\n      }\n    };\n    _apply_op(that, op());\n  }\n\n  GLM_FUNC_QUALIFIER value_type& operator[](size_t i) {\n#ifndef __CUDA_ARCH__\n    static\n#endif\n        const int offset_dst[4] = {E0, E1, E2, E3};\n    return this->elem(offset_dst[i]);\n  }\n  GLM_FUNC_QUALIFIER value_type operator[](size_t i) const {\n#ifndef __CUDA_ARCH__\n    static\n#endif\n        const int offset_dst[4] = {E0, E1, E2, E3};\n    return this->elem(offset_dst[i]);\n  }\n\n protected:\n  template <typename T>\n  GLM_FUNC_QUALIFIER void _apply_op(const VecType& that, T op) {\n    // Make a copy of the data in this == &that.\n    // The copier should optimize out the copy in cases where the function is\n    // properly inlined and the copy is not necessary.\n    ValueType t[N];\n    for (int i = 0; i < N; ++i) t[i] = that[i];\n    for (int i = 0; i < N; ++i) op((*this)[i], t[i]);\n  }\n};\n\n// Specialization for swizzles containing duplicate elements.  These cannot be\n// modified.\ntemplate <typename ValueType, precision P, typename VecType, int N, int E0,\n          int E1, int E2, int E3>\nstruct _swizzle_base2<ValueType, P, VecType, N, E0, E1, E2, E3, 1>\n    : public _swizzle_base1<ValueType, P, VecType, E0, E1, E2, E3, N> {\n  typedef VecType vec_type;\n  typedef ValueType value_type;\n\n  struct Stub {};\n  GLM_FUNC_QUALIFIER _swizzle_base2& operator=(Stub const&) { return *this; }\n\n  GLM_FUNC_QUALIFIER value_type operator[](size_t i) const {\n#ifndef __CUDA_ARCH__\n    static\n#endif\n        const int offset_dst[4] = {E0, E1, E2, E3};\n    return this->elem(offset_dst[i]);\n  }\n};\n\ntemplate <int N, typename ValueType, precision P, typename VecType, int E0,\n          int E1, int E2, int E3>\nstruct _swizzle\n    : public _swizzle_base2<ValueType, P, VecType, N, E0, E1, E2, E3,\n                            (E0 == E1 || E0 == E2 || E0 == E3 || E1 == E2 ||\n                             E1 == E3 || E2 == E3)> {\n  typedef _swizzle_base2<ValueType, P, VecType, N, E0, E1, E2, E3,\n                         (E0 == E1 || E0 == E2 || E0 == E3 || E1 == E2 ||\n                          E1 == E3 || E2 == E3)>\n      base_type;\n\n  using base_type::operator=;\n\n  GLM_FUNC_QUALIFIER operator VecType() const { return (*this)(); }\n};\n\n//\n// To prevent the C++ syntax from getting entirely overwhelming, define some\n// alias macros\n//\n#define _GLM_SWIZZLE_TEMPLATE1                                          \\\n  template <int N, typename T, precision P, typename V, int E0, int E1, \\\n            int E2, int E3>\n#define _GLM_SWIZZLE_TEMPLATE2                                          \\\n  template <int N, typename T, precision P, typename V, int E0, int E1, \\\n            int E2, int E3, int F0, int F1, int F2, int F3>\n#define _GLM_SWIZZLE_TYPE1 _swizzle<N, T, P, V, E0, E1, E2, E3>\n#define _GLM_SWIZZLE_TYPE2 _swizzle<N, T, P, V, F0, F1, F2, F3>\n\n//\n// Wrapper for a binary operator (e.g. u.yy + v.zy)\n//\n#define _GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(OPERAND)    \\\n  _GLM_SWIZZLE_TEMPLATE2                                               \\\n  GLM_FUNC_QUALIFIER V operator OPERAND(const _GLM_SWIZZLE_TYPE1& a,   \\\n                                        const _GLM_SWIZZLE_TYPE2& b) { \\\n    return a() OPERAND b();                                            \\\n  }                                                                    \\\n  _GLM_SWIZZLE_TEMPLATE1                                               \\\n  GLM_FUNC_QUALIFIER V operator OPERAND(const _GLM_SWIZZLE_TYPE1& a,   \\\n                                        const V& b) {                  \\\n    return a() OPERAND b;                                              \\\n  }                                                                    \\\n  _GLM_SWIZZLE_TEMPLATE1                                               \\\n  GLM_FUNC_QUALIFIER V operator OPERAND(const V& a,                    \\\n                                        const _GLM_SWIZZLE_TYPE1& b) { \\\n    return a OPERAND b();                                              \\\n  }\n\n//\n// Wrapper for a operand between a swizzle and a binary (e.g. 1.0f - u.xyz)\n//\n#define _GLM_SWIZZLE_SCALAR_BINARY_OPERATOR_IMPLEMENTATION(OPERAND)    \\\n  _GLM_SWIZZLE_TEMPLATE1                                               \\\n  GLM_FUNC_QUALIFIER V operator OPERAND(const _GLM_SWIZZLE_TYPE1& a,   \\\n                                        const T& b) {                  \\\n    return a() OPERAND b;                                              \\\n  }                                                                    \\\n  _GLM_SWIZZLE_TEMPLATE1                                               \\\n  GLM_FUNC_QUALIFIER V operator OPERAND(const T& a,                    \\\n                                        const _GLM_SWIZZLE_TYPE1& b) { \\\n    return a OPERAND b();                                              \\\n  }\n\n//\n// Macro for wrapping a function taking one argument (e.g. abs())\n//\n#define _GLM_SWIZZLE_FUNCTION_1_ARGS(RETURN_TYPE, FUNCTION)             \\\n  _GLM_SWIZZLE_TEMPLATE1                                                \\\n  GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION( \\\n      const _GLM_SWIZZLE_TYPE1& a) {                                    \\\n    return FUNCTION(a());                                               \\\n  }\n\n//\n// Macro for wrapping a function taking two vector arguments (e.g. dot()).\n//\n#define _GLM_SWIZZLE_FUNCTION_2_ARGS(RETURN_TYPE, FUNCTION)             \\\n  _GLM_SWIZZLE_TEMPLATE2                                                \\\n  GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION( \\\n      const _GLM_SWIZZLE_TYPE1& a, const _GLM_SWIZZLE_TYPE2& b) {       \\\n    return FUNCTION(a(), b());                                          \\\n  }                                                                     \\\n  _GLM_SWIZZLE_TEMPLATE1                                                \\\n  GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION( \\\n      const _GLM_SWIZZLE_TYPE1& a, const _GLM_SWIZZLE_TYPE1& b) {       \\\n    return FUNCTION(a(), b());                                          \\\n  }                                                                     \\\n  _GLM_SWIZZLE_TEMPLATE1                                                \\\n  GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION( \\\n      const _GLM_SWIZZLE_TYPE1& a, const typename V& b) {               \\\n    return FUNCTION(a(), b);                                            \\\n  }                                                                     \\\n  _GLM_SWIZZLE_TEMPLATE1                                                \\\n  GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION( \\\n      const V& a, const _GLM_SWIZZLE_TYPE1& b) {                        \\\n    return FUNCTION(a, b());                                            \\\n  }\n\n//\n// Macro for wrapping a function take 2 vec arguments followed by a scalar (e.g.\n// mix()).\n//\n#define _GLM_SWIZZLE_FUNCTION_2_ARGS_SCALAR(RETURN_TYPE, FUNCTION)            \\\n  _GLM_SWIZZLE_TEMPLATE2                                                      \\\n  GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(       \\\n      const _GLM_SWIZZLE_TYPE1& a, const _GLM_SWIZZLE_TYPE2& b, const T& c) { \\\n    return FUNCTION(a(), b(), c);                                             \\\n  }                                                                           \\\n  _GLM_SWIZZLE_TEMPLATE1                                                      \\\n  GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(       \\\n      const _GLM_SWIZZLE_TYPE1& a, const _GLM_SWIZZLE_TYPE1& b, const T& c) { \\\n    return FUNCTION(a(), b(), c);                                             \\\n  }                                                                           \\\n  _GLM_SWIZZLE_TEMPLATE1                                                      \\\n  GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(       \\\n      const _GLM_SWIZZLE_TYPE1& a, const typename S0::vec_type& b,            \\\n      const T& c) {                                                           \\\n    return FUNCTION(a(), b, c);                                               \\\n  }                                                                           \\\n  _GLM_SWIZZLE_TEMPLATE1                                                      \\\n  GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(       \\\n      const typename V& a, const _GLM_SWIZZLE_TYPE1& b, const T& c) {         \\\n    return FUNCTION(a, b(), c);                                               \\\n  }\n\n}  // namespace detail\n}  // namespace glm\n\nnamespace glm {\nnamespace detail {\n_GLM_SWIZZLE_SCALAR_BINARY_OPERATOR_IMPLEMENTATION(-)\n_GLM_SWIZZLE_SCALAR_BINARY_OPERATOR_IMPLEMENTATION(*)\n_GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(+)\n_GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(-)\n_GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(*)\n_GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(/)\n}  // namespace detail\n\n//\n// Swizzles are distinct types from the unswizzled type.  The below macros will\n// provide template specializations for the swizzle types for the given\n// functions so that the compiler does not have any ambiguity to choosing how to\n// handle the function.\n//\n// The alternative is to use the operator()() when calling the function in order\n// to explicitly convert the swizzled type to the unswizzled type.\n//\n\n//_GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type,    abs);\n//_GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type,    acos);\n//_GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type,    acosh);\n//_GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type,    all);\n//_GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type,    any);\n\n//_GLM_SWIZZLE_FUNCTION_2_ARGS(value_type,  dot);\n//_GLM_SWIZZLE_FUNCTION_2_ARGS(vec_type,    cross);\n//_GLM_SWIZZLE_FUNCTION_2_ARGS(vec_type,    step);\n//_GLM_SWIZZLE_FUNCTION_2_ARGS_SCALAR(vec_type, mix);\n}  // namespace glm\n\n#define _GLM_SWIZZLE2_2_MEMBERS(T, P, V, E0, E1)     \\\n  struct {                                           \\\n    _swizzle<2, T, P, V<T, P>, 0, 0, -1, -2> E0##E0; \\\n  };                                                 \\\n  struct {                                           \\\n    _swizzle<2, T, P, V<T, P>, 0, 1, -1, -2> E0##E1; \\\n  };                                                 \\\n  struct {                                           \\\n    _swizzle<2, T, P, V<T, P>, 1, 0, -1, -2> E1##E0; \\\n  };                                                 \\\n  struct {                                           \\\n    _swizzle<2, T, P, V<T, P>, 1, 1, -1, -2> E1##E1; \\\n  };\n\n#define _GLM_SWIZZLE2_3_MEMBERS(T, P, V, E0, E1)        \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 0, 0, 0, -1> E0##E0##E0; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 0, 0, 1, -1> E0##E0##E1; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 0, 1, 0, -1> E0##E1##E0; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 0, 1, 1, -1> E0##E1##E1; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 1, 0, 0, -1> E1##E0##E0; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 1, 0, 1, -1> E1##E0##E1; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 1, 1, 0, -1> E1##E1##E0; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 1, 1, 1, -1> E1##E1##E1; \\\n  };\n\n#define _GLM_SWIZZLE2_4_MEMBERS(T, P, V, E0, E1)           \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 0, 0, 0> E0##E0##E0##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 0, 0, 1> E0##E0##E0##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 0, 1, 0> E0##E0##E1##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 0, 1, 1> E0##E0##E1##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 1, 0, 0> E0##E1##E0##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 1, 0, 1> E0##E1##E0##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 1, 1, 0> E0##E1##E1##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 1, 1, 1> E0##E1##E1##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 0, 0, 0> E1##E0##E0##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 0, 0, 1> E1##E0##E0##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 0, 1, 0> E1##E0##E1##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 0, 1, 1> E1##E0##E1##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 1, 0, 0> E1##E1##E0##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 1, 0, 1> E1##E1##E0##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 1, 1, 0> E1##E1##E1##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 1, 1, 1> E1##E1##E1##E1; \\\n  };\n\n#define _GLM_SWIZZLE3_2_MEMBERS(T, P, V, E0, E1, E2) \\\n  struct {                                           \\\n    _swizzle<2, T, P, V<T, P>, 0, 0, -1, -2> E0##E0; \\\n  };                                                 \\\n  struct {                                           \\\n    _swizzle<2, T, P, V<T, P>, 0, 1, -1, -2> E0##E1; \\\n  };                                                 \\\n  struct {                                           \\\n    _swizzle<2, T, P, V<T, P>, 0, 2, -1, -2> E0##E2; \\\n  };                                                 \\\n  struct {                                           \\\n    _swizzle<2, T, P, V<T, P>, 1, 0, -1, -2> E1##E0; \\\n  };                                                 \\\n  struct {                                           \\\n    _swizzle<2, T, P, V<T, P>, 1, 1, -1, -2> E1##E1; \\\n  };                                                 \\\n  struct {                                           \\\n    _swizzle<2, T, P, V<T, P>, 1, 2, -1, -2> E1##E2; \\\n  };                                                 \\\n  struct {                                           \\\n    _swizzle<2, T, P, V<T, P>, 2, 0, -1, -2> E2##E0; \\\n  };                                                 \\\n  struct {                                           \\\n    _swizzle<2, T, P, V<T, P>, 2, 1, -1, -2> E2##E1; \\\n  };                                                 \\\n  struct {                                           \\\n    _swizzle<2, T, P, V<T, P>, 2, 2, -1, -2> E2##E2; \\\n  };\n\n#define _GLM_SWIZZLE3_3_MEMBERS(T, P, V, E0, E1, E2)    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 0, 0, 0, -1> E0##E0##E0; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 0, 0, 1, -1> E0##E0##E1; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 0, 0, 2, -1> E0##E0##E2; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 0, 1, 0, -1> E0##E1##E0; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 0, 1, 1, -1> E0##E1##E1; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 0, 1, 2, -1> E0##E1##E2; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 0, 2, 0, -1> E0##E2##E0; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 0, 2, 1, -1> E0##E2##E1; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 0, 2, 2, -1> E0##E2##E2; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 1, 0, 0, -1> E1##E0##E0; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 1, 0, 1, -1> E1##E0##E1; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 1, 0, 2, -1> E1##E0##E2; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 1, 1, 0, -1> E1##E1##E0; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 1, 1, 1, -1> E1##E1##E1; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 1, 1, 2, -1> E1##E1##E2; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 1, 2, 0, -1> E1##E2##E0; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 1, 2, 1, -1> E1##E2##E1; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 1, 2, 2, -1> E1##E2##E2; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 2, 0, 0, -1> E2##E0##E0; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 2, 0, 1, -1> E2##E0##E1; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 2, 0, 2, -1> E2##E0##E2; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 2, 1, 0, -1> E2##E1##E0; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 2, 1, 1, -1> E2##E1##E1; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 2, 1, 2, -1> E2##E1##E2; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 2, 2, 0, -1> E2##E2##E0; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 2, 2, 1, -1> E2##E2##E1; \\\n  };                                                    \\\n  struct {                                              \\\n    _swizzle<3, T, P, V<T, P>, 2, 2, 2, -1> E2##E2##E2; \\\n  };\n\n#define _GLM_SWIZZLE3_4_MEMBERS(T, P, V, E0, E1, E2)       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 0, 0, 0> E0##E0##E0##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 0, 0, 1> E0##E0##E0##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 0, 0, 2> E0##E0##E0##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 0, 1, 0> E0##E0##E1##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 0, 1, 1> E0##E0##E1##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 0, 1, 2> E0##E0##E1##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 0, 2, 0> E0##E0##E2##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 0, 2, 1> E0##E0##E2##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 0, 2, 2> E0##E0##E2##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 1, 0, 0> E0##E1##E0##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 1, 0, 1> E0##E1##E0##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 1, 0, 2> E0##E1##E0##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 1, 1, 0> E0##E1##E1##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 1, 1, 1> E0##E1##E1##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 1, 1, 2> E0##E1##E1##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 1, 2, 0> E0##E1##E2##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 1, 2, 1> E0##E1##E2##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 1, 2, 2> E0##E1##E2##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 2, 0, 0> E0##E2##E0##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 2, 0, 1> E0##E2##E0##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 2, 0, 2> E0##E2##E0##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 2, 1, 0> E0##E2##E1##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 2, 1, 1> E0##E2##E1##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 2, 1, 2> E0##E2##E1##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 2, 2, 0> E0##E2##E2##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 2, 2, 1> E0##E2##E2##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 2, 2, 2> E0##E2##E2##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 0, 0, 0> E1##E0##E0##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 0, 0, 1> E1##E0##E0##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 0, 0, 2> E1##E0##E0##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 0, 1, 0> E1##E0##E1##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 0, 1, 1> E1##E0##E1##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 0, 1, 2> E1##E0##E1##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 0, 2, 0> E1##E0##E2##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 0, 2, 1> E1##E0##E2##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 0, 2, 2> E1##E0##E2##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 1, 0, 0> E1##E1##E0##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 1, 0, 1> E1##E1##E0##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 1, 0, 2> E1##E1##E0##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 1, 1, 0> E1##E1##E1##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 1, 1, 1> E1##E1##E1##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 1, 1, 2> E1##E1##E1##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 1, 2, 0> E1##E1##E2##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 1, 2, 1> E1##E1##E2##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 1, 2, 2> E1##E1##E2##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 2, 0, 0> E1##E2##E0##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 2, 0, 1> E1##E2##E0##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 2, 0, 2> E1##E2##E0##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 2, 1, 0> E1##E2##E1##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 2, 1, 1> E1##E2##E1##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 2, 1, 2> E1##E2##E1##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 2, 2, 0> E1##E2##E2##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 2, 2, 1> E1##E2##E2##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 2, 2, 2> E1##E2##E2##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 0, 0, 0> E2##E0##E0##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 0, 0, 1> E2##E0##E0##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 0, 0, 2> E2##E0##E0##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 0, 1, 0> E2##E0##E1##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 0, 1, 1> E2##E0##E1##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 0, 1, 2> E2##E0##E1##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 0, 2, 0> E2##E0##E2##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 0, 2, 1> E2##E0##E2##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 0, 2, 2> E2##E0##E2##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 1, 0, 0> E2##E1##E0##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 1, 0, 1> E2##E1##E0##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 1, 0, 2> E2##E1##E0##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 1, 1, 0> E2##E1##E1##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 1, 1, 1> E2##E1##E1##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 1, 1, 2> E2##E1##E1##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 1, 2, 0> E2##E1##E2##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 1, 2, 1> E2##E1##E2##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 1, 2, 2> E2##E1##E2##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 2, 0, 0> E2##E2##E0##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 2, 0, 1> E2##E2##E0##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 2, 0, 2> E2##E2##E0##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 2, 1, 0> E2##E2##E1##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 2, 1, 1> E2##E2##E1##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 2, 1, 2> E2##E2##E1##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 2, 2, 0> E2##E2##E2##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 2, 2, 1> E2##E2##E2##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 2, 2, 2> E2##E2##E2##E2; \\\n  };\n\n#define _GLM_SWIZZLE4_2_MEMBERS(T, P, V, E0, E1, E2, E3) \\\n  struct {                                               \\\n    _swizzle<2, T, P, V<T, P>, 0, 0, -1, -2> E0##E0;     \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<2, T, P, V<T, P>, 0, 1, -1, -2> E0##E1;     \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<2, T, P, V<T, P>, 0, 2, -1, -2> E0##E2;     \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<2, T, P, V<T, P>, 0, 3, -1, -2> E0##E3;     \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<2, T, P, V<T, P>, 1, 0, -1, -2> E1##E0;     \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<2, T, P, V<T, P>, 1, 1, -1, -2> E1##E1;     \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<2, T, P, V<T, P>, 1, 2, -1, -2> E1##E2;     \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<2, T, P, V<T, P>, 1, 3, -1, -2> E1##E3;     \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<2, T, P, V<T, P>, 2, 0, -1, -2> E2##E0;     \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<2, T, P, V<T, P>, 2, 1, -1, -2> E2##E1;     \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<2, T, P, V<T, P>, 2, 2, -1, -2> E2##E2;     \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<2, T, P, V<T, P>, 2, 3, -1, -2> E2##E3;     \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<2, T, P, V<T, P>, 3, 0, -1, -2> E3##E0;     \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<2, T, P, V<T, P>, 3, 1, -1, -2> E3##E1;     \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<2, T, P, V<T, P>, 3, 2, -1, -2> E3##E2;     \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<2, T, P, V<T, P>, 3, 3, -1, -2> E3##E3;     \\\n  };\n\n#define _GLM_SWIZZLE4_3_MEMBERS(T, P, V, E0, E1, E2, E3) \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 0, 0, 0, -1> E0##E0##E0;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 0, 0, 1, -1> E0##E0##E1;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 0, 0, 2, -1> E0##E0##E2;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 0, 0, 3, -1> E0##E0##E3;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 0, 1, 0, -1> E0##E1##E0;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 0, 1, 1, -1> E0##E1##E1;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 0, 1, 2, -1> E0##E1##E2;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 0, 1, 3, -1> E0##E1##E3;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 0, 2, 0, -1> E0##E2##E0;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 0, 2, 1, -1> E0##E2##E1;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 0, 2, 2, -1> E0##E2##E2;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 0, 2, 3, -1> E0##E2##E3;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 0, 3, 0, -1> E0##E3##E0;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 0, 3, 1, -1> E0##E3##E1;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 0, 3, 2, -1> E0##E3##E2;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 0, 3, 3, -1> E0##E3##E3;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 1, 0, 0, -1> E1##E0##E0;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 1, 0, 1, -1> E1##E0##E1;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 1, 0, 2, -1> E1##E0##E2;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 1, 0, 3, -1> E1##E0##E3;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 1, 1, 0, -1> E1##E1##E0;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 1, 1, 1, -1> E1##E1##E1;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 1, 1, 2, -1> E1##E1##E2;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 1, 1, 3, -1> E1##E1##E3;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 1, 2, 0, -1> E1##E2##E0;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 1, 2, 1, -1> E1##E2##E1;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 1, 2, 2, -1> E1##E2##E2;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 1, 2, 3, -1> E1##E2##E3;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 1, 3, 0, -1> E1##E3##E0;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 1, 3, 1, -1> E1##E3##E1;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 1, 3, 2, -1> E1##E3##E2;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 1, 3, 3, -1> E1##E3##E3;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 2, 0, 0, -1> E2##E0##E0;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 2, 0, 1, -1> E2##E0##E1;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 2, 0, 2, -1> E2##E0##E2;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 2, 0, 3, -1> E2##E0##E3;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 2, 1, 0, -1> E2##E1##E0;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 2, 1, 1, -1> E2##E1##E1;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 2, 1, 2, -1> E2##E1##E2;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 2, 1, 3, -1> E2##E1##E3;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 2, 2, 0, -1> E2##E2##E0;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 2, 2, 1, -1> E2##E2##E1;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 2, 2, 2, -1> E2##E2##E2;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 2, 2, 3, -1> E2##E2##E3;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 2, 3, 0, -1> E2##E3##E0;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 2, 3, 1, -1> E2##E3##E1;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 2, 3, 2, -1> E2##E3##E2;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 2, 3, 3, -1> E2##E3##E3;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 3, 0, 0, -1> E3##E0##E0;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 3, 0, 1, -1> E3##E0##E1;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 3, 0, 2, -1> E3##E0##E2;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 3, 0, 3, -1> E3##E0##E3;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 3, 1, 0, -1> E3##E1##E0;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 3, 1, 1, -1> E3##E1##E1;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 3, 1, 2, -1> E3##E1##E2;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 3, 1, 3, -1> E3##E1##E3;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 3, 2, 0, -1> E3##E2##E0;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 3, 2, 1, -1> E3##E2##E1;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 3, 2, 2, -1> E3##E2##E2;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 3, 2, 3, -1> E3##E2##E3;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 3, 3, 0, -1> E3##E3##E0;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 3, 3, 1, -1> E3##E3##E1;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 3, 3, 2, -1> E3##E3##E2;  \\\n  };                                                     \\\n  struct {                                               \\\n    _swizzle<3, T, P, V<T, P>, 3, 3, 3, -1> E3##E3##E3;  \\\n  };\n\n#define _GLM_SWIZZLE4_4_MEMBERS(T, P, V, E0, E1, E2, E3)   \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 0, 0, 0> E0##E0##E0##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 0, 0, 1> E0##E0##E0##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 0, 0, 2> E0##E0##E0##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 0, 0, 3> E0##E0##E0##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 0, 1, 0> E0##E0##E1##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 0, 1, 1> E0##E0##E1##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 0, 1, 2> E0##E0##E1##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 0, 1, 3> E0##E0##E1##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 0, 2, 0> E0##E0##E2##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 0, 2, 1> E0##E0##E2##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 0, 2, 2> E0##E0##E2##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 0, 2, 3> E0##E0##E2##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 0, 3, 0> E0##E0##E3##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 0, 3, 1> E0##E0##E3##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 0, 3, 2> E0##E0##E3##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 0, 3, 3> E0##E0##E3##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 1, 0, 0> E0##E1##E0##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 1, 0, 1> E0##E1##E0##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 1, 0, 2> E0##E1##E0##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 1, 0, 3> E0##E1##E0##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 1, 1, 0> E0##E1##E1##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 1, 1, 1> E0##E1##E1##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 1, 1, 2> E0##E1##E1##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 1, 1, 3> E0##E1##E1##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 1, 2, 0> E0##E1##E2##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 1, 2, 1> E0##E1##E2##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 1, 2, 2> E0##E1##E2##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 1, 2, 3> E0##E1##E2##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 1, 3, 0> E0##E1##E3##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 1, 3, 1> E0##E1##E3##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 1, 3, 2> E0##E1##E3##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 1, 3, 3> E0##E1##E3##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 2, 0, 0> E0##E2##E0##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 2, 0, 1> E0##E2##E0##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 2, 0, 2> E0##E2##E0##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 2, 0, 3> E0##E2##E0##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 2, 1, 0> E0##E2##E1##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 2, 1, 1> E0##E2##E1##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 2, 1, 2> E0##E2##E1##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 2, 1, 3> E0##E2##E1##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 2, 2, 0> E0##E2##E2##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 2, 2, 1> E0##E2##E2##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 2, 2, 2> E0##E2##E2##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 2, 2, 3> E0##E2##E2##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 2, 3, 0> E0##E2##E3##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 2, 3, 1> E0##E2##E3##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 2, 3, 2> E0##E2##E3##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 2, 3, 3> E0##E2##E3##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 3, 0, 0> E0##E3##E0##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 3, 0, 1> E0##E3##E0##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 3, 0, 2> E0##E3##E0##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 3, 0, 3> E0##E3##E0##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 3, 1, 0> E0##E3##E1##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 3, 1, 1> E0##E3##E1##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 3, 1, 2> E0##E3##E1##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 3, 1, 3> E0##E3##E1##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 3, 2, 0> E0##E3##E2##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 3, 2, 1> E0##E3##E2##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 3, 2, 2> E0##E3##E2##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 3, 2, 3> E0##E3##E2##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 3, 3, 0> E0##E3##E3##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 3, 3, 1> E0##E3##E3##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 3, 3, 2> E0##E3##E3##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 0, 3, 3, 3> E0##E3##E3##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 0, 0, 0> E1##E0##E0##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 0, 0, 1> E1##E0##E0##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 0, 0, 2> E1##E0##E0##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 0, 0, 3> E1##E0##E0##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 0, 1, 0> E1##E0##E1##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 0, 1, 1> E1##E0##E1##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 0, 1, 2> E1##E0##E1##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 0, 1, 3> E1##E0##E1##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 0, 2, 0> E1##E0##E2##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 0, 2, 1> E1##E0##E2##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 0, 2, 2> E1##E0##E2##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 0, 2, 3> E1##E0##E2##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 0, 3, 0> E1##E0##E3##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 0, 3, 1> E1##E0##E3##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 0, 3, 2> E1##E0##E3##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 0, 3, 3> E1##E0##E3##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 1, 0, 0> E1##E1##E0##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 1, 0, 1> E1##E1##E0##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 1, 0, 2> E1##E1##E0##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 1, 0, 3> E1##E1##E0##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 1, 1, 0> E1##E1##E1##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 1, 1, 1> E1##E1##E1##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 1, 1, 2> E1##E1##E1##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 1, 1, 3> E1##E1##E1##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 1, 2, 0> E1##E1##E2##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 1, 2, 1> E1##E1##E2##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 1, 2, 2> E1##E1##E2##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 1, 2, 3> E1##E1##E2##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 1, 3, 0> E1##E1##E3##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 1, 3, 1> E1##E1##E3##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 1, 3, 2> E1##E1##E3##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 1, 3, 3> E1##E1##E3##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 2, 0, 0> E1##E2##E0##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 2, 0, 1> E1##E2##E0##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 2, 0, 2> E1##E2##E0##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 2, 0, 3> E1##E2##E0##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 2, 1, 0> E1##E2##E1##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 2, 1, 1> E1##E2##E1##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 2, 1, 2> E1##E2##E1##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 2, 1, 3> E1##E2##E1##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 2, 2, 0> E1##E2##E2##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 2, 2, 1> E1##E2##E2##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 2, 2, 2> E1##E2##E2##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 2, 2, 3> E1##E2##E2##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 2, 3, 0> E1##E2##E3##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 2, 3, 1> E1##E2##E3##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 2, 3, 2> E1##E2##E3##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 2, 3, 3> E1##E2##E3##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 3, 0, 0> E1##E3##E0##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 3, 0, 1> E1##E3##E0##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 3, 0, 2> E1##E3##E0##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 3, 0, 3> E1##E3##E0##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 3, 1, 0> E1##E3##E1##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 3, 1, 1> E1##E3##E1##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 3, 1, 2> E1##E3##E1##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 3, 1, 3> E1##E3##E1##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 3, 2, 0> E1##E3##E2##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 3, 2, 1> E1##E3##E2##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 3, 2, 2> E1##E3##E2##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 3, 2, 3> E1##E3##E2##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 3, 3, 0> E1##E3##E3##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 3, 3, 1> E1##E3##E3##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 3, 3, 2> E1##E3##E3##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 1, 3, 3, 3> E1##E3##E3##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 0, 0, 0> E2##E0##E0##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 0, 0, 1> E2##E0##E0##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 0, 0, 2> E2##E0##E0##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 0, 0, 3> E2##E0##E0##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 0, 1, 0> E2##E0##E1##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 0, 1, 1> E2##E0##E1##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 0, 1, 2> E2##E0##E1##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 0, 1, 3> E2##E0##E1##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 0, 2, 0> E2##E0##E2##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 0, 2, 1> E2##E0##E2##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 0, 2, 2> E2##E0##E2##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 0, 2, 3> E2##E0##E2##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 0, 3, 0> E2##E0##E3##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 0, 3, 1> E2##E0##E3##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 0, 3, 2> E2##E0##E3##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 0, 3, 3> E2##E0##E3##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 1, 0, 0> E2##E1##E0##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 1, 0, 1> E2##E1##E0##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 1, 0, 2> E2##E1##E0##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 1, 0, 3> E2##E1##E0##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 1, 1, 0> E2##E1##E1##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 1, 1, 1> E2##E1##E1##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 1, 1, 2> E2##E1##E1##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 1, 1, 3> E2##E1##E1##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 1, 2, 0> E2##E1##E2##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 1, 2, 1> E2##E1##E2##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 1, 2, 2> E2##E1##E2##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 1, 2, 3> E2##E1##E2##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 1, 3, 0> E2##E1##E3##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 1, 3, 1> E2##E1##E3##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 1, 3, 2> E2##E1##E3##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 1, 3, 3> E2##E1##E3##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 2, 0, 0> E2##E2##E0##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 2, 0, 1> E2##E2##E0##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 2, 0, 2> E2##E2##E0##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 2, 0, 3> E2##E2##E0##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 2, 1, 0> E2##E2##E1##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 2, 1, 1> E2##E2##E1##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 2, 1, 2> E2##E2##E1##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 2, 1, 3> E2##E2##E1##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 2, 2, 0> E2##E2##E2##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 2, 2, 1> E2##E2##E2##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 2, 2, 2> E2##E2##E2##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 2, 2, 3> E2##E2##E2##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 2, 3, 0> E2##E2##E3##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 2, 3, 1> E2##E2##E3##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 2, 3, 2> E2##E2##E3##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 2, 3, 3> E2##E2##E3##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 3, 0, 0> E2##E3##E0##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 3, 0, 1> E2##E3##E0##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 3, 0, 2> E2##E3##E0##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 3, 0, 3> E2##E3##E0##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 3, 1, 0> E2##E3##E1##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 3, 1, 1> E2##E3##E1##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 3, 1, 2> E2##E3##E1##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 3, 1, 3> E2##E3##E1##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 3, 2, 0> E2##E3##E2##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 3, 2, 1> E2##E3##E2##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 3, 2, 2> E2##E3##E2##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 3, 2, 3> E2##E3##E2##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 3, 3, 0> E2##E3##E3##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 3, 3, 1> E2##E3##E3##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 3, 3, 2> E2##E3##E3##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 2, 3, 3, 3> E2##E3##E3##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 0, 0, 0> E3##E0##E0##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 0, 0, 1> E3##E0##E0##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 0, 0, 2> E3##E0##E0##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 0, 0, 3> E3##E0##E0##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 0, 1, 0> E3##E0##E1##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 0, 1, 1> E3##E0##E1##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 0, 1, 2> E3##E0##E1##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 0, 1, 3> E3##E0##E1##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 0, 2, 0> E3##E0##E2##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 0, 2, 1> E3##E0##E2##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 0, 2, 2> E3##E0##E2##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 0, 2, 3> E3##E0##E2##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 0, 3, 0> E3##E0##E3##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 0, 3, 1> E3##E0##E3##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 0, 3, 2> E3##E0##E3##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 0, 3, 3> E3##E0##E3##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 1, 0, 0> E3##E1##E0##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 1, 0, 1> E3##E1##E0##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 1, 0, 2> E3##E1##E0##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 1, 0, 3> E3##E1##E0##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 1, 1, 0> E3##E1##E1##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 1, 1, 1> E3##E1##E1##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 1, 1, 2> E3##E1##E1##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 1, 1, 3> E3##E1##E1##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 1, 2, 0> E3##E1##E2##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 1, 2, 1> E3##E1##E2##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 1, 2, 2> E3##E1##E2##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 1, 2, 3> E3##E1##E2##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 1, 3, 0> E3##E1##E3##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 1, 3, 1> E3##E1##E3##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 1, 3, 2> E3##E1##E3##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 1, 3, 3> E3##E1##E3##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 2, 0, 0> E3##E2##E0##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 2, 0, 1> E3##E2##E0##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 2, 0, 2> E3##E2##E0##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 2, 0, 3> E3##E2##E0##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 2, 1, 0> E3##E2##E1##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 2, 1, 1> E3##E2##E1##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 2, 1, 2> E3##E2##E1##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 2, 1, 3> E3##E2##E1##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 2, 2, 0> E3##E2##E2##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 2, 2, 1> E3##E2##E2##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 2, 2, 2> E3##E2##E2##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 2, 2, 3> E3##E2##E2##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 2, 3, 0> E3##E2##E3##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 2, 3, 1> E3##E2##E3##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 2, 3, 2> E3##E2##E3##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 2, 3, 3> E3##E2##E3##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 3, 0, 0> E3##E3##E0##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 3, 0, 1> E3##E3##E0##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 3, 0, 2> E3##E3##E0##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 3, 0, 3> E3##E3##E0##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 3, 1, 0> E3##E3##E1##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 3, 1, 1> E3##E3##E1##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 3, 1, 2> E3##E3##E1##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 3, 1, 3> E3##E3##E1##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 3, 2, 0> E3##E3##E2##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 3, 2, 1> E3##E3##E2##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 3, 2, 2> E3##E3##E2##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 3, 2, 3> E3##E3##E2##E3; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 3, 3, 0> E3##E3##E3##E0; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 3, 3, 1> E3##E3##E3##E1; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 3, 3, 2> E3##E3##E3##E2; \\\n  };                                                       \\\n  struct {                                                 \\\n    _swizzle<4, T, P, V<T, P>, 3, 3, 3, 3> E3##E3##E3##E3; \\\n  };\n\n#endif  // glm_core_swizzle\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/_swizzle_func.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/_swizzle_func.hpp\n/// @date 2011-10-16 / 2011-10-16\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_core_swizzle_func\n#define glm_core_swizzle_func\n\n#define GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, \\\n                                   SWIZZLED_TYPE, CONST, A, B)       \\\n  SWIZZLED_TYPE<TMPL_TYPE, PRECISION> A##B() CONST {                 \\\n    return SWIZZLED_TYPE<TMPL_TYPE, PRECISION>(this->A, this->B);    \\\n  }\n\n#define GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE,       \\\n                                   SWIZZLED_TYPE, CONST, A, B, C)          \\\n  SWIZZLED_TYPE<TMPL_TYPE, PRECISION> A##B##C() CONST {                    \\\n    return SWIZZLED_TYPE<TMPL_TYPE, PRECISION>(this->A, this->B, this->C); \\\n  }\n\n#define GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE,      \\\n                                   SWIZZLED_TYPE, CONST, A, B, C, D)      \\\n  SWIZZLED_TYPE<TMPL_TYPE, PRECISION> A##B##C##D() CONST {                \\\n    return SWIZZLED_TYPE<TMPL_TYPE, PRECISION>(this->A, this->B, this->C, \\\n                                               this->D);                  \\\n  }\n\n#define GLM_SWIZZLE_GEN_VEC2_ENTRY_DEF(TMPL_TYPE, PRECISION, CLASS_TYPE,    \\\n                                       SWIZZLED_TYPE, CONST, A, B)          \\\n  template <typename TMPL_TYPE>                                             \\\n  SWIZZLED_TYPE<TMPL_TYPE> CLASS_TYPE<TMPL_TYPE, PRECISION>::A##B() CONST { \\\n    return SWIZZLED_TYPE<TMPL_TYPE, PRECISION>(this->A, this->B);           \\\n  }\n\n#define GLM_SWIZZLE_GEN_VEC3_ENTRY_DEF(TMPL_TYPE, PRECISION, CLASS_TYPE,       \\\n                                       SWIZZLED_TYPE, CONST, A, B, C)          \\\n  template <typename TMPL_TYPE>                                                \\\n  SWIZZLED_TYPE<TMPL_TYPE> CLASS_TYPE<TMPL_TYPE, PRECISION>::A##B##C() CONST { \\\n    return SWIZZLED_TYPE<TMPL_TYPE, PRECISION>(this->A, this->B, this->C);     \\\n  }\n\n#define GLM_SWIZZLE_GEN_VEC4_ENTRY_DEF(TMPL_TYPE, PRECISION, CLASS_TYPE,  \\\n                                       SWIZZLED_TYPE, CONST, A, B, C, D)  \\\n  template <typename TMPL_TYPE>                                           \\\n  SWIZZLED_TYPE<TMPL_TYPE> CLASS_TYPE<TMPL_TYPE, PRECISION>::A##B##C##D() \\\n      CONST {                                                             \\\n    return SWIZZLED_TYPE<TMPL_TYPE, PRECISION>(this->A, this->B, this->C, \\\n                                               this->D);                  \\\n  }\n\n#define GLM_MUTABLE\n\n#define GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(                               \\\n    TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B)                    \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             GLM_MUTABLE, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             GLM_MUTABLE, B, A)\n\n#define GLM_SWIZZLE_GEN_REF_FROM_VEC2(TMPL_TYPE, PRECISION, CLASS_TYPE,    \\\n                                      SWIZZLED_VEC2_TYPE)                  \\\n  GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, \\\n                                         SWIZZLED_VEC2_TYPE, x, y)         \\\n  GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, \\\n                                         SWIZZLED_VEC2_TYPE, r, g)         \\\n  GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE, \\\n                                         SWIZZLED_VEC2_TYPE, s, t)\n\n// GLM_SWIZZLE_GEN_REF_FROM_VEC2(valType, detail::vec2, detail::ref2)\n\n#define GLM_SWIZZLE_GEN_REF2_FROM_VEC3_SWIZZLE(                               \\\n    TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C)                 \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             GLM_MUTABLE, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             GLM_MUTABLE, A, C)                               \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             GLM_MUTABLE, B, A)                               \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             GLM_MUTABLE, B, C)                               \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             GLM_MUTABLE, C, A)                               \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             GLM_MUTABLE, C, B)\n\n#define GLM_SWIZZLE_GEN_REF3_FROM_VEC3_SWIZZLE(                               \\\n    TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C)                 \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             GLM_MUTABLE, A, B, C)                            \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             GLM_MUTABLE, A, C, B)                            \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             GLM_MUTABLE, B, A, C)                            \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             GLM_MUTABLE, B, C, A)                            \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             GLM_MUTABLE, C, A, B)                            \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             GLM_MUTABLE, C, B, A)\n\n#define GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE, \\\n                                           SWIZZLED_VEC2_TYPE,               \\\n                                           SWIZZLED_VEC3_TYPE, A, B, C)      \\\n  GLM_SWIZZLE_GEN_REF3_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE,   \\\n                                         SWIZZLED_VEC3_TYPE, A, B, C)        \\\n  GLM_SWIZZLE_GEN_REF2_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE,   \\\n                                         SWIZZLED_VEC2_TYPE, A, B, C)\n\n#define GLM_SWIZZLE_GEN_REF_FROM_VEC3(TMPL_TYPE, PRECISION, CLASS_TYPE,       \\\n                                      SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE) \\\n  GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE,        \\\n                                     SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE,  \\\n                                     x, y, z)                                 \\\n  GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE,        \\\n                                     SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE,  \\\n                                     r, g, b)                                 \\\n  GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE,        \\\n                                     SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE,  \\\n                                     s, t, p)\n\n// GLM_SWIZZLE_GEN_REF_FROM_VEC3(valType, detail::vec3, detail::ref2,\n// detail::ref3)\n\n#define GLM_SWIZZLE_GEN_REF2_FROM_VEC4_SWIZZLE(                               \\\n    TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D)              \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             GLM_MUTABLE, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             GLM_MUTABLE, A, C)                               \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             GLM_MUTABLE, A, D)                               \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             GLM_MUTABLE, B, A)                               \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             GLM_MUTABLE, B, C)                               \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             GLM_MUTABLE, B, D)                               \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             GLM_MUTABLE, C, A)                               \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             GLM_MUTABLE, C, B)                               \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             GLM_MUTABLE, C, D)                               \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             GLM_MUTABLE, D, A)                               \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             GLM_MUTABLE, D, B)                               \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             GLM_MUTABLE, D, C)\n\n#define GLM_SWIZZLE_GEN_REF3_FROM_VEC4_SWIZZLE(                               \\\n    TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D)              \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , A, B, C)                                       \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , A, B, D)                                       \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , A, C, B)                                       \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , A, C, D)                                       \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , A, D, B)                                       \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , A, D, C)                                       \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , B, A, C)                                       \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , B, A, D)                                       \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , B, C, A)                                       \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , B, C, D)                                       \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , B, D, A)                                       \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , B, D, C)                                       \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , C, A, B)                                       \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , C, A, D)                                       \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , C, B, A)                                       \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , C, B, D)                                       \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , C, D, A)                                       \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , C, D, B)                                       \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , D, A, B)                                       \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , D, A, C)                                       \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , D, B, A)                                       \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , D, B, C)                                       \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , D, C, A)                                       \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , D, C, B)\n\n#define GLM_SWIZZLE_GEN_REF4_FROM_VEC4_SWIZZLE(                               \\\n    TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D)              \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , A, C, B, D)                                    \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , A, C, D, B)                                    \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , A, D, B, C)                                    \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , A, D, C, B)                                    \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , A, B, D, C)                                    \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , A, B, C, D)                                    \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , B, C, A, D)                                    \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , B, C, D, A)                                    \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , B, D, A, C)                                    \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , B, D, C, A)                                    \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , B, A, D, C)                                    \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , B, A, C, D)                                    \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , C, B, A, D)                                    \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , C, B, D, A)                                    \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , C, D, A, B)                                    \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , C, D, B, A)                                    \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , C, A, D, B)                                    \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , C, A, B, D)                                    \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , D, C, B, A)                                    \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , D, C, A, B)                                    \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , D, A, B, C)                                    \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , D, A, C, B)                                    \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , D, B, A, C)                                    \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             , D, B, C, A)\n\n#define GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(                                   \\\n    TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, \\\n    SWIZZLED_VEC4_TYPE, A, B, C, D)                                           \\\n  GLM_SWIZZLE_GEN_REF2_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE,    \\\n                                         SWIZZLED_VEC2_TYPE, A, B, C, D)      \\\n  GLM_SWIZZLE_GEN_REF3_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE,    \\\n                                         SWIZZLED_VEC3_TYPE, A, B, C, D)      \\\n  GLM_SWIZZLE_GEN_REF4_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE,    \\\n                                         SWIZZLED_VEC4_TYPE, A, B, C, D)\n\n#define GLM_SWIZZLE_GEN_REF_FROM_VEC4(TMPL_TYPE, PRECISION, CLASS_TYPE,       \\\n                                      SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, \\\n                                      SWIZZLED_VEC4_TYPE)                     \\\n  GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE,        \\\n                                     SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE,  \\\n                                     SWIZZLED_VEC4_TYPE, x, y, z, w)          \\\n  GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE,        \\\n                                     SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE,  \\\n                                     SWIZZLED_VEC4_TYPE, r, g, b, a)          \\\n  GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE,        \\\n                                     SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE,  \\\n                                     SWIZZLED_VEC4_TYPE, s, t, p, q)\n\n// GLM_SWIZZLE_GEN_REF_FROM_VEC4(valType, detail::vec4, detail::ref2,\n// detail::ref3, detail::ref4)\n\n#define GLM_SWIZZLE_GEN_VEC2_FROM_VEC2_SWIZZLE(                               \\\n    TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B)                    \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A)                                     \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B)                                     \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A)                                     \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B)\n\n#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC2_SWIZZLE(                               \\\n    TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B)                    \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, A)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, B)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, A)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, B)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, A)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, B)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, A)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, B)\n\n#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC2_SWIZZLE(                               \\\n    TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B)                    \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, A, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, B, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, B, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, A, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, B, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, B, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, A, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, B, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, B, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, A, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, B, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, B, B)\n\n#define GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(                                   \\\n    TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, \\\n    SWIZZLED_VEC4_TYPE, A, B)                                                 \\\n  GLM_SWIZZLE_GEN_VEC2_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE,    \\\n                                         SWIZZLED_VEC2_TYPE, A, B)            \\\n  GLM_SWIZZLE_GEN_VEC3_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE,    \\\n                                         SWIZZLED_VEC3_TYPE, A, B)            \\\n  GLM_SWIZZLE_GEN_VEC4_FROM_VEC2_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE,    \\\n                                         SWIZZLED_VEC4_TYPE, A, B)\n\n#define GLM_SWIZZLE_GEN_VEC_FROM_VEC2(TMPL_TYPE, PRECISION, CLASS_TYPE,       \\\n                                      SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, \\\n                                      SWIZZLED_VEC4_TYPE)                     \\\n  GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE,        \\\n                                     SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE,  \\\n                                     SWIZZLED_VEC4_TYPE, x, y)                \\\n  GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE,        \\\n                                     SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE,  \\\n                                     SWIZZLED_VEC4_TYPE, r, g)                \\\n  GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE,        \\\n                                     SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE,  \\\n                                     SWIZZLED_VEC4_TYPE, s, t)\n\n// GLM_SWIZZLE_GEN_VEC_FROM_VEC2(valType, detail::vec2, detail::vec2,\n// detail::vec3, detail::vec4)\n\n#define GLM_SWIZZLE_GEN_VEC2_FROM_VEC3_SWIZZLE(                               \\\n    TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C)                 \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A)                                     \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B)                                     \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C)                                     \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A)                                     \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B)                                     \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C)                                     \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A)                                     \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B)                                     \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C)\n\n#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC3_SWIZZLE(                               \\\n    TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C)                 \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, A)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, B)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, C)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, A)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, B)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, C)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, A)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, B)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, C)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, A)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, B)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, C)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, A)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, B)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, C)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, A)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, B)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, C)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, A)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, B)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, C)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, A)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, B)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, C)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, A)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, B)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, C)\n\n#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC3_SWIZZLE(                               \\\n    TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C)                 \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, A, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, A, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, B, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, B, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, B, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, C, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, C, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, C, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, A, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, A, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, B, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, B, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, B, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, C, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, C, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, C, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, A, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, A, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, B, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, B, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, B, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, C, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, C, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, C, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, A, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, A, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, B, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, B, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, B, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, C, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, C, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, C, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, A, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, A, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, B, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, B, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, B, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, C, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, C, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, C, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, A, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, A, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, B, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, B, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, B, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, C, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, C, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, C, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, A, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, A, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, B, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, B, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, B, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, C, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, C, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, C, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, A, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, A, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, B, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, B, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, B, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, C, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, C, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, C, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, A, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, A, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, B, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, B, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, B, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, C, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, C, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, C, C)\n\n#define GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(                                   \\\n    TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, \\\n    SWIZZLED_VEC4_TYPE, A, B, C)                                              \\\n  GLM_SWIZZLE_GEN_VEC2_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE,    \\\n                                         SWIZZLED_VEC2_TYPE, A, B, C)         \\\n  GLM_SWIZZLE_GEN_VEC3_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE,    \\\n                                         SWIZZLED_VEC3_TYPE, A, B, C)         \\\n  GLM_SWIZZLE_GEN_VEC4_FROM_VEC3_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE,    \\\n                                         SWIZZLED_VEC4_TYPE, A, B, C)\n\n#define GLM_SWIZZLE_GEN_VEC_FROM_VEC3(TMPL_TYPE, PRECISION, CLASS_TYPE,       \\\n                                      SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, \\\n                                      SWIZZLED_VEC4_TYPE)                     \\\n  GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE,        \\\n                                     SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE,  \\\n                                     SWIZZLED_VEC4_TYPE, x, y, z)             \\\n  GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE,        \\\n                                     SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE,  \\\n                                     SWIZZLED_VEC4_TYPE, r, g, b)             \\\n  GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE,        \\\n                                     SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE,  \\\n                                     SWIZZLED_VEC4_TYPE, s, t, p)\n\n// GLM_SWIZZLE_GEN_VEC_FROM_VEC3(valType, detail::vec3, detail::vec2,\n// detail::vec3, detail::vec4)\n\n#define GLM_SWIZZLE_GEN_VEC2_FROM_VEC4_SWIZZLE(                               \\\n    TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D)              \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A)                                     \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B)                                     \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C)                                     \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, D)                                     \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A)                                     \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B)                                     \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C)                                     \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, D)                                     \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A)                                     \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B)                                     \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C)                                     \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, D)                                     \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, A)                                     \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, B)                                     \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, C)                                     \\\n  GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, D)\n\n#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC4_SWIZZLE(                               \\\n    TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D)              \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, A)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, B)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, C)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, D)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, A)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, B)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, C)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, D)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, A)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, B)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, C)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, D)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, D, A)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, D, B)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, D, C)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, D, D)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, A)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, B)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, C)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, D)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, A)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, B)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, C)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, D)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, A)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, B)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, C)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, D)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, D, A)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, D, B)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, D, C)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, D, D)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, A)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, B)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, C)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, D)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, A)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, B)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, C)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, D)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, A)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, B)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, C)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, D)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, D, A)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, D, B)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, D, C)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, D, D)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, A, A)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, A, B)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, A, C)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, A, D)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, B, A)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, B, B)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, B, C)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, B, D)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, C, A)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, C, B)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, C, C)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, C, D)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, D, A)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, D, B)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, D, C)                                  \\\n  GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, D, D)\n\n#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC4_SWIZZLE(                               \\\n    TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D)              \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, A, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, A, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, A, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, B, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, B, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, B, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, B, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, C, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, C, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, C, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, C, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, D, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, D, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, D, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, A, D, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, A, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, A, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, A, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, B, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, B, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, B, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, B, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, C, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, C, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, C, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, C, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, D, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, D, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, D, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, B, D, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, A, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, A, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, A, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, B, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, B, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, B, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, B, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, C, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, C, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, C, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, C, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, D, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, D, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, D, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, C, D, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, D, A, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, D, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, D, A, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, D, A, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, D, B, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, D, B, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, D, B, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, D, B, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, D, C, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, D, C, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, D, C, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, D, C, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, D, D, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, D, D, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, D, D, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, A, D, D, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, A, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, A, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, A, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, B, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, B, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, B, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, B, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, C, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, C, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, C, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, C, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, D, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, D, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, D, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, A, D, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, A, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, A, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, A, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, B, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, B, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, B, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, B, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, C, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, C, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, C, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, C, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, D, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, D, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, D, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, B, D, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, A, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, A, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, A, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, B, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, B, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, B, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, B, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, C, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, C, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, C, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, C, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, D, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, D, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, D, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, C, D, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, D, A, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, D, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, D, A, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, D, A, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, D, B, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, D, B, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, D, B, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, D, B, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, D, C, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, D, C, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, D, C, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, D, C, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, D, D, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, D, D, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, D, D, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, B, D, D, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, A, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, A, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, A, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, B, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, B, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, B, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, B, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, C, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, C, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, C, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, C, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, D, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, D, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, D, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, A, D, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, A, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, A, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, A, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, B, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, B, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, B, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, B, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, C, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, C, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, C, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, C, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, D, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, D, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, D, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, B, D, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, A, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, A, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, A, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, B, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, B, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, B, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, B, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, C, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, C, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, C, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, C, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, D, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, D, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, D, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, C, D, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, D, A, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, D, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, D, A, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, D, A, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, D, B, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, D, B, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, D, B, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, D, B, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, D, C, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, D, C, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, D, C, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, D, C, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, D, D, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, D, D, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, D, D, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, C, D, D, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, A, A, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, A, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, A, A, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, A, A, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, A, B, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, A, B, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, A, B, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, A, B, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, A, C, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, A, C, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, A, C, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, A, C, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, A, D, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, A, D, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, A, D, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, A, D, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, B, A, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, B, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, B, A, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, B, A, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, B, B, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, B, B, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, B, B, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, B, B, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, B, C, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, B, C, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, B, C, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, B, C, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, B, D, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, B, D, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, B, D, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, B, D, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, C, A, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, C, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, C, A, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, C, A, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, C, B, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, C, B, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, C, B, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, C, B, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, C, C, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, C, C, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, C, C, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, C, C, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, C, D, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, C, D, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, C, D, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, C, D, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, D, A, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, D, A, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, D, A, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, D, A, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, D, B, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, D, B, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, D, B, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, D, B, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, D, C, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, D, C, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, D, C, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, D, C, D)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, D, D, A)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, D, D, B)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, D, D, C)                               \\\n  GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_TYPE, \\\n                             const, D, D, D, D)\n\n#define GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(                                   \\\n    TMPL_TYPE, PRECISION, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, \\\n    SWIZZLED_VEC4_TYPE, A, B, C, D)                                           \\\n  GLM_SWIZZLE_GEN_VEC2_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE,    \\\n                                         SWIZZLED_VEC2_TYPE, A, B, C, D)      \\\n  GLM_SWIZZLE_GEN_VEC3_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE,    \\\n                                         SWIZZLED_VEC3_TYPE, A, B, C, D)      \\\n  GLM_SWIZZLE_GEN_VEC4_FROM_VEC4_SWIZZLE(TMPL_TYPE, PRECISION, CLASS_TYPE,    \\\n                                         SWIZZLED_VEC4_TYPE, A, B, C, D)\n\n#define GLM_SWIZZLE_GEN_VEC_FROM_VEC4(TMPL_TYPE, PRECISION, CLASS_TYPE,       \\\n                                      SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, \\\n                                      SWIZZLED_VEC4_TYPE)                     \\\n  GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE,        \\\n                                     SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE,  \\\n                                     SWIZZLED_VEC4_TYPE, x, y, z, w)          \\\n  GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE,        \\\n                                     SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE,  \\\n                                     SWIZZLED_VEC4_TYPE, r, g, b, a)          \\\n  GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(TMPL_TYPE, PRECISION, CLASS_TYPE,        \\\n                                     SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE,  \\\n                                     SWIZZLED_VEC4_TYPE, s, t, p, q)\n\n// GLM_SWIZZLE_GEN_VEC_FROM_VEC4(valType, detail::vec4, detail::vec2,\n// detail::vec3, detail::vec4)\n\n#endif  // glm_core_swizzle_func\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/_vectorize.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/_vectorize.hpp\n/// @date 2011-10-14 / 2011-10-14\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_CORE_DETAIL_INCLUDED\n#define GLM_CORE_DETAIL_INCLUDED\n\n#include \"type_vec1.hpp\"\n#include \"type_vec2.hpp\"\n#include \"type_vec3.hpp\"\n#include \"type_vec4.hpp\"\n\n#define VECTORIZE1_VEC(func)                                                  \\\n  template <typename T, precision P>                                          \\\n  GLM_FUNC_QUALIFIER detail::tvec1<T, P> func(detail::tvec1<T, P> const& v) { \\\n    return detail::tvec1<T, P>(func(v.x));                                    \\\n  }\n\n#define VECTORIZE2_VEC(func)                                                  \\\n  template <typename T, precision P>                                          \\\n  GLM_FUNC_QUALIFIER detail::tvec2<T, P> func(detail::tvec2<T, P> const& v) { \\\n    return detail::tvec2<T, P>(func(v.x), func(v.y));                         \\\n  }\n\n#define VECTORIZE3_VEC(func)                                                  \\\n  template <typename T, precision P>                                          \\\n  GLM_FUNC_QUALIFIER detail::tvec3<T, P> func(detail::tvec3<T, P> const& v) { \\\n    return detail::tvec3<T, P>(func(v.x), func(v.y), func(v.z));              \\\n  }\n\n#define VECTORIZE4_VEC(func)                                                  \\\n  template <typename T, precision P>                                          \\\n  GLM_FUNC_QUALIFIER detail::tvec4<T, P> func(detail::tvec4<T, P> const& v) { \\\n    return detail::tvec4<T, P>(func(v.x), func(v.y), func(v.z), func(v.w));   \\\n  }\n\n#define VECTORIZE_VEC(func) \\\n  VECTORIZE1_VEC(func)      \\\n  VECTORIZE2_VEC(func)      \\\n  VECTORIZE3_VEC(func)      \\\n  VECTORIZE4_VEC(func)\n\n#define VECTORIZE1_VEC_SCA(func)                                            \\\n  template <typename T, precision P>                                        \\\n  GLM_FUNC_QUALIFIER detail::tvec1<T, P> func(detail::tvec1<T, P> const& x, \\\n                                              T const& y) {                 \\\n    return detail::tvec1<T, P>(func(x.x, y));                               \\\n  }\n\n#define VECTORIZE2_VEC_SCA(func)                                            \\\n  template <typename T, precision P>                                        \\\n  GLM_FUNC_QUALIFIER detail::tvec2<T, P> func(detail::tvec2<T, P> const& x, \\\n                                              T const& y) {                 \\\n    return detail::tvec2<T, P>(func(x.x, y), func(x.y, y));                 \\\n  }\n\n#define VECTORIZE3_VEC_SCA(func)                                            \\\n  template <typename T, precision P>                                        \\\n  GLM_FUNC_QUALIFIER detail::tvec3<T, P> func(detail::tvec3<T, P> const& x, \\\n                                              T const& y) {                 \\\n    return detail::tvec3<T, P>(func(x.x, y), func(x.y, y), func(x.z, y));   \\\n  }\n\n#define VECTORIZE4_VEC_SCA(func)                                            \\\n  template <typename T, precision P>                                        \\\n  GLM_FUNC_QUALIFIER detail::tvec4<T, P> func(detail::tvec4<T, P> const& x, \\\n                                              T const& y) {                 \\\n    return detail::tvec4<T, P>(func(x.x, y), func(x.y, y), func(x.z, y),    \\\n                               func(x.w, y));                               \\\n  }\n\n#define VECTORIZE_VEC_SCA(func) \\\n  VECTORIZE1_VEC_SCA(func)      \\\n  VECTORIZE2_VEC_SCA(func)      \\\n  VECTORIZE3_VEC_SCA(func)      \\\n  VECTORIZE4_VEC_SCA(func)\n\n#define VECTORIZE2_VEC_VEC(func)                                              \\\n  template <typename T, precision P>                                          \\\n  GLM_FUNC_QUALIFIER detail::tvec2<T, P> func(detail::tvec2<T, P> const& x,   \\\n                                              detail::tvec2<T, P> const& y) { \\\n    return detail::tvec2<T, P>(func(x.x, y.x), func(x.y, y.y));               \\\n  }\n\n#define VECTORIZE3_VEC_VEC(func)                                              \\\n  template <typename T, precision P>                                          \\\n  GLM_FUNC_QUALIFIER detail::tvec3<T, P> func(detail::tvec3<T, P> const& x,   \\\n                                              detail::tvec3<T, P> const& y) { \\\n    return detail::tvec3<T, P>(func(x.x, y.x), func(x.y, y.y),                \\\n                               func(x.z, y.z));                               \\\n  }\n\n#define VECTORIZE4_VEC_VEC(func)                                               \\\n  template <typename T, precision P>                                           \\\n  GLM_FUNC_QUALIFIER detail::tvec4<T, P> func(detail::tvec4<T, P> const& x,    \\\n                                              detail::tvec4<T, P> const& y) {  \\\n    return detail::tvec4<T, P>(func(x.x, y.x), func(x.y, y.y), func(x.z, y.z), \\\n                               func(x.w, y.w));                                \\\n  }\n\n#define VECTORIZE_VEC_VEC(func) \\\n  VECTORIZE2_VEC_VEC(func)      \\\n  VECTORIZE3_VEC_VEC(func)      \\\n  VECTORIZE4_VEC_VEC(func)\n\nnamespace glm {\nnamespace detail {\ntemplate <bool C>\nstruct If {\n  template <typename F, typename T>\n  static GLM_FUNC_QUALIFIER T apply(F functor, const T& val) {\n    return functor(val);\n  }\n};\n\ntemplate <>\nstruct If<false> {\n  template <typename F, typename T>\n  static GLM_FUNC_QUALIFIER T apply(F, const T& val) {\n    return val;\n  }\n};\n}  // namespace detail\n}  // namespace glm\n\n#endif  // GLM_CORE_DETAIL_INCLUDED\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/func_common.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/func_common.hpp\n/// @date 2008-03-08 / 2010-01-26\n/// @author Christophe Riccio\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a>\n///\n/// @defgroup core_func_common Common functions\n/// @ingroup core\n///\n/// These all operate component-wise. The description is per component.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_FUNC_COMMON_INCLUDED\n#define GLM_FUNC_COMMON_INCLUDED\n\n#include \"_fixes.hpp\"\n#include \"precision.hpp\"\n#include \"setup.hpp\"\n#include \"type_int.hpp\"\n\nnamespace glm {\n/// @addtogroup core_func_common\n/// @{\n\n/// Returns x if x >= 0; otherwise, it returns -x.\n///\n/// @tparam genType floating-point or signed integer; scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/abs.xml\">GLSL abs\n/// man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType abs(genType const& x);\n\n/// Returns 1.0 if x > 0, 0.0 if x == 0, or -1.0 if x < 0.\n///\n/// @tparam genType Floating-point or signed integer; scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/sign.xml\">GLSL\n/// sign man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType sign(genType const& x);\n\n/// Returns a value equal to the nearest integer that is less then or equal to\n/// x.\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/floor.xml\">GLSL\n/// floor man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType floor(genType const& x);\n\n/// Returns a value equal to the nearest integer to x\n/// whose absolute value is not larger than the absolute value of x.\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/trunc.xml\">GLSL\n/// trunc man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType trunc(genType const& x);\n\n/// Returns a value equal to the nearest integer to x.\n/// The fraction 0.5 will round in a direction chosen by the\n/// implementation, presumably the direction that is fastest.\n/// This includes the possibility that round(x) returns the\n/// same value as roundEven(x) for all values of x.\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/round.xml\">GLSL\n/// round man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType round(genType const& x);\n\n/// Returns a value equal to the nearest integer to x.\n/// A fractional part of 0.5 will round toward the nearest even\n/// integer. (Both 3.5 and 4.5 for x will return 4.0.)\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/roundEven.xml\">GLSL\n/// roundEven man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a>\n/// @see <a\n/// href=\"http://developer.amd.com/documentation/articles/pages/New-Round-to-Even-Technique.aspx\">New\n/// round to even technique</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType roundEven(genType const& x);\n\n/// Returns a value equal to the nearest integer\n/// that is greater than or equal to x.\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/ceil.xml\">GLSL\n/// ceil man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType ceil(genType const& x);\n\n/// Return x - floor(x).\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/fract.xml\">GLSL\n/// fract man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType fract(genType const& x);\n\n/// Modulus. Returns x - y * floor(x / y)\n/// for each component in x using the floating point value y.\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/mod.xml\">GLSL mod\n/// man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType mod(genType const& x, genType const& y);\n\n/// Modulus. Returns x - y * floor(x / y)\n/// for each component in x using the floating point value y.\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/mod.xml\">GLSL mod\n/// man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType mod(genType const& x,\n                          typename genType::value_type const& y);\n\n/// Returns the fractional part of x and sets i to the integer\n/// part (as a whole number floating point value). Both the\n/// return value and the output parameter will have the same\n/// sign as x.\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/modf.xml\">GLSL\n/// modf man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType modf(genType const& x, genType& i);\n\n/// Returns y if y < x; otherwise, it returns x.\n///\n/// @tparam genType Floating-point or integer; scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/min.xml\">GLSL min\n/// man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a><<<<<<< HEAD\ntemplate <typename genType>\nGLM_FUNC_DECL genType min(genType const& x, genType const& y);\n\ntemplate <typename genType>\nGLM_FUNC_DECL genType min(genType const& x,\n                          typename genType::value_type const& y);\n\n/// Returns y if x < y; otherwise, it returns x.\n///\n/// @tparam genType Floating-point or integer; scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/max.xml\">GLSL max\n/// man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType max(genType const& x, genType const& y);\n\ntemplate <typename genType>\nGLM_FUNC_DECL genType max(genType const& x,\n                          typename genType::value_type const& y);\n\n/// Returns min(max(x, minVal), maxVal) for each component in x\n/// using the floating-point values minVal and maxVal.\n///\n/// @tparam genType Floating-point or integer; scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/clamp.xml\">GLSL\n/// clamp man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType clamp(genType const& x, genType const& minVal,\n                            genType const& maxVal);\n\ntemplate <typename genType, precision P>\nGLM_FUNC_DECL genType clamp(genType const& x,\n                            typename genType::value_type const& minVal,\n                            typename genType::value_type const& maxVal);\n\n/// If genTypeU is a floating scalar or vector:\n/// Returns x * (1.0 - a) + y * a, i.e., the linear blend of\n/// x and y using the floating-point value a.\n/// The value for a is not restricted to the range [0, 1].\n///\n/// If genTypeU is a boolean scalar or vector:\n/// Selects which vector each returned component comes\n/// from. For a component of <a> that is false, the\n/// corresponding component of x is returned. For a\n/// component of a that is true, the corresponding\n/// component of y is returned. Components of x and y that\n/// are not selected are allowed to be invalid floating point\n/// values and will have no effect on the results. Thus, this\n/// provides different functionality than\n/// genType mix(genType x, genType y, genType(a))\n/// where a is a Boolean vector.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/mix.xml\">GLSL mix\n/// man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a>\n///\n/// @param[in]  x Value to interpolate.\n/// @param[in]  y Value to interpolate.\n/// @param[in]  a Interpolant.\n///\n/// @tparam\tgenTypeT Floating point scalar or vector.\n/// @tparam genTypeU Floating point or boolean scalar or vector. It can't be a\n/// vector if it is the length of genTypeT.\n///\n/// @code\n/// #include <glm/glm.hpp>\n/// ...\n/// float a;\n/// bool b;\n/// glm::dvec3 e;\n/// glm::dvec3 f;\n/// glm::vec4 g;\n/// glm::vec4 h;\n/// ...\n/// glm::vec4 r = glm::mix(g, h, a); // Interpolate with a floating-point scalar\n/// two vectors. glm::vec4 s = glm::mix(g, h, b); // Teturns g or h; glm::dvec3\n/// t = glm::mix(e, f, a); // Types of the third parameter is not required to\n/// match with the first and the second. glm::vec4 u = glm::mix(g, h, r); //\n/// Interpolations can be perform per component with a vector for the last\n/// parameter.\n/// @endcode\ntemplate <typename T, typename U, precision P,\n          template <typename, precision> class vecType>\nGLM_FUNC_DECL vecType<T, P> mix(vecType<T, P> const& x, vecType<T, P> const& y,\n                                vecType<U, P> const& a);\n\ntemplate <typename T, typename U, precision P,\n          template <typename, precision> class vecType>\nGLM_FUNC_DECL vecType<T, P> mix(vecType<T, P> const& x, vecType<T, P> const& y,\n                                U const& a);\n\ntemplate <typename genTypeT, typename genTypeU>\nGLM_FUNC_DECL genTypeT mix(genTypeT const& x, genTypeT const& y,\n                           genTypeU const& a);\n\n/// Returns 0.0 if x < edge, otherwise it returns 1.0 for each component of a\n/// genType.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/step.xml\">GLSL\n/// step man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType step(genType const& edge, genType const& x);\n\n/// Returns 0.0 if x < edge, otherwise it returns 1.0.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/step.xml\">GLSL\n/// step man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a>\ntemplate <template <typename, precision> class vecType, typename T, precision P>\nGLM_FUNC_DECL vecType<T, P> step(T const& edge, vecType<T, P> const& x);\n\n/// Returns 0.0 if x <= edge0 and 1.0 if x >= edge1 and\n/// performs smooth Hermite interpolation between 0 and 1\n/// when edge0 < x < edge1. This is useful in cases where\n/// you would want a threshold function with a smooth\n/// transition. This is equivalent to:\n/// genType t;\n/// t = clamp ((x - edge0) / (edge1 - edge0), 0, 1);\n/// return t * t * (3 - 2 * t);\n/// Results are undefined if edge0 >= edge1.\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/smoothstep.xml\">GLSL\n/// smoothstep man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType smoothstep(genType const& edge0, genType const& edge1,\n                                 genType const& x);\n\ntemplate <typename genType>\nGLM_FUNC_DECL genType smoothstep(typename genType::value_type const& edge0,\n                                 typename genType::value_type const& edge1,\n                                 genType const& x);\n\n/// Returns true if x holds a NaN (not a number)\n/// representation in the underlying implementation's set of\n/// floating point representations. Returns false otherwise,\n/// including for implementations with no NaN\n/// representations.\n///\n/// /!\\ When using compiler fast math, this function may fail.\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/isnan.xml\">GLSL\n/// isnan man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL typename genType::bool_type isnan(genType const& x);\n\n/// Returns true if x holds a positive infinity or negative\n/// infinity representation in the underlying implementation's\n/// set of floating point representations. Returns false\n/// otherwise, including for implementations with no infinity\n/// representations.\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/isinf.xml\">GLSL\n/// isinf man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL typename genType::bool_type isinf(genType const& x);\n\n/// Returns a signed integer value representing\n/// the encoding of a floating-point value. The floating-point\n/// value's bit-level representation is preserved.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToInt.xml\">GLSL\n/// floatBitsToInt man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a>\nGLM_FUNC_DECL int floatBitsToInt(float const& v);\n\n/// Returns a signed integer value representing\n/// the encoding of a floating-point value. The floatingpoint\n/// value's bit-level representation is preserved.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToInt.xml\">GLSL\n/// floatBitsToInt man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a>\ntemplate <template <typename, precision> class vecType, precision P>\nGLM_FUNC_DECL vecType<int, P> floatBitsToInt(vecType<float, P> const& v);\n\n/// Returns a unsigned integer value representing\n/// the encoding of a floating-point value. The floatingpoint\n/// value's bit-level representation is preserved.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToUint.xml\">GLSL\n/// floatBitsToUint man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a>\nGLM_FUNC_DECL uint floatBitsToUint(float const& v);\n\n/// Returns a unsigned integer value representing\n/// the encoding of a floating-point value. The floatingpoint\n/// value's bit-level representation is preserved.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToUint.xml\">GLSL\n/// floatBitsToUint man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a>\ntemplate <template <typename, precision> class vecType, precision P>\nGLM_FUNC_DECL vecType<uint, P> floatBitsToUint(vecType<float, P> const& v);\n\n/// Returns a floating-point value corresponding to a signed\n/// integer encoding of a floating-point value.\n/// If an inf or NaN is passed in, it will not signal, and the\n/// resulting floating point value is unspecified. Otherwise,\n/// the bit-level representation is preserved.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/intBitsToFloat.xml\">GLSL\n/// intBitsToFloat man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a>\nGLM_FUNC_DECL float intBitsToFloat(int const& v);\n\n/// Returns a floating-point value corresponding to a signed\n/// integer encoding of a floating-point value.\n/// If an inf or NaN is passed in, it will not signal, and the\n/// resulting floating point value is unspecified. Otherwise,\n/// the bit-level representation is preserved.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/intBitsToFloat.xml\">GLSL\n/// intBitsToFloat man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a>\ntemplate <template <typename, precision> class vecType, precision P>\nGLM_FUNC_DECL vecType<float, P> intBitsToFloat(vecType<int, P> const& v);\n\n/// Returns a floating-point value corresponding to a\n/// unsigned integer encoding of a floating-point value.\n/// If an inf or NaN is passed in, it will not signal, and the\n/// resulting floating point value is unspecified. Otherwise,\n/// the bit-level representation is preserved.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/uintBitsToFloat.xml\">GLSL\n/// uintBitsToFloat man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a>\nGLM_FUNC_DECL float uintBitsToFloat(uint const& v);\n\n/// Returns a floating-point value corresponding to a\n/// unsigned integer encoding of a floating-point value.\n/// If an inf or NaN is passed in, it will not signal, and the\n/// resulting floating point value is unspecified. Otherwise,\n/// the bit-level representation is preserved.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/uintBitsToFloat.xml\">GLSL\n/// uintBitsToFloat man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a>\ntemplate <template <typename, precision> class vecType, precision P>\nGLM_FUNC_DECL vecType<float, P> uintBitsToFloat(vecType<uint, P> const& v);\n\n/// Computes and returns a * b + c.\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/fma.xml\">GLSL fma\n/// man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType fma(genType const& a, genType const& b, genType const& c);\n\n/// Splits x into a floating-point significand in the range\n/// [0.5, 1.0) and an integral exponent of two, such that:\n/// x = significand * exp(2, exponent)\n///\n/// The significand is returned by the function and the\n/// exponent is returned in the parameter exp. For a\n/// floating-point value of zero, the significant and exponent\n/// are both zero. For a floating-point value that is an\n/// infinity or is not a number, the results are undefined.\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/frexp.xml\">GLSL\n/// frexp man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a>\ntemplate <typename genType, typename genIType>\nGLM_FUNC_DECL genType frexp(genType const& x, genIType& exp);\n\n/// Builds a floating-point number from x and the\n/// corresponding integral exponent of two in exp, returning:\n/// significand * exp(2, exponent)\n///\n/// If this product is too large to be represented in the\n/// floating-point type, the result is undefined.\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/ldexp.xml\">GLSL\n/// ldexp man page</a>;\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.3 Common Functions</a>\ntemplate <typename genType, typename genIType>\nGLM_FUNC_DECL genType ldexp(genType const& x, genIType const& exp);\n\n/// @}\n}  // namespace glm\n\n#include \"func_common.inl\"\n\n#endif  // GLM_FUNC_COMMON_INCLUDED\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/func_common.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/func_common.inl\n/// @date 2008-08-03 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#include <limits>\n\n#include \"_vectorize.hpp\"\n#include \"func_vector_relational.hpp\"\n#include \"type_vec2.hpp\"\n#include \"type_vec3.hpp\"\n#include \"type_vec4.hpp\"\n\nnamespace glm {\nnamespace detail {\ntemplate <typename genFIType, bool /*signed*/>\nstruct compute_abs {};\n\ntemplate <typename genFIType>\nstruct compute_abs<genFIType, true> {\n  GLM_FUNC_QUALIFIER static genFIType call(genFIType const& x) {\n    GLM_STATIC_ASSERT(\n        std::numeric_limits<genFIType>::is_iec559 ||\n            std::numeric_limits<genFIType>::is_signed,\n        \"'abs' only accept floating-point and integer scalar or vector inputs\");\n    return x >= genFIType(0) ? x : -x;\n    // TODO, perf comp with: *(((int *) &x) + 1) &= 0x7fffffff;\n  }\n};\n\ntemplate <typename genFIType>\nstruct compute_abs<genFIType, false> {\n  GLM_FUNC_QUALIFIER static genFIType call(genFIType const& x) {\n    GLM_STATIC_ASSERT(\n        !std::numeric_limits<genFIType>::is_signed &&\n            std::numeric_limits<genFIType>::is_integer,\n        \"'abs' only accept floating-point and integer scalar or vector inputs\");\n    return x;\n  }\n};\n\ntemplate <typename T, typename U, precision P,\n          template <class, precision> class vecType>\nstruct compute_mix_vector {\n  GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const& x,\n                                               vecType<T, P> const& y,\n                                               vecType<U, P> const& a) {\n    GLM_STATIC_ASSERT(\n        std::numeric_limits<U>::is_iec559,\n        \"'mix' only accept floating-point inputs for the interpolator a\");\n\n    return vecType<T, P>(vecType<U, P>(x) + a * vecType<U, P>(y - x));\n  }\n};\n\ntemplate <typename T, precision P, template <class, precision> class vecType>\nstruct compute_mix_vector<T, bool, P, vecType> {\n  GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const& x,\n                                               vecType<T, P> const& y,\n                                               vecType<bool, P> const& a) {\n    vecType<T, P> Result;\n    for (length_t i = 0; i < x.length(); ++i) Result[i] = a[i] ? y[i] : x[i];\n    return Result;\n  }\n};\n\ntemplate <typename T, typename U, precision P,\n          template <class, precision> class vecType>\nstruct compute_mix_scalar {\n  GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const& x,\n                                               vecType<T, P> const& y,\n                                               U const& a) {\n    GLM_STATIC_ASSERT(\n        std::numeric_limits<U>::is_iec559,\n        \"'mix' only accept floating-point inputs for the interpolator a\");\n\n    return vecType<T, P>(vecType<U, P>(x) + a * vecType<U, P>(y - x));\n  }\n};\n\ntemplate <typename T, precision P, template <class, precision> class vecType>\nstruct compute_mix_scalar<T, bool, P, vecType> {\n  GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const& x,\n                                               vecType<T, P> const& y,\n                                               bool const& a) {\n    return a ? y : x;\n  }\n};\n\ntemplate <typename T, typename U>\nstruct compute_mix {\n  GLM_FUNC_QUALIFIER static T call(T const& x, T const& y, U const& a) {\n    GLM_STATIC_ASSERT(\n        std::numeric_limits<U>::is_iec559,\n        \"'mix' only accept floating-point inputs for the interpolator a\");\n\n    return static_cast<T>(static_cast<U>(x) + a * static_cast<U>(y - x));\n  }\n};\n\ntemplate <typename T>\nstruct compute_mix<T, bool> {\n  GLM_FUNC_QUALIFIER static T call(T const& x, T const& y, bool const& a) {\n    return a ? y : x;\n  }\n};\n}  // namespace detail\n\n// abs\ntemplate <typename genFIType>\nGLM_FUNC_QUALIFIER genFIType abs(genFIType const& x) {\n  return detail::compute_abs<\n      genFIType, std::numeric_limits<genFIType>::is_signed>::call(x);\n}\n\nVECTORIZE_VEC(abs)\n\n// sign\n// Try something like based on x >> 31 to get the sign bit\ntemplate <typename genFIType>\nGLM_FUNC_QUALIFIER genFIType sign(genFIType const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genFIType>::is_iec559 ||\n                        (std::numeric_limits<genFIType>::is_signed &&\n                         std::numeric_limits<genFIType>::is_integer),\n                    \"'sign' only accept signed inputs\");\n\n  genFIType result;\n  if (x > genFIType(0))\n    result = genFIType(1);\n  else if (x < genFIType(0))\n    result = genFIType(-1);\n  else\n    result = genFIType(0);\n  return result;\n}\n\nVECTORIZE_VEC(sign)\n\n// floor\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType floor(genType const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'floor' only accept floating-point inputs\");\n\n  return ::std::floor(x);\n}\n\nVECTORIZE_VEC(floor)\n\n// trunc\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType trunc(genType const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'trunc' only accept floating-point inputs\");\n\n  // TODO, add C++11 std::trunk\n  return x < 0 ? -floor(-x) : floor(x);\n}\n\nVECTORIZE_VEC(trunc)\n\n// round\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType round(genType const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'round' only accept floating-point inputs\");\n\n  // TODO, add C++11 std::round\n  return x < 0 ? genType(int(x - genType(0.5)))\n               : genType(int(x + genType(0.5)));\n}\n\nVECTORIZE_VEC(round)\n\n/*\n        // roundEven\n        template <typename genType>\n        GLM_FUNC_QUALIFIER genType roundEven(genType const& x)\n        {\n                GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n   \"'roundEven' only accept floating-point inputs\");\n\n                return genType(int(x + genType(int(x) % 2)));\n        }\n*/\n\n// roundEven\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType roundEven(genType const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'roundEven' only accept floating-point inputs\");\n\n  int Integer = static_cast<int>(x);\n  genType IntegerPart = static_cast<genType>(Integer);\n  genType FractionalPart = fract(x);\n\n  if (FractionalPart > static_cast<genType>(0.5) ||\n      FractionalPart < static_cast<genType>(0.5)) {\n    return round(x);\n  } else if ((Integer % 2) == 0) {\n    return IntegerPart;\n  } else if (x <= static_cast<genType>(0))  // Work around...\n  {\n    return IntegerPart - static_cast<genType>(1);\n  } else {\n    return IntegerPart + static_cast<genType>(1);\n  }\n  // else // Bug on MinGW 4.5.2\n  //{\n  //\treturn mix(IntegerPart + genType(-1), IntegerPart + genType(1), x <=\n  // genType(0));\n  // }\n}\n\nVECTORIZE_VEC(roundEven)\n\n// ceil\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType ceil(genType const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'ceil' only accept floating-point inputs\");\n\n  return ::std::ceil(x);\n}\n\nVECTORIZE_VEC(ceil)\n\n// fract\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType fract(genType const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'fract' only accept floating-point inputs\");\n\n  return x - floor(x);\n}\n\nVECTORIZE_VEC(fract)\n\n// mod\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType mod(genType const& x, genType const& y) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'mod' only accept floating-point inputs\");\n\n  return x - y * floor(x / y);\n}\n\nVECTORIZE_VEC_SCA(mod)\nVECTORIZE_VEC_VEC(mod)\n\n// modf\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType modf(genType const& x, genType& i) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'modf' only accept floating-point inputs\");\n\n  return std::modf(x, &i);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<T, P> modf(detail::tvec2<T, P> const& x,\n                                            detail::tvec2<T, P>& i) {\n  return detail::tvec2<T, P>(modf(x.x, i.x), modf(x.y, i.y));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> modf(detail::tvec3<T, P> const& x,\n                                            detail::tvec3<T, P>& i) {\n  return detail::tvec3<T, P>(modf(x.x, i.x), modf(x.y, i.y), modf(x.z, i.z));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> modf(detail::tvec4<T, P> const& x,\n                                            detail::tvec4<T, P>& i) {\n  return detail::tvec4<T, P>(modf(x.x, i.x), modf(x.y, i.y), modf(x.z, i.z),\n                             modf(x.w, i.w));\n}\n\n//// Only valid if (INT_MIN <= x-y <= INT_MAX)\n//// min(x,y)\n// r = y + ((x - y) & ((x - y) >> (sizeof(int) *\n// CHAR_BIT - 1)));\n//// max(x,y)\n// r = x - ((x - y) & ((x - y) >> (sizeof(int) *\n// CHAR_BIT - 1)));\n\n// min\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType min(genType const& x, genType const& y) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559 ||\n                        std::numeric_limits<genType>::is_integer,\n                    \"'min' only accept floating-point or integer inputs\");\n\n  return x < y ? x : y;\n}\n\nVECTORIZE_VEC_SCA(min)\nVECTORIZE_VEC_VEC(min)\n\n// max\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType max(genType const& x, genType const& y) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559 ||\n                        std::numeric_limits<genType>::is_integer,\n                    \"'max' only accept floating-point or integer inputs\");\n\n  return x > y ? x : y;\n}\n\nVECTORIZE_VEC_SCA(max)\nVECTORIZE_VEC_VEC(max)\n\n// clamp\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType clamp(genType const& x, genType const& minVal,\n                                 genType const& maxVal) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559 ||\n                        std::numeric_limits<genType>::is_integer,\n                    \"'clamp' only accept floating-point or integer inputs\");\n\n  return min(maxVal, max(minVal, x));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<T, P> clamp(detail::tvec2<T, P> const& x,\n                                             T const& minVal, T const& maxVal) {\n  GLM_STATIC_ASSERT(\n      std::numeric_limits<T>::is_iec559 || std::numeric_limits<T>::is_integer,\n      \"'clamp' only accept floating-point or integer inputs\");\n\n  return detail::tvec2<T, P>(clamp(x.x, minVal, maxVal),\n                             clamp(x.y, minVal, maxVal));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> clamp(detail::tvec3<T, P> const& x,\n                                             T const& minVal, T const& maxVal) {\n  GLM_STATIC_ASSERT(\n      std::numeric_limits<T>::is_iec559 || std::numeric_limits<T>::is_integer,\n      \"'clamp' only accept floating-point or integer inputs\");\n\n  return detail::tvec3<T, P>(clamp(x.x, minVal, maxVal),\n                             clamp(x.y, minVal, maxVal),\n                             clamp(x.z, minVal, maxVal));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> clamp(detail::tvec4<T, P> const& x,\n                                             T const& minVal, T const& maxVal) {\n  GLM_STATIC_ASSERT(\n      std::numeric_limits<T>::is_iec559 || std::numeric_limits<T>::is_integer,\n      \"'clamp' only accept floating-point or integer inputs\");\n\n  return detail::tvec4<T, P>(\n      clamp(x.x, minVal, maxVal), clamp(x.y, minVal, maxVal),\n      clamp(x.z, minVal, maxVal), clamp(x.w, minVal, maxVal));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<T, P> clamp(\n    detail::tvec2<T, P> const& x, detail::tvec2<T, P> const& minVal,\n    detail::tvec2<T, P> const& maxVal) {\n  GLM_STATIC_ASSERT(\n      std::numeric_limits<T>::is_iec559 || std::numeric_limits<T>::is_integer,\n      \"'clamp' only accept floating-point or integer inputs\");\n\n  return detail::tvec2<T, P>(clamp(x.x, minVal.x, maxVal.x),\n                             clamp(x.y, minVal.y, maxVal.y));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> clamp(\n    detail::tvec3<T, P> const& x, detail::tvec3<T, P> const& minVal,\n    detail::tvec3<T, P> const& maxVal) {\n  GLM_STATIC_ASSERT(\n      std::numeric_limits<T>::is_iec559 || std::numeric_limits<T>::is_integer,\n      \"'clamp' only accept floating-point or integer inputs\");\n\n  return detail::tvec3<T, P>(clamp(x.x, minVal.x, maxVal.x),\n                             clamp(x.y, minVal.y, maxVal.y),\n                             clamp(x.z, minVal.z, maxVal.z));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> clamp(\n    detail::tvec4<T, P> const& x, detail::tvec4<T, P> const& minVal,\n    detail::tvec4<T, P> const& maxVal) {\n  GLM_STATIC_ASSERT(\n      std::numeric_limits<T>::is_iec559 || std::numeric_limits<T>::is_integer,\n      \"'clamp' only accept floating-point or integer inputs\");\n\n  return detail::tvec4<T, P>(\n      clamp(x.x, minVal.x, maxVal.x), clamp(x.y, minVal.y, maxVal.y),\n      clamp(x.z, minVal.z, maxVal.z), clamp(x.w, minVal.w, maxVal.w));\n}\n\ntemplate <typename T, typename U, precision P,\n          template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER vecType<T, P> mix(vecType<T, P> const& x,\n                                     vecType<T, P> const& y,\n                                     vecType<U, P> const& a) {\n  return detail::compute_mix_vector<T, U, P, vecType>::call(x, y, a);\n}\n\ntemplate <typename T, typename U, precision P,\n          template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER vecType<T, P> mix(vecType<T, P> const& x,\n                                     vecType<T, P> const& y, U const& a) {\n  return detail::compute_mix_scalar<T, U, P, vecType>::call(x, y, a);\n}\n\ntemplate <typename genTypeT, typename genTypeU>\nGLM_FUNC_QUALIFIER genTypeT mix(genTypeT const& x, genTypeT const& y,\n                                genTypeU const& a) {\n  return detail::compute_mix<genTypeT, genTypeU>::call(x, y, a);\n}\n\n// step\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType step(genType const& edge, genType const& x) {\n  return mix(genType(1), genType(0), glm::lessThan(x, edge));\n}\n\ntemplate <template <typename, precision> class vecType, typename T, precision P>\nGLM_FUNC_QUALIFIER vecType<T, P> step(T const& edge, vecType<T, P> const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'step' only accept floating-point inputs\");\n\n  return mix(vecType<T, P>(1), vecType<T, P>(0),\n             glm::lessThan(x, vecType<T, P>(edge)));\n}\n\n// smoothstep\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType smoothstep(genType const& edge0,\n                                      genType const& edge1, genType const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'smoothstep' only accept floating-point inputs\");\n\n  genType tmp = clamp((x - edge0) / (edge1 - edge0), genType(0), genType(1));\n  return tmp * tmp * (genType(3) - genType(2) * tmp);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<T, P> smoothstep(\n    T const& edge0, T const& edge1, detail::tvec2<T, P> const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'smoothstep' only accept floating-point inputs\");\n\n  return detail::tvec2<T, P>(smoothstep(edge0, edge1, x.x),\n                             smoothstep(edge0, edge1, x.y));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> smoothstep(\n    T const& edge0, T const& edge1, detail::tvec3<T, P> const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'smoothstep' only accept floating-point inputs\");\n\n  return detail::tvec3<T, P>(smoothstep(edge0, edge1, x.x),\n                             smoothstep(edge0, edge1, x.y),\n                             smoothstep(edge0, edge1, x.z));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> smoothstep(\n    T const& edge0, T const& edge1, detail::tvec4<T, P> const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'smoothstep' only accept floating-point inputs\");\n\n  return detail::tvec4<T, P>(\n      smoothstep(edge0, edge1, x.x), smoothstep(edge0, edge1, x.y),\n      smoothstep(edge0, edge1, x.z), smoothstep(edge0, edge1, x.w));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<T, P> smoothstep(\n    detail::tvec2<T, P> const& edge0, detail::tvec2<T, P> const& edge1,\n    detail::tvec2<T, P> const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'smoothstep' only accept floating-point inputs\");\n\n  return detail::tvec2<T, P>(smoothstep(edge0.x, edge1.x, x.x),\n                             smoothstep(edge0.y, edge1.y, x.y));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> smoothstep(\n    detail::tvec3<T, P> const& edge0, detail::tvec3<T, P> const& edge1,\n    detail::tvec3<T, P> const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'smoothstep' only accept floating-point inputs\");\n\n  return detail::tvec3<T, P>(smoothstep(edge0.x, edge1.x, x.x),\n                             smoothstep(edge0.y, edge1.y, x.y),\n                             smoothstep(edge0.z, edge1.z, x.z));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> smoothstep(\n    detail::tvec4<T, P> const& edge0, detail::tvec4<T, P> const& edge1,\n    detail::tvec4<T, P> const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'smoothstep' only accept floating-point inputs\");\n\n  return detail::tvec4<T, P>(\n      smoothstep(edge0.x, edge1.x, x.x), smoothstep(edge0.y, edge1.y, x.y),\n      smoothstep(edge0.z, edge1.z, x.z), smoothstep(edge0.w, edge1.w, x.w));\n}\n\n// TODO: Not working on MinGW...\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER bool isnan(genType const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'isnan' only accept floating-point inputs\");\n\n#if (GLM_COMPILER & (GLM_COMPILER_VC | GLM_COMPILER_INTEL))\n  return _isnan(x) != 0;\n#elif (GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_CLANG))\n#if (GLM_PLATFORM & GLM_PLATFORM_ANDROID)\n  return _isnan(x) != 0;\n#else\n  return std::isnan(x);\n#endif\n#elif (GLM_COMPILER & GLM_COMPILER_CUDA)\n  return isnan(x) != 0;\n#else\n  return std::isnan(x);\n#endif\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename detail::tvec2<T, P>::bool_type isnan(\n    detail::tvec2<T, P> const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'isnan' only accept floating-point inputs\");\n\n  return typename detail::tvec2<T, P>::bool_type(isnan(x.x), isnan(x.y));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename detail::tvec3<T, P>::bool_type isnan(\n    detail::tvec3<T, P> const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'isnan' only accept floating-point inputs\");\n\n  return typename detail::tvec3<T, P>::bool_type(isnan(x.x), isnan(x.y),\n                                                 isnan(x.z));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename detail::tvec4<T, P>::bool_type isnan(\n    detail::tvec4<T, P> const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'isnan' only accept floating-point inputs\");\n\n  return typename detail::tvec4<T, P>::bool_type(isnan(x.x), isnan(x.y),\n                                                 isnan(x.z), isnan(x.w));\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER bool isinf(genType const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'isinf' only accept floating-point inputs\");\n\n#if (GLM_COMPILER & (GLM_COMPILER_INTEL | GLM_COMPILER_VC))\n  return _fpclass(x) == _FPCLASS_NINF || _fpclass(x) == _FPCLASS_PINF;\n#elif (GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_CLANG))\n#if (GLM_PLATFORM & GLM_PLATFORM_ANDROID)\n  return _isinf(x) != 0;\n#else\n  return std::isinf(x);\n#endif\n#elif (GLM_COMPILER & GLM_COMPILER_CUDA)\n  // http://developer.download.nvidia.com/compute/cuda/4_2/rel/toolkit/docs/online/group__CUDA__MATH__DOUBLE_g13431dd2b40b51f9139cbb7f50c18fab.html#g13431dd2b40b51f9139cbb7f50c18fab\n  return isinf(double(x)) != 0;\n#else\n  return std::isinf(x);\n#endif\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename detail::tvec2<T, P>::bool_type isinf(\n    detail::tvec2<T, P> const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'isinf' only accept floating-point inputs\");\n\n  return typename detail::tvec2<T, P>::bool_type(isinf(x.x), isinf(x.y));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename detail::tvec3<T, P>::bool_type isinf(\n    detail::tvec3<T, P> const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'isinf' only accept floating-point inputs\");\n\n  return typename detail::tvec3<T, P>::bool_type(isinf(x.x), isinf(x.y),\n                                                 isinf(x.z));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename detail::tvec4<T, P>::bool_type isinf(\n    detail::tvec4<T, P> const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'isinf' only accept floating-point inputs\");\n\n  return typename detail::tvec4<T, P>::bool_type(isinf(x.x), isinf(x.y),\n                                                 isinf(x.z), isinf(x.w));\n}\n\nGLM_FUNC_QUALIFIER int floatBitsToInt(float const& v) {\n  return reinterpret_cast<int&>(const_cast<float&>(v));\n}\n\ntemplate <template <typename, precision> class vecType, precision P>\nGLM_FUNC_QUALIFIER vecType<int, P> floatBitsToInt(vecType<float, P> const& v) {\n  return reinterpret_cast<vecType<int, P>&>(const_cast<vecType<float, P>&>(v));\n}\n\nGLM_FUNC_QUALIFIER uint floatBitsToUint(float const& v) {\n  return reinterpret_cast<uint&>(const_cast<float&>(v));\n}\n\ntemplate <template <typename, precision> class vecType, precision P>\nGLM_FUNC_QUALIFIER vecType<uint, P> floatBitsToUint(\n    vecType<float, P> const& v) {\n  return reinterpret_cast<vecType<uint, P>&>(const_cast<vecType<float, P>&>(v));\n}\n\nGLM_FUNC_QUALIFIER float intBitsToFloat(int const& v) {\n  return reinterpret_cast<float&>(const_cast<int&>(v));\n}\n\ntemplate <template <typename, precision> class vecType, precision P>\nGLM_FUNC_QUALIFIER vecType<float, P> intBitsToFloat(vecType<int, P> const& v) {\n  return reinterpret_cast<vecType<float, P>&>(const_cast<vecType<int, P>&>(v));\n}\n\nGLM_FUNC_QUALIFIER float uintBitsToFloat(uint const& v) {\n  return reinterpret_cast<float&>(const_cast<uint&>(v));\n}\n\ntemplate <template <typename, precision> class vecType, precision P>\nGLM_FUNC_QUALIFIER vecType<float, P> uintBitsToFloat(\n    vecType<uint, P> const& v) {\n  return reinterpret_cast<vecType<float, P>&>(const_cast<vecType<uint, P>&>(v));\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType fma(genType const& a, genType const& b,\n                               genType const& c) {\n  return a * b + c;\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType frexp(genType const& x, int& exp) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'frexp' only accept floating-point inputs\");\n\n  return std::frexp(x, exp);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<T, P> frexp(detail::tvec2<T, P> const& x,\n                                             detail::tvec2<int, P>& exp) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'frexp' only accept floating-point inputs\");\n\n  return detail::tvec2<T, P>(frexp(x.x, exp.x), frexp(x.y, exp.y));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> frexp(detail::tvec3<T, P> const& x,\n                                             detail::tvec3<int, P>& exp) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'frexp' only accept floating-point inputs\");\n\n  return detail::tvec3<T, P>(frexp(x.x, exp.x), frexp(x.y, exp.y),\n                             frexp(x.z, exp.z));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> frexp(detail::tvec4<T, P> const& x,\n                                             detail::tvec4<int, P>& exp) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'frexp' only accept floating-point inputs\");\n\n  return detail::tvec4<T, P>(frexp(x.x, exp.x), frexp(x.y, exp.y),\n                             frexp(x.z, exp.z), frexp(x.w, exp.w));\n}\n\ntemplate <typename genType, precision P>\nGLM_FUNC_QUALIFIER genType ldexp(genType const& x, int const& exp) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'frexp' only accept floating-point inputs\");\n\n  return std::ldexp(x, exp);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<T, P> ldexp(detail::tvec2<T, P> const& x,\n                                             detail::tvec2<int, P> const& exp) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'ldexp' only accept floating-point inputs\");\n\n  return detail::tvec2<T, P>(ldexp(x.x, exp.x), ldexp(x.y, exp.y));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> ldexp(detail::tvec3<T, P> const& x,\n                                             detail::tvec3<int, P> const& exp) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'ldexp' only accept floating-point inputs\");\n\n  return detail::tvec3<T, P>(ldexp(x.x, exp.x), ldexp(x.y, exp.y),\n                             ldexp(x.z, exp.z));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> ldexp(detail::tvec4<T, P> const& x,\n                                             detail::tvec4<int, P> const& exp) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'ldexp' only accept floating-point inputs\");\n\n  return detail::tvec4<T, P>(ldexp(x.x, exp.x), ldexp(x.y, exp.y),\n                             ldexp(x.z, exp.z), ldexp(x.w, exp.w));\n}\n\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/func_exponential.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/func_exponential.hpp\n/// @date 2008-08-08 / 2011-06-14\n/// @author Christophe Riccio\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.2 Exponential Functions</a>\n///\n/// @defgroup core_func_exponential Exponential functions\n/// @ingroup core\n///\n/// These all operate component-wise. The description is per component.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_core_func_exponential\n#define glm_core_func_exponential\n\n#include <cmath>\n\n#include \"type_vec1.hpp\"\n#include \"type_vec2.hpp\"\n#include \"type_vec3.hpp\"\n#include \"type_vec4.hpp\"\n\nnamespace glm {\n/// @addtogroup core_func_exponential\n/// @{\n\n/// Returns 'base' raised to the power 'exponent'.\n///\n/// @param base Floating point value. pow function is defined for input values\n/// of x defined in the range (inf-, inf+) in the limit of the type precision.\n/// @param exponent Floating point value representing the 'exponent'.\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/pow.xml\">GLSL pow\n/// man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.2 Exponential Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType pow(genType const& base, genType const& exponent);\n\n/// Returns the natural exponentiation of x, i.e., e^x.\n///\n/// @param x exp function is defined for input values of x defined in the range\n/// (inf-, inf+) in the limit of the type precision.\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/exp.xml\">GLSL exp\n/// man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.2 Exponential Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType exp(genType const& x);\n\n/// Returns the natural logarithm of x, i.e.,\n/// returns the value y which satisfies the equation x = e^y.\n/// Results are undefined if x <= 0.\n///\n/// @param x log function is defined for input values of x defined in the range\n/// (0, inf+) in the limit of the type precision.\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/log.xml\">GLSL log\n/// man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.2 Exponential Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType log(genType const& x);\n\n/// Returns 2 raised to the x power.\n///\n/// @param x exp2 function is defined for input values of x defined in the range\n/// (inf-, inf+) in the limit of the type precision.\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/exp2.xml\">GLSL\n/// exp2 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.2 Exponential Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType exp2(genType const& x);\n\n/// Returns the base 2 log of x, i.e., returns the value y,\n/// which satisfies the equation x = 2 ^ y.\n///\n/// @param x log2 function is defined for input values of x defined in the range\n/// (0, inf+) in the limit of the type precision.\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/log2.xml\">GLSL\n/// log2 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.2 Exponential Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType log2(genType x);\n\n/// Returns the positive square root of x.\n///\n/// @param x sqrt function is defined for input values of x defined in the range\n/// [0, inf+) in the limit of the type precision.\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/sqrt.xml\">GLSL\n/// sqrt man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.2 Exponential Functions</a>\n// template <typename genType>\n// GLM_FUNC_DECL genType sqrt(genType const & x);\n\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_DECL vecType<T, P> sqrt(vecType<T, P> const& x);\n\n/// Returns the reciprocal of the positive square root of x.\n///\n/// @param x inversesqrt function is defined for input values of x defined in\n/// the range [0, inf+) in the limit of the type precision.\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/inversesqrt.xml\">GLSL\n/// inversesqrt man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.2 Exponential Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType inversesqrt(genType const& x);\n\n/// @}\n}  // namespace glm\n\n#include \"func_exponential.inl\"\n\n#endif  // glm_core_func_exponential\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/func_exponential.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/func_exponential.inl\n/// @date 2008-08-03 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#include <cassert>\n#include <limits>\n\n#include \"_vectorize.hpp\"\n#include \"func_vector_relational.hpp\"\n\nnamespace glm {\nnamespace detail {\ntemplate <bool isFloat>\nstruct compute_log2 {\n  template <typename T>\n  T operator()(T const& Value) const;\n};\n\ntemplate <>\nstruct compute_log2<true> {\n  template <typename T>\n  GLM_FUNC_QUALIFIER T operator()(T const& Value) const {\n    return static_cast<T>(::std::log(Value)) *\n           static_cast<T>(1.4426950408889634073599246810019);\n  }\n};\n\ntemplate <template <class, precision> class vecType, typename T, precision P>\nstruct compute_inversesqrt {\n  GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const& x) {\n    return static_cast<T>(1) / sqrt(x);\n  }\n};\n\ntemplate <template <class, precision> class vecType>\nstruct compute_inversesqrt<vecType, float, lowp> {\n  GLM_FUNC_QUALIFIER static vecType<float, lowp> call(\n      vecType<float, lowp> const& x) {\n    vecType<float, lowp> tmp(x);\n    vecType<float, lowp> xhalf(tmp * 0.5f);\n    vecType<uint, lowp>* p = reinterpret_cast<vecType<uint, lowp>*>(\n        const_cast<vecType<float, lowp>*>(&x));\n    vecType<uint, lowp> i =\n        vecType<uint, lowp>(0x5f375a86) - (*p >> vecType<uint, lowp>(1));\n    vecType<float, lowp>* ptmp = reinterpret_cast<vecType<float, lowp>*>(&i);\n    tmp = *ptmp;\n    tmp = tmp * (1.5f - xhalf * tmp * tmp);\n    return tmp;\n  }\n};\n}  // namespace detail\n\n// pow\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType pow(genType const& x, genType const& y) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'pow' only accept floating-point inputs\");\n\n  return std::pow(x, y);\n}\n\nVECTORIZE_VEC_VEC(pow)\n\n// exp\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType exp(genType const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'exp' only accept floating-point inputs\");\n\n  return std::exp(x);\n}\n\nVECTORIZE_VEC(exp)\n\n// log\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType log(genType const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'log' only accept floating-point inputs\");\n\n  return std::log(x);\n}\n\nVECTORIZE_VEC(log)\n\n// exp2, ln2 = 0.69314718055994530941723212145818f\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType exp2(genType const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'exp2' only accept floating-point inputs\");\n\n  return std::exp(static_cast<genType>(0.69314718055994530941723212145818) * x);\n}\n\nVECTORIZE_VEC(exp2)\n\n// log2, ln2 = 0.69314718055994530941723212145818f\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType log2(genType x) {\n  GLM_STATIC_ASSERT(\n      std::numeric_limits<genType>::is_iec559 ||\n          std::numeric_limits<genType>::is_integer,\n      \"GLM core 'log2' only accept floating-point inputs. Include \"\n      \"<glm/gtx/integer.hpp> for additional integer support.\");\n\n  assert(x > genType(0));  // log2 is only defined on the range (0, inf]\n  return detail::compute_log2<std::numeric_limits<genType>::is_iec559>()(x);\n}\n\nVECTORIZE_VEC(log2)\n\nnamespace detail {\ntemplate <template <class, precision> class vecType, typename T, precision P>\nstruct compute_sqrt {};\n\ntemplate <typename T, precision P>\nstruct compute_sqrt<detail::tvec1, T, P> {\n  GLM_FUNC_QUALIFIER static detail::tvec1<T, P> call(\n      detail::tvec1<T, P> const& x) {\n    return detail::tvec1<T, P>(std::sqrt(x.x));\n  }\n};\n\ntemplate <typename T, precision P>\nstruct compute_sqrt<detail::tvec2, T, P> {\n  GLM_FUNC_QUALIFIER static detail::tvec2<T, P> call(\n      detail::tvec2<T, P> const& x) {\n    return detail::tvec2<T, P>(std::sqrt(x.x), std::sqrt(x.y));\n  }\n};\n\ntemplate <typename T, precision P>\nstruct compute_sqrt<detail::tvec3, T, P> {\n  GLM_FUNC_QUALIFIER static detail::tvec3<T, P> call(\n      detail::tvec3<T, P> const& x) {\n    return detail::tvec3<T, P>(std::sqrt(x.x), std::sqrt(x.y), std::sqrt(x.z));\n  }\n};\n\ntemplate <typename T, precision P>\nstruct compute_sqrt<detail::tvec4, T, P> {\n  GLM_FUNC_QUALIFIER static detail::tvec4<T, P> call(\n      detail::tvec4<T, P> const& x) {\n    return detail::tvec4<T, P>(std::sqrt(x.x), std::sqrt(x.y), std::sqrt(x.z),\n                               std::sqrt(x.w));\n  }\n};\n}  // namespace detail\n\n// sqrt\nGLM_FUNC_QUALIFIER float sqrt(float x) {\n#ifdef __CUDACC__  // Wordaround for a CUDA compiler bug up to CUDA6\n  detail::tvec1<float, highp> tmp(\n      detail::compute_sqrt<detail::tvec1, float, highp>::call(x));\n  return tmp.x;\n#else\n  return detail::compute_sqrt<detail::tvec1, float, highp>::call(x).x;\n#endif\n}\n\nGLM_FUNC_QUALIFIER double sqrt(double x) {\n#ifdef __CUDACC__  // Wordaround for a CUDA compiler bug up to CUDA6\n  detail::tvec1<double, highp> tmp(\n      detail::compute_sqrt<detail::tvec1, double, highp>::call(x));\n  return tmp.x;\n#else\n  return detail::compute_sqrt<detail::tvec1, double, highp>::call(x).x;\n#endif\n}\n\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER vecType<T, P> sqrt(vecType<T, P> const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'sqrt' only accept floating-point inputs\");\n  return detail::compute_sqrt<vecType, T, P>::call(x);\n}\n\n// inversesqrt\nGLM_FUNC_QUALIFIER float inversesqrt(float const& x) { return 1.0f / sqrt(x); }\n\nGLM_FUNC_QUALIFIER double inversesqrt(double const& x) { return 1.0 / sqrt(x); }\n\ntemplate <template <class, precision> class vecType, typename T, precision P>\nGLM_FUNC_QUALIFIER vecType<T, P> inversesqrt(vecType<T, P> const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'inversesqrt' only accept floating-point inputs\");\n  return detail::compute_inversesqrt<vecType, T, P>::call(x);\n}\n\nVECTORIZE_VEC(inversesqrt)\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/func_geometric.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/func_geometric.hpp\n/// @date 2008-08-03 / 2011-06-14\n/// @author Christophe Riccio\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.5 Geometric Functions</a>\n///\n/// @defgroup core_func_geometric Geometric functions\n/// @ingroup core\n///\n/// These operate on vectors as vectors, not component-wise.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_core_func_geometric\n#define glm_core_func_geometric\n\n#include \"type_vec3.hpp\"\n\nnamespace glm {\n/// @addtogroup core_func_geometric\n/// @{\n\n/// Returns the length of x, i.e., sqrt(x * x).\n///\n/// @tparam genType Floating-point vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/length.xml\">GLSL\n/// length man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.5 Geometric Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL typename genType::value_type length(genType const& x);\n\n/// Returns the distance betwwen p0 and p1, i.e., length(p0 - p1).\n///\n/// @tparam genType Floating-point vector types.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/distance.xml\">GLSL\n/// distance man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.5 Geometric Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL typename genType::value_type distance(genType const& p0,\n                                                    genType const& p1);\n\n/// Returns the dot product of x and y, i.e., result = x * y.\n///\n/// @tparam genType Floating-point vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/dot.xml\">GLSL dot\n/// man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.5 Geometric Functions</a>\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_DECL T dot(vecType<T, P> const& x, vecType<T, P> const& y);\n\n/// Returns the dot product of x and y, i.e., result = x * y.\n///\n/// @tparam genType Floating-point vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/dot.xml\">GLSL dot\n/// man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.5 Geometric Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType dot(genType const& x, genType const& y);\n\n/// Returns the cross product of x and y.\n///\n/// @tparam valType Floating-point scalar types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/cross.xml\">GLSL\n/// cross man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.5 Geometric Functions</a>\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec3<T, P> cross(detail::tvec3<T, P> const& x,\n                                        detail::tvec3<T, P> const& y);\n\n/// Returns a vector in the same direction as x but with length of 1.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/normalize.xml\">GLSL\n/// normalize man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.5 Geometric Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType normalize(genType const& x);\n\n/// If dot(Nref, I) < 0.0, return N, otherwise, return -N.\n///\n/// @tparam genType Floating-point vector types.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/faceforward.xml\">GLSL\n/// faceforward man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.5 Geometric Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType faceforward(genType const& N, genType const& I,\n                                  genType const& Nref);\n\n/// For the incident vector I and surface orientation N,\n/// returns the reflection direction : result = I - 2.0 * dot(N, I) * N.\n///\n/// @tparam genType Floating-point vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/reflect.xml\">GLSL\n/// reflect man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.5 Geometric Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType reflect(genType const& I, genType const& N);\n\n/// For the incident vector I and surface normal N,\n/// and the ratio of indices of refraction eta,\n/// return the refraction vector.\n///\n/// @tparam genType Floating-point vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/refract.xml\">GLSL\n/// refract man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.5 Geometric Functions</a>\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_DECL vecType<T, P> refract(vecType<T, P> const& I,\n                                    vecType<T, P> const& N, T const& eta);\n\n/// @}\n}  // namespace glm\n\n#include \"func_geometric.inl\"\n\n#endif  // glm_core_func_geometric\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/func_geometric.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/func_geometric.inl\n/// @date 2008-08-03 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#include \"func_common.hpp\"\n#include \"func_exponential.hpp\"\n#include \"type_float.hpp\"\n#include \"type_vec2.hpp\"\n#include \"type_vec4.hpp\"\n\nnamespace glm {\nnamespace detail {\ntemplate <template <class, precision> class vecType, typename T, precision P>\nstruct compute_dot {};\n\ntemplate <typename T, precision P>\nstruct compute_dot<detail::tvec1, T, P> {\n  GLM_FUNC_QUALIFIER static T call(detail::tvec1<T, P> const& x,\n                                   detail::tvec1<T, P> const& y) {\n#ifdef __CUDACC__  // Wordaround for a CUDA compiler bug up to CUDA6\n    detail::tvec1<T, P> tmp(x * y);\n    return tmp.x;\n#else\n    return detail::tvec1<T, P>(x * y).x;\n#endif\n  }\n};\n\ntemplate <typename T, precision P>\nstruct compute_dot<detail::tvec2, T, P> {\n  GLM_FUNC_QUALIFIER static T call(detail::tvec2<T, P> const& x,\n                                   detail::tvec2<T, P> const& y) {\n    detail::tvec2<T, P> tmp(x * y);\n    return tmp.x + tmp.y;\n  }\n};\n\ntemplate <typename T, precision P>\nstruct compute_dot<detail::tvec3, T, P> {\n  GLM_FUNC_QUALIFIER static T call(detail::tvec3<T, P> const& x,\n                                   detail::tvec3<T, P> const& y) {\n    detail::tvec3<T, P> tmp(x * y);\n    return tmp.x + tmp.y + tmp.z;\n  }\n};\n\ntemplate <typename T, precision P>\nstruct compute_dot<detail::tvec4, T, P> {\n  GLM_FUNC_QUALIFIER static T call(detail::tvec4<T, P> const& x,\n                                   detail::tvec4<T, P> const& y) {\n    detail::tvec4<T, P> tmp(x * y);\n    return (tmp.x + tmp.y) + (tmp.z + tmp.w);\n  }\n};\n}  // namespace detail\n\n// length\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType length(genType const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'length' only accept floating-point inputs\");\n\n  genType sqr = x * x;\n  return sqrt(sqr);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T length(detail::tvec2<T, P> const& v) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'length' only accept floating-point inputs\");\n\n  T sqr = v.x * v.x + v.y * v.y;\n  return sqrt(sqr);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T length(detail::tvec3<T, P> const& v) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'length' only accept floating-point inputs\");\n\n  T sqr = v.x * v.x + v.y * v.y + v.z * v.z;\n  return sqrt(sqr);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T length(detail::tvec4<T, P> const& v) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'length' only accept floating-point inputs\");\n\n  T sqr = v.x * v.x + v.y * v.y + v.z * v.z + v.w * v.w;\n  return sqrt(sqr);\n}\n\n// distance\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType distance(genType const& p0, genType const& p1) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'distance' only accept floating-point inputs\");\n\n  return length(p1 - p0);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T distance(detail::tvec2<T, P> const& p0,\n                              detail::tvec2<T, P> const& p1) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'distance' only accept floating-point inputs\");\n\n  return length(p1 - p0);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T distance(detail::tvec3<T, P> const& p0,\n                              detail::tvec3<T, P> const& p1) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'distance' only accept floating-point inputs\");\n\n  return length(p1 - p0);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T distance(detail::tvec4<T, P> const& p0,\n                              detail::tvec4<T, P> const& p1) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'distance' only accept floating-point inputs\");\n\n  return length(p1 - p0);\n}\n\n// dot\ntemplate <typename T>\nGLM_FUNC_QUALIFIER T dot(T const& x, T const& y) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'dot' only accept floating-point inputs\");\n  return detail::compute_dot<detail::tvec1, T, highp>::call(x, y);\n}\n\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER T dot(vecType<T, P> const& x, vecType<T, P> const& y) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'dot' only accept floating-point inputs\");\n  return detail::compute_dot<vecType, T, P>::call(x, y);\n}\n\n/* // SSE3\n        GLM_FUNC_QUALIFIER float dot(const tvec4<float>& x, const tvec4<float>&\n   y)\n        {\n                float Result;\n                __asm\n                {\n                        mov\t\tesi, x\n                        mov\t\tedi, y\n                        movaps\txmm0, [esi]\n                        mulps\txmm0, [edi]\n                        haddps(\t_xmm0, _xmm0 )\n                        haddps(\t_xmm0, _xmm0 )\n                        movss\tResult, xmm0\n                }\n                return Result;\n        }\n*/\n// cross\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> cross(detail::tvec3<T, P> const& x,\n                                             detail::tvec3<T, P> const& y) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'cross' only accept floating-point inputs\");\n\n  return detail::tvec3<T, P>(x.y * y.z - y.y * x.z, x.z * y.x - y.z * x.x,\n                             x.x * y.y - y.x * x.y);\n}\n\n// normalize\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType normalize(genType const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'normalize' only accept floating-point inputs\");\n\n  return x < genType(0) ? genType(-1) : genType(1);\n}\n\n// According to issue 10 GLSL 1.10 specification, if length(x) == 0 then result\n// is undefine and generate an error\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<T, P> normalize(detail::tvec2<T, P> const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'normalize' only accept floating-point inputs\");\n\n  T sqr = x.x * x.x + x.y * x.y;\n  return x * inversesqrt(sqr);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> normalize(detail::tvec3<T, P> const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'normalize' only accept floating-point inputs\");\n\n  T sqr = x.x * x.x + x.y * x.y + x.z * x.z;\n  return x * inversesqrt(sqr);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> normalize(detail::tvec4<T, P> const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'normalize' only accept floating-point inputs\");\n\n  T sqr = x.x * x.x + x.y * x.y + x.z * x.z + x.w * x.w;\n  return x * inversesqrt(sqr);\n}\n\n// faceforward\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType faceforward(genType const& N, genType const& I,\n                                       genType const& Nref) {\n  return dot(Nref, I) < 0 ? N : -N;\n}\n\n// reflect\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType reflect(genType const& I, genType const& N) {\n  return I - N * dot(N, I) * genType(2);\n}\n\n// refract\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType refract(genType const& I, genType const& N,\n                                   genType const& eta) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'refract' only accept floating-point inputs\");\n\n  genType dotValue = dot(N, I);\n  genType k = genType(1) - eta * eta * (genType(1) - dotValue * dotValue);\n  if (k < genType(0))\n    return genType(0);\n  else\n    return eta * I - (eta * dotValue + sqrt(k)) * N;\n}\n\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER vecType<T, P> refract(vecType<T, P> const& I,\n                                         vecType<T, P> const& N, T const& eta) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'refract' only accept floating-point inputs\");\n\n  T dotValue = dot(N, I);\n  T k = T(1) - eta * eta * (T(1) - dotValue * dotValue);\n  if (k < T(0))\n    return vecType<T, P>(0);\n  else\n    return eta * I - (eta * dotValue + std::sqrt(k)) * N;\n}\n\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/func_integer.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/func_integer.hpp\n/// @date 2010-03-17 / 2011-06-18\n/// @author Christophe Riccio\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.8 Integer Functions</a>\n///\n/// @defgroup core_func_integer Integer functions\n/// @ingroup core\n///\n/// These all operate component-wise. The description is per component.\n/// The notation [a, b] means the set of bits from bit-number a through\n/// bit-number b, inclusive. The lowest-order bit is bit 0.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_core_func_integer\n#define glm_core_func_integer\n\n#include \"setup.hpp\"\n\nnamespace glm {\n/// @addtogroup core_func_integer\n/// @{\n\n/// Adds 32-bit unsigned integer x and y, returning the sum\n/// modulo pow(2, 32). The value carry is set to 0 if the sum was\n/// less than pow(2, 32), or to 1 otherwise.\n///\n/// @tparam genUType Unsigned integer scalar or vector types.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/uaddCarry.xml\">GLSL\n/// uaddCarry man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.8 Integer Functions</a>\ntemplate <typename genUType>\nGLM_FUNC_DECL genUType uaddCarry(genUType const& x, genUType const& y,\n                                 genUType& carry);\n\n/// Subtracts the 32-bit unsigned integer y from x, returning\n/// the difference if non-negative, or pow(2, 32) plus the difference\n/// otherwise. The value borrow is set to 0 if x >= y, or to 1 otherwise.\n///\n/// @tparam genUType Unsigned integer scalar or vector types.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/usubBorrow.xml\">GLSL\n/// usubBorrow man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.8 Integer Functions</a>\ntemplate <typename genUType>\nGLM_FUNC_DECL genUType usubBorrow(genUType const& x, genUType const& y,\n                                  genUType& borrow);\n\n/// Multiplies 32-bit integers x and y, producing a 64-bit\n/// result. The 32 least-significant bits are returned in lsb.\n/// The 32 most-significant bits are returned in msb.\n///\n/// @tparam genUType Unsigned integer scalar or vector types.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/umulExtended.xml\">GLSL\n/// umulExtended man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.8 Integer Functions</a>\ntemplate <typename genUType>\nGLM_FUNC_DECL void umulExtended(genUType const& x, genUType const& y,\n                                genUType& msb, genUType& lsb);\n\n/// Multiplies 32-bit integers x and y, producing a 64-bit\n/// result. The 32 least-significant bits are returned in lsb.\n/// The 32 most-significant bits are returned in msb.\n///\n/// @tparam genIType Signed integer scalar or vector types.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/imulExtended.xml\">GLSL\n/// imulExtended man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.8 Integer Functions</a>\ntemplate <typename genIType>\nGLM_FUNC_DECL void imulExtended(genIType const& x, genIType const& y,\n                                genIType& msb, genIType& lsb);\n\n/// Extracts bits [offset, offset + bits - 1] from value,\n/// returning them in the least significant bits of the result.\n/// For unsigned data types, the most significant bits of the\n/// result will be set to zero. For signed data types, the\n/// most significant bits will be set to the value of bit offset + base - 1.\n///\n/// If bits is zero, the result will be zero. The result will be\n/// undefined if offset or bits is negative, or if the sum of\n/// offset and bits is greater than the number of bits used\n/// to store the operand.\n///\n/// @tparam genIUType Signed or unsigned integer scalar or vector types.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/bitfieldExtract.xml\">GLSL\n/// bitfieldExtract man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.8 Integer Functions</a>\ntemplate <typename genIUType>\nGLM_FUNC_DECL genIUType bitfieldExtract(genIUType const& Value,\n                                        int const& Offset, int const& Bits);\n\n/// Returns the insertion the bits least-significant bits of insert into base.\n///\n/// The result will have bits [offset, offset + bits - 1] taken\n/// from bits [0, bits - 1] of insert, and all other bits taken\n/// directly from the corresponding bits of base. If bits is\n/// zero, the result will simply be base. The result will be\n/// undefined if offset or bits is negative, or if the sum of\n/// offset and bits is greater than the number of bits used to\n/// store the operand.\n///\n/// @tparam genIUType Signed or unsigned integer scalar or vector types.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/bitfieldInsert.xml\">GLSL\n/// bitfieldInsert man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.8 Integer Functions</a>\ntemplate <typename genIUType>\nGLM_FUNC_DECL genIUType bitfieldInsert(genIUType const& Base,\n                                       genIUType const& Insert,\n                                       int const& Offset, int const& Bits);\n\n/// Returns the reversal of the bits of value.\n/// The bit numbered n of the result will be taken from bit (bits - 1) - n of\n/// value, where bits is the total number of bits used to represent value.\n///\n/// @tparam genIUType Signed or unsigned integer scalar or vector types.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/bitfieldReverse.xml\">GLSL\n/// bitfieldReverse man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.8 Integer Functions</a>\ntemplate <typename genIUType>\nGLM_FUNC_DECL genIUType bitfieldReverse(genIUType const& Value);\n\n/// Returns the number of bits set to 1 in the binary representation of value.\n///\n/// @tparam genIUType Signed or unsigned integer scalar or vector types.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/bitCount.xml\">GLSL\n/// bitCount man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.8 Integer Functions</a>\n///\n/// @todo Clarify the declaration to specify that scalars are suported.\ntemplate <typename T, template <typename> class genIUType>\nGLM_FUNC_DECL typename genIUType<T>::signed_type bitCount(\n    genIUType<T> const& Value);\n\n/// Returns the bit number of the least significant bit set to\n/// 1 in the binary representation of value.\n/// If value is zero, -1 will be returned.\n///\n/// @tparam genIUType Signed or unsigned integer scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/findLSB.xml\">GLSL\n/// findLSB man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.8 Integer Functions</a>\n///\n/// @todo Clarify the declaration to specify that scalars are suported.\ntemplate <typename T, template <typename> class genIUType>\nGLM_FUNC_DECL typename genIUType<T>::signed_type findLSB(\n    genIUType<T> const& Value);\n\n/// Returns the bit number of the most significant bit in the binary\n/// representation of value. For positive integers, the result will be the bit\n/// number of the most significant bit set to 1. For negative integers, the\n/// result will be the bit number of the most significant bit set to 0. For a\n/// value of zero or negative one, -1 will be returned.\n///\n/// @tparam genIUType Signed or unsigned integer scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/findMSB.xml\">GLSL\n/// findMSB man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.8 Integer Functions</a>\n///\n/// @todo Clarify the declaration to specify that scalars are suported.\ntemplate <typename T, template <typename> class genIUType>\nGLM_FUNC_DECL typename genIUType<T>::signed_type findMSB(\n    genIUType<T> const& Value);\n\n/// @}\n}  // namespace glm\n\n#include \"func_integer.inl\"\n\n#endif  // glm_core_func_integer\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/func_integer.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/func_integer.inl\n/// @date 2010-03-17 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#include \"_vectorize.hpp\"\n#include \"type_int.hpp\"\n#include \"type_vec2.hpp\"\n#include \"type_vec3.hpp\"\n#include \"type_vec4.hpp\"\n#if (GLM_ARCH != GLM_ARCH_PURE)\n#if (GLM_COMPILER & GLM_COMPILER_VC)\n#include <intrin.h>\n#pragma intrinsic(_BitScanReverse)\n#endif  //(GLM_COMPILER & GLM_COMPILER_VC)\n#endif  //(GLM_ARCH != GLM_ARCH_PURE)\n#include <limits>\n\nnamespace glm {\n// uaddCarry\ntemplate <>\nGLM_FUNC_QUALIFIER uint uaddCarry(uint const& x, uint const& y, uint& Carry) {\n  uint64 Value64 = static_cast<uint64>(x) + static_cast<uint64>(y);\n  uint32 Result = static_cast<uint32>(\n      Value64 % (static_cast<uint64>(1) << static_cast<uint64>(32)));\n  Carry = (Value64 % (static_cast<uint64>(1) << static_cast<uint64>(32))) > 1\n              ? static_cast<uint32>(1)\n              : static_cast<uint32>(0);\n  return Result;\n}\n\ntemplate <>\nGLM_FUNC_QUALIFIER uvec2 uaddCarry(uvec2 const& x, uvec2 const& y,\n                                   uvec2& Carry) {\n  return uvec2(uaddCarry(x[0], y[0], Carry[0]),\n               uaddCarry(x[1], y[1], Carry[1]));\n}\n\ntemplate <>\nGLM_FUNC_QUALIFIER uvec3 uaddCarry(uvec3 const& x, uvec3 const& y,\n                                   uvec3& Carry) {\n  return uvec3(uaddCarry(x[0], y[0], Carry[0]), uaddCarry(x[1], y[1], Carry[1]),\n               uaddCarry(x[2], y[2], Carry[2]));\n}\n\ntemplate <>\nGLM_FUNC_QUALIFIER uvec4 uaddCarry(uvec4 const& x, uvec4 const& y,\n                                   uvec4& Carry) {\n  return uvec4(uaddCarry(x[0], y[0], Carry[0]), uaddCarry(x[1], y[1], Carry[1]),\n               uaddCarry(x[2], y[2], Carry[2]),\n               uaddCarry(x[3], y[3], Carry[3]));\n}\n\n// usubBorrow\ntemplate <>\nGLM_FUNC_QUALIFIER uint usubBorrow(uint const& x, uint const& y, uint& Borrow) {\n  GLM_STATIC_ASSERT(sizeof(uint) == sizeof(uint32),\n                    \"uint and uint32 size mismatch\");\n\n  Borrow = x >= y ? static_cast<uint32>(0) : static_cast<uint32>(1);\n  if (y >= x)\n    return y - x;\n  else\n    return static_cast<uint32>(\n        (static_cast<int64>(1) << static_cast<int64>(32)) +\n        (static_cast<int64>(y) - static_cast<int64>(x)));\n}\n\ntemplate <>\nGLM_FUNC_QUALIFIER uvec2 usubBorrow(uvec2 const& x, uvec2 const& y,\n                                    uvec2& Borrow) {\n  return uvec2(usubBorrow(x[0], y[0], Borrow[0]),\n               usubBorrow(x[1], y[1], Borrow[1]));\n}\n\ntemplate <>\nGLM_FUNC_QUALIFIER uvec3 usubBorrow(uvec3 const& x, uvec3 const& y,\n                                    uvec3& Borrow) {\n  return uvec3(usubBorrow(x[0], y[0], Borrow[0]),\n               usubBorrow(x[1], y[1], Borrow[1]),\n               usubBorrow(x[2], y[2], Borrow[2]));\n}\n\ntemplate <>\nGLM_FUNC_QUALIFIER uvec4 usubBorrow(uvec4 const& x, uvec4 const& y,\n                                    uvec4& Borrow) {\n  return uvec4(\n      usubBorrow(x[0], y[0], Borrow[0]), usubBorrow(x[1], y[1], Borrow[1]),\n      usubBorrow(x[2], y[2], Borrow[2]), usubBorrow(x[3], y[3], Borrow[3]));\n}\n\n// umulExtended\ntemplate <>\nGLM_FUNC_QUALIFIER void umulExtended(uint const& x, uint const& y, uint& msb,\n                                     uint& lsb) {\n  GLM_STATIC_ASSERT(sizeof(uint) == sizeof(uint32),\n                    \"uint and uint32 size mismatch\");\n\n  uint64 Value64 = static_cast<uint64>(x) * static_cast<uint64>(y);\n  uint32* PointerMSB = (reinterpret_cast<uint32*>(&Value64) + 1);\n  msb = *PointerMSB;\n  uint32* PointerLSB = (reinterpret_cast<uint32*>(&Value64) + 0);\n  lsb = *PointerLSB;\n}\n\ntemplate <>\nGLM_FUNC_QUALIFIER void umulExtended(uvec2 const& x, uvec2 const& y, uvec2& msb,\n                                     uvec2& lsb) {\n  umulExtended(x[0], y[0], msb[0], lsb[0]);\n  umulExtended(x[1], y[1], msb[1], lsb[1]);\n}\n\ntemplate <>\nGLM_FUNC_QUALIFIER void umulExtended(uvec3 const& x, uvec3 const& y, uvec3& msb,\n                                     uvec3& lsb) {\n  umulExtended(x[0], y[0], msb[0], lsb[0]);\n  umulExtended(x[1], y[1], msb[1], lsb[1]);\n  umulExtended(x[2], y[2], msb[2], lsb[2]);\n}\n\ntemplate <>\nGLM_FUNC_QUALIFIER void umulExtended(uvec4 const& x, uvec4 const& y, uvec4& msb,\n                                     uvec4& lsb) {\n  umulExtended(x[0], y[0], msb[0], lsb[0]);\n  umulExtended(x[1], y[1], msb[1], lsb[1]);\n  umulExtended(x[2], y[2], msb[2], lsb[2]);\n  umulExtended(x[3], y[3], msb[3], lsb[3]);\n}\n\n// imulExtended\ntemplate <>\nGLM_FUNC_QUALIFIER void imulExtended(int const& x, int const& y, int& msb,\n                                     int& lsb) {\n  GLM_STATIC_ASSERT(sizeof(int) == sizeof(int32),\n                    \"int and int32 size mismatch\");\n\n  int64 Value64 = static_cast<int64>(x) * static_cast<int64>(y);\n  int32* PointerMSB = (reinterpret_cast<int32*>(&Value64) + 1);\n  msb = *PointerMSB;\n  int32* PointerLSB = (reinterpret_cast<int32*>(&Value64));\n  lsb = *PointerLSB;\n}\n\ntemplate <>\nGLM_FUNC_QUALIFIER void imulExtended(ivec2 const& x, ivec2 const& y, ivec2& msb,\n                                     ivec2& lsb) {\n  imulExtended(x[0], y[0], msb[0], lsb[0]),\n      imulExtended(x[1], y[1], msb[1], lsb[1]);\n}\n\ntemplate <>\nGLM_FUNC_QUALIFIER void imulExtended(ivec3 const& x, ivec3 const& y, ivec3& msb,\n                                     ivec3& lsb) {\n  imulExtended(x[0], y[0], msb[0], lsb[0]),\n      imulExtended(x[1], y[1], msb[1], lsb[1]);\n  imulExtended(x[2], y[2], msb[2], lsb[2]);\n}\n\ntemplate <>\nGLM_FUNC_QUALIFIER void imulExtended(ivec4 const& x, ivec4 const& y, ivec4& msb,\n                                     ivec4& lsb) {\n  imulExtended(x[0], y[0], msb[0], lsb[0]),\n      imulExtended(x[1], y[1], msb[1], lsb[1]);\n  imulExtended(x[2], y[2], msb[2], lsb[2]);\n  imulExtended(x[3], y[3], msb[3], lsb[3]);\n}\n\n// bitfieldExtract\ntemplate <typename genIUType>\nGLM_FUNC_QUALIFIER genIUType bitfieldExtract(genIUType const& Value,\n                                             int const& Offset,\n                                             int const& Bits) {\n  int GenSize = int(sizeof(genIUType)) << int(3);\n\n  assert(Offset + Bits <= GenSize);\n\n  genIUType ShiftLeft =\n      Bits ? Value << (GenSize - (Bits + Offset)) : genIUType(0);\n  genIUType ShiftBack = ShiftLeft >> genIUType(GenSize - Bits);\n\n  return ShiftBack;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<T, P> bitfieldExtract(\n    detail::tvec2<T, P> const& Value, int const& Offset, int const& Bits) {\n  return detail::tvec2<T, P>(bitfieldExtract(Value[0], Offset, Bits),\n                             bitfieldExtract(Value[1], Offset, Bits));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> bitfieldExtract(\n    detail::tvec3<T, P> const& Value, int const& Offset, int const& Bits) {\n  return detail::tvec3<T, P>(bitfieldExtract(Value[0], Offset, Bits),\n                             bitfieldExtract(Value[1], Offset, Bits),\n                             bitfieldExtract(Value[2], Offset, Bits));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> bitfieldExtract(\n    detail::tvec4<T, P> const& Value, int const& Offset, int const& Bits) {\n  return detail::tvec4<T, P>(bitfieldExtract(Value[0], Offset, Bits),\n                             bitfieldExtract(Value[1], Offset, Bits),\n                             bitfieldExtract(Value[2], Offset, Bits),\n                             bitfieldExtract(Value[3], Offset, Bits));\n}\n\n// bitfieldInsert\ntemplate <typename genIUType>\nGLM_FUNC_QUALIFIER genIUType bitfieldInsert(genIUType const& Base,\n                                            genIUType const& Insert,\n                                            int const& Offset,\n                                            int const& Bits) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer,\n                    \"'bitfieldInsert' only accept integer values\");\n  assert(Offset + Bits <= sizeof(genIUType));\n\n  if (Bits == 0) return Base;\n\n  genIUType Mask = 0;\n  for (int Bit = Offset; Bit < Offset + Bits; ++Bit) Mask |= (1 << Bit);\n\n  return (Base & ~Mask) | (Insert & Mask);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<T, P> bitfieldInsert(\n    detail::tvec2<T, P> const& Base, detail::tvec2<T, P> const& Insert,\n    int const& Offset, int const& Bits) {\n  return detail::tvec2<T, P>(bitfieldInsert(Base[0], Insert[0], Offset, Bits),\n                             bitfieldInsert(Base[1], Insert[1], Offset, Bits));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> bitfieldInsert(\n    detail::tvec3<T, P> const& Base, detail::tvec3<T, P> const& Insert,\n    int const& Offset, int const& Bits) {\n  return detail::tvec3<T, P>(bitfieldInsert(Base[0], Insert[0], Offset, Bits),\n                             bitfieldInsert(Base[1], Insert[1], Offset, Bits),\n                             bitfieldInsert(Base[2], Insert[2], Offset, Bits));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> bitfieldInsert(\n    detail::tvec4<T, P> const& Base, detail::tvec4<T, P> const& Insert,\n    int const& Offset, int const& Bits) {\n  return detail::tvec4<T, P>(bitfieldInsert(Base[0], Insert[0], Offset, Bits),\n                             bitfieldInsert(Base[1], Insert[1], Offset, Bits),\n                             bitfieldInsert(Base[2], Insert[2], Offset, Bits),\n                             bitfieldInsert(Base[3], Insert[3], Offset, Bits));\n}\n\n// bitfieldReverse\ntemplate <typename genIUType>\nGLM_FUNC_QUALIFIER genIUType bitfieldReverse(genIUType const& Value) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer,\n                    \"'bitfieldReverse' only accept integer values\");\n\n  genIUType Out = 0;\n  std::size_t BitSize = sizeof(genIUType) * 8;\n  for (std::size_t i = 0; i < BitSize; ++i)\n    if (Value & (genIUType(1) << i)) Out |= genIUType(1) << (BitSize - 1 - i);\n  return Out;\n}\n\nVECTORIZE_VEC(bitfieldReverse)\n\n// bitCount\ntemplate <typename genIUType>\nGLM_FUNC_QUALIFIER int bitCount(genIUType const& Value) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer,\n                    \"'bitCount' only accept integer values\");\n\n  int Count = 0;\n  for (std::size_t i = 0; i < sizeof(genIUType) * std::size_t(8); ++i) {\n    if (Value & (1 << i)) ++Count;\n  }\n  return Count;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<int, P> bitCount(\n    detail::tvec2<T, P> const& value) {\n  return detail::tvec2<int, P>(bitCount(value[0]), bitCount(value[1]));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<int, P> bitCount(\n    detail::tvec3<T, P> const& value) {\n  return detail::tvec3<int, P>(bitCount(value[0]), bitCount(value[1]),\n                               bitCount(value[2]));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<int, P> bitCount(\n    detail::tvec4<T, P> const& value) {\n  return detail::tvec4<int, P>(bitCount(value[0]), bitCount(value[1]),\n                               bitCount(value[2]), bitCount(value[3]));\n}\n\n// findLSB\ntemplate <typename genIUType>\nGLM_FUNC_QUALIFIER int findLSB(genIUType const& Value) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer,\n                    \"'findLSB' only accept integer values\");\n  if (Value == 0) return -1;\n\n  genIUType Bit;\n  for (Bit = genIUType(0); !(Value & (1 << Bit)); ++Bit) {\n  }\n  return Bit;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<int, P> findLSB(\n    detail::tvec2<T, P> const& value) {\n  return detail::tvec2<int, P>(findLSB(value[0]), findLSB(value[1]));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<int, P> findLSB(\n    detail::tvec3<T, P> const& value) {\n  return detail::tvec3<int, P>(findLSB(value[0]), findLSB(value[1]),\n                               findLSB(value[2]));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<int, P> findLSB(\n    detail::tvec4<T, P> const& value) {\n  return detail::tvec4<int, P>(findLSB(value[0]), findLSB(value[1]),\n                               findLSB(value[2]), findLSB(value[3]));\n}\n\n// findMSB\n#if ((GLM_ARCH != GLM_ARCH_PURE) && (GLM_COMPILER & GLM_COMPILER_VC))\n\ntemplate <typename genIUType>\nGLM_FUNC_QUALIFIER int findMSB(genIUType const& Value) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer,\n                    \"'findMSB' only accept integer values\");\n  if (Value == 0) return -1;\n\n  unsigned long Result(0);\n  _BitScanReverse(&Result, Value);\n  return int(Result);\n}\n/*\n// __builtin_clz seems to be buggy as it crasks for some values, from 0x00200000\nto 80000000 #elif((GLM_ARCH != GLM_ARCH_PURE) && (GLM_COMPILER &\nGLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC40))\n\n        template <typename genIUType>\n        GLM_FUNC_QUALIFIER int findMSB\n        (\n                genIUType const & Value\n        )\n        {\n                GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer,\n\"'findMSB' only accept integer values\"); if(Value == 0) return -1;\n\n                // clz returns the number or trailing 0-bits; see\n                //\nhttp://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Other-Builtins.html\n                //\n                // NoteBecause __builtin_clz only works for unsigned ints, this\n                // implementation will not work for 64-bit integers.\n                //\n                return 31 - __builtin_clzl(Value);\n        }\n*/\n#else\n\n/* SSE implementation idea\n\n                __m128i const Zero = _mm_set_epi32( 0,  0,  0,  0);\n                __m128i const One = _mm_set_epi32( 1,  1,  1,  1);\n                __m128i Bit = _mm_set_epi32(-1, -1, -1, -1);\n                __m128i Tmp = _mm_set_epi32(Value, Value, Value, Value);\n                __m128i Mmi = Zero;\n                for(int i = 0; i < 32; ++i)\n                {\n                        __m128i Shilt = _mm_and_si128(_mm_cmpgt_epi32(Tmp, One),\n   One); Tmp = _mm_srai_epi32(Tmp, One); Bit = _mm_add_epi32(Bit,\n   _mm_and_si128(Shilt, i)); Mmi = _mm_and_si128(Mmi, One);\n                }\n                return Bit;\n\n*/\n\ntemplate <typename genIUType>\nGLM_FUNC_QUALIFIER int findMSB(genIUType const& Value) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer,\n                    \"'findMSB' only accept integer values\");\n\n  if (Value == genIUType(0) || Value == genIUType(-1))\n    return -1;\n  else if (Value > 0) {\n    genIUType Bit = genIUType(-1);\n    for (genIUType tmp = Value; tmp > 0; tmp >>= 1, ++Bit) {\n    }\n    return Bit;\n  } else  // if(Value < 0)\n  {\n    int const BitCount(sizeof(genIUType) * 8);\n    int MostSignificantBit(-1);\n    for (int BitIndex(0); BitIndex < BitCount; ++BitIndex)\n      MostSignificantBit =\n          (Value & (1 << BitIndex)) ? MostSignificantBit : BitIndex;\n    assert(MostSignificantBit >= 0);\n    return MostSignificantBit;\n  }\n}\n#endif  //(GLM_COMPILER)\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<int, P> findMSB(\n    detail::tvec2<T, P> const& value) {\n  return detail::tvec2<int, P>(findMSB(value[0]), findMSB(value[1]));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<int, P> findMSB(\n    detail::tvec3<T, P> const& value) {\n  return detail::tvec3<int, P>(findMSB(value[0]), findMSB(value[1]),\n                               findMSB(value[2]));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<int, P> findMSB(\n    detail::tvec4<T, P> const& value) {\n  return detail::tvec4<int, P>(findMSB(value[0]), findMSB(value[1]),\n                               findMSB(value[2]), findMSB(value[3]));\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/func_matrix.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/func_matrix.hpp\n/// @date 2008-08-03 / 2011-06-15\n/// @author Christophe Riccio\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.6 Matrix Functions</a>\n///\n/// @defgroup core_func_matrix Matrix functions\n/// @ingroup core\n///\n/// For each of the following built-in matrix functions, there is both a\n/// single-precision floating point version, where all arguments and return\n/// values are single precision, and a double-precision floating version, where\n/// all arguments and return values are double precision. Only the\n/// single-precision floating point version is shown.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_CORE_func_matrix\n#define GLM_CORE_func_matrix\n\n// Dependencies\n#include \"../detail/precision.hpp\"\n#include \"../detail/setup.hpp\"\n#include \"../detail/type_mat.hpp\"\n#include \"../mat2x2.hpp\"\n#include \"../mat2x3.hpp\"\n#include \"../mat2x4.hpp\"\n#include \"../mat3x2.hpp\"\n#include \"../mat3x3.hpp\"\n#include \"../mat3x4.hpp\"\n#include \"../mat4x2.hpp\"\n#include \"../mat4x3.hpp\"\n#include \"../mat4x4.hpp\"\n#include \"../vec2.hpp\"\n#include \"../vec3.hpp\"\n#include \"../vec4.hpp\"\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nstruct outerProduct_trait<T, P, tvec2, tvec2> {\n  typedef tmat2x2<T, P> type;\n};\n\ntemplate <typename T, precision P>\nstruct outerProduct_trait<T, P, tvec2, tvec3> {\n  typedef tmat2x3<T, P> type;\n};\n\ntemplate <typename T, precision P>\nstruct outerProduct_trait<T, P, tvec2, tvec4> {\n  typedef tmat2x4<T, P> type;\n};\n\ntemplate <typename T, precision P>\nstruct outerProduct_trait<T, P, tvec3, tvec2> {\n  typedef tmat3x2<T, P> type;\n};\n\ntemplate <typename T, precision P>\nstruct outerProduct_trait<T, P, tvec3, tvec3> {\n  typedef tmat3x3<T, P> type;\n};\n\ntemplate <typename T, precision P>\nstruct outerProduct_trait<T, P, tvec3, tvec4> {\n  typedef tmat3x4<T, P> type;\n};\n\ntemplate <typename T, precision P>\nstruct outerProduct_trait<T, P, tvec4, tvec2> {\n  typedef tmat4x2<T, P> type;\n};\n\ntemplate <typename T, precision P>\nstruct outerProduct_trait<T, P, tvec4, tvec3> {\n  typedef tmat4x3<T, P> type;\n};\n\ntemplate <typename T, precision P>\nstruct outerProduct_trait<T, P, tvec4, tvec4> {\n  typedef tmat4x4<T, P> type;\n};\n\n}  // namespace detail\n\n/// @addtogroup core_func_matrix\n/// @{\n\n/// Multiply matrix x by matrix y component-wise, i.e.,\n/// result[i][j] is the scalar product of x[i][j] and y[i][j].\n///\n/// @tparam matType Floating-point matrix types.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/matrixCompMult.xml\">GLSL\n/// matrixCompMult man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.6 Matrix Functions</a>\ntemplate <typename T, precision P, template <typename, precision> class matType>\nGLM_FUNC_DECL matType<T, P> matrixCompMult(matType<T, P> const& x,\n                                           matType<T, P> const& y);\n\n/// Treats the first parameter c as a column vector\n/// and the second parameter r as a row vector\n/// and does a linear algebraic matrix multiply c * r.\n///\n/// @tparam matType Floating-point matrix types.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/outerProduct.xml\">GLSL\n/// outerProduct man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.6 Matrix Functions</a>\n///\n/// @todo Clarify the declaration to specify that matType doesn't have to be\n/// provided when used.\ntemplate <typename T, precision P,\n          template <typename, precision> class vecTypeA,\n          template <typename, precision> class vecTypeB>\nGLM_FUNC_DECL\n    typename detail::outerProduct_trait<T, P, vecTypeA, vecTypeB>::type\n    outerProduct(vecTypeA<T, P> const& c, vecTypeB<T, P> const& r);\n\n/// Returns the transposed matrix of x\n///\n/// @tparam matType Floating-point matrix types.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/transpose.xml\">GLSL\n/// transpose man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.6 Matrix Functions</a>\n#if ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC11))\ntemplate <typename T, precision P, template <typename, precision> class matType>\nGLM_FUNC_DECL typename matType<T, P>::transpose_type transpose(\n    matType<T, P> const& x);\n#endif\n\n/// Return the determinant of a squared matrix.\n///\n/// @tparam valType Floating-point scalar types.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/determinant.xml\">GLSL\n/// determinant man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.6 Matrix Functions</a>\ntemplate <typename T, precision P, template <typename, precision> class matType>\nGLM_FUNC_DECL T determinant(matType<T, P> const& m);\n\n/// Return the inverse of a squared matrix.\n///\n/// @tparam valType Floating-point scalar types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/inverse.xml\">GLSL\n/// inverse man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.6 Matrix Functions</a>\ntemplate <typename T, precision P, template <typename, precision> class matType>\nGLM_FUNC_DECL matType<T, P> inverse(matType<T, P> const& m);\n\n/// @}\n}  // namespace glm\n\n#include \"func_matrix.inl\"\n\n#endif  // GLM_CORE_func_matrix\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/func_matrix.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/func_matrix.inl\n/// @date 2008-03-08 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#include <limits>\n\n#include \"../geometric.hpp\"\n\nnamespace glm {\nnamespace detail {\ntemplate <template <class, precision> class vecTypeA,\n          template <class, precision> class vecTypeB, typename T, precision P>\nstruct compute_outerProduct {};\n\ntemplate <typename T, precision P>\nstruct compute_outerProduct<detail::tvec2, detail::tvec2, T, P> {\n  GLM_FUNC_QUALIFIER static\n      typename detail::outerProduct_trait<T, P, detail::tvec2,\n                                          detail::tvec2>::type\n      call(detail::tvec2<T, P> const& c, detail::tvec2<T, P> const& r) {\n    detail::tmat2x2<T, P> m(detail::tmat2x2<T, P>::_null);\n    m[0][0] = c[0] * r[0];\n    m[0][1] = c[1] * r[0];\n    m[1][0] = c[0] * r[1];\n    m[1][1] = c[1] * r[1];\n    return m;\n  }\n};\n\ntemplate <typename T, precision P>\nstruct compute_outerProduct<detail::tvec3, detail::tvec3, T, P> {\n  GLM_FUNC_QUALIFIER static\n      typename detail::outerProduct_trait<T, P, detail::tvec3,\n                                          detail::tvec3>::type\n      call(detail::tvec3<T, P> const& c, detail::tvec3<T, P> const& r) {\n    detail::tmat3x3<T, P> m(detail::tmat3x3<T, P>::_null);\n    for (length_t i(0); i < m.length(); ++i) m[i] = c * r[i];\n    return m;\n  }\n};\n\ntemplate <typename T, precision P>\nstruct compute_outerProduct<detail::tvec4, detail::tvec4, T, P> {\n  GLM_FUNC_QUALIFIER static\n      typename detail::outerProduct_trait<T, P, detail::tvec4,\n                                          detail::tvec4>::type\n      call(detail::tvec4<T, P> const& c, detail::tvec4<T, P> const& r) {\n    detail::tmat4x4<T, P> m(detail::tmat4x4<T, P>::_null);\n    for (length_t i(0); i < m.length(); ++i) m[i] = c * r[i];\n    return m;\n  }\n};\n\ntemplate <typename T, precision P>\nstruct compute_outerProduct<detail::tvec3, detail::tvec2, T, P> {\n  GLM_FUNC_QUALIFIER static\n      typename detail::outerProduct_trait<T, P, detail::tvec3,\n                                          detail::tvec2>::type\n      call(detail::tvec3<T, P> const& c, detail::tvec2<T, P> const& r) {\n    detail::tmat2x3<T, P> m(detail::tmat2x3<T, P>::_null);\n    m[0][0] = c.x * r.x;\n    m[0][1] = c.y * r.x;\n    m[0][2] = c.z * r.x;\n    m[1][0] = c.x * r.y;\n    m[1][1] = c.y * r.y;\n    m[1][2] = c.z * r.y;\n    return m;\n  }\n};\n\ntemplate <typename T, precision P>\nstruct compute_outerProduct<detail::tvec2, detail::tvec3, T, P> {\n  GLM_FUNC_QUALIFIER static\n      typename detail::outerProduct_trait<T, P, detail::tvec2,\n                                          detail::tvec3>::type\n      call(detail::tvec2<T, P> const& c, detail::tvec3<T, P> const& r) {\n    detail::tmat3x2<T, P> m(detail::tmat3x2<T, P>::_null);\n    m[0][0] = c.x * r.x;\n    m[0][1] = c.y * r.x;\n    m[1][0] = c.x * r.y;\n    m[1][1] = c.y * r.y;\n    m[2][0] = c.x * r.z;\n    m[2][1] = c.y * r.z;\n    return m;\n  }\n};\n\ntemplate <typename T, precision P>\nstruct compute_outerProduct<detail::tvec4, detail::tvec2, T, P> {\n  GLM_FUNC_QUALIFIER static\n      typename detail::outerProduct_trait<T, P, detail::tvec4,\n                                          detail::tvec2>::type\n      call(detail::tvec4<T, P> const& c, detail::tvec2<T, P> const& r) {\n    detail::tmat2x4<T, P> m(detail::tmat2x4<T, P>::_null);\n    m[0][0] = c.x * r.x;\n    m[0][1] = c.y * r.x;\n    m[0][2] = c.z * r.x;\n    m[0][3] = c.w * r.x;\n    m[1][0] = c.x * r.y;\n    m[1][1] = c.y * r.y;\n    m[1][2] = c.z * r.y;\n    m[1][3] = c.w * r.y;\n    return m;\n  }\n};\n\ntemplate <typename T, precision P>\nstruct compute_outerProduct<detail::tvec2, detail::tvec4, T, P> {\n  GLM_FUNC_QUALIFIER static\n      typename detail::outerProduct_trait<T, P, detail::tvec2,\n                                          detail::tvec4>::type\n      call(detail::tvec2<T, P> const& c, detail::tvec4<T, P> const& r) {\n    detail::tmat4x2<T, P> m(detail::tmat4x2<T, P>::_null);\n    m[0][0] = c.x * r.x;\n    m[0][1] = c.y * r.x;\n    m[1][0] = c.x * r.y;\n    m[1][1] = c.y * r.y;\n    m[2][0] = c.x * r.z;\n    m[2][1] = c.y * r.z;\n    m[3][0] = c.x * r.w;\n    m[3][1] = c.y * r.w;\n    return m;\n  }\n};\n\ntemplate <typename T, precision P>\nstruct compute_outerProduct<detail::tvec4, detail::tvec3, T, P> {\n  GLM_FUNC_QUALIFIER static\n      typename detail::outerProduct_trait<T, P, detail::tvec4,\n                                          detail::tvec3>::type\n      call(detail::tvec4<T, P> const& c, detail::tvec3<T, P> const& r) {\n    detail::tmat3x4<T, P> m(detail::tmat3x4<T, P>::_null);\n    m[0][0] = c.x * r.x;\n    m[0][1] = c.y * r.x;\n    m[0][2] = c.z * r.x;\n    m[0][3] = c.w * r.x;\n    m[1][0] = c.x * r.y;\n    m[1][1] = c.y * r.y;\n    m[1][2] = c.z * r.y;\n    m[1][3] = c.w * r.y;\n    m[2][0] = c.x * r.z;\n    m[2][1] = c.y * r.z;\n    m[2][2] = c.z * r.z;\n    m[2][3] = c.w * r.z;\n    return m;\n  }\n};\n\ntemplate <typename T, precision P>\nstruct compute_outerProduct<detail::tvec3, detail::tvec4, T, P> {\n  GLM_FUNC_QUALIFIER static\n      typename detail::outerProduct_trait<T, P, detail::tvec3,\n                                          detail::tvec4>::type\n      call(detail::tvec3<T, P> const& c, detail::tvec4<T, P> const& r) {\n    detail::tmat4x3<T, P> m(detail::tmat4x3<T, P>::_null);\n    m[0][0] = c.x * r.x;\n    m[0][1] = c.y * r.x;\n    m[0][2] = c.z * r.x;\n    m[1][0] = c.x * r.y;\n    m[1][1] = c.y * r.y;\n    m[1][2] = c.z * r.y;\n    m[2][0] = c.x * r.z;\n    m[2][1] = c.y * r.z;\n    m[2][2] = c.z * r.z;\n    m[3][0] = c.x * r.w;\n    m[3][1] = c.y * r.w;\n    m[3][2] = c.z * r.w;\n    return m;\n  }\n};\n\ntemplate <template <class, precision> class matType, typename T, precision P>\nstruct compute_transpose {};\n\ntemplate <typename T, precision P>\nstruct compute_transpose<detail::tmat2x2, T, P> {\n  GLM_FUNC_QUALIFIER static detail::tmat2x2<T, P> call(\n      detail::tmat2x2<T, P> const& m) {\n    detail::tmat2x2<T, P> result(detail::tmat2x2<T, P>::_null);\n    result[0][0] = m[0][0];\n    result[0][1] = m[1][0];\n    result[1][0] = m[0][1];\n    result[1][1] = m[1][1];\n    return result;\n  }\n};\n\ntemplate <typename T, precision P>\nstruct compute_transpose<detail::tmat2x3, T, P> {\n  GLM_FUNC_QUALIFIER static detail::tmat3x2<T, P> call(\n      detail::tmat2x3<T, P> const& m) {\n    detail::tmat3x2<T, P> result(detail::tmat3x2<T, P>::_null);\n    result[0][0] = m[0][0];\n    result[0][1] = m[1][0];\n    result[1][0] = m[0][1];\n    result[1][1] = m[1][1];\n    result[2][0] = m[0][2];\n    result[2][1] = m[1][2];\n    return result;\n  }\n};\n\ntemplate <typename T, precision P>\nstruct compute_transpose<detail::tmat2x4, T, P> {\n  GLM_FUNC_QUALIFIER static detail::tmat4x2<T, P> call(\n      detail::tmat2x4<T, P> const& m) {\n    detail::tmat4x2<T, P> result(detail::tmat4x2<T, P>::_null);\n    result[0][0] = m[0][0];\n    result[0][1] = m[1][0];\n    result[1][0] = m[0][1];\n    result[1][1] = m[1][1];\n    result[2][0] = m[0][2];\n    result[2][1] = m[1][2];\n    result[3][0] = m[0][3];\n    result[3][1] = m[1][3];\n    return result;\n  }\n};\n\ntemplate <typename T, precision P>\nstruct compute_transpose<detail::tmat3x2, T, P> {\n  GLM_FUNC_QUALIFIER static detail::tmat2x3<T, P> call(\n      detail::tmat3x2<T, P> const& m) {\n    detail::tmat2x3<T, P> result(detail::tmat2x3<T, P>::_null);\n    result[0][0] = m[0][0];\n    result[0][1] = m[1][0];\n    result[0][2] = m[2][0];\n    result[1][0] = m[0][1];\n    result[1][1] = m[1][1];\n    result[1][2] = m[2][1];\n    return result;\n  }\n};\n\ntemplate <typename T, precision P>\nstruct compute_transpose<detail::tmat3x3, T, P> {\n  GLM_FUNC_QUALIFIER static detail::tmat3x3<T, P> call(\n      detail::tmat3x3<T, P> const& m) {\n    detail::tmat3x3<T, P> result(detail::tmat3x3<T, P>::_null);\n    result[0][0] = m[0][0];\n    result[0][1] = m[1][0];\n    result[0][2] = m[2][0];\n\n    result[1][0] = m[0][1];\n    result[1][1] = m[1][1];\n    result[1][2] = m[2][1];\n\n    result[2][0] = m[0][2];\n    result[2][1] = m[1][2];\n    result[2][2] = m[2][2];\n    return result;\n  }\n};\n\ntemplate <typename T, precision P>\nstruct compute_transpose<detail::tmat3x4, T, P> {\n  GLM_FUNC_QUALIFIER static detail::tmat4x3<T, P> call(\n      detail::tmat3x4<T, P> const& m) {\n    detail::tmat4x3<T, P> result(detail::tmat4x3<T, P>::_null);\n    result[0][0] = m[0][0];\n    result[0][1] = m[1][0];\n    result[0][2] = m[2][0];\n    result[1][0] = m[0][1];\n    result[1][1] = m[1][1];\n    result[1][2] = m[2][1];\n    result[2][0] = m[0][2];\n    result[2][1] = m[1][2];\n    result[2][2] = m[2][2];\n    result[3][0] = m[0][3];\n    result[3][1] = m[1][3];\n    result[3][2] = m[2][3];\n    return result;\n  }\n};\n\ntemplate <typename T, precision P>\nstruct compute_transpose<detail::tmat4x2, T, P> {\n  GLM_FUNC_QUALIFIER static detail::tmat2x4<T, P> call(\n      detail::tmat4x2<T, P> const& m) {\n    detail::tmat2x4<T, P> result(detail::tmat2x4<T, P>::_null);\n    result[0][0] = m[0][0];\n    result[0][1] = m[1][0];\n    result[0][2] = m[2][0];\n    result[0][3] = m[3][0];\n    result[1][0] = m[0][1];\n    result[1][1] = m[1][1];\n    result[1][2] = m[2][1];\n    result[1][3] = m[3][1];\n    return result;\n  }\n};\n\ntemplate <typename T, precision P>\nstruct compute_transpose<detail::tmat4x3, T, P> {\n  GLM_FUNC_QUALIFIER static detail::tmat3x4<T, P> call(\n      detail::tmat4x3<T, P> const& m) {\n    detail::tmat3x4<T, P> result(detail::tmat3x4<T, P>::_null);\n    result[0][0] = m[0][0];\n    result[0][1] = m[1][0];\n    result[0][2] = m[2][0];\n    result[0][3] = m[3][0];\n    result[1][0] = m[0][1];\n    result[1][1] = m[1][1];\n    result[1][2] = m[2][1];\n    result[1][3] = m[3][1];\n    result[2][0] = m[0][2];\n    result[2][1] = m[1][2];\n    result[2][2] = m[2][2];\n    result[2][3] = m[3][2];\n    return result;\n  }\n};\n\ntemplate <typename T, precision P>\nstruct compute_transpose<detail::tmat4x4, T, P> {\n  GLM_FUNC_QUALIFIER static detail::tmat4x4<T, P> call(\n      detail::tmat4x4<T, P> const& m) {\n    detail::tmat4x4<T, P> result(detail::tmat4x4<T, P>::_null);\n    result[0][0] = m[0][0];\n    result[0][1] = m[1][0];\n    result[0][2] = m[2][0];\n    result[0][3] = m[3][0];\n\n    result[1][0] = m[0][1];\n    result[1][1] = m[1][1];\n    result[1][2] = m[2][1];\n    result[1][3] = m[3][1];\n\n    result[2][0] = m[0][2];\n    result[2][1] = m[1][2];\n    result[2][2] = m[2][2];\n    result[2][3] = m[3][2];\n\n    result[3][0] = m[0][3];\n    result[3][1] = m[1][3];\n    result[3][2] = m[2][3];\n    result[3][3] = m[3][3];\n    return result;\n  }\n};\n\ntemplate <template <class, precision> class matType, typename T, precision P>\nstruct compute_determinant {};\n\ntemplate <typename T, precision P>\nstruct compute_determinant<detail::tmat2x2, T, P> {\n  GLM_FUNC_QUALIFIER static T call(detail::tmat2x2<T, P> const& m) {\n    return m[0][0] * m[1][1] - m[1][0] * m[0][1];\n  }\n};\n\ntemplate <typename T, precision P>\nstruct compute_determinant<detail::tmat3x3, T, P> {\n  GLM_FUNC_QUALIFIER static T call(detail::tmat3x3<T, P> const& m) {\n    return +m[0][0] * (m[1][1] * m[2][2] - m[2][1] * m[1][2]) -\n           m[1][0] * (m[0][1] * m[2][2] - m[2][1] * m[0][2]) +\n           m[2][0] * (m[0][1] * m[1][2] - m[1][1] * m[0][2]);\n  }\n};\n\ntemplate <typename T, precision P>\nstruct compute_determinant<detail::tmat4x4, T, P> {\n  GLM_FUNC_QUALIFIER static T call(detail::tmat4x4<T, P> const& m) {\n    T SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];\n    T SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];\n    T SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];\n    T SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];\n    T SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];\n    T SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];\n\n    detail::tvec4<T, P> DetCof(+(m[1][1] * SubFactor00 - m[1][2] * SubFactor01 +\n                                 m[1][3] * SubFactor02),\n                               -(m[1][0] * SubFactor00 - m[1][2] * SubFactor03 +\n                                 m[1][3] * SubFactor04),\n                               +(m[1][0] * SubFactor01 - m[1][1] * SubFactor03 +\n                                 m[1][3] * SubFactor05),\n                               -(m[1][0] * SubFactor02 - m[1][1] * SubFactor04 +\n                                 m[1][2] * SubFactor05));\n\n    return m[0][0] * DetCof[0] + m[0][1] * DetCof[1] + m[0][2] * DetCof[2] +\n           m[0][3] * DetCof[3];\n  }\n};\n}  // namespace detail\n\ntemplate <typename T, precision P, template <typename, precision> class matType>\nGLM_FUNC_QUALIFIER matType<T, P> matrixCompMult(matType<T, P> const& x,\n                                                matType<T, P> const& y) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'matrixCompMult' only accept floating-point inputs\");\n\n  matType<T, P> result(matType<T, P>::_null);\n  for (length_t i = 0; i < result.length(); ++i) result[i] = x[i] * y[i];\n  return result;\n}\n\ntemplate <typename T, precision P,\n          template <typename, precision> class vecTypeA,\n          template <typename, precision> class vecTypeB>\nGLM_FUNC_QUALIFIER\n    typename detail::outerProduct_trait<T, P, vecTypeA, vecTypeB>::type\n    outerProduct(vecTypeA<T, P> const& c, vecTypeB<T, P> const& r) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'outerProduct' only accept floating-point inputs\");\n  return detail::compute_outerProduct<vecTypeA, vecTypeB, T, P>::call(c, r);\n}\n\ntemplate <typename T, precision P, template <typename, precision> class matType>\nGLM_FUNC_QUALIFIER typename matType<T, P>::transpose_type transpose(\n    matType<T, P> const& m) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'transpose' only accept floating-point inputs\");\n  return detail::compute_transpose<matType, T, P>::call(m);\n}\n\ntemplate <typename T, precision P, template <typename, precision> class matType>\nGLM_FUNC_QUALIFIER T determinant(matType<T, P> const& m) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'determinant' only accept floating-point inputs\");\n  return detail::compute_determinant<matType, T, P>::call(m);\n}\n\ntemplate <typename T, precision P, template <typename, precision> class matType>\nGLM_FUNC_QUALIFIER matType<T, P> inverse(matType<T, P> const& m) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'inverse' only accept floating-point inputs\");\n  return detail::compute_inverse<matType, T, P>::call(m);\n}\n\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/func_noise.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/func_noise.hpp\n/// @date 2008-08-01 / 2011-06-18\n/// @author Christophe Riccio\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.13 Noise Functions</a>\n///\n/// @defgroup core_func_noise Noise functions\n/// @ingroup core\n///\n/// Noise functions are stochastic functions that can be used to increase visual\n/// complexity. Values returned by the following noise functions give the\n/// appearance of randomness, but are not truly random.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_core_func_noise\n#define glm_core_func_noise\n\n#include \"setup.hpp\"\n#include \"type_vec1.hpp\"\n#include \"type_vec2.hpp\"\n#include \"type_vec3.hpp\"\n\nnamespace glm {\n/// @addtogroup core_func_noise\n/// @{\n\n/// Returns a 1D noise value based on the input value x.\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/noise1.xml\">GLSL\n/// noise1 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.13 Noise Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL typename genType::value_type noise1(genType const& x);\n\n/// Returns a 2D noise value based on the input value x.\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/noise2.xml\">GLSL\n/// noise2 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.13 Noise Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL detail::tvec2<typename genType::value_type, defaultp> noise2(\n    genType const& x);\n\n/// Returns a 3D noise value based on the input value x.\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/noise3.xml\">GLSL\n/// noise3 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.13 Noise Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL detail::tvec3<typename genType::value_type, defaultp> noise3(\n    genType const& x);\n\n/// Returns a 4D noise value based on the input value x.\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/noise4.xml\">GLSL\n/// noise4 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.13 Noise Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL detail::tvec4<typename genType::value_type, defaultp> noise4(\n    genType const& x);\n\n/// @}\n}  // namespace glm\n\n#include \"func_noise.inl\"\n\n#endif  // glm_core_func_noise\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/func_noise.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/func_noise.inl\n/// @date 2008-08-01 / 2011-09-27\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#include \"../detail/_noise.hpp\"\n#include \"./func_common.hpp\"\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> grad4(T const& j,\n                                             detail::tvec4<T, P> const& ip) {\n  detail::tvec3<T, P> pXYZ =\n      floor(fract(detail::tvec3<T, P>(j) * detail::tvec3<T, P>(ip)) * T(7)) *\n          ip[2] -\n      T(1);\n  T pW = static_cast<T>(1.5) - dot(abs(pXYZ), detail::tvec3<T, P>(1));\n  detail::tvec4<T, P> s = detail::tvec4<T, P>(\n      lessThan(detail::tvec4<T, P>(pXYZ, pW), detail::tvec4<T, P>(0.0)));\n  pXYZ = pXYZ + (detail::tvec3<T, P>(s) * T(2) - T(1)) * s.w;\n  return detail::tvec4<T, P>(pXYZ, pW);\n}\n}  // namespace detail\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER T noise1(T const& x) {\n  return noise1(detail::tvec2<T, defaultp>(x, T(0)));\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tvec2<T, defaultp> noise2(T const& x) {\n  return detail::tvec2<T, defaultp>(noise1(x + T(0.0)), noise1(x + T(1.0)));\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tvec3<T, defaultp> noise3(T const& x) {\n  return detail::tvec3<T, defaultp>(noise1(x - T(1.0)), noise1(x + T(0.0)),\n                                    noise1(x + T(1.0)));\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tvec4<T, defaultp> noise4(T const& x) {\n  return detail::tvec4<T, defaultp>(noise1(x - T(1.0)), noise1(x + T(0.0)),\n                                    noise1(x + T(1.0)), noise1(x + T(2.0)));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T noise1(detail::tvec2<T, P> const& v) {\n  detail::tvec4<T, P> const C =\n      detail::tvec4<T, P>(T(0.211324865405187),   // (3.0 -  sqrt(3.0)) / 6.0\n                          T(0.366025403784439),   //  0.5 * (sqrt(3.0)  - 1.0)\n                          T(-0.577350269189626),  // -1.0 + 2.0 * C.x\n                          T(0.024390243902439));  //  1.0 / 41.0\n\n  // First corner\n  detail::tvec2<T, P> i = floor(v + dot(v, detail::tvec2<T, P>(C[1])));\n  detail::tvec2<T, P> x0 = v - i + dot(i, detail::tvec2<T, P>(C[0]));\n\n  // Other corners\n  // i1.x = step( x0.y, x0.x ); // x0.x > x0.y ? 1.0 : 0.0\n  // i1.y = 1.0 - i1.x;\n  detail::tvec2<T, P> i1 =\n      (x0.x > x0.y) ? detail::tvec2<T, P>(1, 0) : detail::tvec2<T, P>(0, 1);\n\n  // x0 = x0 - 0.0 + 0.0 * C.xx ;\n  // x1 = x0 - i1 + 1.0 * C.xx ;\n  // x2 = x0 - 1.0 + 2.0 * C.xx ;\n  detail::tvec4<T, P> x12 = detail::tvec4<T, P>(x0.x, x0.y, x0.x, x0.y) +\n                            detail::tvec4<T, P>(C.x, C.x, C.z, C.z);\n  x12 = detail::tvec4<T, P>(detail::tvec2<T, P>(x12) - i1, x12.z, x12.w);\n\n  // Permutations\n  i = mod(i, T(289));  // Avoid truncation effects in permutation\n  detail::tvec3<T, P> p = detail::permute(\n      detail::permute(i.y + detail::tvec3<T, P>(T(0), i1.y, T(1))) + i.x +\n      detail::tvec3<T, P>(T(0), i1.x, T(1)));\n\n  detail::tvec3<T, P> m =\n      max(T(0.5) - detail::tvec3<T, P>(dot(x0, x0),\n                                       dot(detail::tvec2<T, P>(x12.x, x12.y),\n                                           detail::tvec2<T, P>(x12.x, x12.y)),\n                                       dot(detail::tvec2<T, P>(x12.z, x12.w),\n                                           detail::tvec2<T, P>(x12.z, x12.w))),\n          T(0));\n\n  m = m * m;\n  m = m * m;\n\n  // Gradients: 41 points uniformly over a line, mapped onto a diamond.\n  // The ring size 17*17 = 289 is close to a multiple of 41 (41*7 = 287)\n\n  detail::tvec3<T, P> x = static_cast<T>(2) * fract(p * C.w) - T(1);\n  detail::tvec3<T, P> h = abs(x) - T(0.5);\n  detail::tvec3<T, P> ox = floor(x + T(0.5));\n  detail::tvec3<T, P> a0 = x - ox;\n\n  // Normalise gradients implicitly by scaling m\n  // Inlined for speed: m *= taylorInvSqrt( a0*a0 + h*h );\n  m *= static_cast<T>(1.79284291400159) -\n       T(0.85373472095314) * (a0 * a0 + h * h);\n\n  // Compute final noise value at P\n  detail::tvec3<T, P> g;\n  g.x = a0.x * x0.x + h.x * x0.y;\n  // g.yz = a0.yz * x12.xz + h.yz * x12.yw;\n  g.y = a0.y * x12.x + h.y * x12.y;\n  g.z = a0.z * x12.z + h.z * x12.w;\n  return T(130) * dot(m, g);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T noise1(detail::tvec3<T, P> const& v) {\n  detail::tvec2<T, P> const C(1.0 / 6.0, 1.0 / 3.0);\n  detail::tvec4<T, P> const D(0.0, 0.5, 1.0, 2.0);\n\n  // First corner\n  detail::tvec3<T, P> i(floor(v + dot(v, detail::tvec3<T, P>(C.y))));\n  detail::tvec3<T, P> x0(v - i + dot(i, detail::tvec3<T, P>(C.x)));\n\n  // Other corners\n  detail::tvec3<T, P> g(step(detail::tvec3<T, P>(x0.y, x0.z, x0.x), x0));\n  detail::tvec3<T, P> l(T(1) - g);\n  detail::tvec3<T, P> i1(min(g, detail::tvec3<T, P>(l.z, l.x, l.y)));\n  detail::tvec3<T, P> i2(max(g, detail::tvec3<T, P>(l.z, l.x, l.y)));\n\n  // x0 = x0 - 0.0 + 0.0 * C.xxx;\n  // x1 = x0 - i1  + 1.0 * C.xxx;\n  // x2 = x0 - i2  + 2.0 * C.xxx;\n  // x3 = x0 - 1.0 + 3.0 * C.xxx;\n  detail::tvec3<T, P> x1(x0 - i1 + C.x);\n  detail::tvec3<T, P> x2(x0 - i2 + C.y);  // 2.0*C.x = 1/3 = C.y\n  detail::tvec3<T, P> x3(x0 - D.y);       // -1.0+3.0*C.x = -0.5 = -D.y\n\n  // Permutations\n  i = mod289(i);\n  detail::tvec4<T, P> p(detail::permute(\n      detail::permute(\n          detail::permute(i.z + detail::tvec4<T, P>(T(0), i1.z, i2.z, T(1))) +\n          i.y + detail::tvec4<T, P>(T(0), i1.y, i2.y, T(1))) +\n      i.x + detail::tvec4<T, P>(T(0), i1.x, i2.x, T(1))));\n\n  // Gradients: 7x7 points over a square, mapped onto an octahedron.\n  // The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)\n  T n_ = static_cast<T>(0.142857142857);  // 1.0/7.0\n  detail::tvec3<T, P> ns(n_ * detail::tvec3<T, P>(D.w, D.y, D.z) -\n                         detail::tvec3<T, P>(D.x, D.z, D.x));\n\n  detail::tvec4<T, P> j(p - T(49) * floor(p * ns.z * ns.z));  // mod(p,7*7)\n\n  detail::tvec4<T, P> x_(floor(j * ns.z));\n  detail::tvec4<T, P> y_(floor(j - T(7) * x_));  // mod(j,N)\n\n  detail::tvec4<T, P> x(x_ * ns.x + ns.y);\n  detail::tvec4<T, P> y(y_ * ns.x + ns.y);\n  detail::tvec4<T, P> h(T(1) - abs(x) - abs(y));\n\n  detail::tvec4<T, P> b0(x.x, x.y, y.x, y.y);\n  detail::tvec4<T, P> b1(x.z, x.w, y.z, y.w);\n\n  // vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0;\n  // vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;\n  detail::tvec4<T, P> s0(floor(b0) * T(2) + T(1));\n  detail::tvec4<T, P> s1(floor(b1) * T(2) + T(1));\n  detail::tvec4<T, P> sh(-step(h, detail::tvec4<T, P>(0.0)));\n\n  detail::tvec4<T, P> a0 = detail::tvec4<T, P>(b0.x, b0.z, b0.y, b0.w) +\n                           detail::tvec4<T, P>(s0.x, s0.z, s0.y, s0.w) *\n                               detail::tvec4<T, P>(sh.x, sh.x, sh.y, sh.y);\n  detail::tvec4<T, P> a1 = detail::tvec4<T, P>(b1.x, b1.z, b1.y, b1.w) +\n                           detail::tvec4<T, P>(s1.x, s1.z, s1.y, s1.w) *\n                               detail::tvec4<T, P>(sh.z, sh.z, sh.w, sh.w);\n\n  detail::tvec3<T, P> p0(a0.x, a0.y, h.x);\n  detail::tvec3<T, P> p1(a0.z, a0.w, h.y);\n  detail::tvec3<T, P> p2(a1.x, a1.y, h.z);\n  detail::tvec3<T, P> p3(a1.z, a1.w, h.w);\n\n  // Normalise gradients\n  detail::tvec4<T, P> norm = taylorInvSqrt(\n      detail::tvec4<T, P>(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)));\n  p0 *= norm.x;\n  p1 *= norm.y;\n  p2 *= norm.z;\n  p3 *= norm.w;\n\n  // Mix final noise value\n  detail::tvec4<T, P> m =\n      max(T(0.6) - detail::tvec4<T, P>(dot(x0, x0), dot(x1, x1), dot(x2, x2),\n                                       dot(x3, x3)),\n          T(0));\n  m = m * m;\n  return T(42) * dot(m * m, detail::tvec4<T, P>(dot(p0, x0), dot(p1, x1),\n                                                dot(p2, x2), dot(p3, x3)));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T noise1(detail::tvec4<T, P> const& v) {\n  detail::tvec4<T, P> const C(0.138196601125011,    // (5 - sqrt(5))/20  G4\n                              0.276393202250021,    // 2 * G4\n                              0.414589803375032,    // 3 * G4\n                              -0.447213595499958);  // -1 + 4 * G4\n\n  // (sqrt(5) - 1)/4 = F4, used once below\n  T const F4 = static_cast<T>(0.309016994374947451);\n\n  // First corner\n  detail::tvec4<T, P> i = floor(v + dot(v, detail::tvec4<T, P>(F4)));\n  detail::tvec4<T, P> x0 = v - i + dot(i, detail::tvec4<T, P>(C.x));\n\n  // Other corners\n\n  // Rank sorting originally contributed by Bill Licea-Kane, AMD (formerly ATI)\n  detail::tvec4<T, P> i0;\n  detail::tvec3<T, P> isX =\n      step(detail::tvec3<T, P>(x0.y, x0.z, x0.w), detail::tvec3<T, P>(x0.x));\n  detail::tvec3<T, P> isYZ = step(detail::tvec3<T, P>(x0.z, x0.w, x0.w),\n                                  detail::tvec3<T, P>(x0.y, x0.y, x0.z));\n\n  //  i0.x = dot(isX, vec3(1.0));\n  // i0.x = isX.x + isX.y + isX.z;\n  // i0.yzw = static_cast<T>(1) - isX;\n  i0 = detail::tvec4<T, P>(isX.x + isX.y + isX.z, T(1) - isX);\n\n  //  i0.y += dot(isYZ.xy, vec2(1.0));\n  i0.y += isYZ.x + isYZ.y;\n\n  // i0.zw += 1.0 - detail::tvec2<T, P>(isYZ.x, isYZ.y);\n  i0.z += static_cast<T>(1) - isYZ.x;\n  i0.w += static_cast<T>(1) - isYZ.y;\n  i0.z += isYZ.z;\n  i0.w += static_cast<T>(1) - isYZ.z;\n\n  // i0 now contains the unique values 0,1,2,3 in each channel\n  detail::tvec4<T, P> i3 = clamp(i0, T(0), T(1));\n  detail::tvec4<T, P> i2 = clamp(i0 - T(1), T(0), T(1));\n  detail::tvec4<T, P> i1 = clamp(i0 - T(2), T(0), T(1));\n\n  //  x0 = x0 - 0.0 + 0.0 * C.xxxx\n  //  x1 = x0 - i1  + 0.0 * C.xxxx\n  //  x2 = x0 - i2  + 0.0 * C.xxxx\n  //  x3 = x0 - i3  + 0.0 * C.xxxx\n  //  x4 = x0 - 1.0 + 4.0 * C.xxxx\n  detail::tvec4<T, P> x1 = x0 - i1 + C.x;\n  detail::tvec4<T, P> x2 = x0 - i2 + C.y;\n  detail::tvec4<T, P> x3 = x0 - i3 + C.z;\n  detail::tvec4<T, P> x4 = x0 + C.w;\n\n  // Permutations\n  i = mod(i, T(289));\n  T j0 = detail::permute(\n      detail::permute(detail::permute(detail::permute(i.w) + i.z) + i.y) + i.x);\n  detail::tvec4<T, P> j1 = detail::permute(\n      detail::permute(\n          detail::permute(detail::permute(i.w + detail::tvec4<T, P>(\n                                                    i1.w, i2.w, i3.w, T(1))) +\n                          i.z + detail::tvec4<T, P>(i1.z, i2.z, i3.z, T(1))) +\n          i.y + detail::tvec4<T, P>(i1.y, i2.y, i3.y, T(1))) +\n      i.x + detail::tvec4<T, P>(i1.x, i2.x, i3.x, T(1)));\n\n  // Gradients: 7x7x6 points over a cube, mapped onto a 4-cross polytope\n  // 7*7*6 = 294, which is close to the ring size 17*17 = 289.\n  detail::tvec4<T, P> ip =\n      detail::tvec4<T, P>(T(1) / T(294), T(1) / T(49), T(1) / T(7), T(0));\n\n  detail::tvec4<T, P> p0 = detail::grad4(j0, ip);\n  detail::tvec4<T, P> p1 = detail::grad4(j1.x, ip);\n  detail::tvec4<T, P> p2 = detail::grad4(j1.y, ip);\n  detail::tvec4<T, P> p3 = detail::grad4(j1.z, ip);\n  detail::tvec4<T, P> p4 = detail::grad4(j1.w, ip);\n\n  // Normalise gradients\n  detail::tvec4<T, P> norm = detail::taylorInvSqrt(\n      detail::tvec4<T, P>(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)));\n  p0 *= norm.x;\n  p1 *= norm.y;\n  p2 *= norm.z;\n  p3 *= norm.w;\n  p4 *= taylorInvSqrt(dot(p4, p4));\n\n  // Mix contributions from the five corners\n  detail::tvec3<T, P> m0 =\n      max(T(0.6) - detail::tvec3<T, P>(dot(x0, x0), dot(x1, x1), dot(x2, x2)),\n          T(0));\n  detail::tvec2<T, P> m1 =\n      max(T(0.6) - detail::tvec2<T, P>(dot(x3, x3), dot(x4, x4)), T(0));\n  m0 = m0 * m0;\n  m1 = m1 * m1;\n\n  return T(49) * (dot(m0 * m0, detail::tvec3<T, P>(dot(p0, x0), dot(p1, x1),\n                                                   dot(p2, x2))) +\n                  dot(m1 * m1, detail::tvec2<T, P>(dot(p3, x3), dot(p4, x4))));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<T, P> noise2(detail::tvec2<T, P> const& x) {\n  return detail::tvec2<T, P>(noise1(x + detail::tvec2<T, P>(0.0)),\n                             noise1(detail::tvec2<T, P>(0.0) - x));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<T, P> noise2(detail::tvec3<T, P> const& x) {\n  return detail::tvec2<T, P>(noise1(x + detail::tvec3<T, P>(0.0)),\n                             noise1(detail::tvec3<T, P>(0.0) - x));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<T, P> noise2(detail::tvec4<T, P> const& x) {\n  return detail::tvec2<T, P>(noise1(x + detail::tvec4<T, P>(0)),\n                             noise1(detail::tvec4<T, P>(0) - x));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> noise3(detail::tvec2<T, P> const& x) {\n  return detail::tvec3<T, P>(noise1(x - detail::tvec2<T, P>(1.0)),\n                             noise1(x + detail::tvec2<T, P>(0.0)),\n                             noise1(x + detail::tvec2<T, P>(1.0)));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> noise3(detail::tvec3<T, P> const& x) {\n  return detail::tvec3<T, P>(noise1(x - detail::tvec3<T, P>(1.0)),\n                             noise1(x + detail::tvec3<T, P>(0.0)),\n                             noise1(x + detail::tvec3<T, P>(1.0)));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> noise3(detail::tvec4<T, P> const& x) {\n  return detail::tvec3<T, P>(noise1(x - detail::tvec4<T, P>(1)),\n                             noise1(x + detail::tvec4<T, P>(0)),\n                             noise1(x + detail::tvec4<T, P>(1)));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> noise4(detail::tvec2<T, P> const& x) {\n  return detail::tvec4<T, P>(\n      noise1(x - detail::tvec2<T, P>(1)), noise1(x + detail::tvec2<T, P>(0)),\n      noise1(x + detail::tvec2<T, P>(1)), noise1(x + detail::tvec2<T, P>(2)));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> noise4(detail::tvec3<T, P> const& x) {\n  return detail::tvec4<T, P>(\n      noise1(x - detail::tvec3<T, P>(1)), noise1(x + detail::tvec3<T, P>(0)),\n      noise1(x + detail::tvec3<T, P>(1)), noise1(x + detail::tvec3<T, P>(2)));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> noise4(detail::tvec4<T, P> const& x) {\n  return detail::tvec4<T, P>(\n      noise1(x - detail::tvec4<T, P>(1)), noise1(x + detail::tvec4<T, P>(0)),\n      noise1(x + detail::tvec4<T, P>(1)), noise1(x + detail::tvec4<T, P>(2)));\n}\n\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/func_packing.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/func_packing.hpp\n/// @date 2010-03-17 / 2011-06-15\n/// @author Christophe Riccio\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\n///\n/// @defgroup core_func_packing Floating-Point Pack and Unpack Functions\n/// @ingroup core\n///\n/// These functions do not operate component-wise, rather as described in each\n/// case.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_CORE_func_packing\n#define GLM_CORE_func_packing\n\n#include \"type_vec2.hpp\"\n#include \"type_vec4.hpp\"\n\nnamespace glm {\n/// @addtogroup core_func_packing\n/// @{\n\n/// First, converts each component of the normalized floating-point value v into\n/// 8- or 16-bit integer values. Then, the results are packed into the returned\n/// 32-bit unsigned integer.\n///\n/// The conversion for component c of v to fixed point is done as follows:\n/// packUnorm2x16: round(clamp(c, 0, +1) * 65535.0)\n///\n/// The first component of the vector will be written to the least significant\n/// bits of the output; the last component will be written to the most\n/// significant bits.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm2x16.xml\">GLSL\n/// packUnorm2x16 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL uint packUnorm2x16(vec2 const& v);\n\n/// First, converts each component of the normalized floating-point value v into\n/// 8- or 16-bit integer values. Then, the results are packed into the returned\n/// 32-bit unsigned integer.\n///\n/// The conversion for component c of v to fixed point is done as follows:\n/// packSnorm2x16: round(clamp(v, -1, +1) * 32767.0)\n///\n/// The first component of the vector will be written to the least significant\n/// bits of the output; the last component will be written to the most\n/// significant bits.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm2x16.xml\">GLSL\n/// packSnorm2x16 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL uint packSnorm2x16(vec2 const& v);\n\n/// First, converts each component of the normalized floating-point value v into\n/// 8- or 16-bit integer values. Then, the results are packed into the returned\n/// 32-bit unsigned integer.\n///\n/// The conversion for component c of v to fixed point is done as follows:\n/// packUnorm4x8:\tround(clamp(c, 0, +1) * 255.0)\n///\n/// The first component of the vector will be written to the least significant\n/// bits of the output; the last component will be written to the most\n/// significant bits.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm4x8.xml\">GLSL\n/// packUnorm4x8 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL uint packUnorm4x8(vec4 const& v);\n\n/// First, converts each component of the normalized floating-point value v into\n/// 8- or 16-bit integer values. Then, the results are packed into the returned\n/// 32-bit unsigned integer.\n///\n/// The conversion for component c of v to fixed point is done as follows:\n/// packSnorm4x8:\tround(clamp(c, -1, +1) * 127.0)\n///\n/// The first component of the vector will be written to the least significant\n/// bits of the output; the last component will be written to the most\n/// significant bits.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm4x8.xml\">GLSL\n/// packSnorm4x8 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL uint packSnorm4x8(vec4 const& v);\n\n/// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit\n/// unsigned integers, four 8-bit unsigned integers, or four 8-bit signed\n/// integers. Then, each component is converted to a normalized floating-point\n/// value to generate the returned two- or four-component vector.\n///\n/// The conversion for unpacked fixed-point value f to floating point is done as\n/// follows: unpackUnorm2x16: f / 65535.0\n///\n/// The first component of the returned vector will be extracted from the least\n/// significant bits of the input; the last component will be extracted from the\n/// most significant bits.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm2x16.xml\">GLSL\n/// unpackUnorm2x16 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL vec2 unpackUnorm2x16(uint const& p);\n\n/// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit\n/// unsigned integers, four 8-bit unsigned integers, or four 8-bit signed\n/// integers. Then, each component is converted to a normalized floating-point\n/// value to generate the returned two- or four-component vector.\n///\n/// The conversion for unpacked fixed-point value f to floating point is done as\n/// follows: unpackSnorm2x16: clamp(f / 32767.0, -1, +1)\n///\n/// The first component of the returned vector will be extracted from the least\n/// significant bits of the input; the last component will be extracted from the\n/// most significant bits.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm2x16.xml\">GLSL\n/// unpackSnorm2x16 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL vec2 unpackSnorm2x16(uint const& p);\n\n/// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit\n/// unsigned integers, four 8-bit unsigned integers, or four 8-bit signed\n/// integers. Then, each component is converted to a normalized floating-point\n/// value to generate the returned two- or four-component vector.\n///\n/// The conversion for unpacked fixed-point value f to floating point is done as\n/// follows: unpackUnorm4x8: f / 255.0\n///\n/// The first component of the returned vector will be extracted from the least\n/// significant bits of the input; the last component will be extracted from the\n/// most significant bits.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm4x8.xml\">GLSL\n/// unpackUnorm4x8 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL vec4 unpackUnorm4x8(uint const& p);\n\n/// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit\n/// unsigned integers, four 8-bit unsigned integers, or four 8-bit signed\n/// integers. Then, each component is converted to a normalized floating-point\n/// value to generate the returned two- or four-component vector.\n///\n/// The conversion for unpacked fixed-point value f to floating point is done as\n/// follows: unpackSnorm4x8: clamp(f / 127.0, -1, +1)\n///\n/// The first component of the returned vector will be extracted from the least\n/// significant bits of the input; the last component will be extracted from the\n/// most significant bits.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm4x8.xml\">GLSL\n/// unpackSnorm4x8 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL vec4 unpackSnorm4x8(uint const& p);\n\n/// Returns a double-precision value obtained by packing the components of v\n/// into a 64-bit value. If an IEEE 754 Inf or NaN is created, it will not\n/// signal, and the resulting floating point value is unspecified. Otherwise,\n/// the bit- level representation of v is preserved. The first vector component\n/// specifies the 32 least significant bits; the second component specifies the\n/// 32 most significant bits.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packDouble2x32.xml\">GLSL\n/// packDouble2x32 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL double packDouble2x32(uvec2 const& v);\n\n/// Returns a two-component unsigned integer vector representation of v.\n/// The bit-level representation of v is preserved.\n/// The first component of the vector contains the 32 least significant bits of\n/// the double; the second component consists the 32 most significant bits.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackDouble2x32.xml\">GLSL\n/// unpackDouble2x32 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL uvec2 unpackDouble2x32(double const& v);\n\n/// Returns an unsigned integer obtained by converting the components of a\n/// two-component floating-point vector to the 16-bit floating-point\n/// representation found in the OpenGL Specification, and then packing these two\n/// 16- bit integers into a 32-bit unsigned integer. The first vector component\n/// specifies the 16 least-significant bits of the result; the second component\n/// specifies the 16 most-significant bits.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packHalf2x16.xml\">GLSL\n/// packHalf2x16 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL uint packHalf2x16(vec2 const& v);\n\n/// Returns a two-component floating-point vector with components obtained by\n/// unpacking a 32-bit unsigned integer into a pair of 16-bit values,\n/// interpreting those values as 16-bit floating-point numbers according to the\n/// OpenGL Specification, and converting them to 32-bit floating-point values.\n/// The first component of the vector is obtained from the 16 least-significant\n/// bits of v; the second component is obtained from the 16 most-significant\n/// bits of v.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackHalf2x16.xml\">GLSL\n/// unpackHalf2x16 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL vec2 unpackHalf2x16(uint const& v);\n\n/// @}\n}  // namespace glm\n\n#include \"func_packing.inl\"\n\n#endif  // GLM_CORE_func_packing\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/func_packing.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/func_packing.inl\n/// @date 2010-03-17 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#include \"../fwd.hpp\"\n#include \"func_common.hpp\"\n#include \"type_half.hpp\"\n\nnamespace glm {\nGLM_FUNC_QUALIFIER uint packUnorm2x16(vec2 const &v) {\n  u16vec2 Topack(round(clamp(v, 0.0f, 1.0f) * 65535.0f));\n  return reinterpret_cast<uint &>(Topack);\n}\n\nGLM_FUNC_QUALIFIER vec2 unpackUnorm2x16(uint const &p) {\n  vec2 Unpack(reinterpret_cast<u16vec2 const &>(p));\n  return Unpack * float(1.5259021896696421759365224689097e-5);  // 1.0 / 65535.0\n}\n\nGLM_FUNC_QUALIFIER uint packSnorm2x16(vec2 const &v) {\n  i16vec2 Topack(round(clamp(v, -1.0f, 1.0f) * 32767.0f));\n  return reinterpret_cast<uint32 &>(Topack);\n}\n\nGLM_FUNC_QUALIFIER vec2 unpackSnorm2x16(uint const &p) {\n  vec2 Unpack(reinterpret_cast<i16vec2 const &>(p));\n  return clamp(\n      Unpack * 3.0518509475997192297128208258309e-5f,  // 1.0f / 32767.0f,\n      -1.0f, 1.0f);\n}\n\nGLM_FUNC_QUALIFIER uint packUnorm4x8(vec4 const &v) {\n  u8vec4 Topack(round(clamp(v, 0.0f, 1.0f) * 255.0f));\n  return reinterpret_cast<uint &>(Topack);\n}\n\nGLM_FUNC_QUALIFIER vec4 unpackUnorm4x8(uint const &p) {\n  vec4 Unpack(reinterpret_cast<u8vec4 const &>(p));\n  return Unpack * float(0.0039215686274509803921568627451);  // 1 / 255\n}\n\nGLM_FUNC_QUALIFIER uint packSnorm4x8(vec4 const &v) {\n  i8vec4 Topack(round(clamp(v, -1.0f, 1.0f) * 127.0f));\n  return reinterpret_cast<uint &>(Topack);\n}\n\nGLM_FUNC_QUALIFIER glm::vec4 unpackSnorm4x8(uint const &p) {\n  vec4 Unpack(reinterpret_cast<i8vec4 const &>(p));\n  return clamp(Unpack * 0.0078740157480315f,  // 1.0f / 127.0f\n               -1.0f, 1.0f);\n}\n\nGLM_FUNC_QUALIFIER double packDouble2x32(uvec2 const &v) {\n  return reinterpret_cast<double const &>(v);\n}\n\nGLM_FUNC_QUALIFIER uvec2 unpackDouble2x32(double const &v) {\n  return reinterpret_cast<uvec2 const &>(v);\n}\n\nGLM_FUNC_QUALIFIER uint packHalf2x16(vec2 const &v) {\n  i16vec2 Unpack(detail::toFloat16(v.x), detail::toFloat16(v.y));\n\n  uint *Result = reinterpret_cast<uint *>(&Unpack);\n  return *Result;\n}\n\nGLM_FUNC_QUALIFIER vec2 unpackHalf2x16(uint const &v) {\n  i16vec2 Unpack(reinterpret_cast<i16vec2 const &>(v));\n\n  return vec2(detail::toFloat32(Unpack.x), detail::toFloat32(Unpack.y));\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/func_trigonometric.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/func_trigonometric.hpp\n/// @date 2008-08-01 / 2011-06-15\n/// @author Christophe Riccio\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.1 Angle and Trigonometry Functions</a>\n///\n/// @defgroup core_func_trigonometric Angle and Trigonometry Functions\n/// @ingroup core\n///\n/// Function parameters specified as angle are assumed to be in units of\n/// radians. In no case will any of these functions result in a divide by zero\n/// error. If the divisor of a ratio is 0, then results will be undefined.\n///\n/// These all operate component-wise. The description is per component.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_CORE_func_trigonometric\n#define GLM_CORE_func_trigonometric\n\nnamespace glm {\n/// @addtogroup core_func_trigonometric\n/// @{\n\n/// Converts degrees to radians and returns the result.\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/radians.xml\">GLSL\n/// radians man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.1 Angle and Trigonometry Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType radians(genType const& degrees);\n\n/// Converts radians to degrees and returns the result.\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/degrees.xml\">GLSL\n/// degrees man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.1 Angle and Trigonometry Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType degrees(genType const& radians);\n\n/// The standard trigonometric sine function.\n/// The values returned by this function will range from [-1, 1].\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/sin.xml\">GLSL sin\n/// man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.1 Angle and Trigonometry Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType sin(genType const& angle);\n\n/// The standard trigonometric cosine function.\n/// The values returned by this function will range from [-1, 1].\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/cos.xml\">GLSL cos\n/// man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.1 Angle and Trigonometry Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType cos(genType const& angle);\n\n/// The standard trigonometric tangent function.\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/tan.xml\">GLSL tan\n/// man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.1 Angle and Trigonometry Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType tan(genType const& angle);\n\n/// Arc sine. Returns an angle whose sine is x.\n/// The range of values returned by this function is [-PI/2, PI/2].\n/// Results are undefined if |x| > 1.\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/asin.xml\">GLSL\n/// asin man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.1 Angle and Trigonometry Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType asin(genType const& x);\n\n/// Arc cosine. Returns an angle whose sine is x.\n/// The range of values returned by this function is [0, PI].\n/// Results are undefined if |x| > 1.\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/acos.xml\">GLSL\n/// acos man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.1 Angle and Trigonometry Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType acos(genType const& x);\n\n/// Arc tangent. Returns an angle whose tangent is y/x.\n/// The signs of x and y are used to determine what\n/// quadrant the angle is in. The range of values returned\n/// by this function is [-PI, PI]. Results are undefined\n/// if x and y are both 0.\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/atan.xml\">GLSL\n/// atan man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.1 Angle and Trigonometry Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType atan(genType const& y, genType const& x);\n\n/// Arc tangent. Returns an angle whose tangent is y_over_x.\n/// The range of values returned by this function is [-PI/2, PI/2].\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/atan.xml\">GLSL\n/// atan man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.1 Angle and Trigonometry Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType atan(genType const& y_over_x);\n\n/// Returns the hyperbolic sine function, (exp(x) - exp(-x)) / 2\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/sinh.xml\">GLSL\n/// sinh man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.1 Angle and Trigonometry Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType sinh(genType const& angle);\n\n/// Returns the hyperbolic cosine function, (exp(x) + exp(-x)) / 2\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/cosh.xml\">GLSL\n/// cosh man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.1 Angle and Trigonometry Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType cosh(genType const& angle);\n\n/// Returns the hyperbolic tangent function, sinh(angle) / cosh(angle)\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/tanh.xml\">GLSL\n/// tanh man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.1 Angle and Trigonometry Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType tanh(genType const& angle);\n\n/// Arc hyperbolic sine; returns the inverse of sinh.\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/asinh.xml\">GLSL\n/// asinh man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.1 Angle and Trigonometry Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType asinh(genType const& x);\n\n/// Arc hyperbolic cosine; returns the non-negative inverse\n/// of cosh. Results are undefined if x < 1.\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/acosh.xml\">GLSL\n/// acosh man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.1 Angle and Trigonometry Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType acosh(genType const& x);\n\n/// Arc hyperbolic tangent; returns the inverse of tanh.\n/// Results are undefined if abs(x) >= 1.\n///\n/// @tparam genType Floating-point scalar or vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/atanh.xml\">GLSL\n/// atanh man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.1 Angle and Trigonometry Functions</a>\ntemplate <typename genType>\nGLM_FUNC_DECL genType atanh(genType const& x);\n\n/// @}\n}  // namespace glm\n\n#include \"func_trigonometric.inl\"\n\n#endif  // GLM_CORE_func_trigonometric\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/func_trigonometric.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/func_trigonometric.inl\n/// @date 2008-08-03 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#include <cmath>\n#include <limits>\n\n#include \"_vectorize.hpp\"\n\nnamespace glm {\n// radians\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType radians(genType const& degrees) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'radians' only accept floating-point input\");\n\n  return degrees * genType(0.01745329251994329576923690768489);\n}\n\nVECTORIZE_VEC(radians)\n\n// degrees\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType degrees(genType const& radians) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'degrees' only accept floating-point input\");\n\n  return radians * genType(57.295779513082320876798154814105);\n}\n\nVECTORIZE_VEC(degrees)\n\n// sin\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType sin(genType const& angle) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'sin' only accept floating-point input\");\n\n  return genType(::std::sin(angle));\n}\n\nVECTORIZE_VEC(sin)\n\n// cos\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType cos(genType const& angle) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'cos' only accept floating-point input\");\n\n  return genType(::std::cos(angle));\n}\n\nVECTORIZE_VEC(cos)\n\n// tan\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType tan(genType const& angle) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'tan' only accept floating-point input\");\n\n  return genType(::std::tan(angle));\n}\n\nVECTORIZE_VEC(tan)\n\n// asin\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType asin(genType const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'asin' only accept floating-point input\");\n\n  return genType(::std::asin(x));\n}\n\nVECTORIZE_VEC(asin)\n\n// acos\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType acos(genType const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'acos' only accept floating-point input\");\n\n  return genType(::std::acos(x));\n}\n\nVECTORIZE_VEC(acos)\n\n// atan\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType atan(genType const& y, genType const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'atan' only accept floating-point input\");\n\n  return genType(::std::atan2(y, x));\n}\n\nVECTORIZE_VEC_VEC(atan)\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType atan(genType const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'atan' only accept floating-point input\");\n\n  return genType(::std::atan(x));\n}\n\nVECTORIZE_VEC(atan)\n\n// sinh\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType sinh(genType const& angle) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'sinh' only accept floating-point input\");\n\n  return genType(std::sinh(angle));\n}\n\nVECTORIZE_VEC(sinh)\n\n// cosh\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType cosh(genType const& angle) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'cosh' only accept floating-point input\");\n\n  return genType(std::cosh(angle));\n}\n\nVECTORIZE_VEC(cosh)\n\n// tanh\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType tanh(genType const& angle) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'tanh' only accept floating-point input\");\n\n  return genType(std::tanh(angle));\n}\n\nVECTORIZE_VEC(tanh)\n\n// asinh\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType asinh(genType const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'asinh' only accept floating-point input\");\n\n  return (x < genType(0) ? genType(-1)\n                         : (x > genType(0) ? genType(1) : genType(0))) *\n         log(abs(x) + sqrt(genType(1) + x * x));\n}\n\nVECTORIZE_VEC(asinh)\n\n// acosh\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType acosh(genType const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'acosh' only accept floating-point input\");\n\n  if (x < genType(1)) return genType(0);\n  return log(x + sqrt(x * x - genType(1)));\n}\n\nVECTORIZE_VEC(acosh)\n\n// atanh\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType atanh(genType const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'atanh' only accept floating-point input\");\n\n  if (abs(x) >= genType(1)) return 0;\n  return genType(0.5) * log((genType(1) + x) / (genType(1) - x));\n}\n\nVECTORIZE_VEC(atanh)\n\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/func_vector_relational.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/func_vector_relational.hpp\n/// @date 2008-08-03 / 2011-06-15\n/// @author Christophe Riccio\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.7 Vector Relational Functions</a>\n///\n/// @defgroup core_func_vector_relational Vector Relational Functions\n/// @ingroup core\n///\n/// Relational and equality operators (<, <=, >, >=, ==, !=) are defined to\n/// operate on scalars and produce scalar Boolean results. For vector results,\n/// use the following built-in functions.\n///\n/// In all cases, the sizes of all the input and return vectors for any\n/// particular call must match.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_CORE_func_vector_relational\n#define GLM_CORE_func_vector_relational\n\n#include \"precision.hpp\"\n#include \"setup.hpp\"\n\n#if !((GLM_COMPILER & GLM_COMPILER_VC) && \\\n      (GLM_COMPILER <= GLM_COMPILER_VC10))  // Workaround a Visual C++ bug\n\nnamespace glm {\n/// @addtogroup core_func_vector_relational\n/// @{\n\n/// Returns the component-wise comparison result of x < y.\n///\n/// @tparam vecType Floating-point or integer vector types.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/lessThan.xml\">GLSL\n/// lessThan man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.7 Vector Relational Functions</a>\n// TODO: Mismatched\n// template <typename T, precision P, template <typename, precision> class\n// vecType> GLM_FUNC_DECL typename vecType<T, P>::bool_type lessThan(vecType<T,\n// P> const & x, vecType<T, P> const & y);\n\n/// Returns the component-wise comparison of result x <= y.\n///\n/// @tparam vecType Floating-point or integer vector types.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/lessThanEqual.xml\">GLSL\n/// lessThanEqual man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.7 Vector Relational Functions</a>\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_DECL typename vecType<T, P>::bool_type lessThanEqual(\n    vecType<T, P> const& x, vecType<T, P> const& y);\n\n/// Returns the component-wise comparison of result x > y.\n///\n/// @tparam vecType Floating-point or integer vector types.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/greaterThan.xml\">GLSL\n/// greaterThan man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.7 Vector Relational Functions</a>\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_DECL typename vecType<T, P>::bool_type greaterThan(\n    vecType<T, P> const& x, vecType<T, P> const& y);\n\n/// Returns the component-wise comparison of result x >= y.\n///\n/// @tparam vecType Floating-point or integer vector types.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/greaterThanEqual.xml\">GLSL\n/// greaterThanEqual man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.7 Vector Relational Functions</a>\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_DECL typename vecType<T, P>::bool_type greaterThanEqual(\n    vecType<T, P> const& x, vecType<T, P> const& y);\n\n/// Returns the component-wise comparison of result x == y.\n///\n/// @tparam vecType Floating-point, integer or boolean vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/equal.xml\">GLSL\n/// equal man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.7 Vector Relational Functions</a>\n// TODO: conflicts with definision\n// template <typename T, precision P, template <typename, precision> class\n// vecType> GLM_FUNC_DECL typename vecType<T, P>::bool_type equal(vecType<T, P>\n// const & x, vecType<T, P> const & y);\n\n/// Returns the component-wise comparison of result x != y.\n///\n/// @tparam vecType Floating-point, integer or boolean vector types.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/notEqual.xml\">GLSL\n/// notEqual man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.7 Vector Relational Functions</a>\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_DECL typename vecType<T, P>::bool_type notEqual(\n    vecType<T, P> const& x, vecType<T, P> const& y);\n\n/// Returns true if any component of x is true.\n///\n/// @tparam vecType Boolean vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/any.xml\">GLSL any\n/// man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.7 Vector Relational Functions</a>\ntemplate <precision P, template <typename, precision> class vecType>\nGLM_FUNC_DECL bool any(vecType<bool, P> const& v);\n\n/// Returns true if all components of x are true.\n///\n/// @tparam vecType Boolean vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/all.xml\">GLSL all\n/// man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.7 Vector Relational Functions</a>\ntemplate <precision P, template <typename, precision> class vecType>\nGLM_FUNC_DECL bool all(vecType<bool, P> const& v);\n\n/// Returns the component-wise logical complement of x.\n/// /!\\ Because of language incompatibilities between C++ and GLSL, GLM defines\n/// the function not but not_ instead.\n///\n/// @tparam vecType Boolean vector types.\n///\n/// @see <a href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/not.xml\">GLSL not\n/// man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.7 Vector Relational Functions</a>\ntemplate <precision P, template <typename, precision> class vecType>\nGLM_FUNC_DECL vecType<bool, P> not_(vecType<bool, P> const& v);\n\n/// @}\n}  // namespace glm\n\n#endif\n\n#include \"func_vector_relational.inl\"\n\n#endif  // GLM_CORE_func_vector_relational\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/func_vector_relational.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/func_vector_relational.inl\n/// @date 2008-08-03 / 2011-09-09\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#include <limits>\n\nnamespace glm {\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER typename vecType<T, P>::bool_type lessThan(\n    vecType<T, P> const& x, vecType<T, P> const& y) {\n  GLM_STATIC_ASSERT(\n      std::numeric_limits<T>::is_iec559 || std::numeric_limits<T>::is_integer,\n      \"Invalid template instantiation of 'lessThan', GLM vector types required \"\n      \"floating-point or integer value types vectors\");\n  assert(x.length() == y.length());\n\n  typename vecType<bool, P>::bool_type Result(vecType<bool, P>::_null);\n  for (int i = 0; i < x.length(); ++i) Result[i] = x[i] < y[i];\n\n  return Result;\n}\n\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER typename vecType<T, P>::bool_type lessThanEqual(\n    vecType<T, P> const& x, vecType<T, P> const& y) {\n  GLM_STATIC_ASSERT(\n      std::numeric_limits<T>::is_iec559 || std::numeric_limits<T>::is_integer,\n      \"Invalid template instantiation of 'lessThanEqual', GLM vector types \"\n      \"required floating-point or integer value types vectors\");\n  assert(x.length() == y.length());\n\n  typename vecType<bool, P>::bool_type Result(vecType<bool, P>::_null);\n  for (int i = 0; i < x.length(); ++i) Result[i] = x[i] <= y[i];\n  return Result;\n}\n\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER typename vecType<T, P>::bool_type greaterThan(\n    vecType<T, P> const& x, vecType<T, P> const& y) {\n  GLM_STATIC_ASSERT(\n      std::numeric_limits<T>::is_iec559 || std::numeric_limits<T>::is_integer,\n      \"Invalid template instantiation of 'greaterThan', GLM vector types \"\n      \"required floating-point or integer value types vectors\");\n  assert(x.length() == y.length());\n\n  typename vecType<bool, P>::bool_type Result(vecType<bool, P>::_null);\n  for (int i = 0; i < x.length(); ++i) Result[i] = x[i] > y[i];\n  return Result;\n}\n\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER typename vecType<T, P>::bool_type greaterThanEqual(\n    vecType<T, P> const& x, vecType<T, P> const& y) {\n  GLM_STATIC_ASSERT(\n      std::numeric_limits<T>::is_iec559 || std::numeric_limits<T>::is_integer,\n      \"Invalid template instantiation of 'greaterThanEqual', GLM vector types \"\n      \"required floating-point or integer value types vectors\");\n  assert(x.length() == y.length());\n\n  typename vecType<bool, P>::bool_type Result(vecType<bool, P>::_null);\n  for (int i = 0; i < x.length(); ++i) Result[i] = x[i] >= y[i];\n  return Result;\n}\n\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER typename vecType<T, P>::bool_type equal(\n    vecType<T, P> const& x, vecType<T, P> const& y) {\n  assert(x.length() == y.length());\n\n  typename vecType<bool, P>::bool_type Result(vecType<bool, P>::_null);\n  for (int i = 0; i < x.length(); ++i) Result[i] = x[i] == y[i];\n  return Result;\n}\n\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER typename vecType<T, P>::bool_type notEqual(\n    vecType<T, P> const& x, vecType<T, P> const& y) {\n  assert(x.length() == y.length());\n\n  typename vecType<bool, P>::bool_type Result(vecType<bool, P>::_null);\n  for (int i = 0; i < x.length(); ++i) Result[i] = x[i] != y[i];\n  return Result;\n}\n\ntemplate <precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER bool any(vecType<bool, P> const& v) {\n  bool Result = false;\n  for (int i = 0; i < v.length(); ++i) Result = Result || v[i];\n  return Result;\n}\n\ntemplate <precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER bool all(vecType<bool, P> const& v) {\n  bool Result = true;\n  for (int i = 0; i < v.length(); ++i) Result = Result && v[i];\n  return Result;\n}\n\ntemplate <precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER vecType<bool, P> not_(vecType<bool, P> const& v) {\n  typename vecType<bool, P>::bool_type Result(vecType<bool, P>::_null);\n  for (int i = 0; i < v.length(); ++i) Result[i] = !v[i];\n  return Result;\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/glm.cpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/glm.cpp\n/// @date 2013-04-22 / 2013-04-22\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#include <glm/glm.hpp>\n#include <glm/gtc/quaternion.hpp>\n#include <glm/gtx/dual_quaternion.hpp>\n\nnamespace glm {\nnamespace detail {\n// tvec1 type explicit instantiation\n/*\ntemplate struct tvec1<uint8, lowp>;\ntemplate struct tvec1<uint16, lowp>;\ntemplate struct tvec1<uint32, lowp>;\ntemplate struct tvec1<uint64, lowp>;\ntemplate struct tvec1<int8, lowp>;\ntemplate struct tvec1<int16, lowp>;\ntemplate struct tvec1<int32, lowp>;\ntemplate struct tvec1<int64, lowp>;\ntemplate struct tvec1<float16, lowp>;\ntemplate struct tvec1<float32, lowp>;\ntemplate struct tvec1<float64, lowp>;\n\ntemplate struct tvec1<uint8, mediump>;\ntemplate struct tvec1<uint16, mediump>;\ntemplate struct tvec1<uint32, mediump>;\ntemplate struct tvec1<uint64, mediump>;\ntemplate struct tvec1<int8, mediump>;\ntemplate struct tvec1<int16, mediump>;\ntemplate struct tvec1<int32, mediump>;\ntemplate struct tvec1<int64, mediump>;\ntemplate struct tvec1<float16, mediump>;\ntemplate struct tvec1<float32, mediump>;\ntemplate struct tvec1<float64, mediump>;\n\ntemplate struct tvec1<uint8, highp>;\ntemplate struct tvec1<uint16, highp>;\ntemplate struct tvec1<uint32, highp>;\ntemplate struct tvec1<uint64, highp>;\ntemplate struct tvec1<int8, highp>;\ntemplate struct tvec1<int16, highp>;\ntemplate struct tvec1<int32, highp>;\ntemplate struct tvec1<int64, highp>;\ntemplate struct tvec1<float16, highp>;\ntemplate struct tvec1<float32, highp>;\ntemplate struct tvec1<float64, highp>;\n*/\n// tvec2 type explicit instantiation\ntemplate struct tvec2<uint8, lowp>;\ntemplate struct tvec2<uint16, lowp>;\ntemplate struct tvec2<uint32, lowp>;\ntemplate struct tvec2<uint64, lowp>;\ntemplate struct tvec2<int8, lowp>;\ntemplate struct tvec2<int16, lowp>;\ntemplate struct tvec2<int32, lowp>;\ntemplate struct tvec2<int64, lowp>;\ntemplate struct tvec2<float32, lowp>;\ntemplate struct tvec2<float64, lowp>;\n\ntemplate struct tvec2<uint8, mediump>;\ntemplate struct tvec2<uint16, mediump>;\ntemplate struct tvec2<uint32, mediump>;\ntemplate struct tvec2<uint64, mediump>;\ntemplate struct tvec2<int8, mediump>;\ntemplate struct tvec2<int16, mediump>;\ntemplate struct tvec2<int32, mediump>;\ntemplate struct tvec2<int64, mediump>;\ntemplate struct tvec2<float32, mediump>;\ntemplate struct tvec2<float64, mediump>;\n\ntemplate struct tvec2<uint8, highp>;\ntemplate struct tvec2<uint16, highp>;\ntemplate struct tvec2<uint32, highp>;\ntemplate struct tvec2<uint64, highp>;\ntemplate struct tvec2<int8, highp>;\ntemplate struct tvec2<int16, highp>;\ntemplate struct tvec2<int32, highp>;\ntemplate struct tvec2<int64, highp>;\ntemplate struct tvec2<float32, highp>;\ntemplate struct tvec2<float64, highp>;\n\n// tvec3 type explicit instantiation\ntemplate struct tvec3<uint8, lowp>;\ntemplate struct tvec3<uint16, lowp>;\ntemplate struct tvec3<uint32, lowp>;\ntemplate struct tvec3<uint64, lowp>;\ntemplate struct tvec3<int8, lowp>;\ntemplate struct tvec3<int16, lowp>;\ntemplate struct tvec3<int32, lowp>;\ntemplate struct tvec3<int64, lowp>;\ntemplate struct tvec3<float32, lowp>;\ntemplate struct tvec3<float64, lowp>;\n\ntemplate struct tvec3<uint8, mediump>;\ntemplate struct tvec3<uint16, mediump>;\ntemplate struct tvec3<uint32, mediump>;\ntemplate struct tvec3<uint64, mediump>;\ntemplate struct tvec3<int8, mediump>;\ntemplate struct tvec3<int16, mediump>;\ntemplate struct tvec3<int32, mediump>;\ntemplate struct tvec3<int64, mediump>;\ntemplate struct tvec3<float32, mediump>;\ntemplate struct tvec3<float64, mediump>;\n\ntemplate struct tvec3<uint8, highp>;\ntemplate struct tvec3<uint16, highp>;\ntemplate struct tvec3<uint32, highp>;\ntemplate struct tvec3<uint64, highp>;\ntemplate struct tvec3<int8, highp>;\ntemplate struct tvec3<int16, highp>;\ntemplate struct tvec3<int32, highp>;\ntemplate struct tvec3<int64, highp>;\ntemplate struct tvec3<float32, highp>;\ntemplate struct tvec3<float64, highp>;\n\n// tvec4 type explicit instantiation\ntemplate struct tvec4<uint8, lowp>;\ntemplate struct tvec4<uint16, lowp>;\ntemplate struct tvec4<uint32, lowp>;\ntemplate struct tvec4<uint64, lowp>;\ntemplate struct tvec4<int8, lowp>;\ntemplate struct tvec4<int16, lowp>;\ntemplate struct tvec4<int32, lowp>;\ntemplate struct tvec4<int64, lowp>;\ntemplate struct tvec4<float32, lowp>;\ntemplate struct tvec4<float64, lowp>;\n\ntemplate struct tvec4<uint8, mediump>;\ntemplate struct tvec4<uint16, mediump>;\ntemplate struct tvec4<uint32, mediump>;\ntemplate struct tvec4<uint64, mediump>;\ntemplate struct tvec4<int8, mediump>;\ntemplate struct tvec4<int16, mediump>;\ntemplate struct tvec4<int32, mediump>;\ntemplate struct tvec4<int64, mediump>;\ntemplate struct tvec4<float32, mediump>;\ntemplate struct tvec4<float64, mediump>;\n\ntemplate struct tvec4<uint8, highp>;\ntemplate struct tvec4<uint16, highp>;\ntemplate struct tvec4<uint32, highp>;\ntemplate struct tvec4<uint64, highp>;\ntemplate struct tvec4<int8, highp>;\ntemplate struct tvec4<int16, highp>;\ntemplate struct tvec4<int32, highp>;\ntemplate struct tvec4<int64, highp>;\ntemplate struct tvec4<float32, highp>;\ntemplate struct tvec4<float64, highp>;\n\n// tmat2x2 type explicit instantiation\ntemplate struct tmat2x2<float32, lowp>;\ntemplate struct tmat2x2<float64, lowp>;\n\ntemplate struct tmat2x2<float32, mediump>;\ntemplate struct tmat2x2<float64, mediump>;\n\ntemplate struct tmat2x2<float32, highp>;\ntemplate struct tmat2x2<float64, highp>;\n\n// tmat2x3 type explicit instantiation\ntemplate struct tmat2x3<float32, lowp>;\ntemplate struct tmat2x3<float64, lowp>;\n\ntemplate struct tmat2x3<float32, mediump>;\ntemplate struct tmat2x3<float64, mediump>;\n\ntemplate struct tmat2x3<float32, highp>;\ntemplate struct tmat2x3<float64, highp>;\n\n// tmat2x4 type explicit instantiation\ntemplate struct tmat2x4<float32, lowp>;\ntemplate struct tmat2x4<float64, lowp>;\n\ntemplate struct tmat2x4<float32, mediump>;\ntemplate struct tmat2x4<float64, mediump>;\n\ntemplate struct tmat2x4<float32, highp>;\ntemplate struct tmat2x4<float64, highp>;\n\n// tmat3x2 type explicit instantiation\ntemplate struct tmat3x2<float32, lowp>;\ntemplate struct tmat3x2<float64, lowp>;\n\ntemplate struct tmat3x2<float32, mediump>;\ntemplate struct tmat3x2<float64, mediump>;\n\ntemplate struct tmat3x2<float32, highp>;\ntemplate struct tmat3x2<float64, highp>;\n\n// tmat3x3 type explicit instantiation\ntemplate struct tmat3x3<float32, lowp>;\ntemplate struct tmat3x3<float64, lowp>;\n\ntemplate struct tmat3x3<float32, mediump>;\ntemplate struct tmat3x3<float64, mediump>;\n\ntemplate struct tmat3x3<float32, highp>;\ntemplate struct tmat3x3<float64, highp>;\n\n// tmat3x4 type explicit instantiation\ntemplate struct tmat3x4<float32, lowp>;\ntemplate struct tmat3x4<float64, lowp>;\n\ntemplate struct tmat3x4<float32, mediump>;\ntemplate struct tmat3x4<float64, mediump>;\n\ntemplate struct tmat3x4<float32, highp>;\ntemplate struct tmat3x4<float64, highp>;\n\n// tmat4x2 type explicit instantiation\ntemplate struct tmat4x2<float32, lowp>;\ntemplate struct tmat4x2<float64, lowp>;\n\ntemplate struct tmat4x2<float32, mediump>;\ntemplate struct tmat4x2<float64, mediump>;\n\ntemplate struct tmat4x2<float32, highp>;\ntemplate struct tmat4x2<float64, highp>;\n\n// tmat4x3 type explicit instantiation\ntemplate struct tmat4x3<float32, lowp>;\ntemplate struct tmat4x3<float64, lowp>;\n\ntemplate struct tmat4x3<float32, mediump>;\ntemplate struct tmat4x3<float64, mediump>;\n\ntemplate struct tmat4x3<float32, highp>;\ntemplate struct tmat4x3<float64, highp>;\n\n// tmat4x4 type explicit instantiation\ntemplate struct tmat4x4<float32, lowp>;\ntemplate struct tmat4x4<float64, lowp>;\n\ntemplate struct tmat4x4<float32, mediump>;\ntemplate struct tmat4x4<float64, mediump>;\n\ntemplate struct tmat4x4<float32, highp>;\ntemplate struct tmat4x4<float64, highp>;\n\n// tquat type explicit instantiation\ntemplate struct tquat<float32, lowp>;\ntemplate struct tquat<float64, lowp>;\n\ntemplate struct tquat<float32, mediump>;\ntemplate struct tquat<float64, mediump>;\n\ntemplate struct tquat<float32, highp>;\ntemplate struct tquat<float64, highp>;\n\n// tdualquat type explicit instantiation\ntemplate struct tdualquat<float32, lowp>;\ntemplate struct tdualquat<float64, lowp>;\n\ntemplate struct tdualquat<float32, mediump>;\ntemplate struct tdualquat<float64, mediump>;\n\ntemplate struct tdualquat<float32, highp>;\ntemplate struct tdualquat<float64, highp>;\n\n}  // namespace detail\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/hint.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/hint.hpp\n/// @date 2008-08-14 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_core_type\n#define glm_core_type\n\nnamespace glm {\n// Use dont_care, nicest and fastest to optimize implementations.\nclass dont_care {};\nclass nicest {};\nclass fastest {};\n}  // namespace glm\n\n#endif  // glm_core_type\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/intrinsic_common.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/intrinsic_common.hpp\n/// @date 2009-05-11 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_detail_intrinsic_common\n#define glm_detail_intrinsic_common\n\n#include \"setup.hpp\"\n\n#if (!(GLM_ARCH & GLM_ARCH_SSE2))\n#error \"SSE2 instructions not supported or enabled\"\n#else\n\nnamespace glm {\nnamespace detail {\n__m128 sse_abs_ps(__m128 x);\n\n__m128 sse_sgn_ps(__m128 x);\n\n// floor\n__m128 sse_flr_ps(__m128 v);\n\n// trunc\n__m128 sse_trc_ps(__m128 v);\n\n// round\n__m128 sse_nd_ps(__m128 v);\n\n// roundEven\n__m128 sse_rde_ps(__m128 v);\n\n__m128 sse_rnd_ps(__m128 x);\n\n__m128 sse_ceil_ps(__m128 v);\n\n__m128 sse_frc_ps(__m128 x);\n\n__m128 sse_mod_ps(__m128 x, __m128 y);\n\n__m128 sse_modf_ps(__m128 x, __m128i& i);\n\n// GLM_FUNC_QUALIFIER __m128 sse_min_ps(__m128 x, __m128 y)\n\n// GLM_FUNC_QUALIFIER __m128 sse_max_ps(__m128 x, __m128 y)\n\n__m128 sse_clp_ps(__m128 v, __m128 minVal, __m128 maxVal);\n\n__m128 sse_mix_ps(__m128 v1, __m128 v2, __m128 a);\n\n__m128 sse_stp_ps(__m128 edge, __m128 x);\n\n__m128 sse_ssp_ps(__m128 edge0, __m128 edge1, __m128 x);\n\n__m128 sse_nan_ps(__m128 x);\n\n__m128 sse_inf_ps(__m128 x);\n\n}  // namespace detail\n}  // namespace glm\n\n#include \"intrinsic_common.inl\"\n\n#endif  // GLM_ARCH\n#endif  // glm_detail_intrinsic_common\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/intrinsic_common.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/intrinsic_common.inl\n/// @date 2009-05-08 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\nnamespace detail {\n\n#if (GLM_COMPILER & GLM_COMPILER_VC)\n#pragma warning(push)\n#pragma warning(disable : 4510 4512 4610)\n#endif\n\nunion ieee754_QNAN {\n  const float f;\n  struct i {\n    const unsigned int mantissa : 23, exp : 8, sign : 1;\n  };\n\n  ieee754_QNAN() : f(0.0) /*, mantissa(0x7FFFFF), exp(0xFF), sign(0x0)*/ {}\n};\n\n#if (GLM_COMPILER & GLM_COMPILER_VC)\n#pragma warning(pop)\n#endif\n\nstatic const __m128 GLM_VAR_USED zero = _mm_setzero_ps();\nstatic const __m128 GLM_VAR_USED one = _mm_set_ps1(1.0f);\nstatic const __m128 GLM_VAR_USED minus_one = _mm_set_ps1(-1.0f);\nstatic const __m128 GLM_VAR_USED two = _mm_set_ps1(2.0f);\nstatic const __m128 GLM_VAR_USED three = _mm_set_ps1(3.0f);\nstatic const __m128 GLM_VAR_USED pi =\n    _mm_set_ps1(3.1415926535897932384626433832795f);\nstatic const __m128 GLM_VAR_USED hundred_eighty = _mm_set_ps1(180.f);\nstatic const __m128 GLM_VAR_USED pi_over_hundred_eighty =\n    _mm_set_ps1(0.017453292519943295769236907684886f);\nstatic const __m128 GLM_VAR_USED hundred_eighty_over_pi =\n    _mm_set_ps1(57.295779513082320876798154814105f);\n\nstatic const ieee754_QNAN absMask;\nstatic const __m128 GLM_VAR_USED abs4Mask = _mm_set_ps1(absMask.f);\n\nstatic const __m128 GLM_VAR_USED _epi32_sign_mask =\n    _mm_castsi128_ps(_mm_set1_epi32(static_cast<int>(0x80000000)));\n// static const __m128 GLM_VAR_USED _epi32_inv_sign_mask =\n// _mm_castsi128_ps(_mm_set1_epi32(0x7FFFFFFF)); static const __m128\n// GLM_VAR_USED _epi32_mant_mask = _mm_castsi128_ps(_mm_set1_epi32(0x7F800000));\n// static const __m128 GLM_VAR_USED _epi32_inv_mant_mask =\n// _mm_castsi128_ps(_mm_set1_epi32(0x807FFFFF)); static const __m128\n// GLM_VAR_USED _epi32_min_norm_pos =\n// _mm_castsi128_ps(_mm_set1_epi32(0x00800000));\nstatic const __m128 GLM_VAR_USED _epi32_0 = _mm_set_ps1(0);\nstatic const __m128 GLM_VAR_USED _epi32_1 = _mm_set_ps1(1);\nstatic const __m128 GLM_VAR_USED _epi32_2 = _mm_set_ps1(2);\nstatic const __m128 GLM_VAR_USED _epi32_3 = _mm_set_ps1(3);\nstatic const __m128 GLM_VAR_USED _epi32_4 = _mm_set_ps1(4);\nstatic const __m128 GLM_VAR_USED _epi32_5 = _mm_set_ps1(5);\nstatic const __m128 GLM_VAR_USED _epi32_6 = _mm_set_ps1(6);\nstatic const __m128 GLM_VAR_USED _epi32_7 = _mm_set_ps1(7);\nstatic const __m128 GLM_VAR_USED _epi32_8 = _mm_set_ps1(8);\nstatic const __m128 GLM_VAR_USED _epi32_9 = _mm_set_ps1(9);\nstatic const __m128 GLM_VAR_USED _epi32_127 = _mm_set_ps1(127);\n// static const __m128 GLM_VAR_USED _epi32_ninf =\n// _mm_castsi128_ps(_mm_set1_epi32(0xFF800000)); static const __m128\n// GLM_VAR_USED _epi32_pinf = _mm_castsi128_ps(_mm_set1_epi32(0x7F800000));\n\nstatic const __m128 GLM_VAR_USED _ps_1_3 =\n    _mm_set_ps1(0.33333333333333333333333333333333f);\nstatic const __m128 GLM_VAR_USED _ps_0p5 = _mm_set_ps1(0.5f);\nstatic const __m128 GLM_VAR_USED _ps_1 = _mm_set_ps1(1.0f);\nstatic const __m128 GLM_VAR_USED _ps_m1 = _mm_set_ps1(-1.0f);\nstatic const __m128 GLM_VAR_USED _ps_2 = _mm_set_ps1(2.0f);\nstatic const __m128 GLM_VAR_USED _ps_3 = _mm_set_ps1(3.0f);\nstatic const __m128 GLM_VAR_USED _ps_127 = _mm_set_ps1(127.0f);\nstatic const __m128 GLM_VAR_USED _ps_255 = _mm_set_ps1(255.0f);\nstatic const __m128 GLM_VAR_USED _ps_2pow23 = _mm_set_ps1(8388608.0f);\n\nstatic const __m128 GLM_VAR_USED _ps_1_0_0_0 =\n    _mm_set_ps(1.0f, 0.0f, 0.0f, 0.0f);\nstatic const __m128 GLM_VAR_USED _ps_0_1_0_0 =\n    _mm_set_ps(0.0f, 1.0f, 0.0f, 0.0f);\nstatic const __m128 GLM_VAR_USED _ps_0_0_1_0 =\n    _mm_set_ps(0.0f, 0.0f, 1.0f, 0.0f);\nstatic const __m128 GLM_VAR_USED _ps_0_0_0_1 =\n    _mm_set_ps(0.0f, 0.0f, 0.0f, 1.0f);\n\nstatic const __m128 GLM_VAR_USED _ps_pi =\n    _mm_set_ps1(3.1415926535897932384626433832795f);\nstatic const __m128 GLM_VAR_USED _ps_pi2 =\n    _mm_set_ps1(6.283185307179586476925286766560f);\nstatic const __m128 GLM_VAR_USED _ps_2_pi =\n    _mm_set_ps1(0.63661977236758134307553505349006f);\nstatic const __m128 GLM_VAR_USED _ps_pi_2 =\n    _mm_set_ps1(1.5707963267948966192313216916398f);\nstatic const __m128 GLM_VAR_USED _ps_4_pi =\n    _mm_set_ps1(1.2732395447351626861510701069801f);\nstatic const __m128 GLM_VAR_USED _ps_pi_4 =\n    _mm_set_ps1(0.78539816339744830961566084581988f);\n\nstatic const __m128 GLM_VAR_USED _ps_sincos_p0 =\n    _mm_set_ps1(0.15707963267948963959e1f);\nstatic const __m128 GLM_VAR_USED _ps_sincos_p1 =\n    _mm_set_ps1(-0.64596409750621907082e0f);\nstatic const __m128 GLM_VAR_USED _ps_sincos_p2 =\n    _mm_set_ps1(0.7969262624561800806e-1f);\nstatic const __m128 GLM_VAR_USED _ps_sincos_p3 =\n    _mm_set_ps1(-0.468175413106023168e-2f);\nstatic const __m128 GLM_VAR_USED _ps_tan_p0 =\n    _mm_set_ps1(-1.79565251976484877988e7f);\nstatic const __m128 GLM_VAR_USED _ps_tan_p1 =\n    _mm_set_ps1(1.15351664838587416140e6f);\nstatic const __m128 GLM_VAR_USED _ps_tan_p2 =\n    _mm_set_ps1(-1.30936939181383777646e4f);\nstatic const __m128 GLM_VAR_USED _ps_tan_q0 =\n    _mm_set_ps1(-5.38695755929454629881e7f);\nstatic const __m128 GLM_VAR_USED _ps_tan_q1 =\n    _mm_set_ps1(2.50083801823357915839e7f);\nstatic const __m128 GLM_VAR_USED _ps_tan_q2 =\n    _mm_set_ps1(-1.32089234440210967447e6f);\nstatic const __m128 GLM_VAR_USED _ps_tan_q3 =\n    _mm_set_ps1(1.36812963470692954678e4f);\nstatic const __m128 GLM_VAR_USED _ps_tan_poleval = _mm_set_ps1(3.68935e19f);\nstatic const __m128 GLM_VAR_USED _ps_atan_t0 =\n    _mm_set_ps1(-0.91646118527267623468e-1f);\nstatic const __m128 GLM_VAR_USED _ps_atan_t1 =\n    _mm_set_ps1(-0.13956945682312098640e1f);\nstatic const __m128 GLM_VAR_USED _ps_atan_t2 =\n    _mm_set_ps1(-0.94393926122725531747e2f);\nstatic const __m128 GLM_VAR_USED _ps_atan_t3 =\n    _mm_set_ps1(0.12888383034157279340e2f);\nstatic const __m128 GLM_VAR_USED _ps_atan_s0 =\n    _mm_set_ps1(0.12797564625607904396e1f);\nstatic const __m128 GLM_VAR_USED _ps_atan_s1 =\n    _mm_set_ps1(0.21972168858277355914e1f);\nstatic const __m128 GLM_VAR_USED _ps_atan_s2 =\n    _mm_set_ps1(0.68193064729268275701e1f);\nstatic const __m128 GLM_VAR_USED _ps_atan_s3 =\n    _mm_set_ps1(0.28205206687035841409e2f);\n\nstatic const __m128 GLM_VAR_USED _ps_exp_hi = _mm_set_ps1(88.3762626647949f);\nstatic const __m128 GLM_VAR_USED _ps_exp_lo = _mm_set_ps1(-88.3762626647949f);\nstatic const __m128 GLM_VAR_USED _ps_exp_rln2 =\n    _mm_set_ps1(1.4426950408889634073599f);\nstatic const __m128 GLM_VAR_USED _ps_exp_p0 =\n    _mm_set_ps1(1.26177193074810590878e-4f);\nstatic const __m128 GLM_VAR_USED _ps_exp_p1 =\n    _mm_set_ps1(3.02994407707441961300e-2f);\nstatic const __m128 GLM_VAR_USED _ps_exp_q0 =\n    _mm_set_ps1(3.00198505138664455042e-6f);\nstatic const __m128 GLM_VAR_USED _ps_exp_q1 =\n    _mm_set_ps1(2.52448340349684104192e-3f);\nstatic const __m128 GLM_VAR_USED _ps_exp_q2 =\n    _mm_set_ps1(2.27265548208155028766e-1f);\nstatic const __m128 GLM_VAR_USED _ps_exp_q3 =\n    _mm_set_ps1(2.00000000000000000009e0f);\nstatic const __m128 GLM_VAR_USED _ps_exp_c1 = _mm_set_ps1(6.93145751953125e-1f);\nstatic const __m128 GLM_VAR_USED _ps_exp_c2 =\n    _mm_set_ps1(1.42860682030941723212e-6f);\nstatic const __m128 GLM_VAR_USED _ps_exp2_hi = _mm_set_ps1(127.4999961853f);\nstatic const __m128 GLM_VAR_USED _ps_exp2_lo = _mm_set_ps1(-127.4999961853f);\nstatic const __m128 GLM_VAR_USED _ps_exp2_p0 =\n    _mm_set_ps1(2.30933477057345225087e-2f);\nstatic const __m128 GLM_VAR_USED _ps_exp2_p1 =\n    _mm_set_ps1(2.02020656693165307700e1f);\nstatic const __m128 GLM_VAR_USED _ps_exp2_p2 =\n    _mm_set_ps1(1.51390680115615096133e3f);\nstatic const __m128 GLM_VAR_USED _ps_exp2_q0 =\n    _mm_set_ps1(2.33184211722314911771e2f);\nstatic const __m128 GLM_VAR_USED _ps_exp2_q1 =\n    _mm_set_ps1(4.36821166879210612817e3f);\nstatic const __m128 GLM_VAR_USED _ps_log_p0 =\n    _mm_set_ps1(-7.89580278884799154124e-1f);\nstatic const __m128 GLM_VAR_USED _ps_log_p1 =\n    _mm_set_ps1(1.63866645699558079767e1f);\nstatic const __m128 GLM_VAR_USED _ps_log_p2 =\n    _mm_set_ps1(-6.41409952958715622951e1f);\nstatic const __m128 GLM_VAR_USED _ps_log_q0 =\n    _mm_set_ps1(-3.56722798256324312549e1f);\nstatic const __m128 GLM_VAR_USED _ps_log_q1 =\n    _mm_set_ps1(3.12093766372244180303e2f);\nstatic const __m128 GLM_VAR_USED _ps_log_q2 =\n    _mm_set_ps1(-7.69691943550460008604e2f);\nstatic const __m128 GLM_VAR_USED _ps_log_c0 = _mm_set_ps1(0.693147180559945f);\nstatic const __m128 GLM_VAR_USED _ps_log2_c0 =\n    _mm_set_ps1(1.44269504088896340735992f);\n\nGLM_FUNC_QUALIFIER __m128 sse_abs_ps(__m128 x) {\n  return _mm_and_ps(glm::detail::abs4Mask, x);\n}\n\nGLM_FUNC_QUALIFIER __m128 sse_sgn_ps(__m128 x) {\n  __m128 Neg = _mm_set1_ps(-1.0f);\n  __m128 Pos = _mm_set1_ps(1.0f);\n\n  __m128 Cmp0 = _mm_cmplt_ps(x, zero);\n  __m128 Cmp1 = _mm_cmpgt_ps(x, zero);\n\n  __m128 And0 = _mm_and_ps(Cmp0, Neg);\n  __m128 And1 = _mm_and_ps(Cmp1, Pos);\n\n  return _mm_or_ps(And0, And1);\n}\n\n// floor\nGLM_FUNC_QUALIFIER __m128 sse_flr_ps(__m128 x) {\n  __m128 rnd0 = sse_rnd_ps(x);\n  __m128 cmp0 = _mm_cmplt_ps(x, rnd0);\n  __m128 and0 = _mm_and_ps(cmp0, glm::detail::_ps_1);\n  __m128 sub0 = _mm_sub_ps(rnd0, and0);\n  return sub0;\n}\n\n// trunc\n/*\nGLM_FUNC_QUALIFIER __m128 _mm_trc_ps(__m128 v)\n{\n        return __m128();\n}\n*/\n// round\nGLM_FUNC_QUALIFIER __m128 sse_rnd_ps(__m128 x) {\n  __m128 and0 = _mm_and_ps(glm::detail::_epi32_sign_mask, x);\n  __m128 or0 = _mm_or_ps(and0, glm::detail::_ps_2pow23);\n  __m128 add0 = _mm_add_ps(x, or0);\n  __m128 sub0 = _mm_sub_ps(add0, or0);\n  return sub0;\n}\n\n// roundEven\nGLM_FUNC_QUALIFIER __m128 sse_rde_ps(__m128 x) {\n  __m128 and0 = _mm_and_ps(glm::detail::_epi32_sign_mask, x);\n  __m128 or0 = _mm_or_ps(and0, glm::detail::_ps_2pow23);\n  __m128 add0 = _mm_add_ps(x, or0);\n  __m128 sub0 = _mm_sub_ps(add0, or0);\n  return sub0;\n}\n\nGLM_FUNC_QUALIFIER __m128 sse_ceil_ps(__m128 x) {\n  __m128 rnd0 = sse_rnd_ps(x);\n  __m128 cmp0 = _mm_cmpgt_ps(x, rnd0);\n  __m128 and0 = _mm_and_ps(cmp0, glm::detail::_ps_1);\n  __m128 add0 = _mm_add_ps(rnd0, and0);\n  return add0;\n}\n\nGLM_FUNC_QUALIFIER __m128 sse_frc_ps(__m128 x) {\n  __m128 flr0 = sse_flr_ps(x);\n  __m128 sub0 = _mm_sub_ps(x, flr0);\n  return sub0;\n}\n\nGLM_FUNC_QUALIFIER __m128 sse_mod_ps(__m128 x, __m128 y) {\n  __m128 div0 = _mm_div_ps(x, y);\n  __m128 flr0 = sse_flr_ps(div0);\n  __m128 mul0 = _mm_mul_ps(y, flr0);\n  __m128 sub0 = _mm_sub_ps(x, mul0);\n  return sub0;\n}\n\n/// TODO\n/*\nGLM_FUNC_QUALIFIER __m128 sse_modf_ps(__m128 x, __m128i & i)\n{\n        __m128 empty;\n        return empty;\n}\n*/\n\n// GLM_FUNC_QUALIFIER __m128 _mm_min_ps(__m128 x, __m128 y)\n\n// GLM_FUNC_QUALIFIER __m128 _mm_max_ps(__m128 x, __m128 y)\n\nGLM_FUNC_QUALIFIER __m128 sse_clp_ps(__m128 v, __m128 minVal, __m128 maxVal) {\n  __m128 min0 = _mm_min_ps(v, maxVal);\n  __m128 max0 = _mm_max_ps(min0, minVal);\n  return max0;\n}\n\nGLM_FUNC_QUALIFIER __m128 sse_mix_ps(__m128 v1, __m128 v2, __m128 a) {\n  __m128 sub0 = _mm_sub_ps(glm::detail::one, a);\n  __m128 mul0 = _mm_mul_ps(v1, sub0);\n  __m128 mul1 = _mm_mul_ps(v2, a);\n  __m128 add0 = _mm_add_ps(mul0, mul1);\n  return add0;\n}\n\nGLM_FUNC_QUALIFIER __m128 sse_stp_ps(__m128 edge, __m128 x) {\n  __m128 cmp = _mm_cmple_ps(x, edge);\n  if (_mm_movemask_ps(cmp) == 0)\n    return glm::detail::one;\n  else\n    return glm::detail::zero;\n}\n\nGLM_FUNC_QUALIFIER __m128 sse_ssp_ps(__m128 edge0, __m128 edge1, __m128 x) {\n  __m128 sub0 = _mm_sub_ps(x, edge0);\n  __m128 sub1 = _mm_sub_ps(edge1, edge0);\n  __m128 div0 = _mm_sub_ps(sub0, sub1);\n  __m128 clp0 = sse_clp_ps(div0, glm::detail::zero, glm::detail::one);\n  __m128 mul0 = _mm_mul_ps(glm::detail::two, clp0);\n  __m128 sub2 = _mm_sub_ps(glm::detail::three, mul0);\n  __m128 mul1 = _mm_mul_ps(clp0, clp0);\n  __m128 mul2 = _mm_mul_ps(mul1, sub2);\n  return mul2;\n}\n\n/// \\todo\n// GLM_FUNC_QUALIFIER __m128 sse_nan_ps(__m128 x)\n//{\n//\t__m128 empty;\n//\treturn empty;\n// }\n\n/// \\todo\n// GLM_FUNC_QUALIFIER __m128 sse_inf_ps(__m128 x)\n//{\n//\t__m128 empty;\n//\treturn empty;\n// }\n\n// SSE scalar reciprocal sqrt using rsqrt op, plus one Newton-Rhaphson iteration\n// By Elan Ruskin, http://assemblyrequired.crashworks.org/\nGLM_FUNC_QUALIFIER __m128 sse_sqrt_wip_ss(__m128 const& x) {\n  __m128 recip = _mm_rsqrt_ss(x);            // \"estimate\" opcode\n  const static __m128 three = {3, 3, 3, 3};  // aligned consts for fast load\n  const static __m128 half = {0.5, 0.5, 0.5, 0.5};\n  __m128 halfrecip = _mm_mul_ss(half, recip);\n  __m128 threeminus_xrr =\n      _mm_sub_ss(three, _mm_mul_ss(x, _mm_mul_ss(recip, recip)));\n  return _mm_mul_ss(halfrecip, threeminus_xrr);\n}\n\n}  // namespace detail\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/intrinsic_exponential.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/intrinsic_exponential.hpp\n/// @date 2009-05-11 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_detail_intrinsic_exponential\n#define glm_detail_intrinsic_exponential\n\n#include \"setup.hpp\"\n\n#if (!(GLM_ARCH & GLM_ARCH_SSE2))\n#error \"SSE2 instructions not supported or enabled\"\n#else\n\nnamespace glm {\nnamespace detail {\n/*\nGLM_FUNC_QUALIFIER __m128 sse_rsqrt_nr_ss(__m128 const x)\n{\n        __m128 recip = _mm_rsqrt_ss( x );  // \"estimate\" opcode\n        const static __m128 three = { 3, 3, 3, 3 }; // aligned consts for fast\nload const static __m128 half = { 0.5,0.5,0.5,0.5 };\n        __m128 halfrecip = _mm_mul_ss( half, recip );\n        __m128 threeminus_xrr = _mm_sub_ss( three, _mm_mul_ss( x, _mm_mul_ss (\nrecip, recip ) ) ); return _mm_mul_ss( halfrecip, threeminus_xrr );\n}\n\nGLM_FUNC_QUALIFIER __m128 sse_normalize_fast_ps(  float * RESTRICT vOut, float *\nRESTRICT vIn )\n{\n        __m128 x = _mm_load_ss(&vIn[0]);\n        __m128 y = _mm_load_ss(&vIn[1]);\n        __m128 z = _mm_load_ss(&vIn[2]);\n\n        const __m128 l =  // compute x*x + y*y + z*z\n                _mm_add_ss(\n                 _mm_add_ss( _mm_mul_ss(x,x),\n                             _mm_mul_ss(y,y)\n                            ),\n                 _mm_mul_ss( z, z )\n                );\n\n\n        const __m128 rsqt = _mm_rsqrt_nr_ss( l );\n        _mm_store_ss( &vOut[0] , _mm_mul_ss( rsqt, x ) );\n        _mm_store_ss( &vOut[1] , _mm_mul_ss( rsqt, y ) );\n        _mm_store_ss( &vOut[2] , _mm_mul_ss( rsqt, z ) );\n\n        return _mm_mul_ss( l , rsqt );\n}\n*/\n}  // namespace detail\n}  // namespace glm\n\n#endif  // GLM_ARCH\n#endif  // glm_detail_intrinsic_exponential\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/intrinsic_exponential.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/intrinsic_exponential.inl\n/// @date 2011-06-15 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/intrinsic_geometric.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/intrinsic_geometric.hpp\n/// @date 2009-05-08 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_core_intrinsic_geometric\n#define glm_core_intrinsic_geometric\n\n#include \"setup.hpp\"\n\n#if (!(GLM_ARCH & GLM_ARCH_SSE2))\n#error \"SSE2 instructions not supported or enabled\"\n#else\n\n#include \"intrinsic_common.hpp\"\n\nnamespace glm {\nnamespace detail {\n// length\n__m128 sse_len_ps(__m128 x);\n\n// distance\n__m128 sse_dst_ps(__m128 p0, __m128 p1);\n\n// dot\n__m128 sse_dot_ps(__m128 v1, __m128 v2);\n\n// SSE1\n__m128 sse_dot_ss(__m128 v1, __m128 v2);\n\n// cross\n__m128 sse_xpd_ps(__m128 v1, __m128 v2);\n\n// normalize\n__m128 sse_nrm_ps(__m128 v);\n\n// faceforward\n__m128 sse_ffd_ps(__m128 N, __m128 I, __m128 Nref);\n\n// reflect\n__m128 sse_rfe_ps(__m128 I, __m128 N);\n\n// refract\n__m128 sse_rfa_ps(__m128 I, __m128 N, __m128 eta);\n\n}  // namespace detail\n}  // namespace glm\n\n#include \"intrinsic_geometric.inl\"\n\n#endif  // GLM_ARCH\n#endif  // glm_core_intrinsic_geometric\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/intrinsic_geometric.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/intrinsic_geometric.inl\n/// @date 2009-05-08 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\nnamespace detail {\n\n// length\nGLM_FUNC_QUALIFIER __m128 sse_len_ps(__m128 x) {\n  __m128 dot0 = sse_dot_ps(x, x);\n  __m128 sqt0 = _mm_sqrt_ps(dot0);\n  return sqt0;\n}\n\n// distance\nGLM_FUNC_QUALIFIER __m128 sse_dst_ps(__m128 p0, __m128 p1) {\n  __m128 sub0 = _mm_sub_ps(p0, p1);\n  __m128 len0 = sse_len_ps(sub0);\n  return len0;\n}\n\n// dot\nGLM_FUNC_QUALIFIER __m128 sse_dot_ps(__m128 v1, __m128 v2) {\n#if ((GLM_ARCH & GLM_ARCH_AVX) == GLM_ARCH_AVX)\n  return _mm_dp_ps(v1, v2, 0xff);\n#else\n  __m128 mul0 = _mm_mul_ps(v1, v2);\n  __m128 swp0 = _mm_shuffle_ps(mul0, mul0, _MM_SHUFFLE(2, 3, 0, 1));\n  __m128 add0 = _mm_add_ps(mul0, swp0);\n  __m128 swp1 = _mm_shuffle_ps(add0, add0, _MM_SHUFFLE(0, 1, 2, 3));\n  __m128 add1 = _mm_add_ps(add0, swp1);\n  return add1;\n#endif\n}\n\n// SSE1\nGLM_FUNC_QUALIFIER __m128 sse_dot_ss(__m128 v1, __m128 v2) {\n  __m128 mul0 = _mm_mul_ps(v1, v2);\n  __m128 mov0 = _mm_movehl_ps(mul0, mul0);\n  __m128 add0 = _mm_add_ps(mov0, mul0);\n  __m128 swp1 = _mm_shuffle_ps(add0, add0, 1);\n  __m128 add1 = _mm_add_ss(add0, swp1);\n  return add1;\n}\n\n// cross\nGLM_FUNC_QUALIFIER __m128 sse_xpd_ps(__m128 v1, __m128 v2) {\n  __m128 swp0 = _mm_shuffle_ps(v1, v1, _MM_SHUFFLE(3, 0, 2, 1));\n  __m128 swp1 = _mm_shuffle_ps(v1, v1, _MM_SHUFFLE(3, 1, 0, 2));\n  __m128 swp2 = _mm_shuffle_ps(v2, v2, _MM_SHUFFLE(3, 0, 2, 1));\n  __m128 swp3 = _mm_shuffle_ps(v2, v2, _MM_SHUFFLE(3, 1, 0, 2));\n  __m128 mul0 = _mm_mul_ps(swp0, swp3);\n  __m128 mul1 = _mm_mul_ps(swp1, swp2);\n  __m128 sub0 = _mm_sub_ps(mul0, mul1);\n  return sub0;\n}\n\n// normalize\nGLM_FUNC_QUALIFIER __m128 sse_nrm_ps(__m128 v) {\n  __m128 dot0 = sse_dot_ps(v, v);\n  __m128 isr0 = _mm_rsqrt_ps(dot0);\n  __m128 mul0 = _mm_mul_ps(v, isr0);\n  return mul0;\n}\n\n// faceforward\nGLM_FUNC_QUALIFIER __m128 sse_ffd_ps(__m128 N, __m128 I, __m128 Nref) {\n  //__m128 dot0 = _mm_dot_ps(v, v);\n  //__m128 neg0 = _mm_neg_ps(N);\n  //__m128 sgn0 = _mm_sgn_ps(dot0);\n  //__m128 mix0 = _mm_mix_ps(N, neg0, sgn0);\n  // return mix0;\n\n  __m128 dot0 = sse_dot_ps(Nref, I);\n  __m128 sgn0 = sse_sgn_ps(dot0);\n  __m128 mul0 = _mm_mul_ps(sgn0, glm::detail::minus_one);\n  __m128 mul1 = _mm_mul_ps(N, mul0);\n  return mul1;\n}\n\n// reflect\nGLM_FUNC_QUALIFIER __m128 sse_rfe_ps(__m128 I, __m128 N) {\n  __m128 dot0 = sse_dot_ps(N, I);\n  __m128 mul0 = _mm_mul_ps(N, dot0);\n  __m128 mul1 = _mm_mul_ps(mul0, glm::detail::two);\n  __m128 sub0 = _mm_sub_ps(I, mul1);\n  return sub0;\n}\n\n// refract\nGLM_FUNC_QUALIFIER __m128 sse_rfa_ps(__m128 I, __m128 N, __m128 eta) {\n  __m128 dot0 = sse_dot_ps(N, I);\n  __m128 mul0 = _mm_mul_ps(eta, eta);\n  __m128 mul1 = _mm_mul_ps(dot0, dot0);\n  __m128 sub0 = _mm_sub_ps(glm::detail::one, mul0);\n  __m128 sub1 = _mm_sub_ps(glm::detail::one, mul1);\n  __m128 mul2 = _mm_mul_ps(sub0, sub1);\n\n  if (_mm_movemask_ps(_mm_cmplt_ss(mul2, glm::detail::zero)) == 0)\n    return glm::detail::zero;\n\n  __m128 sqt0 = _mm_sqrt_ps(mul2);\n  __m128 mul3 = _mm_mul_ps(eta, dot0);\n  __m128 add0 = _mm_add_ps(mul3, sqt0);\n  __m128 mul4 = _mm_mul_ps(add0, N);\n  __m128 mul5 = _mm_mul_ps(eta, I);\n  __m128 sub2 = _mm_sub_ps(mul5, mul4);\n\n  return sub2;\n}\n\n}  // namespace detail\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/intrinsic_integer.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/intrinsic_integer.hpp\n/// @date 2009-05-11 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_detail_intrinsic_integer\n#define glm_detail_intrinsic_integer\n\n#include \"glm/glm.hpp\"\n\n#if (!(GLM_ARCH & GLM_ARCH_SSE2))\n#error \"SSE2 instructions not supported or enabled\"\n#else\n\nnamespace glm {\nnamespace detail {\n__m128i _mm_bit_interleave_si128(__m128i x);\n__m128i _mm_bit_interleave_si128(__m128i x, __m128i y);\n\n}  // namespace detail\n}  // namespace glm\n\n#include \"intrinsic_integer.inl\"\n\n#endif  // GLM_ARCH\n#endif  // glm_detail_intrinsic_integer\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/intrinsic_integer.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/intrinsic_integer.inl\n/// @date 2009-05-08 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\nnamespace detail {\ninline __m128i _mm_bit_interleave_si128(__m128i x) {\n  __m128i const Mask4 = _mm_set1_epi32(0x0000FFFF);\n  __m128i const Mask3 = _mm_set1_epi32(0x00FF00FF);\n  __m128i const Mask2 = _mm_set1_epi32(0x0F0F0F0F);\n  __m128i const Mask1 = _mm_set1_epi32(0x33333333);\n  __m128i const Mask0 = _mm_set1_epi32(0x55555555);\n\n  __m128i Reg1;\n  __m128i Reg2;\n\n  // REG1 = x;\n  // REG2 = y;\n  // Reg1 = _mm_unpacklo_epi64(x, y);\n  Reg1 = x;\n\n  // REG1 = ((REG1 << 16) | REG1) & glm::uint64(0x0000FFFF0000FFFF);\n  // REG2 = ((REG2 << 16) | REG2) & glm::uint64(0x0000FFFF0000FFFF);\n  Reg2 = _mm_slli_si128(Reg1, 2);\n  Reg1 = _mm_or_si128(Reg2, Reg1);\n  Reg1 = _mm_and_si128(Reg1, Mask4);\n\n  // REG1 = ((REG1 <<  8) | REG1) & glm::uint64(0x00FF00FF00FF00FF);\n  // REG2 = ((REG2 <<  8) | REG2) & glm::uint64(0x00FF00FF00FF00FF);\n  Reg2 = _mm_slli_si128(Reg1, 1);\n  Reg1 = _mm_or_si128(Reg2, Reg1);\n  Reg1 = _mm_and_si128(Reg1, Mask3);\n\n  // REG1 = ((REG1 <<  4) | REG1) & glm::uint64(0x0F0F0F0F0F0F0F0F);\n  // REG2 = ((REG2 <<  4) | REG2) & glm::uint64(0x0F0F0F0F0F0F0F0F);\n  Reg2 = _mm_slli_epi32(Reg1, 4);\n  Reg1 = _mm_or_si128(Reg2, Reg1);\n  Reg1 = _mm_and_si128(Reg1, Mask2);\n\n  // REG1 = ((REG1 <<  2) | REG1) & glm::uint64(0x3333333333333333);\n  // REG2 = ((REG2 <<  2) | REG2) & glm::uint64(0x3333333333333333);\n  Reg2 = _mm_slli_epi32(Reg1, 2);\n  Reg1 = _mm_or_si128(Reg2, Reg1);\n  Reg1 = _mm_and_si128(Reg1, Mask1);\n\n  // REG1 = ((REG1 <<  1) | REG1) & glm::uint64(0x5555555555555555);\n  // REG2 = ((REG2 <<  1) | REG2) & glm::uint64(0x5555555555555555);\n  Reg2 = _mm_slli_epi32(Reg1, 1);\n  Reg1 = _mm_or_si128(Reg2, Reg1);\n  Reg1 = _mm_and_si128(Reg1, Mask0);\n\n  // return REG1 | (REG2 << 1);\n  Reg2 = _mm_slli_epi32(Reg1, 1);\n  Reg2 = _mm_srli_si128(Reg2, 8);\n  Reg1 = _mm_or_si128(Reg1, Reg2);\n\n  return Reg1;\n}\n\ninline __m128i _mm_bit_interleave_si128(__m128i x, __m128i y) {\n  __m128i const Mask4 = _mm_set1_epi32(0x0000FFFF);\n  __m128i const Mask3 = _mm_set1_epi32(0x00FF00FF);\n  __m128i const Mask2 = _mm_set1_epi32(0x0F0F0F0F);\n  __m128i const Mask1 = _mm_set1_epi32(0x33333333);\n  __m128i const Mask0 = _mm_set1_epi32(0x55555555);\n\n  __m128i Reg1;\n  __m128i Reg2;\n\n  // REG1 = x;\n  // REG2 = y;\n  Reg1 = _mm_unpacklo_epi64(x, y);\n\n  // REG1 = ((REG1 << 16) | REG1) & glm::uint64(0x0000FFFF0000FFFF);\n  // REG2 = ((REG2 << 16) | REG2) & glm::uint64(0x0000FFFF0000FFFF);\n  Reg2 = _mm_slli_si128(Reg1, 2);\n  Reg1 = _mm_or_si128(Reg2, Reg1);\n  Reg1 = _mm_and_si128(Reg1, Mask4);\n\n  // REG1 = ((REG1 <<  8) | REG1) & glm::uint64(0x00FF00FF00FF00FF);\n  // REG2 = ((REG2 <<  8) | REG2) & glm::uint64(0x00FF00FF00FF00FF);\n  Reg2 = _mm_slli_si128(Reg1, 1);\n  Reg1 = _mm_or_si128(Reg2, Reg1);\n  Reg1 = _mm_and_si128(Reg1, Mask3);\n\n  // REG1 = ((REG1 <<  4) | REG1) & glm::uint64(0x0F0F0F0F0F0F0F0F);\n  // REG2 = ((REG2 <<  4) | REG2) & glm::uint64(0x0F0F0F0F0F0F0F0F);\n  Reg2 = _mm_slli_epi32(Reg1, 4);\n  Reg1 = _mm_or_si128(Reg2, Reg1);\n  Reg1 = _mm_and_si128(Reg1, Mask2);\n\n  // REG1 = ((REG1 <<  2) | REG1) & glm::uint64(0x3333333333333333);\n  // REG2 = ((REG2 <<  2) | REG2) & glm::uint64(0x3333333333333333);\n  Reg2 = _mm_slli_epi32(Reg1, 2);\n  Reg1 = _mm_or_si128(Reg2, Reg1);\n  Reg1 = _mm_and_si128(Reg1, Mask1);\n\n  // REG1 = ((REG1 <<  1) | REG1) & glm::uint64(0x5555555555555555);\n  // REG2 = ((REG2 <<  1) | REG2) & glm::uint64(0x5555555555555555);\n  Reg2 = _mm_slli_epi32(Reg1, 1);\n  Reg1 = _mm_or_si128(Reg2, Reg1);\n  Reg1 = _mm_and_si128(Reg1, Mask0);\n\n  // return REG1 | (REG2 << 1);\n  Reg2 = _mm_slli_epi32(Reg1, 1);\n  Reg2 = _mm_srli_si128(Reg2, 8);\n  Reg1 = _mm_or_si128(Reg1, Reg2);\n\n  return Reg1;\n}\n}  // namespace detail\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/intrinsic_matrix.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/intrinsic_common.hpp\n/// @date 2009-06-05 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_detail_intrinsic_matrix\n#define glm_detail_intrinsic_matrix\n\n#include \"setup.hpp\"\n\n#if (!(GLM_ARCH & GLM_ARCH_SSE2))\n#error \"SSE2 instructions not supported or enabled\"\n#else\n\n#include \"intrinsic_geometric.hpp\"\n\nnamespace glm {\nnamespace detail {\nvoid sse_add_ps(__m128 in1[4], __m128 in2[4], __m128 out[4]);\n\nvoid sse_sub_ps(__m128 in1[4], __m128 in2[4], __m128 out[4]);\n\n__m128 sse_mul_ps(__m128 m[4], __m128 v);\n\n__m128 sse_mul_ps(__m128 v, __m128 m[4]);\n\nvoid sse_mul_ps(__m128 const in1[4], __m128 const in2[4], __m128 out[4]);\n\nvoid sse_transpose_ps(__m128 const in[4], __m128 out[4]);\n\nvoid sse_inverse_ps(__m128 const in[4], __m128 out[4]);\n\nvoid sse_rotate_ps(__m128 const in[4], float Angle, float const v[3],\n                   __m128 out[4]);\n\n__m128 sse_det_ps(__m128 const m[4]);\n\n__m128 sse_slow_det_ps(__m128 const m[4]);\n\n}  // namespace detail\n}  // namespace glm\n\n#include \"intrinsic_matrix.inl\"\n\n#endif  // GLM_ARCH\n#endif  // glm_detail_intrinsic_matrix\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/intrinsic_matrix.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/intrinsic_common.inl\n/// @date 2009-06-05 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\nnamespace detail {\n\nstatic const __m128 GLM_VAR_USED _m128_rad_ps =\n    _mm_set_ps1(3.141592653589793238462643383279f / 180.f);\nstatic const __m128 GLM_VAR_USED _m128_deg_ps =\n    _mm_set_ps1(180.f / 3.141592653589793238462643383279f);\n\ntemplate <typename matType>\nGLM_FUNC_QUALIFIER matType sse_comp_mul_ps(__m128 const in1[4],\n                                           __m128 const in2[4], __m128 out[4]) {\n  out[0] = _mm_mul_ps(in1[0], in2[0]);\n  out[1] = _mm_mul_ps(in1[1], in2[1]);\n  out[2] = _mm_mul_ps(in1[2], in2[2]);\n  out[3] = _mm_mul_ps(in1[3], in2[3]);\n}\n\nGLM_FUNC_QUALIFIER void sse_add_ps(__m128 const in1[4], __m128 const in2[4],\n                                   __m128 out[4]) {\n  {\n    out[0] = _mm_add_ps(in1[0], in2[0]);\n    out[1] = _mm_add_ps(in1[1], in2[1]);\n    out[2] = _mm_add_ps(in1[2], in2[2]);\n    out[3] = _mm_add_ps(in1[3], in2[3]);\n  }\n}\n\nGLM_FUNC_QUALIFIER void sse_sub_ps(__m128 const in1[4], __m128 const in2[4],\n                                   __m128 out[4]) {\n  {\n    out[0] = _mm_sub_ps(in1[0], in2[0]);\n    out[1] = _mm_sub_ps(in1[1], in2[1]);\n    out[2] = _mm_sub_ps(in1[2], in2[2]);\n    out[3] = _mm_sub_ps(in1[3], in2[3]);\n  }\n}\n\nGLM_FUNC_QUALIFIER __m128 sse_mul_ps(__m128 const m[4], __m128 v) {\n  __m128 v0 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(0, 0, 0, 0));\n  __m128 v1 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(1, 1, 1, 1));\n  __m128 v2 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(2, 2, 2, 2));\n  __m128 v3 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(3, 3, 3, 3));\n\n  __m128 m0 = _mm_mul_ps(m[0], v0);\n  __m128 m1 = _mm_mul_ps(m[1], v1);\n  __m128 m2 = _mm_mul_ps(m[2], v2);\n  __m128 m3 = _mm_mul_ps(m[3], v3);\n\n  __m128 a0 = _mm_add_ps(m0, m1);\n  __m128 a1 = _mm_add_ps(m2, m3);\n  __m128 a2 = _mm_add_ps(a0, a1);\n\n  return a2;\n}\n\nGLM_FUNC_QUALIFIER __m128 sse_mul_ps(__m128 v, __m128 const m[4]) {\n  __m128 i0 = m[0];\n  __m128 i1 = m[1];\n  __m128 i2 = m[2];\n  __m128 i3 = m[3];\n\n  __m128 m0 = _mm_mul_ps(v, i0);\n  __m128 m1 = _mm_mul_ps(v, i1);\n  __m128 m2 = _mm_mul_ps(v, i2);\n  __m128 m3 = _mm_mul_ps(v, i3);\n\n  __m128 u0 = _mm_unpacklo_ps(m0, m1);\n  __m128 u1 = _mm_unpackhi_ps(m0, m1);\n  __m128 a0 = _mm_add_ps(u0, u1);\n\n  __m128 u2 = _mm_unpacklo_ps(m2, m3);\n  __m128 u3 = _mm_unpackhi_ps(m2, m3);\n  __m128 a1 = _mm_add_ps(u2, u3);\n\n  __m128 f0 = _mm_movelh_ps(a0, a1);\n  __m128 f1 = _mm_movehl_ps(a1, a0);\n  __m128 f2 = _mm_add_ps(f0, f1);\n\n  return f2;\n}\n\nGLM_FUNC_QUALIFIER void sse_mul_ps(__m128 const in1[4], __m128 const in2[4],\n                                   __m128 out[4]) {\n  {\n    __m128 e0 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(0, 0, 0, 0));\n    __m128 e1 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(1, 1, 1, 1));\n    __m128 e2 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(2, 2, 2, 2));\n    __m128 e3 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(3, 3, 3, 3));\n\n    __m128 m0 = _mm_mul_ps(in1[0], e0);\n    __m128 m1 = _mm_mul_ps(in1[1], e1);\n    __m128 m2 = _mm_mul_ps(in1[2], e2);\n    __m128 m3 = _mm_mul_ps(in1[3], e3);\n\n    __m128 a0 = _mm_add_ps(m0, m1);\n    __m128 a1 = _mm_add_ps(m2, m3);\n    __m128 a2 = _mm_add_ps(a0, a1);\n\n    out[0] = a2;\n  }\n\n  {\n    __m128 e0 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(0, 0, 0, 0));\n    __m128 e1 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(1, 1, 1, 1));\n    __m128 e2 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(2, 2, 2, 2));\n    __m128 e3 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(3, 3, 3, 3));\n\n    __m128 m0 = _mm_mul_ps(in1[0], e0);\n    __m128 m1 = _mm_mul_ps(in1[1], e1);\n    __m128 m2 = _mm_mul_ps(in1[2], e2);\n    __m128 m3 = _mm_mul_ps(in1[3], e3);\n\n    __m128 a0 = _mm_add_ps(m0, m1);\n    __m128 a1 = _mm_add_ps(m2, m3);\n    __m128 a2 = _mm_add_ps(a0, a1);\n\n    out[1] = a2;\n  }\n\n  {\n    __m128 e0 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(0, 0, 0, 0));\n    __m128 e1 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(1, 1, 1, 1));\n    __m128 e2 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(2, 2, 2, 2));\n    __m128 e3 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(3, 3, 3, 3));\n\n    __m128 m0 = _mm_mul_ps(in1[0], e0);\n    __m128 m1 = _mm_mul_ps(in1[1], e1);\n    __m128 m2 = _mm_mul_ps(in1[2], e2);\n    __m128 m3 = _mm_mul_ps(in1[3], e3);\n\n    __m128 a0 = _mm_add_ps(m0, m1);\n    __m128 a1 = _mm_add_ps(m2, m3);\n    __m128 a2 = _mm_add_ps(a0, a1);\n\n    out[2] = a2;\n  }\n\n  {\n    //(__m128&)_mm_shuffle_epi32(__m128i&)in2[0], _MM_SHUFFLE(3, 3, 3, 3))\n    __m128 e0 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(0, 0, 0, 0));\n    __m128 e1 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(1, 1, 1, 1));\n    __m128 e2 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(2, 2, 2, 2));\n    __m128 e3 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(3, 3, 3, 3));\n\n    __m128 m0 = _mm_mul_ps(in1[0], e0);\n    __m128 m1 = _mm_mul_ps(in1[1], e1);\n    __m128 m2 = _mm_mul_ps(in1[2], e2);\n    __m128 m3 = _mm_mul_ps(in1[3], e3);\n\n    __m128 a0 = _mm_add_ps(m0, m1);\n    __m128 a1 = _mm_add_ps(m2, m3);\n    __m128 a2 = _mm_add_ps(a0, a1);\n\n    out[3] = a2;\n  }\n}\n\nGLM_FUNC_QUALIFIER void sse_transpose_ps(__m128 const in[4], __m128 out[4]) {\n  __m128 tmp0 = _mm_shuffle_ps(in[0], in[1], 0x44);\n  __m128 tmp2 = _mm_shuffle_ps(in[0], in[1], 0xEE);\n  __m128 tmp1 = _mm_shuffle_ps(in[2], in[3], 0x44);\n  __m128 tmp3 = _mm_shuffle_ps(in[2], in[3], 0xEE);\n\n  out[0] = _mm_shuffle_ps(tmp0, tmp1, 0x88);\n  out[1] = _mm_shuffle_ps(tmp0, tmp1, 0xDD);\n  out[2] = _mm_shuffle_ps(tmp2, tmp3, 0x88);\n  out[3] = _mm_shuffle_ps(tmp2, tmp3, 0xDD);\n}\n\nGLM_FUNC_QUALIFIER __m128 sse_slow_det_ps(__m128 const in[4]) {\n  __m128 Fac0;\n  {\n    //\tvalType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];\n    //\tvalType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];\n    //\tvalType SubFactor06 = m[1][2] * m[3][3] - m[3][2] * m[1][3];\n    //\tvalType SubFactor13 = m[1][2] * m[2][3] - m[2][2] * m[1][3];\n\n    __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));\n    __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));\n\n    __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));\n    __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));\n\n    __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n    __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n    Fac0 = _mm_sub_ps(Mul00, Mul01);\n  }\n\n  __m128 Fac1;\n  {\n    //\tvalType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];\n    //\tvalType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];\n    //\tvalType SubFactor07 = m[1][1] * m[3][3] - m[3][1] * m[1][3];\n    //\tvalType SubFactor14 = m[1][1] * m[2][3] - m[2][1] * m[1][3];\n\n    __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));\n    __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));\n\n    __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));\n    __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));\n\n    __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n    __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n    Fac1 = _mm_sub_ps(Mul00, Mul01);\n  }\n\n  __m128 Fac2;\n  {\n    //\tvalType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];\n    //\tvalType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];\n    //\tvalType SubFactor08 = m[1][1] * m[3][2] - m[3][1] * m[1][2];\n    //\tvalType SubFactor15 = m[1][1] * m[2][2] - m[2][1] * m[1][2];\n\n    __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));\n    __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));\n\n    __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));\n    __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));\n\n    __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n    __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n    Fac2 = _mm_sub_ps(Mul00, Mul01);\n  }\n\n  __m128 Fac3;\n  {\n    //\tvalType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];\n    //\tvalType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];\n    //\tvalType SubFactor09 = m[1][0] * m[3][3] - m[3][0] * m[1][3];\n    //\tvalType SubFactor16 = m[1][0] * m[2][3] - m[2][0] * m[1][3];\n\n    __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));\n    __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));\n\n    __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));\n    __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));\n\n    __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n    __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n    Fac3 = _mm_sub_ps(Mul00, Mul01);\n  }\n\n  __m128 Fac4;\n  {\n    //\tvalType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];\n    //\tvalType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];\n    //\tvalType SubFactor10 = m[1][0] * m[3][2] - m[3][0] * m[1][2];\n    //\tvalType SubFactor17 = m[1][0] * m[2][2] - m[2][0] * m[1][2];\n\n    __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));\n    __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));\n\n    __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));\n    __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));\n\n    __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n    __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n    Fac4 = _mm_sub_ps(Mul00, Mul01);\n  }\n\n  __m128 Fac5;\n  {\n    //\tvalType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];\n    //\tvalType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];\n    //\tvalType SubFactor12 = m[1][0] * m[3][1] - m[3][0] * m[1][1];\n    //\tvalType SubFactor18 = m[1][0] * m[2][1] - m[2][0] * m[1][1];\n\n    __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));\n    __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));\n\n    __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));\n    __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));\n\n    __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n    __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n    Fac5 = _mm_sub_ps(Mul00, Mul01);\n  }\n\n  __m128 SignA = _mm_set_ps(1.0f, -1.0f, 1.0f, -1.0f);\n  __m128 SignB = _mm_set_ps(-1.0f, 1.0f, -1.0f, 1.0f);\n\n  // m[1][0]\n  // m[0][0]\n  // m[0][0]\n  // m[0][0]\n  __m128 Temp0 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(0, 0, 0, 0));\n  __m128 Vec0 = _mm_shuffle_ps(Temp0, Temp0, _MM_SHUFFLE(2, 2, 2, 0));\n\n  // m[1][1]\n  // m[0][1]\n  // m[0][1]\n  // m[0][1]\n  __m128 Temp1 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(1, 1, 1, 1));\n  __m128 Vec1 = _mm_shuffle_ps(Temp1, Temp1, _MM_SHUFFLE(2, 2, 2, 0));\n\n  // m[1][2]\n  // m[0][2]\n  // m[0][2]\n  // m[0][2]\n  __m128 Temp2 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(2, 2, 2, 2));\n  __m128 Vec2 = _mm_shuffle_ps(Temp2, Temp2, _MM_SHUFFLE(2, 2, 2, 0));\n\n  // m[1][3]\n  // m[0][3]\n  // m[0][3]\n  // m[0][3]\n  __m128 Temp3 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(3, 3, 3, 3));\n  __m128 Vec3 = _mm_shuffle_ps(Temp3, Temp3, _MM_SHUFFLE(2, 2, 2, 0));\n\n  // col0\n  // + (Vec1[0] * Fac0[0] - Vec2[0] * Fac1[0] + Vec3[0] * Fac2[0]),\n  // - (Vec1[1] * Fac0[1] - Vec2[1] * Fac1[1] + Vec3[1] * Fac2[1]),\n  // + (Vec1[2] * Fac0[2] - Vec2[2] * Fac1[2] + Vec3[2] * Fac2[2]),\n  // - (Vec1[3] * Fac0[3] - Vec2[3] * Fac1[3] + Vec3[3] * Fac2[3]),\n  __m128 Mul00 = _mm_mul_ps(Vec1, Fac0);\n  __m128 Mul01 = _mm_mul_ps(Vec2, Fac1);\n  __m128 Mul02 = _mm_mul_ps(Vec3, Fac2);\n  __m128 Sub00 = _mm_sub_ps(Mul00, Mul01);\n  __m128 Add00 = _mm_add_ps(Sub00, Mul02);\n  __m128 Inv0 = _mm_mul_ps(SignB, Add00);\n\n  // col1\n  // - (Vec0[0] * Fac0[0] - Vec2[0] * Fac3[0] + Vec3[0] * Fac4[0]),\n  // + (Vec0[0] * Fac0[1] - Vec2[1] * Fac3[1] + Vec3[1] * Fac4[1]),\n  // - (Vec0[0] * Fac0[2] - Vec2[2] * Fac3[2] + Vec3[2] * Fac4[2]),\n  // + (Vec0[0] * Fac0[3] - Vec2[3] * Fac3[3] + Vec3[3] * Fac4[3]),\n  __m128 Mul03 = _mm_mul_ps(Vec0, Fac0);\n  __m128 Mul04 = _mm_mul_ps(Vec2, Fac3);\n  __m128 Mul05 = _mm_mul_ps(Vec3, Fac4);\n  __m128 Sub01 = _mm_sub_ps(Mul03, Mul04);\n  __m128 Add01 = _mm_add_ps(Sub01, Mul05);\n  __m128 Inv1 = _mm_mul_ps(SignA, Add01);\n\n  // col2\n  // + (Vec0[0] * Fac1[0] - Vec1[0] * Fac3[0] + Vec3[0] * Fac5[0]),\n  // - (Vec0[0] * Fac1[1] - Vec1[1] * Fac3[1] + Vec3[1] * Fac5[1]),\n  // + (Vec0[0] * Fac1[2] - Vec1[2] * Fac3[2] + Vec3[2] * Fac5[2]),\n  // - (Vec0[0] * Fac1[3] - Vec1[3] * Fac3[3] + Vec3[3] * Fac5[3]),\n  __m128 Mul06 = _mm_mul_ps(Vec0, Fac1);\n  __m128 Mul07 = _mm_mul_ps(Vec1, Fac3);\n  __m128 Mul08 = _mm_mul_ps(Vec3, Fac5);\n  __m128 Sub02 = _mm_sub_ps(Mul06, Mul07);\n  __m128 Add02 = _mm_add_ps(Sub02, Mul08);\n  __m128 Inv2 = _mm_mul_ps(SignB, Add02);\n\n  // col3\n  // - (Vec1[0] * Fac2[0] - Vec1[0] * Fac4[0] + Vec2[0] * Fac5[0]),\n  // + (Vec1[0] * Fac2[1] - Vec1[1] * Fac4[1] + Vec2[1] * Fac5[1]),\n  // - (Vec1[0] * Fac2[2] - Vec1[2] * Fac4[2] + Vec2[2] * Fac5[2]),\n  // + (Vec1[0] * Fac2[3] - Vec1[3] * Fac4[3] + Vec2[3] * Fac5[3]));\n  __m128 Mul09 = _mm_mul_ps(Vec0, Fac2);\n  __m128 Mul10 = _mm_mul_ps(Vec1, Fac4);\n  __m128 Mul11 = _mm_mul_ps(Vec2, Fac5);\n  __m128 Sub03 = _mm_sub_ps(Mul09, Mul10);\n  __m128 Add03 = _mm_add_ps(Sub03, Mul11);\n  __m128 Inv3 = _mm_mul_ps(SignA, Add03);\n\n  __m128 Row0 = _mm_shuffle_ps(Inv0, Inv1, _MM_SHUFFLE(0, 0, 0, 0));\n  __m128 Row1 = _mm_shuffle_ps(Inv2, Inv3, _MM_SHUFFLE(0, 0, 0, 0));\n  __m128 Row2 = _mm_shuffle_ps(Row0, Row1, _MM_SHUFFLE(2, 0, 2, 0));\n\n  //\tvalType Determinant = m[0][0] * Inverse[0][0]\n  //\t\t\t\t\t\t+ m[0][1] * Inverse[1][0]\n  //\t\t\t\t\t\t+ m[0][2] * Inverse[2][0]\n  //\t\t\t\t\t\t+ m[0][3] * Inverse[3][0];\n  __m128 Det0 = sse_dot_ps(in[0], Row2);\n  return Det0;\n}\n\nGLM_FUNC_QUALIFIER __m128 sse_detd_ps(__m128 const m[4]) {\n  // _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(\n\n  // T SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];\n  // T SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];\n  // T SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];\n  // T SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];\n  // T SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];\n  // T SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];\n\n  // First 2 columns\n  __m128 Swp2A = _mm_castsi128_ps(\n      _mm_shuffle_epi32(_mm_castps_si128(m[2]), _MM_SHUFFLE(0, 1, 1, 2)));\n  __m128 Swp3A = _mm_castsi128_ps(\n      _mm_shuffle_epi32(_mm_castps_si128(m[3]), _MM_SHUFFLE(3, 2, 3, 3)));\n  __m128 MulA = _mm_mul_ps(Swp2A, Swp3A);\n\n  // Second 2 columns\n  __m128 Swp2B = _mm_castsi128_ps(\n      _mm_shuffle_epi32(_mm_castps_si128(m[2]), _MM_SHUFFLE(3, 2, 3, 3)));\n  __m128 Swp3B = _mm_castsi128_ps(\n      _mm_shuffle_epi32(_mm_castps_si128(m[3]), _MM_SHUFFLE(0, 1, 1, 2)));\n  __m128 MulB = _mm_mul_ps(Swp2B, Swp3B);\n\n  // Columns subtraction\n  __m128 SubE = _mm_sub_ps(MulA, MulB);\n\n  // Last 2 rows\n  __m128 Swp2C = _mm_castsi128_ps(\n      _mm_shuffle_epi32(_mm_castps_si128(m[2]), _MM_SHUFFLE(0, 0, 1, 2)));\n  __m128 Swp3C = _mm_castsi128_ps(\n      _mm_shuffle_epi32(_mm_castps_si128(m[3]), _MM_SHUFFLE(1, 2, 0, 0)));\n  __m128 MulC = _mm_mul_ps(Swp2C, Swp3C);\n  __m128 SubF = _mm_sub_ps(_mm_movehl_ps(MulC, MulC), MulC);\n\n  // detail::tvec4<T, P> DetCof(\n  //\t+ (m[1][1] * SubFactor00 - m[1][2] * SubFactor01 + m[1][3] *\n  // SubFactor02),\n  //\t- (m[1][0] * SubFactor00 - m[1][2] * SubFactor03 + m[1][3] *\n  // SubFactor04),\n  //\t+ (m[1][0] * SubFactor01 - m[1][1] * SubFactor03 + m[1][3] *\n  // SubFactor05),\n  //\t- (m[1][0] * SubFactor02 - m[1][1] * SubFactor04 + m[1][2] *\n  // SubFactor05));\n\n  __m128 SubFacA = _mm_castsi128_ps(\n      _mm_shuffle_epi32(_mm_castps_si128(SubE), _MM_SHUFFLE(2, 1, 0, 0)));\n  __m128 SwpFacA = _mm_castsi128_ps(\n      _mm_shuffle_epi32(_mm_castps_si128(m[1]), _MM_SHUFFLE(0, 0, 0, 1)));\n  __m128 MulFacA = _mm_mul_ps(SwpFacA, SubFacA);\n\n  __m128 SubTmpB = _mm_shuffle_ps(SubE, SubF, _MM_SHUFFLE(0, 0, 3, 1));\n  __m128 SubFacB = _mm_castsi128_ps(_mm_shuffle_epi32(\n      _mm_castps_si128(SubTmpB),\n      _MM_SHUFFLE(3, 1, 1, 0)));  // SubF[0], SubE[3], SubE[3], SubE[1];\n  __m128 SwpFacB = _mm_castsi128_ps(\n      _mm_shuffle_epi32(_mm_castps_si128(m[1]), _MM_SHUFFLE(1, 1, 2, 2)));\n  __m128 MulFacB = _mm_mul_ps(SwpFacB, SubFacB);\n\n  __m128 SubRes = _mm_sub_ps(MulFacA, MulFacB);\n\n  __m128 SubTmpC = _mm_shuffle_ps(SubE, SubF, _MM_SHUFFLE(1, 0, 2, 2));\n  __m128 SubFacC = _mm_castsi128_ps(\n      _mm_shuffle_epi32(_mm_castps_si128(SubTmpC), _MM_SHUFFLE(3, 3, 2, 0)));\n  __m128 SwpFacC = _mm_castsi128_ps(\n      _mm_shuffle_epi32(_mm_castps_si128(m[1]), _MM_SHUFFLE(2, 3, 3, 3)));\n  __m128 MulFacC = _mm_mul_ps(SwpFacC, SubFacC);\n\n  __m128 AddRes = _mm_add_ps(SubRes, MulFacC);\n  __m128 DetCof = _mm_mul_ps(AddRes, _mm_setr_ps(1.0f, -1.0f, 1.0f, -1.0f));\n\n  // return m[0][0] * DetCof[0]\n  //\t + m[0][1] * DetCof[1]\n  //\t + m[0][2] * DetCof[2]\n  //\t + m[0][3] * DetCof[3];\n\n  return sse_dot_ps(m[0], DetCof);\n}\n\nGLM_FUNC_QUALIFIER __m128 sse_det_ps(__m128 const m[4]) {\n  // _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(add)\n\n  // T SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];\n  // T SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];\n  // T SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];\n  // T SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];\n  // T SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];\n  // T SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];\n\n  // First 2 columns\n  __m128 Swp2A = _mm_shuffle_ps(m[2], m[2], _MM_SHUFFLE(0, 1, 1, 2));\n  __m128 Swp3A = _mm_shuffle_ps(m[3], m[3], _MM_SHUFFLE(3, 2, 3, 3));\n  __m128 MulA = _mm_mul_ps(Swp2A, Swp3A);\n\n  // Second 2 columns\n  __m128 Swp2B = _mm_shuffle_ps(m[2], m[2], _MM_SHUFFLE(3, 2, 3, 3));\n  __m128 Swp3B = _mm_shuffle_ps(m[3], m[3], _MM_SHUFFLE(0, 1, 1, 2));\n  __m128 MulB = _mm_mul_ps(Swp2B, Swp3B);\n\n  // Columns subtraction\n  __m128 SubE = _mm_sub_ps(MulA, MulB);\n\n  // Last 2 rows\n  __m128 Swp2C = _mm_shuffle_ps(m[2], m[2], _MM_SHUFFLE(0, 0, 1, 2));\n  __m128 Swp3C = _mm_shuffle_ps(m[3], m[3], _MM_SHUFFLE(1, 2, 0, 0));\n  __m128 MulC = _mm_mul_ps(Swp2C, Swp3C);\n  __m128 SubF = _mm_sub_ps(_mm_movehl_ps(MulC, MulC), MulC);\n\n  // detail::tvec4<T, P> DetCof(\n  //\t+ (m[1][1] * SubFactor00 - m[1][2] * SubFactor01 + m[1][3] *\n  // SubFactor02),\n  //\t- (m[1][0] * SubFactor00 - m[1][2] * SubFactor03 + m[1][3] *\n  // SubFactor04),\n  //\t+ (m[1][0] * SubFactor01 - m[1][1] * SubFactor03 + m[1][3] *\n  // SubFactor05),\n  //\t- (m[1][0] * SubFactor02 - m[1][1] * SubFactor04 + m[1][2] *\n  // SubFactor05));\n\n  __m128 SubFacA = _mm_shuffle_ps(SubE, SubE, _MM_SHUFFLE(2, 1, 0, 0));\n  __m128 SwpFacA = _mm_shuffle_ps(m[1], m[1], _MM_SHUFFLE(0, 0, 0, 1));\n  __m128 MulFacA = _mm_mul_ps(SwpFacA, SubFacA);\n\n  __m128 SubTmpB = _mm_shuffle_ps(SubE, SubF, _MM_SHUFFLE(0, 0, 3, 1));\n  __m128 SubFacB = _mm_shuffle_ps(\n      SubTmpB, SubTmpB,\n      _MM_SHUFFLE(3, 1, 1, 0));  // SubF[0], SubE[3], SubE[3], SubE[1];\n  __m128 SwpFacB = _mm_shuffle_ps(m[1], m[1], _MM_SHUFFLE(1, 1, 2, 2));\n  __m128 MulFacB = _mm_mul_ps(SwpFacB, SubFacB);\n\n  __m128 SubRes = _mm_sub_ps(MulFacA, MulFacB);\n\n  __m128 SubTmpC = _mm_shuffle_ps(SubE, SubF, _MM_SHUFFLE(1, 0, 2, 2));\n  __m128 SubFacC = _mm_shuffle_ps(SubTmpC, SubTmpC, _MM_SHUFFLE(3, 3, 2, 0));\n  __m128 SwpFacC = _mm_shuffle_ps(m[1], m[1], _MM_SHUFFLE(2, 3, 3, 3));\n  __m128 MulFacC = _mm_mul_ps(SwpFacC, SubFacC);\n\n  __m128 AddRes = _mm_add_ps(SubRes, MulFacC);\n  __m128 DetCof = _mm_mul_ps(AddRes, _mm_setr_ps(1.0f, -1.0f, 1.0f, -1.0f));\n\n  // return m[0][0] * DetCof[0]\n  //\t + m[0][1] * DetCof[1]\n  //\t + m[0][2] * DetCof[2]\n  //\t + m[0][3] * DetCof[3];\n\n  return sse_dot_ps(m[0], DetCof);\n}\n\nGLM_FUNC_QUALIFIER void sse_inverse_ps(__m128 const in[4], __m128 out[4]) {\n  __m128 Fac0;\n  {\n    //\tvalType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];\n    //\tvalType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];\n    //\tvalType SubFactor06 = m[1][2] * m[3][3] - m[3][2] * m[1][3];\n    //\tvalType SubFactor13 = m[1][2] * m[2][3] - m[2][2] * m[1][3];\n\n    __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));\n    __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));\n\n    __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));\n    __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));\n\n    __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n    __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n    Fac0 = _mm_sub_ps(Mul00, Mul01);\n  }\n\n  __m128 Fac1;\n  {\n    //\tvalType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];\n    //\tvalType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];\n    //\tvalType SubFactor07 = m[1][1] * m[3][3] - m[3][1] * m[1][3];\n    //\tvalType SubFactor14 = m[1][1] * m[2][3] - m[2][1] * m[1][3];\n\n    __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));\n    __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));\n\n    __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));\n    __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));\n\n    __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n    __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n    Fac1 = _mm_sub_ps(Mul00, Mul01);\n  }\n\n  __m128 Fac2;\n  {\n    //\tvalType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];\n    //\tvalType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];\n    //\tvalType SubFactor08 = m[1][1] * m[3][2] - m[3][1] * m[1][2];\n    //\tvalType SubFactor15 = m[1][1] * m[2][2] - m[2][1] * m[1][2];\n\n    __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));\n    __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));\n\n    __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));\n    __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));\n\n    __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n    __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n    Fac2 = _mm_sub_ps(Mul00, Mul01);\n  }\n\n  __m128 Fac3;\n  {\n    //\tvalType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];\n    //\tvalType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];\n    //\tvalType SubFactor09 = m[1][0] * m[3][3] - m[3][0] * m[1][3];\n    //\tvalType SubFactor16 = m[1][0] * m[2][3] - m[2][0] * m[1][3];\n\n    __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));\n    __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));\n\n    __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));\n    __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));\n\n    __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n    __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n    Fac3 = _mm_sub_ps(Mul00, Mul01);\n  }\n\n  __m128 Fac4;\n  {\n    //\tvalType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];\n    //\tvalType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];\n    //\tvalType SubFactor10 = m[1][0] * m[3][2] - m[3][0] * m[1][2];\n    //\tvalType SubFactor17 = m[1][0] * m[2][2] - m[2][0] * m[1][2];\n\n    __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));\n    __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));\n\n    __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));\n    __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));\n\n    __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n    __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n    Fac4 = _mm_sub_ps(Mul00, Mul01);\n  }\n\n  __m128 Fac5;\n  {\n    //\tvalType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];\n    //\tvalType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];\n    //\tvalType SubFactor12 = m[1][0] * m[3][1] - m[3][0] * m[1][1];\n    //\tvalType SubFactor18 = m[1][0] * m[2][1] - m[2][0] * m[1][1];\n\n    __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));\n    __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));\n\n    __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));\n    __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));\n\n    __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n    __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n    Fac5 = _mm_sub_ps(Mul00, Mul01);\n  }\n\n  __m128 SignA = _mm_set_ps(1.0f, -1.0f, 1.0f, -1.0f);\n  __m128 SignB = _mm_set_ps(-1.0f, 1.0f, -1.0f, 1.0f);\n\n  // m[1][0]\n  // m[0][0]\n  // m[0][0]\n  // m[0][0]\n  __m128 Temp0 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(0, 0, 0, 0));\n  __m128 Vec0 = _mm_shuffle_ps(Temp0, Temp0, _MM_SHUFFLE(2, 2, 2, 0));\n\n  // m[1][1]\n  // m[0][1]\n  // m[0][1]\n  // m[0][1]\n  __m128 Temp1 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(1, 1, 1, 1));\n  __m128 Vec1 = _mm_shuffle_ps(Temp1, Temp1, _MM_SHUFFLE(2, 2, 2, 0));\n\n  // m[1][2]\n  // m[0][2]\n  // m[0][2]\n  // m[0][2]\n  __m128 Temp2 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(2, 2, 2, 2));\n  __m128 Vec2 = _mm_shuffle_ps(Temp2, Temp2, _MM_SHUFFLE(2, 2, 2, 0));\n\n  // m[1][3]\n  // m[0][3]\n  // m[0][3]\n  // m[0][3]\n  __m128 Temp3 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(3, 3, 3, 3));\n  __m128 Vec3 = _mm_shuffle_ps(Temp3, Temp3, _MM_SHUFFLE(2, 2, 2, 0));\n\n  // col0\n  // + (Vec1[0] * Fac0[0] - Vec2[0] * Fac1[0] + Vec3[0] * Fac2[0]),\n  // - (Vec1[1] * Fac0[1] - Vec2[1] * Fac1[1] + Vec3[1] * Fac2[1]),\n  // + (Vec1[2] * Fac0[2] - Vec2[2] * Fac1[2] + Vec3[2] * Fac2[2]),\n  // - (Vec1[3] * Fac0[3] - Vec2[3] * Fac1[3] + Vec3[3] * Fac2[3]),\n  __m128 Mul00 = _mm_mul_ps(Vec1, Fac0);\n  __m128 Mul01 = _mm_mul_ps(Vec2, Fac1);\n  __m128 Mul02 = _mm_mul_ps(Vec3, Fac2);\n  __m128 Sub00 = _mm_sub_ps(Mul00, Mul01);\n  __m128 Add00 = _mm_add_ps(Sub00, Mul02);\n  __m128 Inv0 = _mm_mul_ps(SignB, Add00);\n\n  // col1\n  // - (Vec0[0] * Fac0[0] - Vec2[0] * Fac3[0] + Vec3[0] * Fac4[0]),\n  // + (Vec0[0] * Fac0[1] - Vec2[1] * Fac3[1] + Vec3[1] * Fac4[1]),\n  // - (Vec0[0] * Fac0[2] - Vec2[2] * Fac3[2] + Vec3[2] * Fac4[2]),\n  // + (Vec0[0] * Fac0[3] - Vec2[3] * Fac3[3] + Vec3[3] * Fac4[3]),\n  __m128 Mul03 = _mm_mul_ps(Vec0, Fac0);\n  __m128 Mul04 = _mm_mul_ps(Vec2, Fac3);\n  __m128 Mul05 = _mm_mul_ps(Vec3, Fac4);\n  __m128 Sub01 = _mm_sub_ps(Mul03, Mul04);\n  __m128 Add01 = _mm_add_ps(Sub01, Mul05);\n  __m128 Inv1 = _mm_mul_ps(SignA, Add01);\n\n  // col2\n  // + (Vec0[0] * Fac1[0] - Vec1[0] * Fac3[0] + Vec3[0] * Fac5[0]),\n  // - (Vec0[0] * Fac1[1] - Vec1[1] * Fac3[1] + Vec3[1] * Fac5[1]),\n  // + (Vec0[0] * Fac1[2] - Vec1[2] * Fac3[2] + Vec3[2] * Fac5[2]),\n  // - (Vec0[0] * Fac1[3] - Vec1[3] * Fac3[3] + Vec3[3] * Fac5[3]),\n  __m128 Mul06 = _mm_mul_ps(Vec0, Fac1);\n  __m128 Mul07 = _mm_mul_ps(Vec1, Fac3);\n  __m128 Mul08 = _mm_mul_ps(Vec3, Fac5);\n  __m128 Sub02 = _mm_sub_ps(Mul06, Mul07);\n  __m128 Add02 = _mm_add_ps(Sub02, Mul08);\n  __m128 Inv2 = _mm_mul_ps(SignB, Add02);\n\n  // col3\n  // - (Vec1[0] * Fac2[0] - Vec1[0] * Fac4[0] + Vec2[0] * Fac5[0]),\n  // + (Vec1[0] * Fac2[1] - Vec1[1] * Fac4[1] + Vec2[1] * Fac5[1]),\n  // - (Vec1[0] * Fac2[2] - Vec1[2] * Fac4[2] + Vec2[2] * Fac5[2]),\n  // + (Vec1[0] * Fac2[3] - Vec1[3] * Fac4[3] + Vec2[3] * Fac5[3]));\n  __m128 Mul09 = _mm_mul_ps(Vec0, Fac2);\n  __m128 Mul10 = _mm_mul_ps(Vec1, Fac4);\n  __m128 Mul11 = _mm_mul_ps(Vec2, Fac5);\n  __m128 Sub03 = _mm_sub_ps(Mul09, Mul10);\n  __m128 Add03 = _mm_add_ps(Sub03, Mul11);\n  __m128 Inv3 = _mm_mul_ps(SignA, Add03);\n\n  __m128 Row0 = _mm_shuffle_ps(Inv0, Inv1, _MM_SHUFFLE(0, 0, 0, 0));\n  __m128 Row1 = _mm_shuffle_ps(Inv2, Inv3, _MM_SHUFFLE(0, 0, 0, 0));\n  __m128 Row2 = _mm_shuffle_ps(Row0, Row1, _MM_SHUFFLE(2, 0, 2, 0));\n\n  //\tvalType Determinant = m[0][0] * Inverse[0][0]\n  //\t\t\t\t\t\t+ m[0][1] * Inverse[1][0]\n  //\t\t\t\t\t\t+ m[0][2] * Inverse[2][0]\n  //\t\t\t\t\t\t+ m[0][3] * Inverse[3][0];\n  __m128 Det0 = sse_dot_ps(in[0], Row2);\n  __m128 Rcp0 = _mm_div_ps(one, Det0);\n  //__m128 Rcp0 = _mm_rcp_ps(Det0);\n\n  //\tInverse /= Determinant;\n  out[0] = _mm_mul_ps(Inv0, Rcp0);\n  out[1] = _mm_mul_ps(Inv1, Rcp0);\n  out[2] = _mm_mul_ps(Inv2, Rcp0);\n  out[3] = _mm_mul_ps(Inv3, Rcp0);\n}\n\nGLM_FUNC_QUALIFIER void sse_inverse_fast_ps(__m128 const in[4], __m128 out[4]) {\n  __m128 Fac0;\n  {\n    //\tvalType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];\n    //\tvalType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];\n    //\tvalType SubFactor06 = m[1][2] * m[3][3] - m[3][2] * m[1][3];\n    //\tvalType SubFactor13 = m[1][2] * m[2][3] - m[2][2] * m[1][3];\n\n    __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));\n    __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));\n\n    __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));\n    __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));\n\n    __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n    __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n    Fac0 = _mm_sub_ps(Mul00, Mul01);\n  }\n\n  __m128 Fac1;\n  {\n    //\tvalType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];\n    //\tvalType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];\n    //\tvalType SubFactor07 = m[1][1] * m[3][3] - m[3][1] * m[1][3];\n    //\tvalType SubFactor14 = m[1][1] * m[2][3] - m[2][1] * m[1][3];\n\n    __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));\n    __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));\n\n    __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));\n    __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));\n\n    __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n    __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n    Fac1 = _mm_sub_ps(Mul00, Mul01);\n  }\n\n  __m128 Fac2;\n  {\n    //\tvalType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];\n    //\tvalType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];\n    //\tvalType SubFactor08 = m[1][1] * m[3][2] - m[3][1] * m[1][2];\n    //\tvalType SubFactor15 = m[1][1] * m[2][2] - m[2][1] * m[1][2];\n\n    __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));\n    __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));\n\n    __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));\n    __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));\n\n    __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n    __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n    Fac2 = _mm_sub_ps(Mul00, Mul01);\n  }\n\n  __m128 Fac3;\n  {\n    //\tvalType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];\n    //\tvalType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];\n    //\tvalType SubFactor09 = m[1][0] * m[3][3] - m[3][0] * m[1][3];\n    //\tvalType SubFactor16 = m[1][0] * m[2][3] - m[2][0] * m[1][3];\n\n    __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));\n    __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));\n\n    __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));\n    __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));\n\n    __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n    __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n    Fac3 = _mm_sub_ps(Mul00, Mul01);\n  }\n\n  __m128 Fac4;\n  {\n    //\tvalType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];\n    //\tvalType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];\n    //\tvalType SubFactor10 = m[1][0] * m[3][2] - m[3][0] * m[1][2];\n    //\tvalType SubFactor17 = m[1][0] * m[2][2] - m[2][0] * m[1][2];\n\n    __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));\n    __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));\n\n    __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));\n    __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));\n\n    __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n    __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n    Fac4 = _mm_sub_ps(Mul00, Mul01);\n  }\n\n  __m128 Fac5;\n  {\n    //\tvalType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];\n    //\tvalType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];\n    //\tvalType SubFactor12 = m[1][0] * m[3][1] - m[3][0] * m[1][1];\n    //\tvalType SubFactor18 = m[1][0] * m[2][1] - m[2][0] * m[1][1];\n\n    __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));\n    __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));\n\n    __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));\n    __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));\n    __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));\n\n    __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);\n    __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);\n    Fac5 = _mm_sub_ps(Mul00, Mul01);\n  }\n\n  __m128 SignA = _mm_set_ps(1.0f, -1.0f, 1.0f, -1.0f);\n  __m128 SignB = _mm_set_ps(-1.0f, 1.0f, -1.0f, 1.0f);\n\n  // m[1][0]\n  // m[0][0]\n  // m[0][0]\n  // m[0][0]\n  __m128 Temp0 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(0, 0, 0, 0));\n  __m128 Vec0 = _mm_shuffle_ps(Temp0, Temp0, _MM_SHUFFLE(2, 2, 2, 0));\n\n  // m[1][1]\n  // m[0][1]\n  // m[0][1]\n  // m[0][1]\n  __m128 Temp1 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(1, 1, 1, 1));\n  __m128 Vec1 = _mm_shuffle_ps(Temp1, Temp1, _MM_SHUFFLE(2, 2, 2, 0));\n\n  // m[1][2]\n  // m[0][2]\n  // m[0][2]\n  // m[0][2]\n  __m128 Temp2 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(2, 2, 2, 2));\n  __m128 Vec2 = _mm_shuffle_ps(Temp2, Temp2, _MM_SHUFFLE(2, 2, 2, 0));\n\n  // m[1][3]\n  // m[0][3]\n  // m[0][3]\n  // m[0][3]\n  __m128 Temp3 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(3, 3, 3, 3));\n  __m128 Vec3 = _mm_shuffle_ps(Temp3, Temp3, _MM_SHUFFLE(2, 2, 2, 0));\n\n  // col0\n  // + (Vec1[0] * Fac0[0] - Vec2[0] * Fac1[0] + Vec3[0] * Fac2[0]),\n  // - (Vec1[1] * Fac0[1] - Vec2[1] * Fac1[1] + Vec3[1] * Fac2[1]),\n  // + (Vec1[2] * Fac0[2] - Vec2[2] * Fac1[2] + Vec3[2] * Fac2[2]),\n  // - (Vec1[3] * Fac0[3] - Vec2[3] * Fac1[3] + Vec3[3] * Fac2[3]),\n  __m128 Mul00 = _mm_mul_ps(Vec1, Fac0);\n  __m128 Mul01 = _mm_mul_ps(Vec2, Fac1);\n  __m128 Mul02 = _mm_mul_ps(Vec3, Fac2);\n  __m128 Sub00 = _mm_sub_ps(Mul00, Mul01);\n  __m128 Add00 = _mm_add_ps(Sub00, Mul02);\n  __m128 Inv0 = _mm_mul_ps(SignB, Add00);\n\n  // col1\n  // - (Vec0[0] * Fac0[0] - Vec2[0] * Fac3[0] + Vec3[0] * Fac4[0]),\n  // + (Vec0[0] * Fac0[1] - Vec2[1] * Fac3[1] + Vec3[1] * Fac4[1]),\n  // - (Vec0[0] * Fac0[2] - Vec2[2] * Fac3[2] + Vec3[2] * Fac4[2]),\n  // + (Vec0[0] * Fac0[3] - Vec2[3] * Fac3[3] + Vec3[3] * Fac4[3]),\n  __m128 Mul03 = _mm_mul_ps(Vec0, Fac0);\n  __m128 Mul04 = _mm_mul_ps(Vec2, Fac3);\n  __m128 Mul05 = _mm_mul_ps(Vec3, Fac4);\n  __m128 Sub01 = _mm_sub_ps(Mul03, Mul04);\n  __m128 Add01 = _mm_add_ps(Sub01, Mul05);\n  __m128 Inv1 = _mm_mul_ps(SignA, Add01);\n\n  // col2\n  // + (Vec0[0] * Fac1[0] - Vec1[0] * Fac3[0] + Vec3[0] * Fac5[0]),\n  // - (Vec0[0] * Fac1[1] - Vec1[1] * Fac3[1] + Vec3[1] * Fac5[1]),\n  // + (Vec0[0] * Fac1[2] - Vec1[2] * Fac3[2] + Vec3[2] * Fac5[2]),\n  // - (Vec0[0] * Fac1[3] - Vec1[3] * Fac3[3] + Vec3[3] * Fac5[3]),\n  __m128 Mul06 = _mm_mul_ps(Vec0, Fac1);\n  __m128 Mul07 = _mm_mul_ps(Vec1, Fac3);\n  __m128 Mul08 = _mm_mul_ps(Vec3, Fac5);\n  __m128 Sub02 = _mm_sub_ps(Mul06, Mul07);\n  __m128 Add02 = _mm_add_ps(Sub02, Mul08);\n  __m128 Inv2 = _mm_mul_ps(SignB, Add02);\n\n  // col3\n  // - (Vec1[0] * Fac2[0] - Vec1[0] * Fac4[0] + Vec2[0] * Fac5[0]),\n  // + (Vec1[0] * Fac2[1] - Vec1[1] * Fac4[1] + Vec2[1] * Fac5[1]),\n  // - (Vec1[0] * Fac2[2] - Vec1[2] * Fac4[2] + Vec2[2] * Fac5[2]),\n  // + (Vec1[0] * Fac2[3] - Vec1[3] * Fac4[3] + Vec2[3] * Fac5[3]));\n  __m128 Mul09 = _mm_mul_ps(Vec0, Fac2);\n  __m128 Mul10 = _mm_mul_ps(Vec1, Fac4);\n  __m128 Mul11 = _mm_mul_ps(Vec2, Fac5);\n  __m128 Sub03 = _mm_sub_ps(Mul09, Mul10);\n  __m128 Add03 = _mm_add_ps(Sub03, Mul11);\n  __m128 Inv3 = _mm_mul_ps(SignA, Add03);\n\n  __m128 Row0 = _mm_shuffle_ps(Inv0, Inv1, _MM_SHUFFLE(0, 0, 0, 0));\n  __m128 Row1 = _mm_shuffle_ps(Inv2, Inv3, _MM_SHUFFLE(0, 0, 0, 0));\n  __m128 Row2 = _mm_shuffle_ps(Row0, Row1, _MM_SHUFFLE(2, 0, 2, 0));\n\n  //\tvalType Determinant = m[0][0] * Inverse[0][0]\n  //\t\t\t\t\t\t+ m[0][1] * Inverse[1][0]\n  //\t\t\t\t\t\t+ m[0][2] * Inverse[2][0]\n  //\t\t\t\t\t\t+ m[0][3] * Inverse[3][0];\n  __m128 Det0 = sse_dot_ps(in[0], Row2);\n  __m128 Rcp0 = _mm_rcp_ps(Det0);\n  //__m128 Rcp0 = _mm_div_ps(one, Det0);\n  //\tInverse /= Determinant;\n  out[0] = _mm_mul_ps(Inv0, Rcp0);\n  out[1] = _mm_mul_ps(Inv1, Rcp0);\n  out[2] = _mm_mul_ps(Inv2, Rcp0);\n  out[3] = _mm_mul_ps(Inv3, Rcp0);\n}\n/*\nGLM_FUNC_QUALIFIER void sse_rotate_ps(__m128 const in[4], float Angle, float\nconst v[3], __m128 out[4])\n{\n        float a = glm::radians(Angle);\n    float c = cos(a);\n    float s = sin(a);\n\n        glm::vec4 AxisA(v[0], v[1], v[2], float(0));\n        __m128 AxisB = _mm_set_ps(AxisA.w, AxisA.z, AxisA.y, AxisA.x);\n    __m128 AxisC = detail::sse_nrm_ps(AxisB);\n\n        __m128 Cos0 = _mm_set_ss(c);\n        __m128 CosA = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(0, 0, 0, 0));\n        __m128 Sin0 = _mm_set_ss(s);\n        __m128 SinA = _mm_shuffle_ps(Sin0, Sin0, _MM_SHUFFLE(0, 0, 0, 0));\n\n        // detail::tvec3<T, P> temp = (valType(1) - c) * axis;\n        __m128 Temp0 = _mm_sub_ps(one, CosA);\n        __m128 Temp1 = _mm_mul_ps(Temp0, AxisC);\n\n        //Rotate[0][0] = c + temp[0] * axis[0];\n        //Rotate[0][1] = 0 + temp[0] * axis[1] + s * axis[2];\n        //Rotate[0][2] = 0 + temp[0] * axis[2] - s * axis[1];\n        __m128 Axis0 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(0, 0, 0, 0));\n        __m128 TmpA0 = _mm_mul_ps(Axis0, AxisC);\n        __m128 CosA0 = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(1, 1, 1, 0));\n        __m128 TmpA1 = _mm_add_ps(CosA0, TmpA0);\n        __m128 SinA0 = SinA;//_mm_set_ps(0.0f, s, -s, 0.0f);\n        __m128 TmpA2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(3, 1, 2, 3));\n        __m128 TmpA3 = _mm_mul_ps(SinA0, TmpA2);\n        __m128 TmpA4 = _mm_add_ps(TmpA1, TmpA3);\n\n        //Rotate[1][0] = 0 + temp[1] * axis[0] - s * axis[2];\n        //Rotate[1][1] = c + temp[1] * axis[1];\n        //Rotate[1][2] = 0 + temp[1] * axis[2] + s * axis[0];\n        __m128 Axis1 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(1, 1, 1, 1));\n        __m128 TmpB0 = _mm_mul_ps(Axis1, AxisC);\n        __m128 CosA1 = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(1, 1, 0, 1));\n        __m128 TmpB1 = _mm_add_ps(CosA1, TmpB0);\n        __m128 SinB0 = SinA;//_mm_set_ps(-s, 0.0f, s, 0.0f);\n        __m128 TmpB2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(3, 0, 3, 2));\n        __m128 TmpB3 = _mm_mul_ps(SinA0, TmpB2);\n        __m128 TmpB4 = _mm_add_ps(TmpB1, TmpB3);\n\n    //Rotate[2][0] = 0 + temp[2] * axis[0] + s * axis[1];\n    //Rotate[2][1] = 0 + temp[2] * axis[1] - s * axis[0];\n    //Rotate[2][2] = c + temp[2] * axis[2];\n        __m128 Axis2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(2, 2, 2, 2));\n        __m128 TmpC0 = _mm_mul_ps(Axis2, AxisC);\n        __m128 CosA2 = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(1, 0, 1, 1));\n        __m128 TmpC1 = _mm_add_ps(CosA2, TmpC0);\n        __m128 SinC0 = SinA;//_mm_set_ps(s, -s, 0.0f, 0.0f);\n        __m128 TmpC2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(3, 3, 0, 1));\n        __m128 TmpC3 = _mm_mul_ps(SinA0, TmpC2);\n        __m128 TmpC4 = _mm_add_ps(TmpC1, TmpC3);\n\n        __m128 Result[4];\n        Result[0] = TmpA4;\n        Result[1] = TmpB4;\n        Result[2] = TmpC4;\n        Result[3] = _mm_set_ps(1, 0, 0, 0);\n\n        //detail::tmat4x4<valType> Result(detail::tmat4x4<valType>::_null);\n        //Result[0] = m[0] * Rotate[0][0] + m[1] * Rotate[0][1] + m[2] *\nRotate[0][2];\n        //Result[1] = m[0] * Rotate[1][0] + m[1] * Rotate[1][1] + m[2] *\nRotate[1][2];\n        //Result[2] = m[0] * Rotate[2][0] + m[1] * Rotate[2][1] + m[2] *\nRotate[2][2];\n        //Result[3] = m[3];\n        //return Result;\n        sse_mul_ps(in, Result, out);\n}\n*/\nGLM_FUNC_QUALIFIER void sse_outer_ps(__m128 const& c, __m128 const& r,\n                                     __m128 out[4]) {\n  out[0] = _mm_mul_ps(c, _mm_shuffle_ps(r, r, _MM_SHUFFLE(0, 0, 0, 0)));\n  out[1] = _mm_mul_ps(c, _mm_shuffle_ps(r, r, _MM_SHUFFLE(1, 1, 1, 1)));\n  out[2] = _mm_mul_ps(c, _mm_shuffle_ps(r, r, _MM_SHUFFLE(2, 2, 2, 2)));\n  out[3] = _mm_mul_ps(c, _mm_shuffle_ps(r, r, _MM_SHUFFLE(3, 3, 3, 3)));\n}\n\n}  // namespace detail\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/intrinsic_trigonometric.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/intrinsic_trigonometric.hpp\n/// @date 2009-06-09 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_detail_intrinsic_trigonometric\n#define glm_detail_intrinsic_trigonometric\n\n#include \"setup.hpp\"\n\n#if (!(GLM_ARCH & GLM_ARCH_SSE2))\n#error \"SSE2 instructions not supported or enabled\"\n#else\n\nnamespace glm {\nnamespace detail {}  // namespace detail\n}  // namespace glm\n\n#include \"intrinsic_trigonometric.inl\"\n\n#endif  // GLM_ARCH\n#endif  // glm_detail_intrinsic_trigonometric\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/intrinsic_trigonometric.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/intrinsic_trigonometric.inl\n/// @date 2011-06-15 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/intrinsic_vector_relational.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/intrinsic_vector_relational.hpp\n/// @date 2009-06-09 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_detail_intrinsic_vector_relational\n#define glm_detail_intrinsic_vector_relational\n\n#include \"setup.hpp\"\n\n#if (!(GLM_ARCH & GLM_ARCH_SSE2))\n#error \"SSE2 instructions not supported or enabled\"\n#else\n\nnamespace glm {\nnamespace detail {}  // namespace detail\n}  // namespace glm\n\n#include \"intrinsic_vector_relational.inl\"\n\n#endif  // GLM_ARCH\n#endif  // glm_detail_intrinsic_vector_relational\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/intrinsic_vector_relational.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/intrinsic_vector_relational.inl\n/// @date 2009-06-09 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n//\n//// lessThan\n// template <typename valType>\n// GLM_FUNC_QUALIFIER typename detail::tvec2<T, P>::bool_type lessThan\n//(\n//\tdetail::tvec2<T, P> const & x,\n//\tdetail::tvec2<T, P> const & y\n//)\n//{\n//\tGLM_STATIC_ASSERT(\n//\t\tdetail::type<valType>::is_float ||\n//\t\tdetail::type<valType>::is_int ||\n//\t\tdetail::type<valType>::is_uint);\n//\n//     return typename detail::tvec2<bool>::bool_type(x.x < y.x, x.y < y.y);\n// }\n//\n// template <typename valType>\n// GLM_FUNC_QUALIFIER typename detail::tvec3<T, P>::bool_type lessThan\n//(\n//\tdetail::tvec3<T, P> const & x,\n//\tdetail::tvec3<T, P> const & y\n//)\n//{\n//\tGLM_STATIC_ASSERT(\n//\t\tdetail::type<valType>::is_float ||\n//\t\tdetail::type<valType>::is_int ||\n//\t\tdetail::type<valType>::is_uint);\n//\n//\treturn typename detail::tvec3<bool>::bool_type(x.x < y.x, x.y < y.y, x.z\n//< y.z);\n// }\n//\n// template <typename valType>\n// GLM_FUNC_QUALIFIER typename detail::tvec4<T, P>::bool_type lessThan\n//(\n//\tdetail::tvec4<T, P> const & x,\n//\tdetail::tvec4<T, P> const & y\n//)\n//{\n//\tGLM_STATIC_ASSERT(\n//\t\tdetail::type<valType>::is_float ||\n//\t\tdetail::type<valType>::is_int ||\n//\t\tdetail::type<valType>::is_uint);\n//\n//\treturn typename detail::tvec4<bool>::bool_type(x.x < y.x, x.y < y.y, x.z\n//< y.z, x.w < y.w);\n// }\n//\n//// lessThanEqual\n// template <typename valType>\n// GLM_FUNC_QUALIFIER typename detail::tvec2<T, P>::bool_type lessThanEqual\n//(\n//\tdetail::tvec2<T, P> const & x,\n//\tdetail::tvec2<T, P> const & y\n//)\n//{\n//\tGLM_STATIC_ASSERT(\n//\t\tdetail::type<valType>::is_float ||\n//\t\tdetail::type<valType>::is_int ||\n//\t\tdetail::type<valType>::is_uint);\n//\n//\treturn typename detail::tvec2<bool>::bool_type(x.x <= y.x, x.y <= y.y);\n// }\n//\n// template <typename valType>\n// GLM_FUNC_QUALIFIER typename detail::tvec3<T, P>::bool_type lessThanEqual\n//(\n//\tdetail::tvec3<T, P> const & x,\n//\tdetail::tvec3<T, P> const & y\n//)\n//{\n//\tGLM_STATIC_ASSERT(\n//\t\tdetail::type<valType>::is_float ||\n//\t\tdetail::type<valType>::is_int ||\n//\t\tdetail::type<valType>::is_uint);\n//\n//\treturn typename detail::tvec3<bool>::bool_type(x.x <= y.x, x.y <= y.y,\n// x.z <= y.z);\n// }\n//\n// template <typename valType>\n// GLM_FUNC_QUALIFIER typename detail::tvec4<T, P>::bool_type lessThanEqual\n//(\n//\tdetail::tvec4<T, P> const & x,\n//\tdetail::tvec4<T, P> const & y\n//)\n//{\n//\tGLM_STATIC_ASSERT(\n//\t\tdetail::type<valType>::is_float ||\n//\t\tdetail::type<valType>::is_int ||\n//\t\tdetail::type<valType>::is_uint);\n//\n//\treturn typename detail::tvec4<bool>::bool_type(x.x <= y.x, x.y <= y.y,\n// x.z <= y.z, x.w <= y.w);\n// }\n//\n//// greaterThan\n// template <typename valType>\n// GLM_FUNC_QUALIFIER typename detail::tvec2<T, P>::bool_type greaterThan\n//(\n//\tdetail::tvec2<T, P> const & x,\n//\tdetail::tvec2<T, P> const & y\n//)\n//{\n//\tGLM_STATIC_ASSERT(\n//\t\tdetail::type<valType>::is_float ||\n//\t\tdetail::type<valType>::is_int ||\n//\t\tdetail::type<valType>::is_uint);\n//\n//\treturn typename detail::tvec2<bool>::bool_type(x.x > y.x, x.y > y.y);\n// }\n//\n// template <typename valType>\n// GLM_FUNC_QUALIFIER typename detail::tvec3<T, P>::bool_type greaterThan\n//(\n//\tdetail::tvec3<T, P> const & x,\n//\tdetail::tvec3<T, P> const & y\n//)\n//{\n//\tGLM_STATIC_ASSERT(\n//\t\tdetail::type<valType>::is_float ||\n//\t\tdetail::type<valType>::is_int ||\n//\t\tdetail::type<valType>::is_uint);\n//\n//\treturn typename detail::tvec3<bool>::bool_type(x.x > y.x, x.y > y.y, x.z\n//> y.z);\n// }\n//\n// template <typename valType>\n// GLM_FUNC_QUALIFIER typename detail::tvec4<T, P>::bool_type greaterThan\n//(\n//\tdetail::tvec4<T, P> const & x,\n//\tdetail::tvec4<T, P> const & y\n//)\n//{\n//\tGLM_STATIC_ASSERT(\n//\t\tdetail::type<valType>::is_float ||\n//\t\tdetail::type<valType>::is_int ||\n//\t\tdetail::type<valType>::is_uint);\n//\n//\treturn typename detail::tvec4<bool>::bool_type(x.x > y.x, x.y > y.y, x.z\n//> y.z, x.w > y.w);\n// }\n//\n//// greaterThanEqual\n// template <typename valType>\n// GLM_FUNC_QUALIFIER typename detail::tvec2<T, P>::bool_type greaterThanEqual\n//(\n//\tdetail::tvec2<T, P> const & x,\n//\tdetail::tvec2<T, P> const & y\n//)\n//{\n//\tGLM_STATIC_ASSERT(\n//\t\tdetail::type<valType>::is_float ||\n//\t\tdetail::type<valType>::is_int ||\n//\t\tdetail::type<valType>::is_uint);\n//\n//\treturn typename detail::tvec2<bool>::bool_type(x.x >= y.x, x.y >= y.y);\n// }\n//\n// template <typename valType>\n// GLM_FUNC_QUALIFIER typename detail::tvec3<T, P>::bool_type greaterThanEqual\n//(\n//\tdetail::tvec3<T, P> const & x,\n//\tdetail::tvec3<T, P> const & y\n//)\n//{\n//\tGLM_STATIC_ASSERT(\n//\t\tdetail::type<valType>::is_float ||\n//\t\tdetail::type<valType>::is_int ||\n//\t\tdetail::type<valType>::is_uint);\n//\n//\treturn typename detail::tvec3<bool>::bool_type(x.x >= y.x, x.y >= y.y,\n// x.z >= y.z);\n// }\n//\n// template <typename valType>\n// GLM_FUNC_QUALIFIER typename detail::tvec4<T, P>::bool_type greaterThanEqual\n//(\n//\tdetail::tvec4<T, P> const & x,\n//\tdetail::tvec4<T, P> const & y\n//)\n//{\n//\tGLM_STATIC_ASSERT(\n//\t\tdetail::type<valType>::is_float ||\n//\t\tdetail::type<valType>::is_int ||\n//\t\tdetail::type<valType>::is_uint);\n//\n//\treturn typename detail::tvec4<bool>::bool_type(x.x >= y.x, x.y >= y.y,\n// x.z >= y.z, x.w >= y.w);\n// }\n//\n//// equal\n// template <typename valType>\n// GLM_FUNC_QUALIFIER typename detail::tvec2<T, P>::bool_type equal\n//(\n//\tdetail::tvec2<T, P> const & x,\n//\tdetail::tvec2<T, P> const & y\n//)\n//{\n//\tGLM_STATIC_ASSERT(\n//\t\tdetail::type<valType>::is_float ||\n//\t\tdetail::type<valType>::is_int ||\n//\t\tdetail::type<valType>::is_uint ||\n//\t\tdetail::type<valType>::is_bool);\n//\n//\treturn typename detail::tvec2<T, P>::bool_type(x.x == y.x, x.y == y.y);\n// }\n//\n// template <typename valType>\n// GLM_FUNC_QUALIFIER typename detail::tvec3<T, P>::bool_type equal\n//(\n//\tdetail::tvec3<T, P> const & x,\n//\tdetail::tvec3<T, P> const & y\n//)\n//{\n//\tGLM_STATIC_ASSERT(\n//\t\tdetail::type<valType>::is_float ||\n//\t\tdetail::type<valType>::is_int ||\n//\t\tdetail::type<valType>::is_uint ||\n//\t\tdetail::type<valType>::is_bool);\n//\n//\treturn typename detail::tvec3<T, P>::bool_type(x.x == y.x, x.y == y.y,\n// x.z == y.z);\n// }\n//\n// template <typename valType>\n// GLM_FUNC_QUALIFIER typename detail::tvec4<T, P>::bool_type equal\n//(\n//\tdetail::tvec4<T, P> const & x,\n//\tdetail::tvec4<T, P> const & y\n//)\n//{\n//\tGLM_STATIC_ASSERT(\n//\t\tdetail::type<valType>::is_float ||\n//\t\tdetail::type<valType>::is_int ||\n//\t\tdetail::type<valType>::is_uint ||\n//\t\tdetail::type<valType>::is_bool);\n//\n//\treturn typename detail::tvec4<T, P>::bool_type(x.x == y.x, x.y == y.y,\n// x.z == y.z, x.w == y.w);\n// }\n//\n//// notEqual\n// template <typename valType>\n// GLM_FUNC_QUALIFIER typename detail::tvec2<T, P>::bool_type notEqual\n//(\n//\tdetail::tvec2<T, P> const & x,\n//\tdetail::tvec2<T, P> const & y\n//)\n//{\n//\tGLM_STATIC_ASSERT(\n//\t\tdetail::type<valType>::is_float ||\n//\t\tdetail::type<valType>::is_int ||\n//\t\tdetail::type<valType>::is_uint ||\n//\t\tdetail::type<valType>::is_bool);\n//\n//\treturn typename detail::tvec2<T, P>::bool_type(x.x != y.x, x.y != y.y);\n// }\n//\n// template <typename valType>\n// GLM_FUNC_QUALIFIER typename detail::tvec3<T, P>::bool_type notEqual\n//(\n//\tdetail::tvec3<T, P> const & x,\n//\tdetail::tvec3<T, P> const & y\n//)\n//{\n//\tGLM_STATIC_ASSERT(\n//\t\tdetail::type<valType>::is_float ||\n//\t\tdetail::type<valType>::is_int ||\n//\t\tdetail::type<valType>::is_uint ||\n//\t\tdetail::type<valType>::is_bool);\n//\n//\treturn typename detail::tvec3<T, P>::bool_type(x.x != y.x, x.y != y.y,\n// x.z != y.z);\n// }\n//\n// template <typename valType>\n// GLM_FUNC_QUALIFIER typename detail::tvec4<T, P>::bool_type notEqual\n//(\n//\tdetail::tvec4<T, P> const & x,\n//\tdetail::tvec4<T, P> const & y\n//)\n//{\n//\tGLM_STATIC_ASSERT(\n//\t\tdetail::type<valType>::is_float ||\n//\t\tdetail::type<valType>::is_int ||\n//\t\tdetail::type<valType>::is_uint ||\n//\t\tdetail::type<valType>::is_bool);\n//\n//\treturn typename detail::tvec4<T, P>::bool_type(x.x != y.x, x.y != y.y,\n// x.z != y.z, x.w != y.w);\n// }\n//\n//// any\n// GLM_FUNC_QUALIFIER bool any(detail::tvec2<bool> const & x)\n//{\n//\treturn x.x || x.y;\n// }\n//\n// GLM_FUNC_QUALIFIER bool any(detail::tvec3<bool> const & x)\n//{\n//     return x.x || x.y || x.z;\n// }\n//\n// GLM_FUNC_QUALIFIER bool any(detail::tvec4<bool> const & x)\n//{\n//     return x.x || x.y || x.z || x.w;\n// }\n//\n//// all\n// GLM_FUNC_QUALIFIER bool all(const detail::tvec2<bool>& x)\n//{\n//     return x.x && x.y;\n// }\n//\n// GLM_FUNC_QUALIFIER bool all(const detail::tvec3<bool>& x)\n//{\n//     return x.x && x.y && x.z;\n// }\n//\n// GLM_FUNC_QUALIFIER bool all(const detail::tvec4<bool>& x)\n//{\n//     return x.x && x.y && x.z && x.w;\n// }\n//\n//// not\n// GLM_FUNC_QUALIFIER detail::tvec2<bool>::bool_type not_\n//(\n//\tdetail::tvec2<bool> const & v\n//)\n//{\n//     return detail::tvec2<bool>::bool_type(!v.x, !v.y);\n// }\n//\n// GLM_FUNC_QUALIFIER detail::tvec3<bool>::bool_type not_\n//(\n//\tdetail::tvec3<bool> const & v\n//)\n//{\n//     return detail::tvec3<bool>::bool_type(!v.x, !v.y, !v.z);\n// }\n//\n// GLM_FUNC_QUALIFIER detail::tvec4<bool>::bool_type not_\n//(\n//\tdetail::tvec4<bool> const & v\n//)\n//{\n//     return detail::tvec4<bool>::bool_type(!v.x, !v.y, !v.z, !v.w);\n// }"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/precision.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/precision.hpp\n/// @date 2013-04-01 / 2013-04-01\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_CORE_PRECISION_INCLUDED\n#define GLM_CORE_PRECISION_INCLUDED\n\nnamespace glm {\nenum precision { highp, mediump, lowp, defaultp = highp };\n}  // namespace glm\n\n#endif  // GLM_CORE_PRECISION_INCLUDED\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/precision.inl",
    "content": ""
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/setup.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/setup.hpp\n/// @date 2006-11-13 / 2013-03-30\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_SETUP_INCLUDED\n#define GLM_SETUP_INCLUDED\n\n#include <cassert>\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Version\n\n#define GLM_VERSION 95\n#define GLM_VERSION_MAJOR 0\n#define GLM_VERSION_MINOR 9\n#define GLM_VERSION_PATCH 5\n#define GLM_VERSION_REVISION 3\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Platform\n\n#define GLM_PLATFORM_UNKNOWN 0x00000000\n#define GLM_PLATFORM_WINDOWS 0x00010000\n#define GLM_PLATFORM_LINUX 0x00020000\n#define GLM_PLATFORM_APPLE 0x00040000\n// #define GLM_PLATFORM_IOS\t\t\t0x00080000\n#define GLM_PLATFORM_ANDROID 0x00100000\n#define GLM_PLATFORM_CHROME_NACL 0x00200000\n#define GLM_PLATFORM_UNIX 0x00400000\n#define GLM_PLATFORM_QNXNTO 0x00800000\n#define GLM_PLATFORM_WINCE 0x01000000\n\n#ifdef GLM_FORCE_PLATFORM_UNKNOWN\n#define GLM_PLATFORM GLM_PLATFORM_UNKNOWN\n#elif defined(__QNXNTO__)\n#define GLM_PLATFORM GLM_PLATFORM_QNXNTO\n#elif defined(__APPLE__)\n#define GLM_PLATFORM GLM_PLATFORM_APPLE\n#elif defined(WINCE)\n#define GLM_PLATFORM GLM_PLATFORM_WINCE\n#elif defined(_WIN32)\n#define GLM_PLATFORM GLM_PLATFORM_WINDOWS\n#elif defined(__native_client__)\n#define GLM_PLATFORM GLM_PLATFORM_CHROME_NACL\n#elif defined(__ANDROID__)\n#define GLM_PLATFORM GLM_PLATFORM_ANDROID\n#elif defined(__linux)\n#define GLM_PLATFORM GLM_PLATFORM_LINUX\n#elif defined(__unix)\n#define GLM_PLATFORM GLM_PLATFORM_UNIX\n#else\n#define GLM_PLATFORM GLM_PLATFORM_UNKNOWN\n#endif  //\n\n// Report platform detection\n#if (defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_PLATFORM_DISPLAYED))\n#define GLM_MESSAGE_PLATFORM_DISPLAYED\n#if (GLM_PLATFORM & GLM_PLATFORM_QNXNTO)\n#pragma message(\"GLM: QNX platform detected\")\n// #\telif(GLM_PLATFORM & GLM_PLATFORM_IOS)\n// #\t\tpragma message(\"GLM: iOS platform detected\")\n#elif (GLM_PLATFORM & GLM_PLATFORM_APPLE)\n#pragma message(\"GLM: Apple platform detected\")\n#elif (GLM_PLATFORM & GLM_PLATFORM_WINCE)\n#pragma message(\"GLM: WinCE platform detected\")\n#elif (GLM_PLATFORM & GLM_PLATFORM_WINDOWS)\n#pragma message(\"GLM: Windows platform detected\")\n#elif (GLM_PLATFORM & GLM_PLATFORM_CHROME_NACL)\n#pragma message(\"GLM: Native Client detected\")\n#elif (GLM_PLATFORM & GLM_PLATFORM_ANDROID)\n#pragma message(\"GLM: Android platform detected\")\n#elif (GLM_PLATFORM & GLM_PLATFORM_LINUX)\n#pragma message(\"GLM: Linux platform detected\")\n#elif (GLM_PLATFORM & GLM_PLATFORM_UNIX)\n#pragma message(\"GLM: UNIX platform detected\")\n#elif (GLM_PLATFORM & GLM_PLATFORM_UNKNOWN)\n#pragma message(\"GLM: platform unknown\")\n#else\n#pragma message(\"GLM: platform not detected\")\n#endif\n#endif  // GLM_MESSAGE\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Compiler\n\n// User defines: GLM_FORCE_COMPILER_UNKNOWN\n// TODO ? __llvm__\n\n#define GLM_COMPILER_UNKNOWN 0x00000000\n\n// Intel\n#define GLM_COMPILER_INTEL 0x00100000\n#define GLM_COMPILER_INTEL9 0x00100010\n#define GLM_COMPILER_INTEL10_0 0x00100020\n#define GLM_COMPILER_INTEL10_1 0x00100030\n#define GLM_COMPILER_INTEL11_0 0x00100040\n#define GLM_COMPILER_INTEL11_1 0x00100050\n#define GLM_COMPILER_INTEL12_0 0x00100060\n#define GLM_COMPILER_INTEL12_1 0x00100070\n#define GLM_COMPILER_INTEL13_0 0x00100080\n\n// Visual C++ defines\n#define GLM_COMPILER_VC 0x01000000\n#define GLM_COMPILER_VC8 0x01000070\n#define GLM_COMPILER_VC9 0x01000080\n#define GLM_COMPILER_VC10 0x01000090\n#define GLM_COMPILER_VC11 0x010000A0\n#define GLM_COMPILER_VC12 0x010000B0\n\n// GCC defines\n#define GLM_COMPILER_GCC 0x02000000\n#define GLM_COMPILER_GCC34 0x02000050\n#define GLM_COMPILER_GCC35 0x02000060\n#define GLM_COMPILER_GCC40 0x02000070\n#define GLM_COMPILER_GCC41 0x02000080\n#define GLM_COMPILER_GCC42 0x02000090\n#define GLM_COMPILER_GCC43 0x020000A0\n#define GLM_COMPILER_GCC44 0x020000B0\n#define GLM_COMPILER_GCC45 0x020000C0\n#define GLM_COMPILER_GCC46 0x020000D0\n#define GLM_COMPILER_GCC47 0x020000E0\n#define GLM_COMPILER_GCC48 0x020000F0\n#define GLM_COMPILER_GCC49 0x02000100\n\n// Borland C++\n#define GLM_COMPILER_BC 0x04000000\n\n// CodeWarrior\n#define GLM_COMPILER_CODEWARRIOR 0x08000000\n\n// CUDA\n#define GLM_COMPILER_CUDA 0x10000000\n#define GLM_COMPILER_CUDA30 0x10000010\n#define GLM_COMPILER_CUDA31 0x10000020\n#define GLM_COMPILER_CUDA32 0x10000030\n#define GLM_COMPILER_CUDA40 0x10000040\n#define GLM_COMPILER_CUDA41 0x10000050\n#define GLM_COMPILER_CUDA42 0x10000060\n\n// Clang\n#define GLM_COMPILER_CLANG 0x20000000\n#define GLM_COMPILER_CLANG26 0x20000010\n#define GLM_COMPILER_CLANG27 0x20000020\n#define GLM_COMPILER_CLANG28 0x20000030\n#define GLM_COMPILER_CLANG29 0x20000040\n#define GLM_COMPILER_CLANG30 0x20000050\n#define GLM_COMPILER_CLANG31 0x20000060\n#define GLM_COMPILER_CLANG32 0x20000070\n#define GLM_COMPILER_CLANG33 0x20000080\n#define GLM_COMPILER_CLANG40 0x20000090\n#define GLM_COMPILER_CLANG41 0x200000A0\n#define GLM_COMPILER_CLANG42 0x200000B0\n#define GLM_COMPILER_CLANG43 0x200000C0\n#define GLM_COMPILER_CLANG50 0x200000D0\n\n// LLVM GCC\n#define GLM_COMPILER_LLVM_GCC 0x40000000\n\n// Build model\n#define GLM_MODEL_32 0x00000010\n#define GLM_MODEL_64 0x00000020\n\n// Force generic C++ compiler\n#ifdef GLM_FORCE_COMPILER_UNKNOWN\n#define GLM_COMPILER GLM_COMPILER_UNKNOWN\n\n#elif defined(__INTEL_COMPILER)\n#if __INTEL_COMPILER == 900\n#define GLM_COMPILER GLM_COMPILER_INTEL9\n#elif __INTEL_COMPILER == 1000\n#define GLM_COMPILER GLM_COMPILER_INTEL10_0\n#elif __INTEL_COMPILER == 1010\n#define GLM_COMPILER GLM_COMPILER_INTEL10_1\n#elif __INTEL_COMPILER == 1100\n#define GLM_COMPILER GLM_COMPILER_INTEL11_0\n#elif __INTEL_COMPILER == 1110\n#define GLM_COMPILER GLM_COMPILER_INTEL11_1\n#elif __INTEL_COMPILER == 1200\n#define GLM_COMPILER GLM_COMPILER_INTEL12_0\n#elif __INTEL_COMPILER == 1210\n#define GLM_COMPILER GLM_COMPILER_INTEL12_1\n#elif __INTEL_COMPILER >= 1300\n#define GLM_COMPILER GLM_COMPILER_INTEL13_0\n#else\n#define GLM_COMPILER GLM_COMPILER_INTEL\n#endif\n\n// CUDA\n#elif defined(__CUDACC__)\n#if !defined(CUDA_VERSION) && !defined(GLM_FORCE_CUDA)\n#include <cuda.h>  // make sure version is defined since nvcc does not define it itself!\n#endif\n#if CUDA_VERSION < 3000\n#error \"GLM requires CUDA 3.0 or higher\"\n#else\n#define GLM_COMPILER GLM_COMPILER_CUDA\n#endif\n\n// Visual C++\n#elif defined(_MSC_VER)\n#if _MSC_VER < 1400\n#error \"GLM requires Visual C++ 2005 or higher\"\n#elif _MSC_VER == 1400\n#define GLM_COMPILER GLM_COMPILER_VC8\n#elif _MSC_VER == 1500\n#define GLM_COMPILER GLM_COMPILER_VC9\n#elif _MSC_VER == 1600\n#define GLM_COMPILER GLM_COMPILER_VC10\n#elif _MSC_VER == 1700\n#define GLM_COMPILER GLM_COMPILER_VC11\n#elif _MSC_VER >= 1800\n#define GLM_COMPILER GLM_COMPILER_VC12\n#else  //_MSC_VER\n#define GLM_COMPILER GLM_COMPILER_VC\n#endif  //_MSC_VER\n\n// Clang\n#elif defined(__clang__)\n#if (__clang_major__ <= 1) || ((__clang_major__ == 2) && (__clang_minor__ < 6))\n#error \"GLM requires Clang 2.6 or higher\"\n#elif (__clang_major__ == 2) && (__clang_minor__ == 6)\n#define GLM_COMPILER GLM_COMPILER_CLANG26\n#elif (__clang_major__ == 2) && (__clang_minor__ == 7)\n#define GLM_COMPILER GLM_COMPILER_CLANG27\n#elif (__clang_major__ == 2) && (__clang_minor__ == 8)\n#define GLM_COMPILER GLM_COMPILER_CLANG28\n#elif (__clang_major__ == 2) && (__clang_minor__ == 9)\n#define GLM_COMPILER GLM_COMPILER_CLANG29\n#elif (__clang_major__ == 3) && (__clang_minor__ == 0)\n#define GLM_COMPILER GLM_COMPILER_CLANG30\n#elif (__clang_major__ == 3) && (__clang_minor__ == 1)\n#define GLM_COMPILER GLM_COMPILER_CLANG31\n#elif (__clang_major__ == 3) && (__clang_minor__ == 2)\n#define GLM_COMPILER GLM_COMPILER_CLANG32\n#elif (__clang_major__ == 3) && (__clang_minor__ == 3)\n#define GLM_COMPILER GLM_COMPILER_CLANG33\n#elif (__clang_major__ == 4) && (__clang_minor__ == 0)\n#define GLM_COMPILER GLM_COMPILER_CLANG40\n#elif (__clang_major__ == 4) && (__clang_minor__ == 1)\n#define GLM_COMPILER GLM_COMPILER_CLANG41\n#elif (__clang_major__ == 4) && (__clang_minor__ == 2)\n#define GLM_COMPILER GLM_COMPILER_CLANG42\n#elif (__clang_major__ == 4) && (__clang_minor__ >= 3)\n#define GLM_COMPILER GLM_COMPILER_CLANG43\n#elif (__clang_major__ > 4)\n#define GLM_COMPILER GLM_COMPILER_CLANG50\n#else\n#define GLM_COMPILER GLM_COMPILER_CLANG\n#endif\n\n// G++\n#elif (defined(__GNUC__) || \\\n       defined(__MINGW32__))  // || defined(__llvm__) || defined(__clang__)\n#if (__GNUC__ == 3) && (__GNUC_MINOR__ == 4)\n#define GLM_COMPILER GLM_COMPILER_GCC34\n#elif (__GNUC__ == 3) && (__GNUC_MINOR__ == 5)\n#define GLM_COMPILER GLM_COMPILER_GCC35\n#elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 0)\n#define GLM_COMPILER (GLM_COMPILER_GCC40)\n#elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 1)\n#define GLM_COMPILER (GLM_COMPILER_GCC41)\n#elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 2)\n#define GLM_COMPILER (GLM_COMPILER_GCC42)\n#elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 3)\n#define GLM_COMPILER (GLM_COMPILER_GCC43)\n#elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 4)\n#define GLM_COMPILER (GLM_COMPILER_GCC44)\n#elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 5)\n#define GLM_COMPILER (GLM_COMPILER_GCC45)\n#elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 6)\n#define GLM_COMPILER (GLM_COMPILER_GCC46)\n#elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 7)\n#define GLM_COMPILER (GLM_COMPILER_GCC47)\n#elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 8)\n#define GLM_COMPILER (GLM_COMPILER_GCC48)\n#elif (__GNUC__ == 4) && (__GNUC_MINOR__ >= 9)\n#define GLM_COMPILER (GLM_COMPILER_GCC49)\n#elif (__GNUC__ > 4)\n#define GLM_COMPILER (GLM_COMPILER_GCC49)\n#else\n#define GLM_COMPILER (GLM_COMPILER_GCC)\n#endif\n\n// Borland C++\n#elif defined(_BORLANDC_)\n#define GLM_COMPILER GLM_COMPILER_BC\n\n// Codewarrior\n#elif defined(__MWERKS__)\n#define GLM_COMPILER GLM_COMPILER_CODEWARRIOR\n\n#else\n#define GLM_COMPILER GLM_COMPILER_UNKNOWN\n#endif\n\n#ifndef GLM_COMPILER\n#error \\\n    \"GLM_COMPILER undefined, your compiler may not be supported by GLM. Add #define GLM_COMPILER 0 to ignore this message.\"\n#endif  // GLM_COMPILER\n\n// Report compiler detection\n#if (defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_COMPILER_DISPLAYED))\n#define GLM_MESSAGE_COMPILER_DISPLAYED\n#if (GLM_COMPILER & GLM_COMPILER_CUDA)\n#pragma message(\"GLM: CUDA compiler detected\")\n#elif (GLM_COMPILER & GLM_COMPILER_VC)\n#pragma message(\"GLM: Visual C++ compiler detected\")\n#elif (GLM_COMPILER & GLM_COMPILER_CLANG)\n#pragma message(\"GLM: Clang compiler detected\")\n#elif (GLM_COMPILER & GLM_COMPILER_LLVM_GCC)\n#pragma message(\"GLM: LLVM GCC compiler detected\")\n#elif (GLM_COMPILER & GLM_COMPILER_INTEL)\n#pragma message(\"GLM: Intel Compiler detected\")\n#elif (GLM_COMPILER & GLM_COMPILER_GCC)\n#if (GLM_COMPILER == GLM_COMPILER_GCC_LLVM)\n#pragma message(\"GLM: LLVM GCC compiler detected\")\n#elif (GLM_COMPILER == GLM_COMPILER_GCC_CLANG)\n#pragma message(\"GLM: CLANG compiler detected\")\n#else\n#pragma message(\"GLM: GCC compiler detected\")\n#endif\n#elif (GLM_COMPILER & GLM_COMPILER_BC)\n#pragma message(\"GLM: Borland compiler detected but not supported\")\n#elif (GLM_COMPILER & GLM_COMPILER_CODEWARRIOR)\n#pragma message(\"GLM: Codewarrior compiler detected but not supported\")\n#else\n#pragma message(\"GLM: Compiler not detected\")\n#endif\n#endif  // GLM_MESSAGE\n\n/////////////////\n// Build model //\n\n#if (defined(__arch64__) || defined(__LP64__) || defined(_M_X64) || \\\n     defined(__ppc64__) || defined(__x86_64__))\n#define GLM_MODEL GLM_MODEL_64\n#elif (defined(__i386__) || defined(__ppc__))\n#define GLM_MODEL GLM_MODEL_32\n#else\n#define GLM_MODEL GLM_MODEL_32\n#endif  //\n\n#if (!defined(GLM_MODEL) && GLM_COMPILER != 0)\n#error \\\n    \"GLM_MODEL undefined, your compiler may not be supported by GLM. Add #define GLM_MODEL 0 to ignore this message.\"\n#endif  // GLM_MODEL\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_MODEL_DISPLAYED))\n#define GLM_MESSAGE_MODEL_DISPLAYED\n#if (GLM_MODEL == GLM_MODEL_64)\n#pragma message(\"GLM: 64 bits model\")\n#elif (GLM_MODEL == GLM_MODEL_32)\n#pragma message(\"GLM: 32 bits model\")\n#endif  // GLM_MODEL\n#endif  // GLM_MESSAGE\n\n/////////////////\n// C++ Version //\n\n// User defines: GLM_FORCE_CXX98\n\n#define GLM_LANG_CXX_FLAG (1 << 0)\n#define GLM_LANG_CXX98_FLAG (1 << 1)\n#define GLM_LANG_CXX03_FLAG (1 << 2)\n#define GLM_LANG_CXX0X_FLAG (1 << 3)\n#define GLM_LANG_CXX11_FLAG (1 << 4)\n#define GLM_LANG_CXX1Y_FLAG (1 << 5)\n#define GLM_LANG_CXXMS_FLAG (1 << 6)\n#define GLM_LANG_CXXGNU_FLAG (1 << 7)\n\n#define GLM_LANG_CXX GLM_LANG_CXX_FLAG\n#define GLM_LANG_CXX98 (GLM_LANG_CXX | GLM_LANG_CXX98_FLAG)\n#define GLM_LANG_CXX03 (GLM_LANG_CXX98 | GLM_LANG_CXX03_FLAG)\n#define GLM_LANG_CXX0X (GLM_LANG_CXX03 | GLM_LANG_CXX0X_FLAG)\n#define GLM_LANG_CXX11 (GLM_LANG_CXX0X | GLM_LANG_CXX11_FLAG)\n#define GLM_LANG_CXX1Y (GLM_LANG_CXX11 | GLM_LANG_CXX1Y_FLAG)\n#define GLM_LANG_CXXMS GLM_LANG_CXXMS_FLAG\n#define GLM_LANG_CXXGNU GLM_LANG_CXXGNU_FLAG\n\n#if (defined(GLM_FORCE_CXX1Y))\n#define GLM_LANG GLM_LANG_CXX1Y\n#elif (defined(GLM_FORCE_CXX11))\n#define GLM_LANG GLM_LANG_CXX11\n#elif (defined(GLM_FORCE_CXX03))\n#define GLM_LANG GLM_LANG_CXX03\n#elif (defined(GLM_FORCE_CXX98))\n#define GLM_LANG GLM_LANG_CXX98\n#else\n#if (__cplusplus >= 201103L)\n#define GLM_LANG GLM_LANG_CXX11\n#elif ((GLM_COMPILER & GLM_COMPILER_CLANG) == GLM_COMPILER_CLANG)\n#if (GLM_PLATFORM == GLM_PLATFORM_APPLE)\n#define GLM_DETAIL_MAJOR 1\n#else\n#define GLM_DETAIL_MAJOR 0\n#endif\n#if (__clang_major__ < (2 + GLM_DETAIL_MAJOR))\n#define GLM_LANG GLM_LANG_CXX\n#elif (__has_feature(cxx_auto_type))\n#define GLM_LANG GLM_LANG_CXX0X\n#else\n#define GLM_LANG GLM_LANG_CXX98\n#endif\n#elif ((GLM_COMPILER & GLM_COMPILER_GCC) == GLM_COMPILER_GCC)\n#if defined(__GXX_EXPERIMENTAL_CXX0X__)\n#define GLM_LANG GLM_LANG_CXX0X\n#else\n#define GLM_LANG GLM_LANG_CXX98\n#endif\n#elif (GLM_COMPILER & GLM_COMPILER_VC)\n#if (defined(_MSC_EXTENSIONS))\n#if (GLM_COMPILER >= GLM_COMPILER_VC10)\n#define GLM_LANG (GLM_LANG_CXX0X | GLM_LANG_CXXMS_FLAG)\n#else\n#define GLM_LANG (GLM_LANG_CXX98 | GLM_LANG_CXXMS_FLAG)\n#endif\n#else\n#if (GLM_COMPILER >= GLM_COMPILER_VC10)\n#define GLM_LANG GLM_LANG_CXX0X\n#else\n#define GLM_LANG GLM_LANG_CXX98\n#endif\n#endif\n#elif (GLM_COMPILER & GLM_COMPILER_INTEL)\n#if (defined(_MSC_EXTENSIONS))\n#if (GLM_COMPILER >= GLM_COMPILER_INTEL13_0)\n#define GLM_LANG (GLM_LANG_CXX0X | GLM_LANG_CXXMS_FLAG)\n#else\n#define GLM_LANG (GLM_LANG_CXX98 | GLM_LANG_CXXMS_FLAG)\n#endif\n#else\n#if (GLM_COMPILER >= GLM_COMPILER_INTEL13_0)\n#define GLM_LANG (GLM_LANG_CXX0X)\n#else\n#define GLM_LANG (GLM_LANG_CXX98)\n#endif\n#endif\n#elif (__cplusplus >= 199711L)\n#define GLM_LANG GLM_LANG_CXX98\n#else\n#define GLM_LANG GLM_LANG_CXX\n#endif\n#endif\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_LANG_DISPLAYED))\n#define GLM_MESSAGE_LANG_DISPLAYED\n#if (GLM_LANG & GLM_LANG_CXXGNU_FLAG)\n#pragma message(\"GLM: C++ with language extensions\")\n#elif (GLM_LANG & GLM_LANG_CXXMS_FLAG)\n#pragma message(\"GLM: C++ with language extensions\")\n#elif (GLM_LANG & GLM_LANG_CXX11_FLAG)\n#pragma message(\"GLM: C++11\")\n#elif (GLM_LANG & GLM_LANG_CXX0X_FLAG)\n#pragma message(\"GLM: C++0x\")\n#elif (GLM_LANG & GLM_LANG_CXX03_FLAG)\n#pragma message(\"GLM: C++03\")\n#elif (GLM_LANG & GLM_LANG_CXX98_FLAG)\n#pragma message(\"GLM: C++98\")\n#else\n#pragma message(\"GLM: C++ language undetected\")\n#endif  // GLM_MODEL\n#pragma message( \\\n        \"GLM: #define GLM_FORCE_CXX98, GLM_FORCE_CXX03, GLM_LANG_CXX11 or GLM_FORCE_CXX1Y to force using a specific version of the C++ language\")\n#endif  // GLM_MESSAGE\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Has of C++ features\n\n#ifndef __has_feature\n#define __has_feature(x) 0  // Compatibility with non-clang compilers.\n#endif\n#ifndef __has_extension\n#define __has_extension __has_feature  // Compatibility with pre-3.0 compilers.\n#endif\n\n// http://clang.llvm.org/cxx_status.html\n// http://gcc.gnu.org/projects/cxx0x.html\n// http://msdn.microsoft.com/en-us/library/vstudio/hh567368(v=vs.120).aspx\n\n// N1720\n#define GLM_HAS_STATIC_ASSERT                                                \\\n  ((GLM_LANG & GLM_LANG_CXX11_FLAG) ||                                       \\\n   ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_VC) &&  \\\n    (GLM_COMPILER >= GLM_COMPILER_VC10)) ||                                  \\\n   ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_GCC) && \\\n    (GLM_COMPILER >= GLM_COMPILER_GCC43)) ||                                 \\\n   __has_feature(cxx_static_assert))\n\n// N1988\n#define GLM_HAS_EXTENDED_INTEGER_TYPE                                          \\\n  ((GLM_LANG & GLM_LANG_CXX11_FLAG) ||                                         \\\n   ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_VC) &&    \\\n    (GLM_COMPILER >= GLM_COMPILER_VC11)) ||                                    \\\n   ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_GCC) &&   \\\n    (GLM_COMPILER >= GLM_COMPILER_GCC43)) ||                                   \\\n   ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_CLANG) && \\\n    (GLM_COMPILER >= GLM_COMPILER_CLANG29)))\n\n// N2235\n#define GLM_HAS_CONSTEXPR                                                    \\\n  ((GLM_LANG & GLM_LANG_CXX11_FLAG) ||                                       \\\n   ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_GCC) && \\\n    (GLM_COMPILER >= GLM_COMPILER_GCC46)) ||                                 \\\n   __has_feature(cxx_constexpr))\n\n// N2672\n#define GLM_HAS_INITIALIZER_LISTS                                            \\\n  ((GLM_LANG & GLM_LANG_CXX11_FLAG) ||                                       \\\n   ((GLM_LANG & GLM_LANG_CXX0X_FLAG) &&                                      \\\n    ((GLM_COMPILER & GLM_COMPILER_VC) &&                                     \\\n     (GLM_COMPILER >= GLM_COMPILER_VC12))) ||                                \\\n   ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_GCC) && \\\n    (GLM_COMPILER >= GLM_COMPILER_GCC44)) ||                                 \\\n   __has_feature(cxx_generalized_initializers))\n\n// OpenMP\n#ifdef _OPENMP\n#if (GLM_COMPILER & GLM_COMPILER_GCC)\n#if (GLM_COMPILER > GLM_COMPILER_GCC47)\n#define GLM_HAS_OPENMP 31\n#elif (GLM_COMPILER > GLM_COMPILER_GCC44)\n#define GLM_HAS_OPENMP 30\n#elif (GLM_COMPILER > GLM_COMPILER_GCC42)\n#define GLM_HAS_OPENMP 25\n#endif\n#endif  //(GLM_COMPILER & GLM_COMPILER_GCC)\n\n#if (GLM_COMPILER & GLM_COMPILER_VC)\n#if (GLM_COMPILER > GLM_COMPILER_VC8)\n#define GLM_HAS_OPENMP 20\n#endif\n#endif  //(GLM_COMPILER & GLM_COMPILER_GCC)\n#endif\n\n// Not standard\n#define GLM_HAS_ANONYMOUS_UNION (GLM_LANG & GLM_LANG_CXXMS_FLAG)\n\n/////////////////\n// Platform\n\n// User defines: GLM_FORCE_PURE GLM_FORCE_SSE2 GLM_FORCE_AVX\n\n#define GLM_ARCH_PURE 0x0000\n#define GLM_ARCH_SSE2 0x0001\n#define GLM_ARCH_SSE3 0x0002  // | GLM_ARCH_SSE2\n#define GLM_ARCH_AVX 0x0008   // | GLM_ARCH_SSE3 | GLM_ARCH_SSE2\n#define GLM_ARCH_AVX2 0x0010  // | GLM_ARCH_AVX | GLM_ARCH_SSE3 | GLM_ARCH_SSE2\n\n#if (defined(GLM_FORCE_PURE))\n#define GLM_ARCH GLM_ARCH_PURE\n#elif (defined(GLM_FORCE_AVX2))\n#define GLM_ARCH (GLM_ARCH_AVX2 | GLM_ARCH_AVX | GLM_ARCH_SSE3 | GLM_ARCH_SSE2)\n#elif (defined(GLM_FORCE_AVX))\n#define GLM_ARCH (GLM_ARCH_AVX | GLM_ARCH_SSE3 | GLM_ARCH_SSE2)\n#elif (defined(GLM_FORCE_SSE3))\n#define GLM_ARCH (GLM_ARCH_SSE3 | GLM_ARCH_SSE2)\n#elif (defined(GLM_FORCE_SSE2))\n#define GLM_ARCH (GLM_ARCH_SSE2)\n#elif (GLM_COMPILER & GLM_COMPILER_VC)\n#if _M_IX86_FP == 2 && defined(__AVX__)\n#define GLM_ARCH (GLM_ARCH_AVX | GLM_ARCH_SSE3 | GLM_ARCH_SSE2)\n#elif _M_IX86_FP == 2\n#define GLM_ARCH (GLM_ARCH_SSE2)\n#else\n#define GLM_ARCH (GLM_ARCH_PURE)\n#endif\n#elif ((GLM_PLATFORM & GLM_PLATFORM_APPLE) && (GLM_COMPILER & GLM_COMPILER_GCC))\n#define GLM_ARCH GLM_ARCH_PURE\n#elif (((GLM_COMPILER & GLM_COMPILER_GCC) &&           \\\n        (defined(__i386__) || defined(__x86_64__))) || \\\n       (GLM_COMPILER & GLM_COMPILER_LLVM_GCC))\n#if defined(__AVX2__)\n#define GLM_ARCH (GLM_ARCH_AVX2 | GLM_ARCH_AVX | GLM_ARCH_SSE3 | GLM_ARCH_SSE2)\n#elif defined(__AVX__)\n#define GLM_ARCH (GLM_ARCH_AVX | GLM_ARCH_SSE3 | GLM_ARCH_SSE2)\n#elif defined(__SSE3__)\n#define GLM_ARCH (GLM_ARCH_SSE3 | GLM_ARCH_SSE2)\n#elif defined(__SSE2__)\n#define GLM_ARCH (GLM_ARCH_SSE2)\n#else\n#define GLM_ARCH (GLM_ARCH_PURE)\n#endif\n#else\n#define GLM_ARCH GLM_ARCH_PURE\n#endif\n\n// With MinGW-W64, including intrinsic headers before intrin.h will produce some\n// errors. The problem is that windows.h (and maybe other headers) will silently\n// include intrin.h, which of course causes problems. To fix, we just explicitly\n// include intrin.h here.\n#if defined(__MINGW32__) && (GLM_ARCH != GLM_ARCH_PURE)\n#include <intrin.h>\n#endif\n\n// #if(GLM_ARCH != GLM_ARCH_PURE)\n#if (GLM_ARCH & GLM_ARCH_AVX2)\n#include <immintrin.h>\n#endif  // GLM_ARCH\n#if (GLM_ARCH & GLM_ARCH_AVX)\n#include <immintrin.h>\n#endif  // GLM_ARCH\n#if (GLM_ARCH & GLM_ARCH_SSE4)\n#include <smmintrin.h>\n#endif  // GLM_ARCH\n#if (GLM_ARCH & GLM_ARCH_SSE3)\n#include <pmmintrin.h>\n#endif  // GLM_ARCH\n#if (GLM_ARCH & GLM_ARCH_SSE2)\n#include <emmintrin.h>\n#if (GLM_COMPILER == \\\n     GLM_COMPILER_VC8)  // VC8 is missing some intrinsics, workaround\ninline float _mm_cvtss_f32(__m128 A) { return A.m128_f32[0]; }\ninline __m128 _mm_castpd_ps(__m128d PD) {\n  union {\n    __m128 ps;\n    __m128d pd;\n  } c;\n  c.pd = PD;\n  return c.ps;\n}\ninline __m128d _mm_castps_pd(__m128 PS) {\n  union {\n    __m128 ps;\n    __m128d pd;\n  } c;\n  c.ps = PS;\n  return c.pd;\n}\ninline __m128i _mm_castps_si128(__m128 PS) {\n  union {\n    __m128 ps;\n    __m128i pi;\n  } c;\n  c.ps = PS;\n  return c.pi;\n}\ninline __m128 _mm_castsi128_ps(__m128i PI) {\n  union {\n    __m128 ps;\n    __m128i pi;\n  } c;\n  c.pi = PI;\n  return c.ps;\n}\n#endif\n#endif  // GLM_ARCH\n// #endif//(GLM_ARCH != GLM_ARCH_PURE)\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_ARCH_DISPLAYED))\n#define GLM_MESSAGE_ARCH_DISPLAYED\n#if (GLM_ARCH == GLM_ARCH_PURE)\n#pragma message(\"GLM: Platform independent code\")\n#elif (GLM_ARCH & GLM_ARCH_SSE2)\n#pragma message(\"GLM: SSE2 instruction set\")\n#elif (GLM_ARCH & GLM_ARCH_SSE3)\n#pragma message(\"GLM: SSE3 instruction set\")\n#elif (GLM_ARCH & GLM_ARCH_SSE4)\n#pragma message(\"GLM: SSE4 instruction set\")\n#elif (GLM_ARCH & GLM_ARCH_AVX)\n#pragma message(\"GLM: AVX instruction set\")\n#elif (GLM_ARCH & GLM_ARCH_AVX2)\n#pragma message(\"GLM: AVX2 instruction set\")\n#endif  // GLM_ARCH\n#pragma message( \\\n        \"GLM: #define GLM_FORCE_PURE to avoid using platform specific instruction sets\")\n#endif  // GLM_MESSAGE\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Radians\n\n// #define GLM_FORCE_RADIANS\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Static assert\n\n#if GLM_HAS_STATIC_ASSERT\n#define GLM_STATIC_ASSERT(x, message) static_assert(x, message)\n#elif (defined(BOOST_STATIC_ASSERT))\n#define GLM_STATIC_ASSERT(x, message) BOOST_STATIC_ASSERT(x)\n#elif (GLM_COMPILER & GLM_COMPILER_VC)\n#define GLM_STATIC_ASSERT(x, message) \\\n  typedef char __CASSERT__##__LINE__[(x) ? 1 : -1]\n#else\n#define GLM_STATIC_ASSERT(x, message)\n#define GLM_STATIC_ASSERT_NULL\n#endif  // GLM_LANG\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Qualifiers\n\n// User defines: GLM_FORCE_INLINE GLM_FORCE_CUDA\n\n#if (defined(GLM_FORCE_CUDA) || (GLM_COMPILER & GLM_COMPILER_CUDA))\n#define GLM_CUDA_FUNC_DEF __device__ __host__\n#define GLM_CUDA_FUNC_DECL __device__ __host__\n#else\n#define GLM_CUDA_FUNC_DEF\n#define GLM_CUDA_FUNC_DECL\n#endif\n\n#if GLM_COMPILER & GLM_COMPILER_GCC\n#define GLM_VAR_USED __attribute__((unused))\n#else\n#define GLM_VAR_USED\n#endif\n\n#if (defined(GLM_FORCE_INLINE))\n#if ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC8))\n#define GLM_INLINE __forceinline\n#elif ((GLM_COMPILER & GLM_COMPILER_GCC) && \\\n       (GLM_COMPILER >= GLM_COMPILER_GCC34))\n#define GLM_INLINE __attribute__((always_inline)) inline\n#elif (GLM_COMPILER & GLM_COMPILER_CLANG)\n#define GLM_INLINE __attribute__((always_inline))\n#else\n#define GLM_INLINE inline\n#endif  // GLM_COMPILER\n#else\n#define GLM_INLINE inline\n#endif  // defined(GLM_FORCE_INLINE)\n\n#define GLM_FUNC_DECL GLM_CUDA_FUNC_DECL\n#define GLM_FUNC_QUALIFIER GLM_CUDA_FUNC_DEF GLM_INLINE\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Swizzle operators\n\n// User defines: GLM_SWIZZLE\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_SWIZZLE_DISPLAYED))\n#define GLM_MESSAGE_SWIZZLE_DISPLAYED\n#if defined(GLM_SWIZZLE)\n#pragma message(\"GLM: Swizzling operators enabled\")\n#else\n#pragma message( \\\n        \"GLM: Swizzling operators disabled, #define GLM_SWIZZLE to enable swizzle operators\")\n#endif\n#endif  // GLM_MESSAGE\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Length type\n\n// User defines: GLM_FORCE_SIZE_T_LENGTH\n\nnamespace glm {\n#if defined(GLM_FORCE_SIZE_T_LENGTH)\ntypedef std::size_t length_t;\n#else\ntypedef int length_t;\n#endif\n}  // namespace glm\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_FORCE_SIZE_T_LENGTH))\n#define GLM_MESSAGE_FORCE_SIZE_T_LENGTH\n#if defined(GLM_FORCE_SIZE_T_LENGTH)\n#pragma message( \\\n        \"GLM: .length() returns glm::length_t, a typedef of std::size_t\")\n#else\n#pragma message( \\\n        \"GLM: .length() returns glm::length_t, a typedef of int following the GLSL specification\")\n#pragma message( \\\n        \"GLM: #define GLM_FORCE_SIZE_T_LENGTH for .length() to return a std::size_t\")\n#endif\n#endif  // GLM_MESSAGE\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Qualifiers\n\n#if ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC8))\n#define GLM_DEPRECATED __declspec(deprecated)\n#define GLM_ALIGN(x) __declspec(align(x))\n#define GLM_ALIGNED_STRUCT(x) __declspec(align(x)) struct\n#define GLM_RESTRICT __declspec(restrict)\n#define GLM_RESTRICT_VAR __restrict\n#elif (GLM_COMPILER & GLM_COMPILER_INTEL)\n#define GLM_DEPRECATED\n#define GLM_ALIGN(x) __declspec(align(x))\n#define GLM_ALIGNED_STRUCT(x) __declspec(align(x)) struct\n#define GLM_RESTRICT\n#define GLM_RESTRICT_VAR __restrict\n#elif (GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_CLANG))\n#define GLM_DEPRECATED __attribute__((__deprecated__))\n#define GLM_ALIGN(x) __attribute__((aligned(x)))\n#define GLM_ALIGNED_STRUCT(x) struct __attribute__((aligned(x)))\n#define GLM_RESTRICT __restrict__\n#define GLM_RESTRICT_VAR __restrict__\n#else\n#define GLM_DEPRECATED\n#define GLM_ALIGN\n#define GLM_ALIGNED_STRUCT(x)\n#define GLM_RESTRICT\n#define GLM_RESTRICT_VAR\n#endif  // GLM_COMPILER\n\n#if GLM_HAS_CONSTEXPR\n#define GLM_CONSTEXPR constexpr\n#else\n#define GLM_CONSTEXPR\n#endif\n\n#endif  // GLM_SETUP_INCLUDED\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_float.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_float.hpp\n/// @date 2008-08-22 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_core_type_float\n#define glm_core_type_float\n\n#include \"setup.hpp\"\n\nnamespace glm {\nnamespace detail {\ntypedef float float32;\ntypedef double float64;\n}  // namespace detail\n\ntypedef float lowp_float_t;\ntypedef float mediump_float_t;\ntypedef double highp_float_t;\n\n/// @addtogroup core_precision\n/// @{\n\n/// Low precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.4 Floats</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef lowp_float_t lowp_float;\n\n/// Medium precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.4 Floats</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef mediump_float_t mediump_float;\n\n/// High precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.4 Floats</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef highp_float_t highp_float;\n\n#if (!defined(GLM_PRECISION_HIGHP_FLOAT) &&   \\\n     !defined(GLM_PRECISION_MEDIUMP_FLOAT) && \\\n     !defined(GLM_PRECISION_LOWP_FLOAT))\ntypedef mediump_float float_t;\n#elif (defined(GLM_PRECISION_HIGHP_FLOAT) &&    \\\n       !defined(GLM_PRECISION_MEDIUMP_FLOAT) && \\\n       !defined(GLM_PRECISION_LOWP_FLOAT))\ntypedef highp_float float_t;\n#elif (!defined(GLM_PRECISION_HIGHP_FLOAT) &&  \\\n       defined(GLM_PRECISION_MEDIUMP_FLOAT) && \\\n       !defined(GLM_PRECISION_LOWP_FLOAT))\ntypedef mediump_float float_t;\n#elif (!defined(GLM_PRECISION_HIGHP_FLOAT) &&   \\\n       !defined(GLM_PRECISION_MEDIUMP_FLOAT) && \\\n       defined(GLM_PRECISION_LOWP_FLOAT))\ntypedef lowp_float float_t;\n#else\n#error \\\n    \"GLM error: multiple default precision requested for floating-point types\"\n#endif\n\ntypedef float float32;\ntypedef double float64;\n\n////////////////////\n// check type sizes\n#ifndef GLM_STATIC_ASSERT_NULL\nGLM_STATIC_ASSERT(sizeof(glm::float32) == 4,\n                  \"float32 size isn't 4 bytes on this platform\");\nGLM_STATIC_ASSERT(sizeof(glm::float64) == 8,\n                  \"float64 size isn't 8 bytes on this platform\");\n#endif  // GLM_STATIC_ASSERT_NULL\n\n/// @}\n\n}  // namespace glm\n\n#endif  // glm_core_type_float\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_gentype.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_gentype.hpp\n/// @date 2008-10-05 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_core_type_gentype\n#define glm_core_type_gentype\n\nnamespace glm {\nenum profile { nice, fast, simd };\n\ntypedef std::size_t sizeType;\n\nnamespace detail {\ntemplate <typename VALTYPE, template <typename> class TYPE>\nstruct genType {\n public:\n  enum ctor { null };\n\n  typedef VALTYPE value_type;\n  typedef VALTYPE& value_reference;\n  typedef VALTYPE* value_pointer;\n  typedef VALTYPE const* value_const_pointer;\n  typedef TYPE<bool> bool_type;\n\n  typedef sizeType size_type;\n  static bool is_vector();\n  static bool is_matrix();\n\n  typedef TYPE<VALTYPE> type;\n  typedef TYPE<VALTYPE>* pointer;\n  typedef TYPE<VALTYPE> const* const_pointer;\n  typedef TYPE<VALTYPE> const* const const_pointer_const;\n  typedef TYPE<VALTYPE>* const pointer_const;\n  typedef TYPE<VALTYPE>& reference;\n  typedef TYPE<VALTYPE> const& const_reference;\n  typedef TYPE<VALTYPE> const& param_type;\n\n  //////////////////////////////////////\n  // Address (Implementation details)\n\n  value_const_pointer value_address() const { return value_pointer(this); }\n  value_pointer value_address() { return value_pointer(this); }\n\n  // protected:\n  //\tenum kind\n  //\t{\n  //\t\tGEN_TYPE,\n  //\t\tVEC_TYPE,\n  //\t\tMAT_TYPE\n  //\t};\n\n  //\ttypedef typename TYPE::kind kind;\n};\n\ntemplate <typename VALTYPE, template <typename> class TYPE>\nbool genType<VALTYPE, TYPE>::is_vector() {\n  return true;\n}\n/*\n        template <typename valTypeT, unsigned int colT, unsigned int rowT,\n   profile proT = nice> class base\n        {\n        public:\n                //////////////////////////////////////\n                // Traits\n\n                typedef sizeType\n   size_type; typedef valTypeT\n   value_type;\n\n                typedef base<value_type, colT, rowT>\t\tclass_type;\n\n                typedef base<bool, colT, rowT> bool_type; typedef\n   base<value_type, rowT, 1>\t\t\tcol_type; typedef\n   base<value_type, colT, 1>\t\t\trow_type; typedef\n   base<value_type, rowT, colT>\t\ttranspose_type;\n\n                static size_type\n   col_size(); static size_type\n   row_size(); static size_type\n   value_size(); static bool\n   is_scalar(); static bool\n   is_vector(); static bool\n   is_matrix();\n\n        private:\n                // Data\n                col_type value[colT];\n\n        public:\n                //////////////////////////////////////\n                // Constructors\n                base();\n                base(class_type const & m);\n\n                explicit base(T const & x);\n                explicit base(value_type const * const x);\n                explicit base(col_type const * const x);\n\n                //////////////////////////////////////\n                // Conversions\n                template <typename vU, uint cU, uint rU, profile pU>\n                explicit base(base<vU, cU, rU, pU> const & m);\n\n                //////////////////////////////////////\n                // Accesses\n                col_type& operator[](size_type i);\n                col_type const & operator[](size_type i) const;\n\n                //////////////////////////////////////\n                // Unary updatable operators\n                class_type& operator=  (class_type const & x);\n                class_type& operator+= (T const & x);\n                class_type& operator+= (class_type const & x);\n                class_type& operator-= (T const & x);\n                class_type& operator-= (class_type const & x);\n                class_type& operator*= (T const & x);\n                class_type& operator*= (class_type const & x);\n                class_type& operator/= (T const & x);\n                class_type& operator/= (class_type const & x);\n                class_type& operator++ ();\n                class_type& operator-- ();\n        };\n*/\n\n// template <typename T>\n// struct traits\n//{\n//\tstatic const bool is_signed = false;\n//\tstatic const bool is_float = false;\n//\tstatic const bool is_vector = false;\n//\tstatic const bool is_matrix = false;\n//\tstatic const bool is_genType = false;\n//\tstatic const bool is_genIType = false;\n//\tstatic const bool is_genUType = false;\n// };\n\n// template <>\n// struct traits<half>\n//{\n//\tstatic const bool is_float = true;\n//\tstatic const bool is_genType = true;\n// };\n\n// template <>\n// struct traits<float>\n//{\n//\tstatic const bool is_float = true;\n//\tstatic const bool is_genType = true;\n// };\n\n// template <>\n// struct traits<double>\n//{\n//\tstatic const bool is_float = true;\n//\tstatic const bool is_genType = true;\n// };\n\n// template <typename genType>\n// struct desc\n//{\n//\ttypedef genType\t\t\t\t\t\t\ttype;\n//\ttypedef genType *\t\t\t\t\t\tpointer;\n//\ttypedef genType const*\t\t\t\t\tconst_pointer;\n//\ttypedef genType const *const\t\t\tconst_pointer_const;\n//\ttypedef genType *const\t\t\t\t\tpointer_const;\n//\ttypedef genType & reference; \ttypedef genType const&\n// const_reference; \ttypedef genType const&\n// param_type;\n\n//\ttypedef typename genType::value_type\tvalue_type;\n//\ttypedef typename genType::size_type\t\tsize_type;\n//\tstatic const typename size_type\t\t\tvalue_size;\n//};\n\n// template <typename genType>\n// const typename desc<genType>::size_type desc<genType>::value_size =\n// genType::value_size();\n\n}  // namespace detail\n}  // namespace glm\n\n// #include \"type_gentype.inl\"\n\n#endif  // glm_core_type_gentype\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_gentype.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_gentype.inl\n/// @date 2008-10-05 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\nnamespace detail {\n\n/////////////////////////////////\n// Static functions\n\ntemplate <typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::size_type base<vT, cT, rT, pT>::col_size() {\n  return cT;\n}\n\ntemplate <typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::size_type base<vT, cT, rT, pT>::row_size() {\n  return rT;\n}\n\ntemplate <typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::size_type base<vT, cT, rT, pT>::value_size() {\n  return rT * cT;\n}\n\ntemplate <typename vT, uint cT, uint rT, profile pT>\nbool base<vT, cT, rT, pT>::is_scalar() {\n  return rT == 1 && cT == 1;\n}\n\ntemplate <typename vT, uint cT, uint rT, profile pT>\nbool base<vT, cT, rT, pT>::is_vector() {\n  return rT == 1;\n}\n\ntemplate <typename vT, uint cT, uint rT, profile pT>\nbool base<vT, cT, rT, pT>::is_matrix() {\n  return rT != 1;\n}\n\n/////////////////////////////////\n// Constructor\n\ntemplate <typename vT, uint cT, uint rT, profile pT>\nbase<vT, cT, rT, pT>::base() {\n  memset(&this->value, 0, cT * rT * sizeof(vT));\n}\n\ntemplate <typename vT, uint cT, uint rT, profile pT>\nbase<vT, cT, rT, pT>::base(typename base<vT, cT, rT, pT>::class_type const& m) {\n  for (typename genType<vT, cT, rT, pT>::size_type i =\n           typename base<vT, cT, rT, pT>::size_type(0);\n       i < base<vT, cT, rT, pT>::col_size(); ++i) {\n    this->value[i] = m[i];\n  }\n}\n\ntemplate <typename vT, uint cT, uint rT, profile pT>\nbase<vT, cT, rT, pT>::base(typename base<vT, cT, rT, pT>::T const& x) {\n  if (rT == 1)  // vector\n  {\n    for (typename base<vT, cT, rT, pT>::size_type i =\n             typename base<vT, cT, rT, pT>::size_type(0);\n         i < base<vT, cT, rT, pT>::col_size(); ++i) {\n      this->value[i][rT] = x;\n    }\n  } else  // matrix\n  {\n    memset(&this->value, 0, cT * rT * sizeof(vT));\n\n    typename base<vT, cT, rT, pT>::size_type stop = cT < rT ? cT : rT;\n\n    for (typename base<vT, cT, rT, pT>::size_type i =\n             typename base<vT, cT, rT, pT>::size_type(0);\n         i < stop; ++i) {\n      this->value[i][i] = x;\n    }\n  }\n}\n\ntemplate <typename vT, uint cT, uint rT, profile pT>\nbase<vT, cT, rT, pT>::base(\n    typename base<vT, cT, rT, pT>::value_type const* const x) {\n  memcpy(&this->value, &x.value, cT * rT * sizeof(vT));\n}\n\ntemplate <typename vT, uint cT, uint rT, profile pT>\nbase<vT, cT, rT, pT>::base(\n    typename base<vT, cT, rT, pT>::col_type const* const x) {\n  for (typename base<vT, cT, rT, pT>::size_type i =\n           typename base<vT, cT, rT, pT>::size_type(0);\n       i < base<vT, cT, rT, pT>::col_size(); ++i) {\n    this->value[i] = x[i];\n  }\n}\n\ntemplate <typename vT, uint cT, uint rT, profile pT>\ntemplate <typename vU, uint cU, uint rU, profile pU>\nbase<vT, cT, rT, pT>::base(base<vU, cU, rU, pU> const& m) {\n  for (typename base<vT, cT, rT, pT>::size_type i =\n           typename base<vT, cT, rT, pT>::size_type(0);\n       i < base<vT, cT, rT, pT>::col_size(); ++i) {\n    this->value[i] = base<vT, cT, rT, pT>(m[i]);\n  }\n}\n\n//////////////////////////////////////\n// Accesses\n\ntemplate <typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::col_type& base<vT, cT, rT, pT>::operator[](\n    typename base<vT, cT, rT, pT>::size_type i) {\n  return this->value[i];\n}\n\ntemplate <typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::col_type const& base<vT, cT, rT, pT>::operator[](\n    typename base<vT, cT, rT, pT>::size_type i) const {\n  return this->value[i];\n}\n\n//////////////////////////////////////\n// Unary updatable operators\n\ntemplate <typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator=(\n    typename base<vT, cT, rT, pT>::class_type const& x) {\n  memcpy(&this->value, &x.value, cT * rT * sizeof(vT));\n  return *this;\n}\n\ntemplate <typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator+=(\n    typename base<vT, cT, rT, pT>::T const& x) {\n  typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();\n  typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();\n\n  for (typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)\n    for (typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)\n      this->value[j][i] += x;\n\n  return *this;\n}\n\ntemplate <typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator+=(\n    typename base<vT, cT, rT, pT>::class_type const& x) {\n  typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();\n  typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();\n\n  for (typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)\n    for (typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)\n      this->value[j][i] += x[j][i];\n\n  return *this;\n}\n\ntemplate <typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator-=(\n    typename base<vT, cT, rT, pT>::T const& x) {\n  typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();\n  typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();\n\n  for (typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)\n    for (typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)\n      this->value[j][i] -= x;\n\n  return *this;\n}\n\ntemplate <typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator-=(\n    typename base<vT, cT, rT, pT>::class_type const& x) {\n  typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();\n  typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();\n\n  for (typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)\n    for (typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)\n      this->value[j][i] -= x[j][i];\n\n  return *this;\n}\n\ntemplate <typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator*=(\n    typename base<vT, cT, rT, pT>::T const& x) {\n  typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();\n  typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();\n\n  for (typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)\n    for (typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)\n      this->value[j][i] *= x;\n\n  return *this;\n}\n\ntemplate <typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator*=(\n    typename base<vT, cT, rT, pT>::class_type const& x) {\n  typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();\n  typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();\n\n  for (typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)\n    for (typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)\n      this->value[j][i] *= x[j][i];\n\n  return *this;\n}\n\ntemplate <typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator/=(\n    typename base<vT, cT, rT, pT>::T const& x) {\n  typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();\n  typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();\n\n  for (typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)\n    for (typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)\n      this->value[j][i] /= x;\n\n  return *this;\n}\n\ntemplate <typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator/=(\n    typename base<vT, cT, rT, pT>::class_type const& x) {\n  typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();\n  typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();\n\n  for (typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)\n    for (typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)\n      this->value[j][i] /= x[j][i];\n\n  return *this;\n}\n\ntemplate <typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator++() {\n  typename base<vT, cT, rT, pT>::size_type stop_col = col_size();\n  typename base<vT, cT, rT, pT>::size_type stop_row = row_size();\n\n  for (typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)\n    for (typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)\n      ++this->value[j][i];\n\n  return *this;\n}\n\ntemplate <typename vT, uint cT, uint rT, profile pT>\ntypename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator--() {\n  typename base<vT, cT, rT, pT>::size_type stop_col = col_size();\n  typename base<vT, cT, rT, pT>::size_type stop_row = row_size();\n\n  for (typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)\n    for (typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)\n      --this->value[j][i];\n\n  return *this;\n}\n\n}  // namespace detail\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_half.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_half.hpp\n/// @date 2008-08-17 / 2011-09-20\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_core_type_half\n#define glm_core_type_half\n\n#include \"setup.hpp\"\n\nnamespace glm {\nnamespace detail {\ntypedef short hdata;\n\nGLM_FUNC_DECL float toFloat32(hdata value);\nGLM_FUNC_DECL hdata toFloat16(float const& value);\n\n}  // namespace detail\n\n/// half-precision floating-point numbers.\n// typedef detail::hdata\t\thalf;\n\n}  // namespace glm\n\n#include \"type_half.inl\"\n\n#endif  // glm_core_type_half\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_half.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///\n/// This half implementation is based on OpenEXR which is Copyright (c) 2002,\n/// Industrial Light & Magic, a division of Lucas Digital Ltd. LLC\n///\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_half.inl\n/// @date 2008-08-17 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\nnamespace detail {\nGLM_FUNC_QUALIFIER float overflow() {\n  volatile float f = 1e10;\n\n  for (int i = 0; i < 10; ++i)\n    f *= f;  // this will overflow before\n             // the forloop terminates\n  return f;\n}\n\nunion uif32 {\n  GLM_FUNC_QUALIFIER uif32() : i(0) {}\n\n  GLM_FUNC_QUALIFIER uif32(float f) : f(f) {}\n\n  GLM_FUNC_QUALIFIER uif32(uint32 i) : i(i) {}\n\n  float f;\n  uint32 i;\n};\n\nGLM_FUNC_QUALIFIER float toFloat32(hdata value) {\n  int s = (value >> 15) & 0x00000001;\n  int e = (value >> 10) & 0x0000001f;\n  int m = value & 0x000003ff;\n\n  if (e == 0) {\n    if (m == 0) {\n      //\n      // Plus or minus zero\n      //\n\n      detail::uif32 result;\n      result.i = (unsigned int)(s << 31);\n      return result.f;\n    } else {\n      //\n      // Denormalized number -- renormalize it\n      //\n\n      while (!(m & 0x00000400)) {\n        m <<= 1;\n        e -= 1;\n      }\n\n      e += 1;\n      m &= ~0x00000400;\n    }\n  } else if (e == 31) {\n    if (m == 0) {\n      //\n      // Positive or negative infinity\n      //\n\n      uif32 result;\n      result.i = (unsigned int)((s << 31) | 0x7f800000);\n      return result.f;\n    } else {\n      //\n      // Nan -- preserve sign and significand bits\n      //\n\n      uif32 result;\n      result.i = (unsigned int)((s << 31) | 0x7f800000 | (m << 13));\n      return result.f;\n    }\n  }\n\n  //\n  // Normalized number\n  //\n\n  e = e + (127 - 15);\n  m = m << 13;\n\n  //\n  // Assemble s, e and m.\n  //\n\n  uif32 Result;\n  Result.i = (unsigned int)((s << 31) | (e << 23) | m);\n  return Result.f;\n}\n\nGLM_FUNC_QUALIFIER hdata toFloat16(float const& f) {\n  uif32 Entry;\n  Entry.f = f;\n  int i = (int)Entry.i;\n\n  //\n  // Our floating point number, f, is represented by the bit\n  // pattern in integer i.  Disassemble that bit pattern into\n  // the sign, s, the exponent, e, and the significand, m.\n  // Shift s into the position where it will go in in the\n  // resulting half number.\n  // Adjust e, accounting for the different exponent bias\n  // of float and half (127 versus 15).\n  //\n\n  int s = (i >> 16) & 0x00008000;\n  int e = ((i >> 23) & 0x000000ff) - (127 - 15);\n  int m = i & 0x007fffff;\n\n  //\n  // Now reassemble s, e and m into a half:\n  //\n\n  if (e <= 0) {\n    if (e < -10) {\n      //\n      // E is less than -10.  The absolute value of f is\n      // less than half_MIN (f may be a small normalized\n      // float, a denormalized float or a zero).\n      //\n      // We convert f to a half zero.\n      //\n\n      return hdata(s);\n    }\n\n    //\n    // E is between -10 and 0.  F is a normalized float,\n    // whose magnitude is less than __half_NRM_MIN.\n    //\n    // We convert f to a denormalized half.\n    //\n\n    m = (m | 0x00800000) >> (1 - e);\n\n    //\n    // Round to nearest, round \"0.5\" up.\n    //\n    // Rounding may cause the significand to overflow and make\n    // our number normalized.  Because of the way a half's bits\n    // are laid out, we don't have to treat this case separately;\n    // the code below will handle it correctly.\n    //\n\n    if (m & 0x00001000) m += 0x00002000;\n\n    //\n    // Assemble the half from s, e (zero) and m.\n    //\n\n    return hdata(s | (m >> 13));\n  } else if (e == 0xff - (127 - 15)) {\n    if (m == 0) {\n      //\n      // F is an infinity; convert f to a half\n      // infinity with the same sign as f.\n      //\n\n      return hdata(s | 0x7c00);\n    } else {\n      //\n      // F is a NAN; we produce a half NAN that preserves\n      // the sign bit and the 10 leftmost bits of the\n      // significand of f, with one exception: If the 10\n      // leftmost bits are all zero, the NAN would turn\n      // into an infinity, so we have to set at least one\n      // bit in the significand.\n      //\n\n      m >>= 13;\n\n      return hdata(s | 0x7c00 | m | (m == 0));\n    }\n  } else {\n    //\n    // E is greater than zero.  F is a normalized float.\n    // We try to convert f to a normalized half.\n    //\n\n    //\n    // Round to nearest, round \"0.5\" up\n    //\n\n    if (m & 0x00001000) {\n      m += 0x00002000;\n\n      if (m & 0x00800000) {\n        m = 0;   // overflow in significand,\n        e += 1;  // adjust exponent\n      }\n    }\n\n    //\n    // Handle exponent overflow\n    //\n\n    if (e > 30) {\n      overflow();  // Cause a hardware floating point overflow;\n\n      return hdata(s | 0x7c00);\n      // if this returns, the half becomes an\n    }  // infinity with the same sign as f.\n\n    //\n    // Assemble the half from s, e and m.\n    //\n\n    return hdata(s | (e << 10) | (m >> 13));\n  }\n}\n\n}  // namespace detail\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_int.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_int.hpp\n/// @date 2008-08-22 / 2013-03-30\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_core_type_int\n#define glm_core_type_int\n\n#include \"setup.hpp\"\n\n#if GLM_HAS_EXTENDED_INTEGER_TYPE\n#include <cstdint>\n#endif\n\nnamespace glm {\nnamespace detail {\n#if GLM_HAS_EXTENDED_INTEGER_TYPE\ntypedef std::int8_t int8;\ntypedef std::int16_t int16;\ntypedef std::int32_t int32;\ntypedef std::int64_t int64;\n\ntypedef std::uint8_t uint8;\ntypedef std::uint16_t uint16;\ntypedef std::uint32_t uint32;\ntypedef std::uint64_t uint64;\n#else\n#if (defined(__STDC_VERSION__) && \\\n     (__STDC_VERSION__ >= 199901L))  // C99 detected, 64 bit types available\ntypedef int64_t sint64;\ntypedef uint64_t uint64;\n#elif (GLM_COMPILER & GLM_COMPILER_VC)\ntypedef signed __int64 sint64;\ntypedef unsigned __int64 uint64;\n#elif (GLM_COMPILER & \\\n       (GLM_COMPILER_GCC | GLM_COMPILER_LLVM_GCC | GLM_COMPILER_CLANG))\n__extension__ typedef signed long long sint64;\n__extension__ typedef unsigned long long uint64;\n#elif (GLM_COMPILER & GLM_COMPILER_BC)\ntypedef Int64 sint64;\ntypedef Uint64 uint64;\n#else   // unknown compiler\ntypedef signed long long sint64;\ntypedef unsigned long long uint64;\n#endif  // GLM_COMPILER\n\ntypedef signed char int8;\ntypedef signed short int16;\ntypedef signed int int32;\ntypedef sint64 int64;\n\ntypedef unsigned char uint8;\ntypedef unsigned short uint16;\ntypedef unsigned int uint32;\ntypedef uint64 uint64;\n#endif  //\n\ntypedef signed int lowp_int_t;\ntypedef signed int mediump_int_t;\ntypedef signed int highp_int_t;\n\ntypedef unsigned int lowp_uint_t;\ntypedef unsigned int mediump_uint_t;\ntypedef unsigned int highp_uint_t;\n}  // namespace detail\n\ntypedef detail::int8 int8;\ntypedef detail::int16 int16;\ntypedef detail::int32 int32;\ntypedef detail::int64 int64;\n\ntypedef detail::uint8 uint8;\ntypedef detail::uint16 uint16;\ntypedef detail::uint32 uint32;\ntypedef detail::uint64 uint64;\n\n/// @addtogroup core_precision\n/// @{\n\n/// Low precision signed integer.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.3 Integers</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::lowp_int_t lowp_int;\n\n/// Medium precision signed integer.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.3 Integers</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::mediump_int_t mediump_int;\n\n/// High precision signed integer.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.3 Integers</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::highp_int_t highp_int;\n\n/// Low precision unsigned integer.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.3 Integers</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::lowp_uint_t lowp_uint;\n\n/// Medium precision unsigned integer.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.3 Integers</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::mediump_uint_t mediump_uint;\n\n/// High precision unsigned integer.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.3 Integers</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::highp_uint_t highp_uint;\n\n#if (!defined(GLM_PRECISION_HIGHP_INT) && \\\n     !defined(GLM_PRECISION_MEDIUMP_INT) && !defined(GLM_PRECISION_LOWP_INT))\ntypedef mediump_int int_t;\n#elif (defined(GLM_PRECISION_HIGHP_INT) &&    \\\n       !defined(GLM_PRECISION_MEDIUMP_INT) && \\\n       !defined(GLM_PRECISION_LOWP_INT))\ntypedef highp_int int_t;\n#elif (!defined(GLM_PRECISION_HIGHP_INT) && \\\n       defined(GLM_PRECISION_MEDIUMP_INT) && !defined(GLM_PRECISION_LOWP_INT))\ntypedef mediump_int int_t;\n#elif (!defined(GLM_PRECISION_HIGHP_INT) && \\\n       !defined(GLM_PRECISION_MEDIUMP_INT) && defined(GLM_PRECISION_LOWP_INT))\ntypedef lowp_int int_t;\n#else\n#error \\\n    \"GLM error: multiple default precision requested for signed interger types\"\n#endif\n\n#if (!defined(GLM_PRECISION_HIGHP_UINT) &&   \\\n     !defined(GLM_PRECISION_MEDIUMP_UINT) && \\\n     !defined(GLM_PRECISION_LOWP_UINT))\ntypedef mediump_uint uint_t;\n#elif (defined(GLM_PRECISION_HIGHP_UINT) &&    \\\n       !defined(GLM_PRECISION_MEDIUMP_UINT) && \\\n       !defined(GLM_PRECISION_LOWP_UINT))\ntypedef highp_uint uint_t;\n#elif (!defined(GLM_PRECISION_HIGHP_UINT) &&  \\\n       defined(GLM_PRECISION_MEDIUMP_UINT) && \\\n       !defined(GLM_PRECISION_LOWP_UINT))\ntypedef mediump_uint uint_t;\n#elif (!defined(GLM_PRECISION_HIGHP_UINT) &&   \\\n       !defined(GLM_PRECISION_MEDIUMP_UINT) && \\\n       defined(GLM_PRECISION_LOWP_UINT))\ntypedef lowp_uint uint_t;\n#else\n#error \\\n    \"GLM error: multiple default precision requested for unsigned interger types\"\n#endif\n\n/// Unsigned integer type.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.3 Integers</a>\ntypedef unsigned int uint;\n\n/// @}\n\n////////////////////\n// check type sizes\n#ifndef GLM_STATIC_ASSERT_NULL\nGLM_STATIC_ASSERT(sizeof(glm::int8) == 1,\n                  \"int8 size isn't 1 byte on this platform\");\nGLM_STATIC_ASSERT(sizeof(glm::int16) == 2,\n                  \"int16 size isn't 2 bytes on this platform\");\nGLM_STATIC_ASSERT(sizeof(glm::int32) == 4,\n                  \"int32 size isn't 4 bytes on this platform\");\nGLM_STATIC_ASSERT(sizeof(glm::int64) == 8,\n                  \"int64 size isn't 8 bytes on this platform\");\n\nGLM_STATIC_ASSERT(sizeof(glm::uint8) == 1,\n                  \"uint8 size isn't 1 byte on this platform\");\nGLM_STATIC_ASSERT(sizeof(glm::uint16) == 2,\n                  \"uint16 size isn't 2 bytes on this platform\");\nGLM_STATIC_ASSERT(sizeof(glm::uint32) == 4,\n                  \"uint32 size isn't 4 bytes on this platform\");\nGLM_STATIC_ASSERT(sizeof(glm::uint64) == 8,\n                  \"uint64 size isn't 8 bytes on this platform\");\n#endif  // GLM_STATIC_ASSERT_NULL\n\n}  // namespace glm\n\n#endif  // glm_core_type_int\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_mat.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_mat.hpp\n/// @date 2010-01-26 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_core_type_mat\n#define glm_core_type_mat\n\n#include \"precision.hpp\"\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nstruct tvec2;\ntemplate <typename T, precision P>\nstruct tvec3;\ntemplate <typename T, precision P>\nstruct tvec4;\ntemplate <typename T, precision P>\nstruct tmat2x2;\ntemplate <typename T, precision P>\nstruct tmat2x3;\ntemplate <typename T, precision P>\nstruct tmat2x4;\ntemplate <typename T, precision P>\nstruct tmat3x2;\ntemplate <typename T, precision P>\nstruct tmat3x3;\ntemplate <typename T, precision P>\nstruct tmat3x4;\ntemplate <typename T, precision P>\nstruct tmat4x2;\ntemplate <typename T, precision P>\nstruct tmat4x3;\ntemplate <typename T, precision P>\nstruct tmat4x4;\n\ntemplate <typename T, precision P, template <class, precision> class colType,\n          template <class, precision> class rowType>\nstruct outerProduct_trait {};\n\ntemplate <template <class, precision> class matType, typename T, precision P>\nstruct compute_inverse {};\n}  // namespace detail\n\n/// @addtogroup core_precision\n/// @{\n\n/// 2 columns of 2 components matrix of low precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x2<float, lowp> lowp_mat2;\n\n/// 2 columns of 2 components matrix of medium precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x2<float, mediump> mediump_mat2;\n\n/// 2 columns of 2 components matrix of high precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x2<float, highp> highp_mat2;\n\n/// 2 columns of 2 components matrix of low precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x2<float, lowp> lowp_mat2x2;\n\n/// 2 columns of 2 components matrix of medium precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x2<float, mediump> mediump_mat2x2;\n\n/// 2 columns of 2 components matrix of high precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x2<float, highp> highp_mat2x2;\n\n/// @}\n\n/// @addtogroup core_precision\n/// @{\n\n/// 2 columns of 3 components matrix of low precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x3<float, lowp> lowp_mat2x3;\n\n/// 2 columns of 3 components matrix of medium precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x3<float, mediump> mediump_mat2x3;\n\n/// 2 columns of 3 components matrix of high precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x3<float, highp> highp_mat2x3;\n\n/// @}\n\n/// @addtogroup core_precision\n/// @{\n\n/// 2 columns of 4 components matrix of low precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x4<float, lowp> lowp_mat2x4;\n\n/// 2 columns of 4 components matrix of medium precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x4<float, mediump> mediump_mat2x4;\n\n/// 2 columns of 4 components matrix of high precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x4<float, highp> highp_mat2x4;\n\n/// @}\n\n/// @addtogroup core_precision\n/// @{\n\n/// 3 columns of 2 components matrix of low precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x2<float, lowp> lowp_mat3x2;\n\n/// 3 columns of 2 components matrix of medium precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x2<float, mediump> mediump_mat3x2;\n\n/// 3 columns of 2 components matrix of high precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x2<float, highp> highp_mat3x2;\n\n/// @}\n\n/// @addtogroup core_precision\n/// @{\n\n/// 3 columns of 3 components matrix of low precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x3<float, lowp> lowp_mat3;\n\n/// 3 columns of 3 components matrix of medium precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x3<float, mediump> mediump_mat3;\n\n/// 3 columns of 3 components matrix of high precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x3<float, highp> highp_mat3;\n\n/// 3 columns of 3 components matrix of low precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x3<float, lowp> lowp_mat3x3;\n\n/// 3 columns of 3 components matrix of medium precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x3<float, mediump> mediump_mat3x3;\n\n/// 3 columns of 3 components matrix of high precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x3<float, highp> highp_mat3x3;\n\n/// @}\n\n/// @addtogroup core_precision\n/// @{\n\n/// 3 columns of 4 components matrix of low precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x4<float, lowp> lowp_mat3x4;\n\n/// 3 columns of 4 components matrix of medium precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x4<float, mediump> mediump_mat3x4;\n\n/// 3 columns of 4 components matrix of high precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x4<float, highp> highp_mat3x4;\n\n/// @}\n\n/// @addtogroup core_precision\n/// @{\n\n/// 4 columns of 2 components matrix of low precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x2<float, lowp> lowp_mat4x2;\n\n/// 4 columns of 2 components matrix of medium precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x2<float, mediump> mediump_mat4x2;\n\n/// 4 columns of 2 components matrix of high precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x2<float, highp> highp_mat4x2;\n\n/// @}\n\n/// @addtogroup core_precision\n/// @{\n\n/// 4 columns of 3 components matrix of low precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x3<float, lowp> lowp_mat4x3;\n\n/// 4 columns of 3 components matrix of medium precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x3<float, mediump> mediump_mat4x3;\n\n/// 4 columns of 3 components matrix of high precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x3<float, highp> highp_mat4x3;\n\n/// @}\n\n/// @addtogroup core_precision\n/// @{\n\n/// 4 columns of 4 components matrix of low precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x4<float, lowp> lowp_mat4;\n\n/// 4 columns of 4 components matrix of medium precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x4<float, mediump> mediump_mat4;\n\n/// 4 columns of 4 components matrix of high precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x4<float, highp> highp_mat4;\n\n/// 4 columns of 4 components matrix of low precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x4<float, lowp> lowp_mat4x4;\n\n/// 4 columns of 4 components matrix of medium precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x4<float, mediump> mediump_mat4x4;\n\n/// 4 columns of 4 components matrix of high precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x4<float, highp> highp_mat4x4;\n\n/// @}\n\n/// @addtogroup core_types\n/// @{\n\n//////////////////////////\n// Float definition\n\n#if (defined(GLM_PRECISION_LOWP_FLOAT))\ntypedef lowp_mat2x2 mat2x2;\ntypedef lowp_mat2x3 mat2x3;\ntypedef lowp_mat2x4 mat2x4;\ntypedef lowp_mat3x2 mat3x2;\ntypedef lowp_mat3x3 mat3x3;\ntypedef lowp_mat3x4 mat3x4;\ntypedef lowp_mat4x2 mat4x2;\ntypedef lowp_mat4x3 mat4x3;\ntypedef lowp_mat4x4 mat4x4;\n#elif (defined(GLM_PRECISION_MEDIUMP_FLOAT))\ntypedef mediump_mat2x2 mat2x2;\ntypedef mediump_mat2x3 mat2x3;\ntypedef mediump_mat2x4 mat2x4;\ntypedef mediump_mat3x2 mat3x2;\ntypedef mediump_mat3x3 mat3x3;\ntypedef mediump_mat3x4 mat3x4;\ntypedef mediump_mat4x2 mat4x2;\ntypedef mediump_mat4x3 mat4x3;\ntypedef mediump_mat4x4 mat4x4;\n#else\n//! 2 columns of 2 components matrix of floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\ntypedef highp_mat2x2 mat2x2;\n\n//! 2 columns of 3 components matrix of floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\ntypedef highp_mat2x3 mat2x3;\n\n//! 2 columns of 4 components matrix of floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\ntypedef highp_mat2x4 mat2x4;\n\n//! 3 columns of 2 components matrix of floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\ntypedef highp_mat3x2 mat3x2;\n\n//! 3 columns of 3 components matrix of floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\ntypedef highp_mat3x3 mat3x3;\n\n//! 3 columns of 4 components matrix of floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\ntypedef highp_mat3x4 mat3x4;\n\n//! 4 columns of 2 components matrix of floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\ntypedef highp_mat4x2 mat4x2;\n\n//! 4 columns of 3 components matrix of floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\ntypedef highp_mat4x3 mat4x3;\n\n//! 4 columns of 4 components matrix of floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\ntypedef highp_mat4x4 mat4x4;\n\n#endif  // GLM_PRECISION\n\n//! 2 columns of 2 components matrix of floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\ntypedef mat2x2 mat2;\n\n//! 3 columns of 3 components matrix of floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\ntypedef mat3x3 mat3;\n\n//! 4 columns of 4 components matrix of floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\ntypedef mat4x4 mat4;\n\n//////////////////////////\n// Double definition\n\n/// @addtogroup core_precision\n/// @{\n\n/// 2 columns of 2 components matrix of low precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x2<double, lowp> lowp_dmat2;\n\n/// 2 columns of 2 components matrix of medium precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x2<double, mediump> mediump_dmat2;\n\n/// 2 columns of 2 components matrix of high precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x2<double, highp> highp_dmat2;\n\n/// 2 columns of 2 components matrix of low precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x2<double, lowp> lowp_dmat2x2;\n\n/// 2 columns of 2 components matrix of medium precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x2<double, mediump> mediump_dmat2x2;\n\n/// 2 columns of 2 components matrix of high precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x2<double, highp> highp_dmat2x2;\n\n/// @}\n\n/// @addtogroup core_precision\n/// @{\n\n/// 2 columns of 3 components matrix of low precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x3<double, lowp> lowp_dmat2x3;\n\n/// 2 columns of 3 components matrix of medium precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x3<double, mediump> mediump_dmat2x3;\n\n/// 2 columns of 3 components matrix of high precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x3<double, highp> highp_dmat2x3;\n\n/// @}\n\n/// @addtogroup core_precision\n/// @{\n\n/// 2 columns of 4 components matrix of low precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x4<double, lowp> lowp_dmat2x4;\n\n/// 2 columns of 4 components matrix of medium precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x4<double, mediump> mediump_dmat2x4;\n\n/// 2 columns of 4 components matrix of high precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x4<double, highp> highp_dmat2x4;\n\n/// @}\n\n/// @addtogroup core_precision\n/// @{\n\n/// 3 columns of 2 components matrix of low precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x2<double, lowp> lowp_dmat3x2;\n\n/// 3 columns of 2 components matrix of medium precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x2<double, mediump> mediump_dmat3x2;\n\n/// 3 columns of 2 components matrix of high precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x2<double, highp> highp_dmat3x2;\n\n/// @}\n\n/// @addtogroup core_precision\n/// @{\n\n/// 3 columns of 3 components matrix of low precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x3<float, lowp> lowp_dmat3;\n\n/// 3 columns of 3 components matrix of medium precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x3<double, mediump> mediump_dmat3;\n\n/// 3 columns of 3 components matrix of high precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x3<double, highp> highp_dmat3;\n\n/// 3 columns of 3 components matrix of low precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x3<double, lowp> lowp_dmat3x3;\n\n/// 3 columns of 3 components matrix of medium precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x3<double, mediump> mediump_dmat3x3;\n\n/// 3 columns of 3 components matrix of high precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x3<double, highp> highp_dmat3x3;\n\n/// @}\n\n/// @addtogroup core_precision\n/// @{\n\n/// 3 columns of 4 components matrix of low precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x4<double, lowp> lowp_dmat3x4;\n\n/// 3 columns of 4 components matrix of medium precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x4<double, mediump> mediump_dmat3x4;\n\n/// 3 columns of 4 components matrix of high precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x4<double, highp> highp_dmat3x4;\n\n/// @}\n\n/// @addtogroup core_precision\n/// @{\n\n/// 4 columns of 2 components matrix of low precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x2<double, lowp> lowp_dmat4x2;\n\n/// 4 columns of 2 components matrix of medium precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x2<double, mediump> mediump_dmat4x2;\n\n/// 4 columns of 2 components matrix of high precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x2<double, highp> highp_dmat4x2;\n\n/// @}\n\n/// @addtogroup core_precision\n/// @{\n\n/// 4 columns of 3 components matrix of low precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x3<double, lowp> lowp_dmat4x3;\n\n/// 4 columns of 3 components matrix of medium precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x3<double, mediump> mediump_dmat4x3;\n\n/// 4 columns of 3 components matrix of high precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x3<double, highp> highp_dmat4x3;\n\n/// @}\n\n/// @addtogroup core_precision\n/// @{\n\n/// 4 columns of 4 components matrix of low precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x4<double, lowp> lowp_dmat4;\n\n/// 4 columns of 4 components matrix of medium precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x4<double, mediump> mediump_dmat4;\n\n/// 4 columns of 4 components matrix of high precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x4<double, highp> highp_dmat4;\n\n/// 4 columns of 4 components matrix of low precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x4<double, lowp> lowp_dmat4x4;\n\n/// 4 columns of 4 components matrix of medium precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x4<double, mediump> mediump_dmat4x4;\n\n/// 4 columns of 4 components matrix of high precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x4<double, highp> highp_dmat4x4;\n\n/// @}\n\n#if (defined(GLM_PRECISION_LOWP_DOUBLE))\ntypedef lowp_dmat2x2 dmat2x2;\ntypedef lowp_dmat2x3 dmat2x3;\ntypedef lowp_dmat2x4 dmat2x4;\ntypedef lowp_dmat3x2 dmat3x2;\ntypedef lowp_dmat3x3 dmat3x3;\ntypedef lowp_dmat3x4 dmat3x4;\ntypedef lowp_dmat4x2 dmat4x2;\ntypedef lowp_dmat4x3 dmat4x3;\ntypedef lowp_dmat4x4 dmat4x4;\n#elif (defined(GLM_PRECISION_MEDIUMP_DOUBLE))\ntypedef mediump_dmat2x2 dmat2x2;\ntypedef mediump_dmat2x3 dmat2x3;\ntypedef mediump_dmat2x4 dmat2x4;\ntypedef mediump_dmat3x2 dmat3x2;\ntypedef mediump_dmat3x3 dmat3x3;\ntypedef mediump_dmat3x4 dmat3x4;\ntypedef mediump_dmat4x2 dmat4x2;\ntypedef mediump_dmat4x3 dmat4x3;\ntypedef mediump_dmat4x4 dmat4x4;\n#else  // defined(GLM_PRECISION_HIGHP_DOUBLE)\n\n//! 2 * 2 matrix of double-precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\ntypedef highp_dmat2x2 dmat2;\n\n//! 3 * 3 matrix of double-precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\ntypedef highp_dmat3x3 dmat3;\n\n//! 4 * 4 matrix of double-precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\ntypedef highp_dmat4x4 dmat4;\n\n//! 2 * 2 matrix of double-precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\ntypedef highp_dmat2x2 dmat2x2;\n\n//! 2 * 3 matrix of double-precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\ntypedef highp_dmat2x3 dmat2x3;\n\n//! 2 * 4 matrix of double-precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\ntypedef highp_dmat2x4 dmat2x4;\n\n//! 3 * 2 matrix of double-precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\ntypedef highp_dmat3x2 dmat3x2;\n\n/// 3 * 3 matrix of double-precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\ntypedef highp_dmat3x3 dmat3x3;\n\n/// 3 * 4 matrix of double-precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\ntypedef highp_dmat3x4 dmat3x4;\n\n/// 4 * 2 matrix of double-precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\ntypedef highp_dmat4x2 dmat4x2;\n\n/// 4 * 3 matrix of double-precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\ntypedef highp_dmat4x3 dmat4x3;\n\n/// 4 * 4 matrix of double-precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\ntypedef highp_dmat4x4 dmat4x4;\n\n#endif  // GLM_PRECISION\n\n/// @}\n}  // namespace glm\n\n#endif  // glm_core_type_mat\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_mat.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_mat.inl\n/// @date 2011-06-15 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_mat2x2.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_mat2x2.hpp\n/// @date 2005-01-27 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_core_type_mat2x2\n#define glm_core_type_mat2x2\n\n#include <limits>\n\n#include \"../fwd.hpp\"\n#include \"type_mat.hpp\"\n#include \"type_vec2.hpp\"\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nstruct tmat2x2 {\n  enum ctor { _null };\n  typedef T value_type;\n  typedef std::size_t size_type;\n  typedef tvec2<T, P> col_type;\n  typedef tvec2<T, P> row_type;\n  typedef tmat2x2<T, P> type;\n  typedef tmat2x2<T, P> transpose_type;\n\n  GLM_FUNC_DECL GLM_CONSTEXPR length_t length() const;\n\n  template <typename U, precision Q>\n  friend tvec2<U, Q> operator/(tmat2x2<U, Q> const& m, tvec2<U, Q> const& v);\n  template <typename U, precision Q>\n  friend tvec2<U, Q> operator/(tvec2<U, Q> const& v, tmat2x2<U, Q> const& m);\n\n private:\n  /// @cond DETAIL\n  col_type value[2];\n  /// @endcond\n\n public:\n  //////////////////////////////////////\n  // Constructors\n  GLM_FUNC_DECL tmat2x2();\n  GLM_FUNC_DECL tmat2x2(tmat2x2<T, P> const& m);\n  template <precision Q>\n  GLM_FUNC_DECL tmat2x2(tmat2x2<T, Q> const& m);\n\n  GLM_FUNC_DECL explicit tmat2x2(ctor Null);\n  GLM_FUNC_DECL explicit tmat2x2(T const& x);\n  GLM_FUNC_DECL tmat2x2(T const& x1, T const& y1, T const& x2, T const& y2);\n  GLM_FUNC_DECL tmat2x2(col_type const& v1, col_type const& v2);\n\n  //////////////////////////////////////\n  // Conversions\n  template <typename U, typename V, typename M, typename N>\n  GLM_FUNC_DECL tmat2x2(U const& x1, V const& y1, M const& x2, N const& y2);\n\n  template <typename U, typename V>\n  GLM_FUNC_DECL tmat2x2(tvec2<U, P> const& v1, tvec2<V, P> const& v2);\n\n  //////////////////////////////////////\n  // Matrix conversions\n  template <typename U, precision Q>\n  GLM_FUNC_DECL explicit tmat2x2(tmat2x2<U, Q> const& m);\n\n  GLM_FUNC_DECL explicit tmat2x2(tmat3x3<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat2x2(tmat4x4<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat2x2(tmat2x3<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat2x2(tmat3x2<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat2x2(tmat2x4<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat2x2(tmat4x2<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat2x2(tmat3x4<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat2x2(tmat4x3<T, P> const& x);\n\n  //////////////////////////////////////\n  // Accesses\n\n  GLM_FUNC_DECL col_type& operator[](length_t i);\n  GLM_FUNC_DECL col_type const& operator[](length_t i) const;\n\n  // Unary updatable operators\n  GLM_FUNC_DECL tmat2x2<T, P>& operator=(tmat2x2<T, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat2x2<T, P>& operator=(tmat2x2<U, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat2x2<T, P>& operator+=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tmat2x2<T, P>& operator+=(tmat2x2<U, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat2x2<T, P>& operator-=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tmat2x2<T, P>& operator-=(tmat2x2<U, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat2x2<T, P>& operator*=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tmat2x2<T, P>& operator*=(tmat2x2<U, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat2x2<T, P>& operator/=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tmat2x2<T, P>& operator/=(tmat2x2<U, P> const& m);\n\n  //////////////////////////////////////\n  // Increment and decrement operators\n\n  GLM_FUNC_DECL tmat2x2<T, P>& operator++();\n  GLM_FUNC_DECL tmat2x2<T, P>& operator--();\n  GLM_FUNC_DECL tmat2x2<T, P> operator++(int);\n  GLM_FUNC_DECL tmat2x2<T, P> operator--(int);\n};\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x2<T, P> compute_inverse_mat2(tmat2x2<T, P> const& m);\n\n// Binary operators\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x2<T, P> operator+(tmat2x2<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x2<T, P> operator+(T const& s, tmat2x2<T, P> const& m);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x2<T, P> operator+(tmat2x2<T, P> const& m1,\n                                      tmat2x2<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x2<T, P> operator-(tmat2x2<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x2<T, P> operator-(T const& s, tmat2x2<T, P> const& m);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x2<T, P> operator-(tmat2x2<T, P> const& m1,\n                                      tmat2x2<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x2<T, P> operator*(tmat2x2<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x2<T, P> operator*(T const& s, tmat2x2<T, P> const& m);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL typename tmat2x2<T, P>::col_type operator*(\n    tmat2x2<T, P> const& m, typename tmat2x2<T, P>::row_type const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL typename tmat2x2<T, P>::row_type operator*(\n    typename tmat2x2<T, P>::col_type const& v, tmat2x2<T, P> const& m);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x2<T, P> operator*(tmat2x2<T, P> const& m1,\n                                      tmat2x2<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x2<T, P> operator*(tmat2x2<T, P> const& m1,\n                                      tmat3x2<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x2<T, P> operator*(tmat2x2<T, P> const& m1,\n                                      tmat4x2<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x2<T, P> operator/(tmat2x2<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x2<T, P> operator/(T const& s, tmat2x2<T, P> const& m);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL typename tmat2x2<T, P>::col_type operator/(\n    tmat2x2<T, P> const& m, typename tmat2x2<T, P>::row_type const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL typename tmat2x2<T, P>::row_type operator/(\n    typename tmat2x2<T, P>::col_type const& v, tmat2x2<T, P> const& m);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x2<T, P> operator/(tmat2x2<T, P> const& m1,\n                                      tmat2x2<T, P> const& m2);\n\n// Unary constant operators\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x2<T, P> const operator-(tmat2x2<T, P> const& m);\n}  // namespace detail\n}  // namespace glm\n\n#ifndef GLM_EXTERNAL_TEMPLATE\n#include \"type_mat2x2.inl\"\n#endif\n\n#endif  // glm_core_type_mat2x2\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_mat2x2.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_mat2x2.inl\n/// @date 2005-01-16 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER GLM_CONSTEXPR length_t tmat2x2<T, P>::length() const {\n  return 2;\n}\n\n//////////////////////////////////////\n// Accesses\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat2x2<T, P>::col_type& tmat2x2<T, P>::operator[](\n    length_t i) {\n  assert(i < this->length());\n  return this->value[i];\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat2x2<T, P>::col_type const&\ntmat2x2<T, P>::operator[](length_t i) const {\n  assert(i < this->length());\n  return this->value[i];\n}\n\n//////////////////////////////////////////////////////////////\n// Constructors\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2() {\n  this->value[0] = col_type(1, 0);\n  this->value[1] = col_type(0, 1);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat2x2<T, P> const& m) {\n  this->value[0] = m.value[0];\n  this->value[1] = m.value[1];\n}\n\ntemplate <typename T, precision P>\ntemplate <precision Q>\nGLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat2x2<T, Q> const& m) {\n  this->value[0] = m.value[0];\n  this->value[1] = m.value[1];\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(ctor) {}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(T const& s) {\n  value_type const Zero(0);\n  this->value[0] = col_type(s, Zero);\n  this->value[1] = col_type(Zero, s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(T const& x0, T const& y0, T const& x1,\n                                          T const& y1) {\n  this->value[0] = col_type(x0, y0);\n  this->value[1] = col_type(x1, y1);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(col_type const& v0,\n                                          col_type const& v1) {\n  this->value[0] = v0;\n  this->value[1] = v1;\n}\n\n//////////////////////////////////////\n// Conversion constructors\ntemplate <typename T, precision P>\ntemplate <typename X1, typename Y1, typename X2, typename Y2>\nGLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(X1 const& x1, Y1 const& y1,\n                                          X2 const& x2, Y2 const& y2) {\n  this->value[0] = col_type(static_cast<T>(x1), value_type(y1));\n  this->value[1] = col_type(static_cast<T>(x2), value_type(y2));\n}\n\ntemplate <typename T, precision P>\ntemplate <typename V1, typename V2>\nGLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tvec2<V1, P> const& v1,\n                                          tvec2<V2, P> const& v2) {\n  this->value[0] = col_type(v1);\n  this->value[1] = col_type(v2);\n}\n\n//////////////////////////////////////////////////////////////\n// mat2x2 matrix conversions\n\ntemplate <typename T, precision P>\ntemplate <typename U, precision Q>\nGLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat2x2<U, Q> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat3x3<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat4x4<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat2x3<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat3x2<T, P> const& m) {\n  this->value[0] = m[0];\n  this->value[1] = m[1];\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat2x4<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat4x2<T, P> const& m) {\n  this->value[0] = m[0];\n  this->value[1] = m[1];\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat3x4<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P>::tmat2x2(tmat4x3<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n}\n\n//////////////////////////////////////////////////////////////\n// mat2x2 operators\n\n// This function shouldn't required but it seems that VC7.1 have an optimisation\n// bug if this operator wasn't declared\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator=(\n    tmat2x2<T, P> const& m) {\n  this->value[0] = m[0];\n  this->value[1] = m[1];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator=(\n    tmat2x2<U, P> const& m) {\n  this->value[0] = m[0];\n  this->value[1] = m[1];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator+=(U s) {\n  this->value[0] += s;\n  this->value[1] += s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator+=(\n    tmat2x2<U, P> const& m) {\n  this->value[0] += m[0];\n  this->value[1] += m[1];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator-=(U s) {\n  this->value[0] -= s;\n  this->value[1] -= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator-=(\n    tmat2x2<U, P> const& m) {\n  this->value[0] -= m[0];\n  this->value[1] -= m[1];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator*=(U s) {\n  this->value[0] *= s;\n  this->value[1] *= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator*=(\n    tmat2x2<U, P> const& m) {\n  return (*this = *this * m);\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator/=(U s) {\n  this->value[0] /= s;\n  this->value[1] /= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator/=(\n    tmat2x2<U, P> const& m) {\n  return (*this =\n              *this * detail::compute_inverse<detail::tmat2x2, T, P>::call(m));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator++() {\n  ++this->value[0];\n  ++this->value[1];\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P>& tmat2x2<T, P>::operator--() {\n  --this->value[0];\n  --this->value[1];\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P> tmat2x2<T, P>::operator++(int) {\n  tmat2x2<T, P> Result(*this);\n  ++*this;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P> tmat2x2<T, P>::operator--(int) {\n  tmat2x2<T, P> Result(*this);\n  --*this;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nstruct compute_inverse<detail::tmat2x2, T, P> {\n  GLM_FUNC_QUALIFIER static detail::tmat2x2<T, P> call(\n      detail::tmat2x2<T, P> const& m) {\n    T OneOverDeterminant =\n        static_cast<T>(1) / (+m[0][0] * m[1][1] - m[1][0] * m[0][1]);\n\n    detail::tmat2x2<T, P> Inverse(\n        +m[1][1] * OneOverDeterminant, -m[0][1] * OneOverDeterminant,\n        -m[1][0] * OneOverDeterminant, +m[0][0] * OneOverDeterminant);\n\n    return Inverse;\n  }\n};\n\n//////////////////////////////////////////////////////////////\n// Binary operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P> operator+(tmat2x2<T, P> const& m, T const& s) {\n  return tmat2x2<T, P>(m[0] + s, m[1] + s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P> operator+(T const& s, tmat2x2<T, P> const& m) {\n  return tmat2x2<T, P>(m[0] + s, m[1] + s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P> operator+(tmat2x2<T, P> const& m1,\n                                           tmat2x2<T, P> const& m2) {\n  return tmat2x2<T, P>(m1[0] + m2[0], m1[1] + m2[1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P> operator-(tmat2x2<T, P> const& m, T const& s) {\n  return tmat2x2<T, P>(m[0] - s, m[1] - s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P> operator-(T const& s, tmat2x2<T, P> const& m) {\n  return tmat2x2<T, P>(s - m[0], s - m[1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P> operator-(tmat2x2<T, P> const& m1,\n                                           tmat2x2<T, P> const& m2) {\n  return tmat2x2<T, P>(m1[0] - m2[0], m1[1] - m2[1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P> operator*(tmat2x2<T, P> const& m, T const& s) {\n  return tmat2x2<T, P>(m[0] * s, m[1] * s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P> operator*(T const& s, tmat2x2<T, P> const& m) {\n  return tmat2x2<T, P>(m[0] * s, m[1] * s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat2x2<T, P>::col_type operator*(\n    tmat2x2<T, P> const& m, typename tmat2x2<T, P>::row_type const& v) {\n  return detail::tvec2<T, P>(m[0][0] * v.x + m[1][0] * v.y,\n                             m[0][1] * v.x + m[1][1] * v.y);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat2x2<T, P>::row_type operator*(\n    typename tmat2x2<T, P>::col_type const& v, tmat2x2<T, P> const& m) {\n  return detail::tvec2<T, P>(v.x * m[0][0] + v.y * m[0][1],\n                             v.x * m[1][0] + v.y * m[1][1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P> operator*(tmat2x2<T, P> const& m1,\n                                           tmat2x2<T, P> const& m2) {\n  return tmat2x2<T, P>(m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1],\n                       m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1],\n                       m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1],\n                       m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x2<T, P> operator*(tmat2x2<T, P> const& m1,\n                                           tmat3x2<T, P> const& m2) {\n  return tmat3x2<T, P>(m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1],\n                       m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1],\n                       m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1],\n                       m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1],\n                       m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1],\n                       m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x2<T, P> operator*(tmat2x2<T, P> const& m1,\n                                           tmat4x2<T, P> const& m2) {\n  return tmat4x2<T, P>(m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1],\n                       m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1],\n                       m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1],\n                       m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1],\n                       m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1],\n                       m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1],\n                       m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1],\n                       m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P> operator/(tmat2x2<T, P> const& m, T const& s) {\n  return tmat2x2<T, P>(m[0] / s, m[1] / s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P> operator/(T const& s, tmat2x2<T, P> const& m) {\n  return tmat2x2<T, P>(s / m[0], s / m[1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat2x2<T, P>::col_type operator/(\n    tmat2x2<T, P> const& m, typename tmat2x2<T, P>::row_type& v) {\n  return detail::compute_inverse<detail::tmat2x2, T, P>::call(m) * v;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat2x2<T, P>::row_type operator/(\n    typename tmat2x2<T, P>::col_type const& v, tmat2x2<T, P> const& m) {\n  return v * detail::compute_inverse<detail::tmat2x2, T, P>::call(m);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P> operator/(tmat2x2<T, P> const& m1,\n                                           tmat2x2<T, P> const& m2) {\n  tmat2x2<T, P> m1_copy(m1);\n  return m1_copy /= m2;\n}\n\n// Unary constant operators\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P> const operator-(tmat2x2<T, P> const& m) {\n  return tmat2x2<T, P>(-m[0], -m[1]);\n}\n\n//////////////////////////////////////\n// Boolean operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool operator==(tmat2x2<T, P> const& m1,\n                                   tmat2x2<T, P> const& m2) {\n  return (m1[0] == m2[0]) && (m1[1] == m2[1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool operator!=(tmat2x2<T, P> const& m1,\n                                   tmat2x2<T, P> const& m2) {\n  return (m1[0] != m2[0]) || (m1[1] != m2[1]);\n}\n\n}  // namespace detail\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_mat2x3.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_mat2x3.hpp\n/// @date 2006-10-01 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_core_type_mat2x3\n#define glm_core_type_mat2x3\n\n#include <limits>\n\n#include \"../fwd.hpp\"\n#include \"type_mat.hpp\"\n#include \"type_vec2.hpp\"\n#include \"type_vec3.hpp\"\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nstruct tmat2x3 {\n  enum ctor { _null };\n  typedef T value_type;\n  typedef std::size_t size_type;\n  typedef tvec3<T, P> col_type;\n  typedef tvec2<T, P> row_type;\n  typedef tmat2x3<T, P> type;\n  typedef tmat3x2<T, P> transpose_type;\n\n  GLM_FUNC_DECL GLM_CONSTEXPR length_t length() const;\n\n private:\n  // Data\n  col_type value[2];\n\n public:\n  // Constructors\n  GLM_FUNC_DECL tmat2x3();\n  GLM_FUNC_DECL tmat2x3(tmat2x3<T, P> const& m);\n  template <precision Q>\n  GLM_FUNC_DECL tmat2x3(tmat2x3<T, Q> const& m);\n\n  GLM_FUNC_DECL explicit tmat2x3(ctor);\n  GLM_FUNC_DECL explicit tmat2x3(T const& s);\n  GLM_FUNC_DECL tmat2x3(T const& x0, T const& y0, T const& z0, T const& x1,\n                        T const& y1, T const& z1);\n  GLM_FUNC_DECL tmat2x3(col_type const& v0, col_type const& v1);\n\n  //////////////////////////////////////\n  // Conversions\n  template <typename X1, typename Y1, typename Z1, typename X2, typename Y2,\n            typename Z2>\n  GLM_FUNC_DECL tmat2x3(X1 const& x1, Y1 const& y1, Z1 const& z1, X2 const& x2,\n                        Y2 const& y2, Z2 const& z2);\n\n  template <typename U, typename V>\n  GLM_FUNC_DECL tmat2x3(tvec3<U, P> const& v1, tvec3<V, P> const& v2);\n\n  //////////////////////////////////////\n  // Matrix conversion\n  template <typename U, precision Q>\n  GLM_FUNC_DECL explicit tmat2x3(tmat2x3<U, Q> const& m);\n\n  GLM_FUNC_DECL explicit tmat2x3(tmat2x2<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat2x3(tmat3x3<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat2x3(tmat4x4<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat2x3(tmat2x4<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat2x3(tmat3x2<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat2x3(tmat3x4<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat2x3(tmat4x2<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat2x3(tmat4x3<T, P> const& x);\n\n  // Accesses\n  GLM_FUNC_DECL col_type& operator[](length_t i);\n  GLM_FUNC_DECL col_type const& operator[](length_t i) const;\n\n  // Unary updatable operators\n  GLM_FUNC_DECL tmat2x3<T, P>& operator=(tmat2x3<T, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat2x3<T, P>& operator=(tmat2x3<U, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat2x3<T, P>& operator+=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tmat2x3<T, P>& operator+=(tmat2x3<U, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat2x3<T, P>& operator-=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tmat2x3<T, P>& operator-=(tmat2x3<U, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat2x3<T, P>& operator*=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tmat2x3<T, P>& operator/=(U s);\n\n  //////////////////////////////////////\n  // Increment and decrement operators\n\n  GLM_FUNC_DECL tmat2x3<T, P>& operator++();\n  GLM_FUNC_DECL tmat2x3<T, P>& operator--();\n  GLM_FUNC_DECL tmat2x3<T, P> operator++(int);\n  GLM_FUNC_DECL tmat2x3<T, P> operator--(int);\n};\n\n// Binary operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x3<T, P> operator+(tmat2x3<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x3<T, P> operator+(tmat2x3<T, P> const& m1,\n                                      tmat2x3<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x3<T, P> operator-(tmat2x3<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x3<T, P> operator-(tmat2x3<T, P> const& m1,\n                                      tmat2x3<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x3<T, P> operator*(tmat2x3<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x3<T, P> operator*(T const& s, tmat2x3<T, P> const& m);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL typename tmat2x3<T, P>::col_type operator*(\n    tmat2x3<T, P> const& m, typename tmat2x3<T, P>::row_type const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL typename tmat2x3<T, P>::row_type operator*(\n    typename tmat2x3<T, P>::col_type const& v, tmat2x3<T, P> const& m);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x3<T, P> operator*(tmat2x3<T, P> const& m1,\n                                      tmat2x2<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x3<T, P> operator*(tmat2x3<T, P> const& m1,\n                                      tmat3x2<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x3<T, P> operator*(tmat2x3<T, P> const& m1,\n                                      tmat4x2<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x3<T, P> operator/(tmat2x3<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x3<T, P> operator/(T const& s, tmat2x3<T, P> const& m);\n\n// Unary constant operators\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x3<T, P> const operator-(tmat2x3<T, P> const& m);\n\n}  // namespace detail\n}  // namespace glm\n\n#ifndef GLM_EXTERNAL_TEMPLATE\n#include \"type_mat2x3.inl\"\n#endif\n\n#endif  // glm_core_type_mat2x3\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_mat2x3.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_mat2x3.inl\n/// @date 2006-08-05 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER GLM_CONSTEXPR length_t tmat2x3<T, P>::length() const {\n  return 2;\n}\n\n//////////////////////////////////////\n// Accesses\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat2x3<T, P>::col_type& tmat2x3<T, P>::operator[](\n    length_t i) {\n  assert(i < this->length());\n  return this->value[i];\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat2x3<T, P>::col_type const&\ntmat2x3<T, P>::operator[](length_t i) const {\n  assert(i < this->length());\n  return this->value[i];\n}\n\n//////////////////////////////////////////////////////////////\n// Constructors\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3() {\n  this->value[0] = col_type(T(1), T(0), T(0));\n  this->value[1] = col_type(T(0), T(1), T(0));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat2x3<T, P> const& m) {\n  this->value[0] = m.value[0];\n  this->value[1] = m.value[1];\n}\n\ntemplate <typename T, precision P>\ntemplate <precision Q>\nGLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat2x3<T, Q> const& m) {\n  this->value[0] = m.value[0];\n  this->value[1] = m.value[1];\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(ctor) {}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(T const& s) {\n  this->value[0] = col_type(s, T(0), T(0));\n  this->value[1] = col_type(T(0), s, T(0));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(T const& x0, T const& y0, T const& z0,\n                                          T const& x1, T const& y1,\n                                          T const& z1) {\n  this->value[0] = col_type(x0, y0, z0);\n  this->value[1] = col_type(x1, y1, z1);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(col_type const& v0,\n                                          col_type const& v1) {\n  this->value[0] = v0;\n  this->value[1] = v1;\n}\n\n//////////////////////////////////////\n// Conversion constructors\ntemplate <typename T, precision P>\ntemplate <typename X1, typename Y1, typename Z1, typename X2, typename Y2,\n          typename Z2>\nGLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(X1 const& x1, Y1 const& y1,\n                                          Z1 const& z1, X2 const& x2,\n                                          Y2 const& y2, Z2 const& z2) {\n  this->value[0] = col_type(static_cast<T>(x1), value_type(y1), value_type(z1));\n  this->value[1] = col_type(static_cast<T>(x2), value_type(y2), value_type(z2));\n}\n\ntemplate <typename T, precision P>\ntemplate <typename V1, typename V2>\nGLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tvec3<V1, P> const& v1,\n                                          tvec3<V2, P> const& v2) {\n  this->value[0] = col_type(v1);\n  this->value[1] = col_type(v2);\n}\n\n//////////////////////////////////////\n// Matrix conversions\n\ntemplate <typename T, precision P>\ntemplate <typename U, precision Q>\nGLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat2x3<U, Q> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat2x2<T, P> const& m) {\n  this->value[0] = col_type(m[0], T(0));\n  this->value[1] = col_type(m[1], T(0));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat3x3<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat4x4<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat2x4<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat3x2<T, P> const& m) {\n  this->value[0] = col_type(m[0], T(0));\n  this->value[1] = col_type(m[1], T(0));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat3x4<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat4x2<T, P> const& m) {\n  this->value[0] = col_type(m[0], T(0));\n  this->value[1] = col_type(m[1], T(0));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x3<T, P>::tmat2x3(tmat4x3<T, P> const& m) {\n  this->value[0] = m[0];\n  this->value[1] = m[1];\n}\n\n//////////////////////////////////////////////////////////////\n// Unary updatable operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x3<T, P>& tmat2x3<T, P>::operator=(\n    tmat2x3<T, P> const& m) {\n  this->value[0] = m[0];\n  this->value[1] = m[1];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat2x3<T, P>& tmat2x3<T, P>::operator=(\n    tmat2x3<U, P> const& m) {\n  this->value[0] = m[0];\n  this->value[1] = m[1];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat2x3<T, P>& tmat2x3<T, P>::operator+=(U s) {\n  this->value[0] += s;\n  this->value[1] += s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat2x3<T, P>& tmat2x3<T, P>::operator+=(\n    tmat2x3<U, P> const& m) {\n  this->value[0] += m[0];\n  this->value[1] += m[1];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat2x3<T, P>& tmat2x3<T, P>::operator-=(U s) {\n  this->value[0] -= s;\n  this->value[1] -= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat2x3<T, P>& tmat2x3<T, P>::operator-=(\n    tmat2x3<U, P> const& m) {\n  this->value[0] -= m[0];\n  this->value[1] -= m[1];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat2x3<T, P>& tmat2x3<T, P>::operator*=(U s) {\n  this->value[0] *= s;\n  this->value[1] *= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat2x3<T, P>& tmat2x3<T, P>::operator/=(U s) {\n  this->value[0] /= s;\n  this->value[1] /= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x3<T, P>& tmat2x3<T, P>::operator++() {\n  ++this->value[0];\n  ++this->value[1];\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x3<T, P>& tmat2x3<T, P>::operator--() {\n  --this->value[0];\n  --this->value[1];\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x3<T, P> tmat2x3<T, P>::operator++(int) {\n  tmat2x3<T, P> Result(*this);\n  ++*this;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x3<T, P> tmat2x3<T, P>::operator--(int) {\n  tmat2x3<T, P> Result(*this);\n  --*this;\n  return Result;\n}\n\n//////////////////////////////////////////////////////////////\n// Binary operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x3<T, P> operator+(tmat2x3<T, P> const& m, T const& s) {\n  return tmat2x3<T, P>(m[0] + s, m[1] + s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x3<T, P> operator+(tmat2x3<T, P> const& m1,\n                                           tmat2x3<T, P> const& m2) {\n  return tmat2x3<T, P>(m1[0] + m2[0], m1[1] + m2[1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x3<T, P> operator-(tmat2x3<T, P> const& m, T const& s) {\n  return tmat2x3<T, P>(m[0] - s, m[1] - s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x3<T, P> operator-(tmat2x3<T, P> const& m1,\n                                           tmat2x3<T, P> const& m2) {\n  return tmat2x3<T, P>(m1[0] - m2[0], m1[1] - m2[1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x3<T, P> operator*(tmat2x3<T, P> const& m, T const& s) {\n  return tmat2x3<T, P>(m[0] * s, m[1] * s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x3<T, P> operator*(T const& s, tmat2x3<T, P> const& m) {\n  return tmat2x3<T, P>(m[0] * s, m[1] * s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat2x3<T, P>::col_type operator*(\n    tmat2x3<T, P> const& m, typename tmat2x3<T, P>::row_type const& v) {\n  return typename tmat2x3<T, P>::col_type(m[0][0] * v.x + m[1][0] * v.y,\n                                          m[0][1] * v.x + m[1][1] * v.y,\n                                          m[0][2] * v.x + m[1][2] * v.y);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat2x3<T, P>::row_type operator*(\n    typename tmat2x3<T, P>::col_type const& v, tmat2x3<T, P> const& m) {\n  return typename tmat2x3<T, P>::row_type(\n      v.x * m[0][0] + v.y * m[0][1] + v.z * m[0][2],\n      v.x * m[1][0] + v.y * m[1][1] + v.z * m[1][2]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x3<T, P> operator*(tmat2x3<T, P> const& m1,\n                                           tmat2x2<T, P> const& m2) {\n  return tmat2x3<T, P>(m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1],\n                       m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1],\n                       m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1],\n                       m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1],\n                       m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1],\n                       m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P> operator*(tmat2x3<T, P> const& m1,\n                                           tmat3x2<T, P> const& m2) {\n  T SrcA00 = m1[0][0];\n  T SrcA01 = m1[0][1];\n  T SrcA02 = m1[0][2];\n  T SrcA10 = m1[1][0];\n  T SrcA11 = m1[1][1];\n  T SrcA12 = m1[1][2];\n\n  T SrcB00 = m2[0][0];\n  T SrcB01 = m2[0][1];\n  T SrcB10 = m2[1][0];\n  T SrcB11 = m2[1][1];\n  T SrcB20 = m2[2][0];\n  T SrcB21 = m2[2][1];\n\n  tmat3x3<T, P> Result(tmat3x3<T, P>::_null);\n  Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01;\n  Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01;\n  Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01;\n  Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11;\n  Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11;\n  Result[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11;\n  Result[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21;\n  Result[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21;\n  Result[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P> operator*(tmat2x3<T, P> const& m1,\n                                           tmat4x2<T, P> const& m2) {\n  return tmat4x3<T, P>(m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1],\n                       m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1],\n                       m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1],\n                       m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1],\n                       m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1],\n                       m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1],\n                       m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1],\n                       m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1],\n                       m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1],\n                       m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1],\n                       m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1],\n                       m1[0][2] * m2[3][0] + m1[1][2] * m2[3][1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x3<T, P> operator/(tmat2x3<T, P> const& m, T const& s) {\n  return tmat2x3<T, P>(m[0] / s, m[1] / s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x3<T, P> operator/(T const& s, tmat2x3<T, P> const& m) {\n  return tmat2x3<T, P>(s / m[0], s / m[1]);\n}\n\n// Unary constant operators\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x3<T, P> const operator-(tmat2x3<T, P> const& m) {\n  return tmat2x3<T, P>(-m[0], -m[1]);\n}\n\n//////////////////////////////////////\n// Boolean operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool operator==(tmat2x3<T, P> const& m1,\n                                   tmat2x3<T, P> const& m2) {\n  return (m1[0] == m2[0]) && (m1[1] == m2[1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool operator!=(tmat2x3<T, P> const& m1,\n                                   tmat2x3<T, P> const& m2) {\n  return (m1[0] != m2[0]) || (m1[1] != m2[1]);\n}\n}  // namespace detail\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_mat2x4.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_mat2x4.hpp\n/// @date 2006-08-05 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_core_type_mat2x4\n#define glm_core_type_mat2x4\n\n#include <limits>\n\n#include \"../fwd.hpp\"\n#include \"type_mat.hpp\"\n#include \"type_vec2.hpp\"\n#include \"type_vec4.hpp\"\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nstruct tmat2x4 {\n  enum ctor { _null };\n  typedef T value_type;\n  typedef std::size_t size_type;\n  typedef tvec4<T, P> col_type;\n  typedef tvec2<T, P> row_type;\n  typedef tmat2x4<T, P> type;\n  typedef tmat4x2<T, P> transpose_type;\n\n  GLM_FUNC_DECL GLM_CONSTEXPR length_t length() const;\n\n private:\n  // Data\n  col_type value[2];\n\n public:\n  // Constructors\n  GLM_FUNC_DECL tmat2x4();\n  GLM_FUNC_DECL tmat2x4(tmat2x4<T, P> const& m);\n  template <precision Q>\n  GLM_FUNC_DECL tmat2x4(tmat2x4<T, Q> const& m);\n\n  GLM_FUNC_DECL explicit tmat2x4(ctor);\n  GLM_FUNC_DECL explicit tmat2x4(T const& s);\n  GLM_FUNC_DECL tmat2x4(T const& x0, T const& y0, T const& z0, T const& w0,\n                        T const& x1, T const& y1, T const& z1, T const& w1);\n  GLM_FUNC_DECL tmat2x4(col_type const& v0, col_type const& v1);\n\n  //////////////////////////////////////\n  // Conversions\n  template <typename X1, typename Y1, typename Z1, typename W1, typename X2,\n            typename Y2, typename Z2, typename W2>\n  GLM_FUNC_DECL tmat2x4(X1 const& x1, Y1 const& y1, Z1 const& z1, W1 const& w1,\n                        X2 const& x2, Y2 const& y2, Z2 const& z2, W2 const& w2);\n\n  template <typename U, typename V>\n  GLM_FUNC_DECL tmat2x4(tvec4<U, P> const& v1, tvec4<V, P> const& v2);\n\n  //////////////////////////////////////\n  // Matrix conversions\n  template <typename U, precision Q>\n  GLM_FUNC_DECL explicit tmat2x4(tmat2x4<U, Q> const& m);\n\n  GLM_FUNC_DECL explicit tmat2x4(tmat2x2<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat2x4(tmat3x3<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat2x4(tmat4x4<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat2x4(tmat2x3<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat2x4(tmat3x2<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat2x4(tmat3x4<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat2x4(tmat4x2<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat2x4(tmat4x3<T, P> const& x);\n\n  // Accesses\n  GLM_FUNC_DECL col_type& operator[](length_t i);\n  GLM_FUNC_DECL col_type const& operator[](length_t i) const;\n\n  // Unary updatable operators\n  GLM_FUNC_DECL tmat2x4<T, P>& operator=(tmat2x4<T, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat2x4<T, P>& operator=(tmat2x4<U, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat2x4<T, P>& operator+=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tmat2x4<T, P>& operator+=(tmat2x4<U, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat2x4<T, P>& operator-=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tmat2x4<T, P>& operator-=(tmat2x4<U, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat2x4<T, P>& operator*=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tmat2x4<T, P>& operator/=(U s);\n\n  //////////////////////////////////////\n  // Increment and decrement operators\n\n  GLM_FUNC_DECL tmat2x4<T, P>& operator++();\n  GLM_FUNC_DECL tmat2x4<T, P>& operator--();\n  GLM_FUNC_DECL tmat2x4<T, P> operator++(int);\n  GLM_FUNC_DECL tmat2x4<T, P> operator--(int);\n};\n\n// Binary operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x4<T, P> operator+(tmat2x4<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x4<T, P> operator+(tmat2x4<T, P> const& m1,\n                                      tmat2x4<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x4<T, P> operator-(tmat2x4<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x4<T, P> operator-(tmat2x4<T, P> const& m1,\n                                      tmat2x4<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x4<T, P> operator*(tmat2x4<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x4<T, P> operator*(T const& s, tmat2x4<T, P> const& m);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL typename tmat2x4<T, P>::col_type operator*(\n    tmat2x4<T, P> const& m, typename tmat2x4<T, P>::row_type const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL typename tmat2x4<T, P>::row_type operator*(\n    typename tmat2x4<T, P>::col_type const& v, tmat2x4<T, P> const& m);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x4<T, P> operator*(tmat2x4<T, P> const& m1,\n                                      tmat4x2<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x4<T, P> operator*(tmat2x4<T, P> const& m1,\n                                      tmat2x2<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x4<T, P> operator*(tmat2x4<T, P> const& m1,\n                                      tmat3x2<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x4<T, P> operator/(tmat2x4<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x4<T, P> operator/(T const& s, tmat2x4<T, P> const& m);\n\n// Unary constant operators\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x4<T, P> const operator-(tmat2x4<T, P> const& m);\n\n}  // namespace detail\n}  // namespace glm\n\n#ifndef GLM_EXTERNAL_TEMPLATE\n#include \"type_mat2x4.inl\"\n#endif\n\n#endif  // glm_core_type_mat2x4\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_mat2x4.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_mat2x4.inl\n/// @date 2006-08-05 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER GLM_CONSTEXPR length_t tmat2x4<T, P>::length() const {\n  return 2;\n}\n\n//////////////////////////////////////\n// Accesses\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat2x4<T, P>::col_type& tmat2x4<T, P>::operator[](\n    length_t i) {\n  assert(i < this->length());\n  return this->value[i];\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat2x4<T, P>::col_type const&\ntmat2x4<T, P>::operator[](length_t i) const {\n  assert(i < this->length());\n  return this->value[i];\n}\n\n//////////////////////////////////////////////////////////////\n// Constructors\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4() {\n  value_type const Zero(0);\n  value_type const One(1);\n  this->value[0] = col_type(One, Zero, Zero, Zero);\n  this->value[1] = col_type(Zero, One, Zero, Zero);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat2x4<T, P> const& m) {\n  this->value[0] = m.value[0];\n  this->value[1] = m.value[1];\n}\n\ntemplate <typename T, precision P>\ntemplate <precision Q>\nGLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat2x4<T, Q> const& m) {\n  this->value[0] = m.value[0];\n  this->value[1] = m.value[1];\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(ctor) {}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(T const& s) {\n  value_type const Zero(0);\n  this->value[0] = col_type(s, Zero, Zero, Zero);\n  this->value[1] = col_type(Zero, s, Zero, Zero);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(T const& x0, T const& y0, T const& z0,\n                                          T const& w0, T const& x1, T const& y1,\n                                          T const& z1, T const& w1) {\n  this->value[0] = col_type(x0, y0, z0, w0);\n  this->value[1] = col_type(x1, y1, z1, w1);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(col_type const& v0,\n                                          col_type const& v1) {\n  this->value[0] = v0;\n  this->value[1] = v1;\n}\n\n//////////////////////////////////////\n// Conversion constructors\ntemplate <typename T, precision P>\ntemplate <typename X1, typename Y1, typename Z1, typename W1, typename X2,\n          typename Y2, typename Z2, typename W2>\nGLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(X1 const& x1, Y1 const& y1,\n                                          Z1 const& z1, W1 const& w1,\n                                          X2 const& x2, Y2 const& y2,\n                                          Z2 const& z2, W2 const& w2) {\n  this->value[0] = col_type(static_cast<T>(x1), value_type(y1), value_type(z1),\n                            value_type(w1));\n  this->value[1] = col_type(static_cast<T>(x2), value_type(y2), value_type(z2),\n                            value_type(w2));\n}\n\ntemplate <typename T, precision P>\ntemplate <typename V1, typename V2>\nGLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tvec4<V1, P> const& v1,\n                                          tvec4<V2, P> const& v2) {\n  this->value[0] = col_type(v1);\n  this->value[1] = col_type(v2);\n}\n\n//////////////////////////////////////\n// Matrix conversions\n\ntemplate <typename T, precision P>\ntemplate <typename U, precision Q>\nGLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat2x4<U, Q> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat2x2<T, P> const& m) {\n  this->value[0] = col_type(m[0], detail::tvec2<T, P>(0));\n  this->value[1] = col_type(m[1], detail::tvec2<T, P>(0));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat3x3<T, P> const& m) {\n  this->value[0] = col_type(m[0], T(0));\n  this->value[1] = col_type(m[1], T(0));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat4x4<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat2x3<T, P> const& m) {\n  this->value[0] = col_type(m[0], T(0));\n  this->value[1] = col_type(m[1], T(0));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat3x2<T, P> const& m) {\n  this->value[0] = col_type(m[0], detail::tvec2<T, P>(0));\n  this->value[1] = col_type(m[1], detail::tvec2<T, P>(0));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat3x4<T, P> const& m) {\n  this->value[0] = m[0];\n  this->value[1] = m[1];\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat4x2<T, P> const& m) {\n  this->value[0] = col_type(m[0], detail::tvec2<T, P>(T(0)));\n  this->value[1] = col_type(m[1], detail::tvec2<T, P>(T(0)));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x4<T, P>::tmat2x4(tmat4x3<T, P> const& m) {\n  this->value[0] = col_type(m[0], T(0));\n  this->value[1] = col_type(m[1], T(0));\n}\n\n//////////////////////////////////////////////////////////////\n// Unary updatable operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x4<T, P>& tmat2x4<T, P>::operator=(\n    tmat2x4<T, P> const& m) {\n  this->value[0] = m[0];\n  this->value[1] = m[1];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat2x4<T, P>& tmat2x4<T, P>::operator=(\n    tmat2x4<U, P> const& m) {\n  this->value[0] = m[0];\n  this->value[1] = m[1];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat2x4<T, P>& tmat2x4<T, P>::operator+=(U s) {\n  this->value[0] += s;\n  this->value[1] += s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat2x4<T, P>& tmat2x4<T, P>::operator+=(\n    tmat2x4<U, P> const& m) {\n  this->value[0] += m[0];\n  this->value[1] += m[1];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat2x4<T, P>& tmat2x4<T, P>::operator-=(U s) {\n  this->value[0] -= s;\n  this->value[1] -= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat2x4<T, P>& tmat2x4<T, P>::operator-=(\n    tmat2x4<U, P> const& m) {\n  this->value[0] -= m[0];\n  this->value[1] -= m[1];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat2x4<T, P>& tmat2x4<T, P>::operator*=(U s) {\n  this->value[0] *= s;\n  this->value[1] *= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat2x4<T, P>& tmat2x4<T, P>::operator/=(U s) {\n  this->value[0] /= s;\n  this->value[1] /= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x4<T, P>& tmat2x4<T, P>::operator++() {\n  ++this->value[0];\n  ++this->value[1];\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x4<T, P>& tmat2x4<T, P>::operator--() {\n  --this->value[0];\n  --this->value[1];\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x4<T, P> tmat2x4<T, P>::operator++(int) {\n  tmat2x4<T, P> Result(*this);\n  ++*this;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x4<T, P> tmat2x4<T, P>::operator--(int) {\n  tmat2x4<T, P> Result(*this);\n  --*this;\n  return Result;\n}\n\n//////////////////////////////////////////////////////////////\n// Binary operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x4<T, P> operator+(tmat2x4<T, P> const& m, T const& s) {\n  return tmat2x4<T, P>(m[0] + s, m[1] + s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x4<T, P> operator+(tmat2x4<T, P> const& m1,\n                                           tmat2x4<T, P> const& m2) {\n  return tmat2x4<T, P>(m1[0] + m2[0], m1[1] + m2[1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x4<T, P> operator-(tmat2x4<T, P> const& m, T const& s) {\n  return tmat2x4<T, P>(m[0] - s, m[1] - s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x4<T, P> operator-(tmat2x4<T, P> const& m1,\n                                           tmat2x4<T, P> const& m2) {\n  return tmat2x4<T, P>(m1[0] - m2[0], m1[1] - m2[1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x4<T, P> operator*(tmat2x4<T, P> const& m, T const& s) {\n  return tmat2x4<T, P>(m[0] * s, m[1] * s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x4<T, P> operator*(T const& s, tmat2x4<T, P> const& m) {\n  return tmat2x4<T, P>(m[0] * s, m[1] * s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat2x4<T, P>::col_type operator*(\n    tmat2x4<T, P> const& m, typename tmat2x4<T, P>::row_type const& v) {\n  return typename tmat2x4<T, P>::col_type(\n      m[0][0] * v.x + m[1][0] * v.y, m[0][1] * v.x + m[1][1] * v.y,\n      m[0][2] * v.x + m[1][2] * v.y, m[0][3] * v.x + m[1][3] * v.y);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat2x4<T, P>::row_type operator*(\n    typename tmat2x4<T, P>::col_type const& v, tmat2x4<T, P> const& m) {\n  return typename tmat2x4<T, P>::row_type(\n      v.x * m[0][0] + v.y * m[0][1] + v.z * m[0][2] + v.w * m[0][3],\n      v.x * m[1][0] + v.y * m[1][1] + v.z * m[1][2] + v.w * m[1][3]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P> operator*(tmat2x4<T, P> const& m1,\n                                           tmat4x2<T, P> const& m2) {\n  T SrcA00 = m1[0][0];\n  T SrcA01 = m1[0][1];\n  T SrcA02 = m1[0][2];\n  T SrcA03 = m1[0][3];\n  T SrcA10 = m1[1][0];\n  T SrcA11 = m1[1][1];\n  T SrcA12 = m1[1][2];\n  T SrcA13 = m1[1][3];\n\n  T SrcB00 = m2[0][0];\n  T SrcB01 = m2[0][1];\n  T SrcB10 = m2[1][0];\n  T SrcB11 = m2[1][1];\n  T SrcB20 = m2[2][0];\n  T SrcB21 = m2[2][1];\n  T SrcB30 = m2[3][0];\n  T SrcB31 = m2[3][1];\n\n  tmat4x4<T, P> Result(tmat4x4<T, P>::_null);\n  Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01;\n  Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01;\n  Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01;\n  Result[0][3] = SrcA03 * SrcB00 + SrcA13 * SrcB01;\n  Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11;\n  Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11;\n  Result[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11;\n  Result[1][3] = SrcA03 * SrcB10 + SrcA13 * SrcB11;\n  Result[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21;\n  Result[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21;\n  Result[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21;\n  Result[2][3] = SrcA03 * SrcB20 + SrcA13 * SrcB21;\n  Result[3][0] = SrcA00 * SrcB30 + SrcA10 * SrcB31;\n  Result[3][1] = SrcA01 * SrcB30 + SrcA11 * SrcB31;\n  Result[3][2] = SrcA02 * SrcB30 + SrcA12 * SrcB31;\n  Result[3][3] = SrcA03 * SrcB30 + SrcA13 * SrcB31;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x4<T, P> operator*(tmat2x4<T, P> const& m1,\n                                           tmat2x2<T, P> const& m2) {\n  return tmat2x4<T, P>(m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1],\n                       m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1],\n                       m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1],\n                       m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1],\n                       m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1],\n                       m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1],\n                       m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1],\n                       m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x4<T, P> operator*(tmat2x4<T, P> const& m1,\n                                           tmat3x2<T, P> const& m2) {\n  return tmat3x4<T, P>(m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1],\n                       m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1],\n                       m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1],\n                       m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1],\n                       m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1],\n                       m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1],\n                       m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1],\n                       m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1],\n                       m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1],\n                       m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1],\n                       m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1],\n                       m1[0][3] * m2[2][0] + m1[1][3] * m2[2][1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x4<T, P> operator/(tmat2x4<T, P> const& m, T const& s) {\n  return tmat2x4<T, P>(m[0] / s, m[1] / s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x4<T, P> operator/(T const& s, tmat2x4<T, P> const& m) {\n  return tmat2x4<T, P>(s / m[0], s / m[1]);\n}\n\n// Unary constant operators\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x4<T, P> const operator-(tmat2x4<T, P> const& m) {\n  return tmat2x4<T, P>(-m[0], -m[1]);\n}\n\n//////////////////////////////////////\n// Boolean operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool operator==(tmat2x4<T, P> const& m1,\n                                   tmat2x4<T, P> const& m2) {\n  return (m1[0] == m2[0]) && (m1[1] == m2[1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool operator!=(tmat2x4<T, P> const& m1,\n                                   tmat2x4<T, P> const& m2) {\n  return (m1[0] != m2[0]) || (m1[1] != m2[1]);\n}\n}  // namespace detail\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_mat3x2.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_mat3x2.hpp\n/// @date 2006-08-05 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_core_type_mat3x2\n#define glm_core_type_mat3x2\n\n#include <limits>\n\n#include \"../fwd.hpp\"\n#include \"type_mat.hpp\"\n#include \"type_vec2.hpp\"\n#include \"type_vec3.hpp\"\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nstruct tmat3x2 {\n  enum ctor { _null };\n  typedef T value_type;\n  typedef std::size_t size_type;\n  typedef tvec2<T, P> col_type;\n  typedef tvec3<T, P> row_type;\n  typedef tmat3x2<T, P> type;\n  typedef tmat2x3<T, P> transpose_type;\n\n  GLM_FUNC_DECL GLM_CONSTEXPR length_t length() const;\n\n private:\n  // Data\n  col_type value[3];\n\n public:\n  // Constructors\n  GLM_FUNC_DECL tmat3x2();\n  GLM_FUNC_DECL tmat3x2(tmat3x2<T, P> const& m);\n  template <precision Q>\n  GLM_FUNC_DECL tmat3x2(tmat3x2<T, Q> const& m);\n\n  GLM_FUNC_DECL explicit tmat3x2(ctor);\n  GLM_FUNC_DECL explicit tmat3x2(T const& s);\n  GLM_FUNC_DECL tmat3x2(T const& x0, T const& y0, T const& x1, T const& y1,\n                        T const& x2, T const& y2);\n  GLM_FUNC_DECL tmat3x2(col_type const& v0, col_type const& v1,\n                        col_type const& v2);\n\n  //////////////////////////////////////\n  // Conversions\n  template <typename X1, typename Y1, typename X2, typename Y2, typename X3,\n            typename Y3>\n  GLM_FUNC_DECL tmat3x2(X1 const& x1, Y1 const& y1, X2 const& x2, Y2 const& y2,\n                        X3 const& x3, Y3 const& y3);\n\n  template <typename V1, typename V2, typename V3>\n  GLM_FUNC_DECL tmat3x2(tvec2<V1, P> const& v1, tvec2<V2, P> const& v2,\n                        tvec2<V3, P> const& v3);\n\n  // Matrix conversions\n  template <typename U, precision Q>\n  GLM_FUNC_DECL explicit tmat3x2(tmat3x2<U, Q> const& m);\n\n  GLM_FUNC_DECL explicit tmat3x2(tmat2x2<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat3x2(tmat3x3<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat3x2(tmat4x4<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat3x2(tmat2x3<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat3x2(tmat2x4<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat3x2(tmat3x4<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat3x2(tmat4x2<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat3x2(tmat4x3<T, P> const& x);\n\n  // Accesses\n  GLM_FUNC_DECL col_type& operator[](length_t i);\n  GLM_FUNC_DECL col_type const& operator[](length_t i) const;\n\n  // Unary updatable operators\n  GLM_FUNC_DECL tmat3x2<T, P>& operator=(tmat3x2<T, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat3x2<T, P>& operator=(tmat3x2<U, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat3x2<T, P>& operator+=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tmat3x2<T, P>& operator+=(tmat3x2<U, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat3x2<T, P>& operator-=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tmat3x2<T, P>& operator-=(tmat3x2<U, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat3x2<T, P>& operator*=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tmat3x2<T, P>& operator/=(U s);\n\n  //////////////////////////////////////\n  // Increment and decrement operators\n\n  GLM_FUNC_DECL tmat3x2<T, P>& operator++();\n  GLM_FUNC_DECL tmat3x2<T, P>& operator--();\n  GLM_FUNC_DECL tmat3x2<T, P> operator++(int);\n  GLM_FUNC_DECL tmat3x2<T, P> operator--(int);\n};\n\n// Binary operators\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x2<T, P> operator+(tmat3x2<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x2<T, P> operator+(tmat3x2<T, P> const& m1,\n                                      tmat3x2<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x2<T, P> operator-(tmat3x2<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x2<T, P> operator-(tmat3x2<T, P> const& m1,\n                                      tmat3x2<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x2<T, P> operator*(tmat3x2<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x2<T, P> operator*(T const& s, tmat3x2<T, P> const& m);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL typename tmat3x2<T, P>::col_type operator*(\n    tmat3x2<T, P> const& m, typename tmat3x2<T, P>::row_type const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL typename tmat3x2<T, P>::row_type operator*(\n    typename tmat3x2<T, P>::col_type const& v, tmat3x2<T, P> const& m);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x2<T, P> operator*(tmat3x2<T, P> const& m1,\n                                      tmat2x3<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x2<T, P> operator*(tmat3x2<T, P> const& m1,\n                                      tmat3x3<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x2<T, P> operator*(tmat3x2<T, P> const& m1,\n                                      tmat4x3<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x2<T, P> operator/(tmat3x2<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x2<T, P> operator/(T const& s, tmat3x2<T, P> const& m);\n\n// Unary constant operators\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x2<T, P> const operator-(tmat3x2<T, P> const& m);\n\n}  // namespace detail\n}  // namespace glm\n\n#ifndef GLM_EXTERNAL_TEMPLATE\n#include \"type_mat3x2.inl\"\n#endif\n\n#endif  // glm_core_type_mat3x2\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_mat3x2.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_mat3x2.inl\n/// @date 2006-08-05 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER GLM_CONSTEXPR length_t tmat3x2<T, P>::length() const {\n  return 3;\n}\n\n//////////////////////////////////////\n// Accesses\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat3x2<T, P>::col_type& tmat3x2<T, P>::operator[](\n    length_t i) {\n  assert(i < this->length());\n  return this->value[i];\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat3x2<T, P>::col_type const&\ntmat3x2<T, P>::operator[](length_t i) const {\n  assert(i < this->length());\n  return this->value[i];\n}\n\n//////////////////////////////////////////////////////////////\n// Constructors\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2() {\n  this->value[0] = col_type(1, 0);\n  this->value[1] = col_type(0, 1);\n  this->value[2] = col_type(0, 0);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat3x2<T, P> const& m) {\n  this->value[0] = m.value[0];\n  this->value[1] = m.value[1];\n  this->value[2] = m.value[2];\n}\n\ntemplate <typename T, precision P>\ntemplate <precision Q>\nGLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat3x2<T, Q> const& m) {\n  this->value[0] = m.value[0];\n  this->value[1] = m.value[1];\n  this->value[2] = m.value[2];\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(ctor) {}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(T const& s) {\n  this->value[0] = col_type(s, 0);\n  this->value[1] = col_type(0, s);\n  this->value[2] = col_type(0, 0);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(T const& x0, T const& y0, T const& x1,\n                                          T const& y1, T const& x2,\n                                          T const& y2) {\n  this->value[0] = col_type(x0, y0);\n  this->value[1] = col_type(x1, y1);\n  this->value[2] = col_type(x2, y2);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(col_type const& v0,\n                                          col_type const& v1,\n                                          col_type const& v2) {\n  this->value[0] = v0;\n  this->value[1] = v1;\n  this->value[2] = v2;\n}\n\n//////////////////////////////////////\n// Conversion constructors\ntemplate <typename T, precision P>\ntemplate <typename X1, typename Y1, typename X2, typename Y2, typename X3,\n          typename Y3>\nGLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(X1 const& x1, Y1 const& y1,\n                                          X2 const& x2, Y2 const& y2,\n                                          X3 const& x3, Y3 const& y3) {\n  this->value[0] = col_type(static_cast<T>(x1), value_type(y1));\n  this->value[1] = col_type(static_cast<T>(x2), value_type(y2));\n  this->value[2] = col_type(static_cast<T>(x3), value_type(y3));\n}\n\ntemplate <typename T, precision P>\ntemplate <typename V1, typename V2, typename V3>\nGLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tvec2<V1, P> const& v1,\n                                          tvec2<V2, P> const& v2,\n                                          tvec2<V3, P> const& v3) {\n  this->value[0] = col_type(v1);\n  this->value[1] = col_type(v2);\n  this->value[2] = col_type(v3);\n}\n\n//////////////////////////////////////////////////////////////\n// mat3x2 matrix conversions\n\ntemplate <typename T, precision P>\ntemplate <typename U, precision Q>\nGLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat3x2<U, Q> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n  this->value[2] = col_type(m[2]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat2x2<T, P> const& m) {\n  this->value[0] = m[0];\n  this->value[1] = m[1];\n  this->value[2] = col_type(T(0));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat3x3<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n  this->value[2] = col_type(m[2]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat4x4<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n  this->value[2] = col_type(m[2]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat2x3<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n  this->value[2] = col_type(T(0));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat2x4<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n  this->value[2] = col_type(T(0));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat3x4<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n  this->value[2] = col_type(m[2]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat4x2<T, P> const& m) {\n  this->value[0] = m[0];\n  this->value[1] = m[1];\n  this->value[2] = m[2];\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2(tmat4x3<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n  this->value[2] = col_type(m[2]);\n}\n\n//////////////////////////////////////////////////////////////\n// Unary updatable operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator=(\n    tmat3x2<T, P> const& m) {\n  this->value[0] = m[0];\n  this->value[1] = m[1];\n  this->value[2] = m[2];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator=(\n    tmat3x2<U, P> const& m) {\n  this->value[0] = m[0];\n  this->value[1] = m[1];\n  this->value[2] = m[2];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator+=(U s) {\n  this->value[0] += s;\n  this->value[1] += s;\n  this->value[2] += s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator+=(\n    tmat3x2<U, P> const& m) {\n  this->value[0] += m[0];\n  this->value[1] += m[1];\n  this->value[2] += m[2];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator-=(U s) {\n  this->value[0] -= s;\n  this->value[1] -= s;\n  this->value[2] -= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator-=(\n    tmat3x2<U, P> const& m) {\n  this->value[0] -= m[0];\n  this->value[1] -= m[1];\n  this->value[2] -= m[2];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator*=(U s) {\n  this->value[0] *= s;\n  this->value[1] *= s;\n  this->value[2] *= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator/=(U s) {\n  this->value[0] /= s;\n  this->value[1] /= s;\n  this->value[2] /= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator++() {\n  ++this->value[0];\n  ++this->value[1];\n  ++this->value[2];\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator--() {\n  --this->value[0];\n  --this->value[1];\n  --this->value[2];\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x2<T, P> tmat3x2<T, P>::operator++(int) {\n  tmat3x2<T, P> Result(*this);\n  ++*this;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x2<T, P> tmat3x2<T, P>::operator--(int) {\n  tmat3x2<T, P> Result(*this);\n  --*this;\n  return Result;\n}\n\n//////////////////////////////////////////////////////////////\n// Binary operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x2<T, P> operator+(tmat3x2<T, P> const& m, T const& s) {\n  return tmat3x2<T, P>(m[0] + s, m[1] + s, m[2] + s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x2<T, P> operator+(tmat3x2<T, P> const& m1,\n                                           tmat3x2<T, P> const& m2) {\n  return tmat3x2<T, P>(m1[0] + m2[0], m1[1] + m2[1], m1[2] + m2[2]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x2<T, P> operator-(tmat3x2<T, P> const& m, T const& s) {\n  return tmat3x2<T, P>(m[0] - s, m[1] - s, m[2] - s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x2<T, P> operator-(tmat3x2<T, P> const& m1,\n                                           tmat3x2<T, P> const& m2) {\n  return tmat3x2<T, P>(m1[0] - m2[0], m1[1] - m2[1], m1[2] - m2[2]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x2<T, P> operator*(tmat3x2<T, P> const& m, T const& s) {\n  return tmat3x2<T, P>(m[0] * s, m[1] * s, m[2] * s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x2<T, P> operator*(T const& s, tmat3x2<T, P> const& m) {\n  return tmat3x2<T, P>(m[0] * s, m[1] * s, m[2] * s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat3x2<T, P>::col_type operator*(\n    tmat3x2<T, P> const& m, typename tmat3x2<T, P>::row_type const& v) {\n  return typename tmat3x2<T, P>::col_type(\n      m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z,\n      m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat3x2<T, P>::row_type operator*(\n    typename tmat3x2<T, P>::col_type const& v, tmat3x2<T, P> const& m) {\n  return typename tmat3x2<T, P>::row_type(v.x * m[0][0] + v.y * m[0][1],\n                                          v.x * m[1][0] + v.y * m[1][1],\n                                          v.x * m[2][0] + v.y * m[2][1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P> operator*(tmat3x2<T, P> const& m1,\n                                           tmat2x3<T, P> const& m2) {\n  const T SrcA00 = m1[0][0];\n  const T SrcA01 = m1[0][1];\n  const T SrcA10 = m1[1][0];\n  const T SrcA11 = m1[1][1];\n  const T SrcA20 = m1[2][0];\n  const T SrcA21 = m1[2][1];\n\n  const T SrcB00 = m2[0][0];\n  const T SrcB01 = m2[0][1];\n  const T SrcB02 = m2[0][2];\n  const T SrcB10 = m2[1][0];\n  const T SrcB11 = m2[1][1];\n  const T SrcB12 = m2[1][2];\n\n  tmat2x2<T, P> Result(tmat2x2<T, P>::_null);\n  Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02;\n  Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02;\n  Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12;\n  Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x2<T, P> operator*(tmat3x2<T, P> const& m1,\n                                           tmat3x3<T, P> const& m2) {\n  return tmat3x2<T, P>(\n      m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2],\n      m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2],\n      m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2],\n      m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2],\n      m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2],\n      m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x2<T, P> operator*(tmat3x2<T, P> const& m1,\n                                           tmat4x3<T, P> const& m2) {\n  return tmat4x2<T, P>(\n      m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2],\n      m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2],\n      m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2],\n      m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2],\n      m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2],\n      m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2],\n      m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1] + m1[2][0] * m2[3][2],\n      m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] + m1[2][1] * m2[3][2]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x2<T, P> operator/(tmat3x2<T, P> const& m, T const& s) {\n  return tmat3x2<T, P>(m[0] / s, m[1] / s, m[2] / s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x2<T, P> operator/(T const& s, tmat3x2<T, P> const& m) {\n  return tmat3x2<T, P>(s / m[0], s / m[1], s / m[2]);\n}\n\n// Unary constant operators\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x2<T, P> const operator-(tmat3x2<T, P> const& m) {\n  return tmat3x2<T, P>(-m[0], -m[1], -m[2]);\n}\n\n//////////////////////////////////////\n// Boolean operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool operator==(tmat3x2<T, P> const& m1,\n                                   tmat3x2<T, P> const& m2) {\n  return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool operator!=(tmat3x2<T, P> const& m1,\n                                   tmat3x2<T, P> const& m2) {\n  return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]);\n}\n\n}  // namespace detail\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_mat3x3.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_mat3x3.hpp\n/// @date 2005-01-27 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_core_type_mat3x3\n#define glm_core_type_mat3x3\n\n#include <limits>\n\n#include \"../fwd.hpp\"\n#include \"type_mat.hpp\"\n#include \"type_vec3.hpp\"\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nstruct tmat3x3 {\n  enum ctor { _null };\n  typedef T value_type;\n  typedef std::size_t size_type;\n  typedef tvec3<T, P> col_type;\n  typedef tvec3<T, P> row_type;\n  typedef tmat3x3<T, P> type;\n  typedef tmat3x3<T, P> transpose_type;\n\n  GLM_FUNC_DECL GLM_CONSTEXPR length_t length() const;\n\n  template <typename U, precision Q>\n  friend tvec3<U, Q> operator/(tmat3x3<U, Q> const& m, tvec3<U, Q> const& v);\n  template <typename U, precision Q>\n  friend tvec3<U, Q> operator/(tvec3<U, Q> const& v, tmat3x3<U, Q> const& m);\n\n private:\n  /// @cond DETAIL\n  col_type value[3];\n  /// @endcond\n\n public:\n  // Constructors\n  GLM_FUNC_DECL tmat3x3();\n  GLM_FUNC_DECL tmat3x3(tmat3x3<T, P> const& m);\n  template <precision Q>\n  GLM_FUNC_DECL tmat3x3(tmat3x3<T, Q> const& m);\n\n  GLM_FUNC_DECL explicit tmat3x3(ctor Null);\n  GLM_FUNC_DECL explicit tmat3x3(T const& s);\n  GLM_FUNC_DECL tmat3x3(T const& x0, T const& y0, T const& z0, T const& x1,\n                        T const& y1, T const& z1, T const& x2, T const& y2,\n                        T const& z2);\n  GLM_FUNC_DECL tmat3x3(col_type const& v0, col_type const& v1,\n                        col_type const& v2);\n\n  //////////////////////////////////////\n  // Conversions\n  template <typename X1, typename Y1, typename Z1, typename X2, typename Y2,\n            typename Z2, typename X3, typename Y3, typename Z3>\n  GLM_FUNC_DECL tmat3x3(X1 const& x1, Y1 const& y1, Z1 const& z1, X2 const& x2,\n                        Y2 const& y2, Z2 const& z2, X3 const& x3, Y3 const& y3,\n                        Z3 const& z3);\n\n  template <typename V1, typename V2, typename V3>\n  GLM_FUNC_DECL tmat3x3(tvec3<V1, P> const& v1, tvec3<V2, P> const& v2,\n                        tvec3<V3, P> const& v3);\n\n  // Matrix conversions\n  template <typename U, precision Q>\n  GLM_FUNC_DECL explicit tmat3x3(tmat3x3<U, Q> const& m);\n\n  GLM_FUNC_DECL explicit tmat3x3(tmat2x2<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat3x3(tmat4x4<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat3x3(tmat2x3<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat3x3(tmat3x2<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat3x3(tmat2x4<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat3x3(tmat4x2<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat3x3(tmat3x4<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat3x3(tmat4x3<T, P> const& x);\n\n  // Accesses\n  GLM_FUNC_DECL col_type& operator[](length_t i);\n  GLM_FUNC_DECL col_type const& operator[](length_t i) const;\n\n  // Unary updatable operators\n  GLM_FUNC_DECL tmat3x3<T, P>& operator=(tmat3x3<T, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat3x3<T, P>& operator=(tmat3x3<U, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat3x3<T, P>& operator+=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tmat3x3<T, P>& operator+=(tmat3x3<U, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat3x3<T, P>& operator-=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tmat3x3<T, P>& operator-=(tmat3x3<U, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat3x3<T, P>& operator*=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tmat3x3<T, P>& operator*=(tmat3x3<U, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat3x3<T, P>& operator/=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tmat3x3<T, P>& operator/=(tmat3x3<U, P> const& m);\n\n  //////////////////////////////////////\n  // Increment and decrement operators\n\n  GLM_FUNC_DECL tmat3x3<T, P>& operator++();\n  GLM_FUNC_DECL tmat3x3<T, P>& operator--();\n  GLM_FUNC_DECL tmat3x3<T, P> operator++(int);\n  GLM_FUNC_DECL tmat3x3<T, P> operator--(int);\n};\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x3<T, P> compute_inverse_mat3(tmat3x3<T, P> const& m);\n\n// Binary operators\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x3<T, P> operator+(tmat3x3<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x3<T, P> operator+(T const& s, tmat3x3<T, P> const& m);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x3<T, P> operator+(tmat3x3<T, P> const& m1,\n                                      tmat3x3<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x3<T, P> operator-(tmat3x3<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x3<T, P> operator-(T const& s, tmat3x3<T, P> const& m);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x3<T, P> operator-(tmat3x3<T, P> const& m1,\n                                      tmat3x3<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x3<T, P> operator*(tmat3x3<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x3<T, P> operator*(T const& s, tmat3x3<T, P> const& m);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL typename tmat3x3<T, P>::col_type operator*(\n    tmat3x3<T, P> const& m, typename tmat3x3<T, P>::row_type const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL typename tmat3x3<T, P>::row_type operator*(\n    typename tmat3x3<T, P>::col_type const& v, tmat3x3<T, P> const& m);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x3<T, P> operator*(tmat3x3<T, P> const& m1,\n                                      tmat3x3<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x3<T, P> operator*(tmat3x3<T, P> const& m1,\n                                      tmat2x3<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x3<T, P> operator*(tmat3x3<T, P> const& m1,\n                                      tmat4x3<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x3<T, P> operator/(tmat3x3<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x3<T, P> operator/(T const& s, tmat3x3<T, P> const& m);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL typename tmat3x3<T, P>::col_type operator/(\n    tmat3x3<T, P> const& m, typename tmat3x3<T, P>::row_type const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL typename tmat3x3<T, P>::row_type operator/(\n    typename tmat3x3<T, P>::col_type const& v, tmat3x3<T, P> const& m);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x3<T, P> operator/(tmat3x3<T, P> const& m1,\n                                      tmat3x3<T, P> const& m2);\n\n// Unary constant operators\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x3<T, P> const operator-(tmat3x3<T, P> const& m);\n\n}  // namespace detail\n}  // namespace glm\n\n#ifndef GLM_EXTERNAL_TEMPLATE\n#include \"type_mat3x3.inl\"\n#endif\n\n#endif  // glm_core_type_mat3x3\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_mat3x3.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_mat3x3.inl\n/// @date 2005-01-27 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER GLM_CONSTEXPR length_t tmat3x3<T, P>::length() const {\n  return 3;\n}\n\n//////////////////////////////////////\n// Accesses\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat3x3<T, P>::col_type& tmat3x3<T, P>::operator[](\n    length_t i) {\n  assert(i < this->length());\n  return this->value[i];\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat3x3<T, P>::col_type const&\ntmat3x3<T, P>::operator[](length_t i) const {\n  assert(i < this->length());\n  return this->value[i];\n}\n\n//////////////////////////////////////////////////////////////\n// Constructors\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3() {\n  value_type const Zero(0);\n  value_type const One(1);\n  this->value[0] = col_type(One, Zero, Zero);\n  this->value[1] = col_type(Zero, One, Zero);\n  this->value[2] = col_type(Zero, Zero, One);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat3x3<T, P> const& m) {\n  this->value[0] = m.value[0];\n  this->value[1] = m.value[1];\n  this->value[2] = m.value[2];\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(ctor) {}\n\ntemplate <typename T, precision P>\ntemplate <precision Q>\nGLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat3x3<T, Q> const& m) {\n  this->value[0] = m.value[0];\n  this->value[1] = m.value[1];\n  this->value[2] = m.value[2];\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(T const& s) {\n  value_type const Zero(0);\n  this->value[0] = col_type(s, Zero, Zero);\n  this->value[1] = col_type(Zero, s, Zero);\n  this->value[2] = col_type(Zero, Zero, s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(T const& x0, T const& y0, T const& z0,\n                                          T const& x1, T const& y1, T const& z1,\n                                          T const& x2, T const& y2,\n                                          T const& z2) {\n  this->value[0] = col_type(x0, y0, z0);\n  this->value[1] = col_type(x1, y1, z1);\n  this->value[2] = col_type(x2, y2, z2);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(col_type const& v0,\n                                          col_type const& v1,\n                                          col_type const& v2) {\n  this->value[0] = v0;\n  this->value[1] = v1;\n  this->value[2] = v2;\n}\n\n//////////////////////////////////////\n// Conversion constructors\ntemplate <typename T, precision P>\ntemplate <typename X1, typename Y1, typename Z1, typename X2, typename Y2,\n          typename Z2, typename X3, typename Y3, typename Z3>\nGLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(X1 const& x1, Y1 const& y1,\n                                          Z1 const& z1, X2 const& x2,\n                                          Y2 const& y2, Z2 const& z2,\n                                          X3 const& x3, Y3 const& y3,\n                                          Z3 const& z3) {\n  this->value[0] = col_type(static_cast<T>(x1), value_type(y1), value_type(z1));\n  this->value[1] = col_type(static_cast<T>(x2), value_type(y2), value_type(z2));\n  this->value[2] = col_type(static_cast<T>(x3), value_type(y3), value_type(z3));\n}\n\ntemplate <typename T, precision P>\ntemplate <typename V1, typename V2, typename V3>\nGLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tvec3<V1, P> const& v1,\n                                          tvec3<V2, P> const& v2,\n                                          tvec3<V3, P> const& v3) {\n  this->value[0] = col_type(v1);\n  this->value[1] = col_type(v2);\n  this->value[2] = col_type(v3);\n}\n\n//////////////////////////////////////////////////////////////\n// Conversions\n\ntemplate <typename T, precision P>\ntemplate <typename U, precision Q>\nGLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat3x3<U, Q> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n  this->value[2] = col_type(m[2]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat2x2<T, P> const& m) {\n  this->value[0] = col_type(m[0], value_type(0));\n  this->value[1] = col_type(m[1], value_type(0));\n  this->value[2] = col_type(detail::tvec2<T, P>(0), value_type(1));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat4x4<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n  this->value[2] = col_type(m[2]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat2x3<T, P> const& m) {\n  this->value[0] = m[0];\n  this->value[1] = m[1];\n  this->value[2] = col_type(detail::tvec2<T, P>(0), value_type(1));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat3x2<T, P> const& m) {\n  this->value[0] = col_type(m[0], value_type(0));\n  this->value[1] = col_type(m[1], value_type(0));\n  this->value[2] = col_type(m[2], value_type(1));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat2x4<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n  this->value[2] = col_type(detail::tvec2<T, P>(0), value_type(1));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat4x2<T, P> const& m) {\n  this->value[0] = col_type(m[0], value_type(0));\n  this->value[1] = col_type(m[1], value_type(0));\n  this->value[2] = col_type(m[2], value_type(1));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat3x4<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n  this->value[2] = col_type(m[2]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P>::tmat3x3(tmat4x3<T, P> const& m) {\n  this->value[0] = m[0];\n  this->value[1] = m[1];\n  this->value[2] = m[2];\n}\n\n//////////////////////////////////////////////////////////////\n// Operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P>& tmat3x3<T, P>::operator=(\n    tmat3x3<T, P> const& m) {\n  this->value[0] = m[0];\n  this->value[1] = m[1];\n  this->value[2] = m[2];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat3x3<T, P>& tmat3x3<T, P>::operator=(\n    tmat3x3<U, P> const& m) {\n  this->value[0] = m[0];\n  this->value[1] = m[1];\n  this->value[2] = m[2];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat3x3<T, P>& tmat3x3<T, P>::operator+=(U s) {\n  this->value[0] += s;\n  this->value[1] += s;\n  this->value[2] += s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat3x3<T, P>& tmat3x3<T, P>::operator+=(\n    tmat3x3<U, P> const& m) {\n  this->value[0] += m[0];\n  this->value[1] += m[1];\n  this->value[2] += m[2];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat3x3<T, P>& tmat3x3<T, P>::operator-=(U s) {\n  this->value[0] -= s;\n  this->value[1] -= s;\n  this->value[2] -= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat3x3<T, P>& tmat3x3<T, P>::operator-=(\n    tmat3x3<U, P> const& m) {\n  this->value[0] -= m[0];\n  this->value[1] -= m[1];\n  this->value[2] -= m[2];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat3x3<T, P>& tmat3x3<T, P>::operator*=(U s) {\n  this->value[0] *= s;\n  this->value[1] *= s;\n  this->value[2] *= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat3x3<T, P>& tmat3x3<T, P>::operator*=(\n    tmat3x3<U, P> const& m) {\n  return (*this = *this * m);\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat3x3<T, P>& tmat3x3<T, P>::operator/=(U s) {\n  this->value[0] /= s;\n  this->value[1] /= s;\n  this->value[2] /= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat3x3<T, P>& tmat3x3<T, P>::operator/=(\n    tmat3x3<U, P> const& m) {\n  return (*this =\n              *this * detail::compute_inverse<detail::tmat3x3, T, P>::call(m));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P>& tmat3x3<T, P>::operator++() {\n  ++this->value[0];\n  ++this->value[1];\n  ++this->value[2];\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P>& tmat3x3<T, P>::operator--() {\n  --this->value[0];\n  --this->value[1];\n  --this->value[2];\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P> tmat3x3<T, P>::operator++(int) {\n  tmat3x3<T, P> Result(*this);\n  ++*this;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P> tmat3x3<T, P>::operator--(int) {\n  tmat3x3<T, P> Result(*this);\n  --*this;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nstruct compute_inverse<detail::tmat3x3, T, P> {\n  static detail::tmat3x3<T, P> call(detail::tmat3x3<T, P> const& m) {\n    T OneOverDeterminant = static_cast<T>(1) /\n                           (+m[0][0] * (m[1][1] * m[2][2] - m[2][1] * m[1][2]) -\n                            m[1][0] * (m[0][1] * m[2][2] - m[2][1] * m[0][2]) +\n                            m[2][0] * (m[0][1] * m[1][2] - m[1][1] * m[0][2]));\n\n    detail::tmat3x3<T, P> Inverse(detail::tmat3x3<T, P>::_null);\n    Inverse[0][0] =\n        +(m[1][1] * m[2][2] - m[2][1] * m[1][2]) * OneOverDeterminant;\n    Inverse[1][0] =\n        -(m[1][0] * m[2][2] - m[2][0] * m[1][2]) * OneOverDeterminant;\n    Inverse[2][0] =\n        +(m[1][0] * m[2][1] - m[2][0] * m[1][1]) * OneOverDeterminant;\n    Inverse[0][1] =\n        -(m[0][1] * m[2][2] - m[2][1] * m[0][2]) * OneOverDeterminant;\n    Inverse[1][1] =\n        +(m[0][0] * m[2][2] - m[2][0] * m[0][2]) * OneOverDeterminant;\n    Inverse[2][1] =\n        -(m[0][0] * m[2][1] - m[2][0] * m[0][1]) * OneOverDeterminant;\n    Inverse[0][2] =\n        +(m[0][1] * m[1][2] - m[1][1] * m[0][2]) * OneOverDeterminant;\n    Inverse[1][2] =\n        -(m[0][0] * m[1][2] - m[1][0] * m[0][2]) * OneOverDeterminant;\n    Inverse[2][2] =\n        +(m[0][0] * m[1][1] - m[1][0] * m[0][1]) * OneOverDeterminant;\n\n    return Inverse;\n  }\n};\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P> compute_inverse_mat3(tmat3x3<T, P> const& m) {\n  T S00 = m[0][0];\n  T S01 = m[0][1];\n  T S02 = m[0][2];\n\n  T S10 = m[1][0];\n  T S11 = m[1][1];\n  T S12 = m[1][2];\n\n  T S20 = m[2][0];\n  T S21 = m[2][1];\n  T S22 = m[2][2];\n  /*\n                  tmat3x3<T, P> Inverse(\n                          + (S11 * S22 - S21 * S12),\n                          - (S10 * S22 - S20 * S12),\n                          + (S10 * S21 - S20 * S11),\n                          - (S01 * S22 - S21 * S02),\n                          + (S00 * S22 - S20 * S02),\n                          - (S00 * S21 - S20 * S01),\n                          + (S01 * S12 - S11 * S02),\n                          - (S00 * S12 - S10 * S02),\n                          + (S00 * S11 - S10 * S01));\n  */\n  tmat3x3<T, P> Inverse(\n      S11 * S22 - S21 * S12, S12 * S20 - S22 * S10, S10 * S21 - S20 * S11,\n      S02 * S21 - S01 * S22, S00 * S22 - S02 * S20, S01 * S20 - S00 * S21,\n      S12 * S01 - S11 * S02, S10 * S02 - S12 * S00, S11 * S00 - S10 * S01);\n\n  T Determinant = +S00 * (S11 * S22 - S21 * S12) -\n                  S10 * (S01 * S22 - S21 * S02) + S20 * (S01 * S12 - S11 * S02);\n\n  Inverse /= Determinant;\n  return Inverse;\n}\n\n//////////////////////////////////////////////////////////////\n// Binary operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P> operator+(tmat3x3<T, P> const& m, T const& s) {\n  return tmat3x3<T, P>(m[0] + s, m[1] + s, m[2] + s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P> operator+(T const& s, tmat3x3<T, P> const& m) {\n  return tmat3x3<T, P>(m[0] + s, m[1] + s, m[2] + s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P> operator+(tmat3x3<T, P> const& m1,\n                                           tmat3x3<T, P> const& m2) {\n  return tmat3x3<T, P>(m1[0] + m2[0], m1[1] + m2[1], m1[2] + m2[2]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P> operator-(tmat3x3<T, P> const& m, T const& s) {\n  return tmat3x3<T, P>(m[0] - s, m[1] - s, m[2] - s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P> operator-(T const& s, tmat3x3<T, P> const& m) {\n  return tmat3x3<T, P>(s - m[0], s - m[1], s - m[2]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P> operator-(tmat3x3<T, P> const& m1,\n                                           tmat3x3<T, P> const& m2) {\n  return tmat3x3<T, P>(m1[0] - m2[0], m1[1] - m2[1], m1[2] - m2[2]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P> operator*(tmat3x3<T, P> const& m, T const& s) {\n  return tmat3x3<T, P>(m[0] * s, m[1] * s, m[2] * s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P> operator*(T const& s, tmat3x3<T, P> const& m) {\n  return tmat3x3<T, P>(m[0] * s, m[1] * s, m[2] * s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat3x3<T, P>::col_type operator*(\n    tmat3x3<T, P> const& m, typename tmat3x3<T, P>::row_type const& v) {\n  return typename tmat3x3<T, P>::col_type(\n      m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z,\n      m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z,\n      m[0][2] * v.x + m[1][2] * v.y + m[2][2] * v.z);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat3x3<T, P>::row_type operator*(\n    typename tmat3x3<T, P>::col_type const& v, tmat3x3<T, P> const& m) {\n  return typename tmat3x3<T, P>::row_type(\n      m[0][0] * v.x + m[0][1] * v.y + m[0][2] * v.z,\n      m[1][0] * v.x + m[1][1] * v.y + m[1][2] * v.z,\n      m[2][0] * v.x + m[2][1] * v.y + m[2][2] * v.z);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P> operator*(tmat3x3<T, P> const& m1,\n                                           tmat3x3<T, P> const& m2) {\n  T const SrcA00 = m1[0][0];\n  T const SrcA01 = m1[0][1];\n  T const SrcA02 = m1[0][2];\n  T const SrcA10 = m1[1][0];\n  T const SrcA11 = m1[1][1];\n  T const SrcA12 = m1[1][2];\n  T const SrcA20 = m1[2][0];\n  T const SrcA21 = m1[2][1];\n  T const SrcA22 = m1[2][2];\n\n  T const SrcB00 = m2[0][0];\n  T const SrcB01 = m2[0][1];\n  T const SrcB02 = m2[0][2];\n  T const SrcB10 = m2[1][0];\n  T const SrcB11 = m2[1][1];\n  T const SrcB12 = m2[1][2];\n  T const SrcB20 = m2[2][0];\n  T const SrcB21 = m2[2][1];\n  T const SrcB22 = m2[2][2];\n\n  tmat3x3<T, P> Result(tmat3x3<T, P>::_null);\n  Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02;\n  Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02;\n  Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01 + SrcA22 * SrcB02;\n  Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12;\n  Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12;\n  Result[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11 + SrcA22 * SrcB12;\n  Result[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21 + SrcA20 * SrcB22;\n  Result[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21 + SrcA21 * SrcB22;\n  Result[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21 + SrcA22 * SrcB22;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x3<T, P> operator*(tmat3x3<T, P> const& m1,\n                                           tmat2x3<T, P> const& m2) {\n  return tmat2x3<T, P>(\n      m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2],\n      m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2],\n      m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2],\n      m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2],\n      m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2],\n      m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P> operator*(tmat3x3<T, P> const& m1,\n                                           tmat4x3<T, P> const& m2) {\n  return tmat4x3<T, P>(\n      m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2],\n      m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2],\n      m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2],\n      m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2],\n      m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2],\n      m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2],\n      m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2],\n      m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2],\n      m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1] + m1[2][2] * m2[2][2],\n      m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1] + m1[2][0] * m2[3][2],\n      m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] + m1[2][1] * m2[3][2],\n      m1[0][2] * m2[3][0] + m1[1][2] * m2[3][1] + m1[2][2] * m2[3][2]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P> operator/(tmat3x3<T, P> const& m, T const& s) {\n  return tmat3x3<T, P>(m[0] / s, m[1] / s, m[2] / s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P> operator/(T const& s, tmat3x3<T, P> const& m) {\n  return tmat3x3<T, P>(s / m[0], s / m[1], s / m[2]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat3x3<T, P>::col_type operator/(\n    tmat3x3<T, P> const& m, typename tmat3x3<T, P>::row_type const& v) {\n  return detail::compute_inverse<detail::tmat3x3, T, P>::call(m) * v;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat3x3<T, P>::row_type operator/(\n    typename tmat3x3<T, P>::col_type const& v, tmat3x3<T, P> const& m) {\n  return v * detail::compute_inverse<detail::tmat3x3, T, P>::call(m);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P> operator/(tmat3x3<T, P> const& m1,\n                                           tmat3x3<T, P> const& m2) {\n  tmat3x3<T, P> m1_copy(m1);\n  return m1_copy /= m2;\n}\n\n// Unary constant operators\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P> const operator-(tmat3x3<T, P> const& m) {\n  return tmat3x3<T, P>(-m[0], -m[1], -m[2]);\n}\n\n//////////////////////////////////////\n// Boolean operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool operator==(tmat3x3<T, P> const& m1,\n                                   tmat3x3<T, P> const& m2) {\n  return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool operator!=(tmat3x3<T, P> const& m1,\n                                   tmat3x3<T, P> const& m2) {\n  return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]);\n}\n\n}  // namespace detail\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_mat3x4.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_mat3x4.hpp\n/// @date 2006-08-05 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_core_type_mat3x4\n#define glm_core_type_mat3x4\n\n#include <limits>\n\n#include \"../fwd.hpp\"\n#include \"type_mat.hpp\"\n#include \"type_vec3.hpp\"\n#include \"type_vec4.hpp\"\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nstruct tmat3x4 {\n  enum ctor { _null };\n  typedef T value_type;\n  typedef std::size_t size_type;\n  typedef tvec4<T, P> col_type;\n  typedef tvec3<T, P> row_type;\n  typedef tmat3x4<T, P> type;\n  typedef tmat4x3<T, P> transpose_type;\n\n  GLM_FUNC_DECL GLM_CONSTEXPR length_t length() const;\n\n private:\n  // Data\n  col_type value[3];\n\n public:\n  // Constructors\n  GLM_FUNC_DECL tmat3x4();\n  GLM_FUNC_DECL tmat3x4(tmat3x4<T, P> const& m);\n  template <precision Q>\n  GLM_FUNC_DECL tmat3x4(tmat3x4<T, Q> const& m);\n\n  GLM_FUNC_DECL explicit tmat3x4(ctor Null);\n  GLM_FUNC_DECL explicit tmat3x4(T const& s);\n  GLM_FUNC_DECL tmat3x4(T const& x0, T const& y0, T const& z0, T const& w0,\n                        T const& x1, T const& y1, T const& z1, T const& w1,\n                        T const& x2, T const& y2, T const& z2, T const& w2);\n  GLM_FUNC_DECL tmat3x4(col_type const& v0, col_type const& v1,\n                        col_type const& v2);\n\n  //////////////////////////////////////\n  // Conversions\n  template <typename X1, typename Y1, typename Z1, typename W1, typename X2,\n            typename Y2, typename Z2, typename W2, typename X3, typename Y3,\n            typename Z3, typename W3>\n  GLM_FUNC_DECL tmat3x4(X1 const& x1, Y1 const& y1, Z1 const& z1, W1 const& w1,\n                        X2 const& x2, Y2 const& y2, Z2 const& z2, W2 const& w2,\n                        X3 const& x3, Y3 const& y3, Z3 const& z3, W3 const& w3);\n\n  template <typename V1, typename V2, typename V3>\n  GLM_FUNC_DECL tmat3x4(tvec4<V1, P> const& v1, tvec4<V2, P> const& v2,\n                        tvec4<V3, P> const& v3);\n\n  // Matrix conversion\n  template <typename U, precision Q>\n  GLM_FUNC_DECL explicit tmat3x4(tmat3x4<U, Q> const& m);\n\n  GLM_FUNC_DECL explicit tmat3x4(tmat2x2<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat3x4(tmat3x3<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat3x4(tmat4x4<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat3x4(tmat2x3<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat3x4(tmat3x2<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat3x4(tmat2x4<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat3x4(tmat4x2<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat3x4(tmat4x3<T, P> const& x);\n\n  // Accesses\n  GLM_FUNC_DECL col_type& operator[](length_t i);\n  GLM_FUNC_DECL col_type const& operator[](length_t i) const;\n\n  // Unary updatable operators\n  GLM_FUNC_DECL tmat3x4<T, P>& operator=(tmat3x4<T, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat3x4<T, P>& operator=(tmat3x4<U, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat3x4<T, P>& operator+=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tmat3x4<T, P>& operator+=(tmat3x4<U, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat3x4<T, P>& operator-=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tmat3x4<T, P>& operator-=(tmat3x4<U, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat3x4<T, P>& operator*=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tmat3x4<T, P>& operator/=(U s);\n\n  //////////////////////////////////////\n  // Increment and decrement operators\n\n  GLM_FUNC_DECL tmat3x4<T, P>& operator++();\n  GLM_FUNC_DECL tmat3x4<T, P>& operator--();\n  GLM_FUNC_DECL tmat3x4<T, P> operator++(int);\n  GLM_FUNC_DECL tmat3x4<T, P> operator--(int);\n};\n\n// Binary operators\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x4<T, P> operator+(tmat3x4<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x4<T, P> operator+(tmat3x4<T, P> const& m1,\n                                      tmat3x4<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x4<T, P> operator-(tmat3x4<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x4<T, P> operator-(tmat3x4<T, P> const& m1,\n                                      tmat3x4<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x4<T, P> operator*(tmat3x4<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x4<T, P> operator*(T const& s, tmat3x4<T, P> const& m);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL typename tmat3x4<T, P>::col_type operator*(\n    tmat3x4<T, P> const& m, typename tmat3x4<T, P>::row_type const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL typename tmat3x4<T, P>::row_type operator*(\n    typename tmat3x4<T, P>::col_type const& v, tmat3x4<T, P> const& m);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x4<T, P> operator*(tmat3x4<T, P> const& m1,\n                                      tmat4x3<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x4<T, P> operator*(tmat3x4<T, P> const& m1,\n                                      tmat2x3<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x4<T, P> operator*(tmat3x4<T, P> const& m1,\n                                      tmat3x3<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x4<T, P> operator/(tmat3x4<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x4<T, P> operator/(T const& s, tmat3x4<T, P> const& m);\n\n// Unary constant operators\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x4<T, P> const operator-(tmat3x4<T, P> const& m);\n\n}  // namespace detail\n}  // namespace glm\n\n#ifndef GLM_EXTERNAL_TEMPLATE\n#include \"type_mat3x4.inl\"\n#endif\n\n#endif  // glm_core_type_mat3x4\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_mat3x4.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_mat3x4.inl\n/// @date 2006-08-05 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER GLM_CONSTEXPR length_t tmat3x4<T, P>::length() const {\n  return 3;\n}\n\n//////////////////////////////////////\n// Accesses\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat3x4<T, P>::col_type& tmat3x4<T, P>::operator[](\n    length_t i) {\n  assert(i < this->length());\n  return this->value[i];\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat3x4<T, P>::col_type const&\ntmat3x4<T, P>::operator[](length_t i) const {\n  assert(i < this->length());\n  return this->value[i];\n}\n\n//////////////////////////////////////////////////////////////\n// Constructors\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4() {\n  this->value[0] = col_type(1, 0, 0, 0);\n  this->value[1] = col_type(0, 1, 0, 0);\n  this->value[2] = col_type(0, 0, 1, 0);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat3x4<T, P> const& m) {\n  this->value[0] = m.value[0];\n  this->value[1] = m.value[1];\n  this->value[2] = m.value[2];\n}\n\ntemplate <typename T, precision P>\ntemplate <precision Q>\nGLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat3x4<T, Q> const& m) {\n  this->value[0] = m.value[0];\n  this->value[1] = m.value[1];\n  this->value[2] = m.value[2];\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(ctor) {}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(T const& s) {\n  value_type const Zero(0);\n  this->value[0] = col_type(s, Zero, Zero, Zero);\n  this->value[1] = col_type(Zero, s, Zero, Zero);\n  this->value[2] = col_type(Zero, Zero, s, Zero);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(T const& x0, T const& y0, T const& z0,\n                                          T const& w0, T const& x1, T const& y1,\n                                          T const& z1, T const& w1, T const& x2,\n                                          T const& y2, T const& z2,\n                                          T const& w2) {\n  this->value[0] = col_type(x0, y0, z0, w0);\n  this->value[1] = col_type(x1, y1, z1, w1);\n  this->value[2] = col_type(x2, y2, z2, w2);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(col_type const& v0,\n                                          col_type const& v1,\n                                          col_type const& v2) {\n  this->value[0] = v0;\n  this->value[1] = v1;\n  this->value[2] = v2;\n}\n\n//////////////////////////////////////\n// Conversion constructors\ntemplate <typename T, precision P>\ntemplate <typename X1, typename Y1, typename Z1, typename W1, typename X2,\n          typename Y2, typename Z2, typename W2, typename X3, typename Y3,\n          typename Z3, typename W3>\nGLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(X1 const& x1, Y1 const& y1,\n                                          Z1 const& z1, W1 const& w1,\n                                          X2 const& x2, Y2 const& y2,\n                                          Z2 const& z2, W2 const& w2,\n                                          X3 const& x3, Y3 const& y3,\n                                          Z3 const& z3, W3 const& w3) {\n  this->value[0] = col_type(static_cast<T>(x1), value_type(y1), value_type(z1),\n                            value_type(w1));\n  this->value[1] = col_type(static_cast<T>(x2), value_type(y2), value_type(z2),\n                            value_type(w2));\n  this->value[2] = col_type(static_cast<T>(x3), value_type(y3), value_type(z3),\n                            value_type(w3));\n}\n\ntemplate <typename T, precision P>\ntemplate <typename V1, typename V2, typename V3>\nGLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tvec4<V1, P> const& v1,\n                                          tvec4<V2, P> const& v2,\n                                          tvec4<V3, P> const& v3) {\n  this->value[0] = col_type(v1);\n  this->value[1] = col_type(v2);\n  this->value[2] = col_type(v3);\n}\n\n// Conversion\ntemplate <typename T, precision P>\ntemplate <typename U, precision Q>\nGLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat3x4<U, Q> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n  this->value[2] = col_type(m[2]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat2x2<T, P> const& m) {\n  this->value[0] = col_type(m[0], detail::tvec2<T, P>(0));\n  this->value[1] = col_type(m[1], detail::tvec2<T, P>(0));\n  this->value[2] = col_type(T(0), T(0), T(1), T(0));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat3x3<T, P> const& m) {\n  this->value[0] = col_type(m[0], T(0));\n  this->value[1] = col_type(m[1], T(0));\n  this->value[2] = col_type(m[2], T(0));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat4x4<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n  this->value[2] = col_type(m[2]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat2x3<T, P> const& m) {\n  this->value[0] = col_type(m[0], T(0));\n  this->value[1] = col_type(m[1], T(0));\n  this->value[2] = col_type(T(0), T(0), T(1), T(0));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat3x2<T, P> const& m) {\n  this->value[0] = col_type(m[0], detail::tvec2<T, P>(0));\n  this->value[1] = col_type(m[1], detail::tvec2<T, P>(0));\n  this->value[2] = col_type(m[2], T(0), T(1));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat2x4<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n  this->value[2] = col_type(T(0), T(0), T(1), T(0));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat4x2<T, P> const& m) {\n  this->value[0] = col_type(m[0], detail::tvec2<T, P>(T(0)));\n  this->value[1] = col_type(m[1], detail::tvec2<T, P>(T(0)));\n  this->value[2] = col_type(m[2], detail::tvec2<T, P>(T(1), T(0)));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x4<T, P>::tmat3x4(tmat4x3<T, P> const& m) {\n  this->value[0] = col_type(m[0], T(0));\n  this->value[1] = col_type(m[1], T(0));\n  this->value[2] = col_type(m[2], T(0));\n}\n\n//////////////////////////////////////////////////////////////\n// Unary updatable operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x4<T, P>& tmat3x4<T, P>::operator=(\n    tmat3x4<T, P> const& m) {\n  this->value[0] = m[0];\n  this->value[1] = m[1];\n  this->value[2] = m[2];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat3x4<T, P>& tmat3x4<T, P>::operator=(\n    tmat3x4<U, P> const& m) {\n  this->value[0] = m[0];\n  this->value[1] = m[1];\n  this->value[2] = m[2];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat3x4<T, P>& tmat3x4<T, P>::operator+=(U s) {\n  this->value[0] += s;\n  this->value[1] += s;\n  this->value[2] += s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat3x4<T, P>& tmat3x4<T, P>::operator+=(\n    tmat3x4<U, P> const& m) {\n  this->value[0] += m[0];\n  this->value[1] += m[1];\n  this->value[2] += m[2];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat3x4<T, P>& tmat3x4<T, P>::operator-=(U s) {\n  this->value[0] -= s;\n  this->value[1] -= s;\n  this->value[2] -= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat3x4<T, P>& tmat3x4<T, P>::operator-=(\n    tmat3x4<U, P> const& m) {\n  this->value[0] -= m[0];\n  this->value[1] -= m[1];\n  this->value[2] -= m[2];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat3x4<T, P>& tmat3x4<T, P>::operator*=(U s) {\n  this->value[0] *= s;\n  this->value[1] *= s;\n  this->value[2] *= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat3x4<T, P>& tmat3x4<T, P>::operator/=(U s) {\n  this->value[0] /= s;\n  this->value[1] /= s;\n  this->value[2] /= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x4<T, P>& tmat3x4<T, P>::operator++() {\n  ++this->value[0];\n  ++this->value[1];\n  ++this->value[2];\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x4<T, P>& tmat3x4<T, P>::operator--() {\n  --this->value[0];\n  --this->value[1];\n  --this->value[2];\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x4<T, P> tmat3x4<T, P>::operator++(int) {\n  tmat3x4<T, P> Result(*this);\n  ++*this;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x4<T, P> tmat3x4<T, P>::operator--(int) {\n  tmat3x4<T, P> Result(*this);\n  --*this;\n  return Result;\n}\n\n//////////////////////////////////////////////////////////////\n// Binary operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x4<T, P> operator+(tmat3x4<T, P> const& m, T const& s) {\n  return tmat3x4<T, P>(m[0] + s, m[1] + s, m[2] + s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x4<T, P> operator+(tmat3x4<T, P> const& m1,\n                                           tmat3x4<T, P> const& m2) {\n  return tmat3x4<T, P>(m1[0] + m2[0], m1[1] + m2[1], m1[2] + m2[2]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x4<T, P> operator-(tmat3x4<T, P> const& m, T const& s) {\n  return tmat3x4<T, P>(m[0] - s, m[1] - s, m[2] - s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x4<T, P> operator-(tmat3x4<T, P> const& m1,\n                                           tmat3x4<T, P> const& m2) {\n  return tmat3x4<T, P>(m1[0] - m2[0], m1[1] - m2[1], m1[2] - m2[2]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x4<T, P> operator*(tmat3x4<T, P> const& m, T const& s) {\n  return tmat3x4<T, P>(m[0] * s, m[1] * s, m[2] * s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x4<T, P> operator*(T const& s, tmat3x4<T, P> const& m) {\n  return tmat3x4<T, P>(m[0] * s, m[1] * s, m[2] * s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat3x4<T, P>::col_type operator*(\n    tmat3x4<T, P> const& m, typename tmat3x4<T, P>::row_type const& v) {\n  return typename tmat3x4<T, P>::col_type(\n      m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z,\n      m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z,\n      m[0][2] * v.x + m[1][2] * v.y + m[2][2] * v.z,\n      m[0][3] * v.x + m[1][3] * v.y + m[2][3] * v.z);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat3x4<T, P>::row_type operator*(\n    typename tmat3x4<T, P>::col_type const& v, tmat3x4<T, P> const& m) {\n  return typename tmat3x4<T, P>::row_type(\n      v.x * m[0][0] + v.y * m[0][1] + v.z * m[0][2] + v.w * m[0][3],\n      v.x * m[1][0] + v.y * m[1][1] + v.z * m[1][2] + v.w * m[1][3],\n      v.x * m[2][0] + v.y * m[2][1] + v.z * m[2][2] + v.w * m[2][3]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P> operator*(tmat3x4<T, P> const& m1,\n                                           tmat4x3<T, P> const& m2) {\n  const T SrcA00 = m1[0][0];\n  const T SrcA01 = m1[0][1];\n  const T SrcA02 = m1[0][2];\n  const T SrcA03 = m1[0][3];\n  const T SrcA10 = m1[1][0];\n  const T SrcA11 = m1[1][1];\n  const T SrcA12 = m1[1][2];\n  const T SrcA13 = m1[1][3];\n  const T SrcA20 = m1[2][0];\n  const T SrcA21 = m1[2][1];\n  const T SrcA22 = m1[2][2];\n  const T SrcA23 = m1[2][3];\n\n  const T SrcB00 = m2[0][0];\n  const T SrcB01 = m2[0][1];\n  const T SrcB02 = m2[0][2];\n  const T SrcB10 = m2[1][0];\n  const T SrcB11 = m2[1][1];\n  const T SrcB12 = m2[1][2];\n  const T SrcB20 = m2[2][0];\n  const T SrcB21 = m2[2][1];\n  const T SrcB22 = m2[2][2];\n  const T SrcB30 = m2[3][0];\n  const T SrcB31 = m2[3][1];\n  const T SrcB32 = m2[3][2];\n\n  tmat4x4<T, P> Result(tmat4x4<T, P>::_null);\n  Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02;\n  Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02;\n  Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01 + SrcA22 * SrcB02;\n  Result[0][3] = SrcA03 * SrcB00 + SrcA13 * SrcB01 + SrcA23 * SrcB02;\n  Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12;\n  Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12;\n  Result[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11 + SrcA22 * SrcB12;\n  Result[1][3] = SrcA03 * SrcB10 + SrcA13 * SrcB11 + SrcA23 * SrcB12;\n  Result[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21 + SrcA20 * SrcB22;\n  Result[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21 + SrcA21 * SrcB22;\n  Result[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21 + SrcA22 * SrcB22;\n  Result[2][3] = SrcA03 * SrcB20 + SrcA13 * SrcB21 + SrcA23 * SrcB22;\n  Result[3][0] = SrcA00 * SrcB30 + SrcA10 * SrcB31 + SrcA20 * SrcB32;\n  Result[3][1] = SrcA01 * SrcB30 + SrcA11 * SrcB31 + SrcA21 * SrcB32;\n  Result[3][2] = SrcA02 * SrcB30 + SrcA12 * SrcB31 + SrcA22 * SrcB32;\n  Result[3][3] = SrcA03 * SrcB30 + SrcA13 * SrcB31 + SrcA23 * SrcB32;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x4<T, P> operator*(tmat3x4<T, P> const& m1,\n                                           tmat2x3<T, P> const& m2) {\n  return tmat2x4<T, P>(\n      m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2],\n      m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2],\n      m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2],\n      m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1] + m1[2][3] * m2[0][2],\n      m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2],\n      m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2],\n      m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2],\n      m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1] + m1[2][3] * m2[1][2]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x4<T, P> operator*(tmat3x4<T, P> const& m1,\n                                           tmat3x3<T, P> const& m2) {\n  return tmat3x4<T, P>(\n      m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2],\n      m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2],\n      m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2],\n      m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1] + m1[2][3] * m2[0][2],\n      m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2],\n      m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2],\n      m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2],\n      m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1] + m1[2][3] * m2[1][2],\n      m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2],\n      m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2],\n      m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1] + m1[2][2] * m2[2][2],\n      m1[0][3] * m2[2][0] + m1[1][3] * m2[2][1] + m1[2][3] * m2[2][2]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x4<T, P> operator/(tmat3x4<T, P> const& m, T const& s) {\n  return tmat3x4<T, P>(m[0] / s, m[1] / s, m[2] / s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x4<T, P> operator/(T const& s, tmat3x4<T, P> const& m) {\n  return tmat3x4<T, P>(s / m[0], s / m[1], s / m[2]);\n}\n\n// Unary constant operators\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x4<T, P> const operator-(tmat3x4<T, P> const& m) {\n  return tmat3x4<T, P>(-m[0], -m[1], -m[2]);\n}\n\n//////////////////////////////////////\n// Boolean operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool operator==(tmat3x4<T, P> const& m1,\n                                   tmat3x4<T, P> const& m2) {\n  return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool operator!=(tmat3x4<T, P> const& m1,\n                                   tmat3x4<T, P> const& m2) {\n  return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]);\n}\n}  // namespace detail\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_mat4x2.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_mat4x2.hpp\n/// @date 2006-10-01 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_core_type_mat4x2\n#define glm_core_type_mat4x2\n\n#include <limits>\n\n#include \"../fwd.hpp\"\n#include \"type_mat.hpp\"\n#include \"type_vec2.hpp\"\n#include \"type_vec4.hpp\"\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nstruct tmat4x2 {\n  enum ctor { _null };\n  typedef T value_type;\n  typedef std::size_t size_type;\n  typedef tvec2<T, P> col_type;\n  typedef tvec4<T, P> row_type;\n  typedef tmat4x2<T, P> type;\n  typedef tmat2x4<T, P> transpose_type;\n\n  GLM_FUNC_DECL GLM_CONSTEXPR length_t length() const;\n\n private:\n  // Data\n  col_type value[4];\n\n public:\n  // Constructors\n  GLM_FUNC_DECL tmat4x2();\n  GLM_FUNC_DECL tmat4x2(tmat4x2<T, P> const& m);\n  template <precision Q>\n  GLM_FUNC_DECL tmat4x2(tmat4x2<T, Q> const& m);\n\n  GLM_FUNC_DECL explicit tmat4x2(ctor Null);\n  GLM_FUNC_DECL explicit tmat4x2(T const& x);\n  GLM_FUNC_DECL tmat4x2(T const& x0, T const& y0, T const& x1, T const& y1,\n                        T const& x2, T const& y2, T const& x3, T const& y3);\n  GLM_FUNC_DECL tmat4x2(col_type const& v0, col_type const& v1,\n                        col_type const& v2, col_type const& v3);\n\n  //////////////////////////////////////\n  // Conversions\n\n  template <typename X1, typename Y1, typename X2, typename Y2, typename X3,\n            typename Y3, typename X4, typename Y4>\n  GLM_FUNC_DECL tmat4x2(X1 const& x1, Y1 const& y1, X2 const& x2, Y2 const& y2,\n                        X3 const& x3, Y3 const& y3, X4 const& x4, Y4 const& y4);\n\n  template <typename V1, typename V2, typename V3, typename V4>\n  GLM_FUNC_DECL tmat4x2(tvec2<V1, P> const& v1, tvec2<V2, P> const& v2,\n                        tvec2<V3, P> const& v3, tvec2<V4, P> const& v4);\n\n  // Matrix conversions\n  template <typename U, precision Q>\n  GLM_FUNC_DECL explicit tmat4x2(tmat4x2<U, Q> const& m);\n\n  GLM_FUNC_DECL explicit tmat4x2(tmat2x2<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat4x2(tmat3x3<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat4x2(tmat4x4<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat4x2(tmat2x3<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat4x2(tmat3x2<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat4x2(tmat2x4<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat4x2(tmat4x3<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat4x2(tmat3x4<T, P> const& x);\n\n  // Accesses\n  GLM_FUNC_DECL col_type& operator[](length_t i);\n  GLM_FUNC_DECL col_type const& operator[](length_t i) const;\n\n  // Unary updatable operators\n  GLM_FUNC_DECL tmat4x2<T, P>& operator=(tmat4x2<T, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat4x2<T, P>& operator=(tmat4x2<U, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat4x2<T, P>& operator+=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tmat4x2<T, P>& operator+=(tmat4x2<U, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat4x2<T, P>& operator-=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tmat4x2<T, P>& operator-=(tmat4x2<U, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat4x2<T, P>& operator*=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tmat4x2<T, P>& operator/=(U s);\n\n  //////////////////////////////////////\n  // Increment and decrement operators\n\n  GLM_FUNC_DECL tmat4x2<T, P>& operator++();\n  GLM_FUNC_DECL tmat4x2<T, P>& operator--();\n  GLM_FUNC_DECL tmat4x2<T, P> operator++(int);\n  GLM_FUNC_DECL tmat4x2<T, P> operator--(int);\n};\n\n// Binary operators\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x2<T, P> operator+(tmat4x2<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x2<T, P> operator+(tmat4x2<T, P> const& m1,\n                                      tmat4x2<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x2<T, P> operator-(tmat4x2<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x2<T, P> operator-(tmat4x2<T, P> const& m1,\n                                      tmat4x2<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x2<T, P> operator*(tmat4x2<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x2<T, P> operator*(T const& s, tmat4x2<T, P> const& m);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL typename tmat4x2<T, P>::col_type operator*(\n    tmat4x2<T, P> const& m, typename tmat4x2<T, P>::row_type const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL typename tmat4x2<T, P>::row_type operator*(\n    typename tmat4x2<T, P>::col_type const& v, tmat4x2<T, P> const& m);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x2<T, P> operator*(tmat4x2<T, P> const& m1,\n                                      tmat3x4<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x2<T, P> operator*(tmat4x2<T, P> const& m1,\n                                      tmat4x4<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x3<T, P> operator*(tmat4x3<T, P> const& m1,\n                                      tmat2x4<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x2<T, P> operator/(tmat4x2<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x2<T, P> operator/(T const& s, tmat4x2<T, P> const& m);\n\n// Unary constant operators\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x2<T, P> const operator-(tmat4x2<T, P> const& m);\n\n}  // namespace detail\n}  // namespace glm\n\n#ifndef GLM_EXTERNAL_TEMPLATE\n#include \"type_mat4x2.inl\"\n#endif\n\n#endif  // glm_core_type_mat4x2\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_mat4x2.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_mat4x2.inl\n/// @date 2006-10-01 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER GLM_CONSTEXPR length_t tmat4x2<T, P>::length() const {\n  return 4;\n}\n\n//////////////////////////////////////\n// Accesses\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat4x2<T, P>::col_type& tmat4x2<T, P>::operator[](\n    length_t i) {\n  assert(i < this->length());\n  return this->value[i];\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat4x2<T, P>::col_type const&\ntmat4x2<T, P>::operator[](length_t i) const {\n  assert(i < this->length());\n  return this->value[i];\n}\n\n//////////////////////////////////////////////////////////////\n// Constructors\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2() {\n  value_type const Zero(0);\n  value_type const One(1);\n  this->value[0] = col_type(One, Zero);\n  this->value[1] = col_type(Zero, One);\n  this->value[2] = col_type(Zero, Zero);\n  this->value[3] = col_type(Zero, Zero);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat4x2<T, P> const& m) {\n  this->value[0] = m.value[0];\n  this->value[1] = m.value[1];\n  this->value[2] = m.value[2];\n  this->value[3] = m.value[3];\n}\n\ntemplate <typename T, precision P>\ntemplate <precision Q>\nGLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat4x2<T, Q> const& m) {\n  this->value[0] = m.value[0];\n  this->value[1] = m.value[1];\n  this->value[2] = m.value[2];\n  this->value[3] = m.value[3];\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(ctor) {}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(T const& s) {\n  value_type const Zero(0);\n  this->value[0] = col_type(s, Zero);\n  this->value[1] = col_type(Zero, s);\n  this->value[2] = col_type(Zero, Zero);\n  this->value[3] = col_type(Zero, Zero);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(T const& x0, T const& y0, T const& x1,\n                                          T const& y1, T const& x2, T const& y2,\n                                          T const& x3, T const& y3) {\n  this->value[0] = col_type(x0, y0);\n  this->value[1] = col_type(x1, y1);\n  this->value[2] = col_type(x2, y2);\n  this->value[3] = col_type(x3, y3);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(col_type const& v0,\n                                          col_type const& v1,\n                                          col_type const& v2,\n                                          col_type const& v3) {\n  this->value[0] = v0;\n  this->value[1] = v1;\n  this->value[2] = v2;\n  this->value[3] = v3;\n}\n\n//////////////////////////////////////\n// Conversion constructors\n\ntemplate <typename T, precision P>\ntemplate <typename X1, typename Y1, typename X2, typename Y2, typename X3,\n          typename Y3, typename X4, typename Y4>\nGLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(X1 const& x1, Y1 const& y1,\n                                          X2 const& x2, Y2 const& y2,\n                                          X3 const& x3, Y3 const& y3,\n                                          X4 const& x4, Y4 const& y4) {\n  this->value[0] = col_type(static_cast<T>(x1), value_type(y1));\n  this->value[1] = col_type(static_cast<T>(x2), value_type(y2));\n  this->value[2] = col_type(static_cast<T>(x3), value_type(y3));\n  this->value[3] = col_type(static_cast<T>(x4), value_type(y4));\n}\n\ntemplate <typename T, precision P>\ntemplate <typename V1, typename V2, typename V3, typename V4>\nGLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tvec2<V1, P> const& v1,\n                                          tvec2<V2, P> const& v2,\n                                          tvec2<V3, P> const& v3,\n                                          tvec2<V4, P> const& v4) {\n  this->value[0] = col_type(v1);\n  this->value[1] = col_type(v2);\n  this->value[2] = col_type(v3);\n  this->value[3] = col_type(v4);\n}\n\n//////////////////////////////////////\n// Conversion\ntemplate <typename T, precision P>\ntemplate <typename U, precision Q>\nGLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat4x2<U, Q> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n  this->value[2] = col_type(m[2]);\n  this->value[3] = col_type(m[3]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat2x2<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n  this->value[2] = col_type(static_cast<T>(0));\n  this->value[3] = col_type(static_cast<T>(0));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat3x3<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n  this->value[2] = col_type(m[2]);\n  this->value[3] = col_type(static_cast<T>(0));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat4x4<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n  this->value[2] = col_type(m[2]);\n  this->value[3] = col_type(m[3]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat2x3<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n  this->value[2] = col_type(static_cast<T>(0));\n  this->value[3] = col_type(static_cast<T>(0));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat3x2<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n  this->value[2] = col_type(m[2]);\n  this->value[3] = col_type(static_cast<T>(0));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat2x4<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n  this->value[2] = col_type(static_cast<T>(0));\n  this->value[3] = col_type(static_cast<T>(0));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat4x3<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n  this->value[2] = col_type(m[2]);\n  this->value[3] = col_type(m[3]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x2<T, P>::tmat4x2(tmat3x4<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n  this->value[2] = col_type(m[2]);\n  this->value[3] = col_type(static_cast<T>(0));\n}\n\n//////////////////////////////////////////////////////////////\n// Unary updatable operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x2<T, P>& tmat4x2<T, P>::operator=(\n    tmat4x2<T, P> const& m) {\n  this->value[0] = m[0];\n  this->value[1] = m[1];\n  this->value[2] = m[2];\n  this->value[3] = m[3];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat4x2<T, P>& tmat4x2<T, P>::operator=(\n    tmat4x2<U, P> const& m) {\n  this->value[0] = m[0];\n  this->value[1] = m[1];\n  this->value[2] = m[2];\n  this->value[3] = m[3];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat4x2<T, P>& tmat4x2<T, P>::operator+=(U s) {\n  this->value[0] += s;\n  this->value[1] += s;\n  this->value[2] += s;\n  this->value[3] += s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat4x2<T, P>& tmat4x2<T, P>::operator+=(\n    tmat4x2<U, P> const& m) {\n  this->value[0] += m[0];\n  this->value[1] += m[1];\n  this->value[2] += m[2];\n  this->value[3] += m[3];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat4x2<T, P>& tmat4x2<T, P>::operator-=(U s) {\n  this->value[0] -= s;\n  this->value[1] -= s;\n  this->value[2] -= s;\n  this->value[3] -= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat4x2<T, P>& tmat4x2<T, P>::operator-=(\n    tmat4x2<U, P> const& m) {\n  this->value[0] -= m[0];\n  this->value[1] -= m[1];\n  this->value[2] -= m[2];\n  this->value[3] -= m[3];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat4x2<T, P>& tmat4x2<T, P>::operator*=(U s) {\n  this->value[0] *= s;\n  this->value[1] *= s;\n  this->value[2] *= s;\n  this->value[3] *= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat4x2<T, P>& tmat4x2<T, P>::operator/=(U s) {\n  this->value[0] /= s;\n  this->value[1] /= s;\n  this->value[2] /= s;\n  this->value[3] /= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x2<T, P>& tmat4x2<T, P>::operator++() {\n  ++this->value[0];\n  ++this->value[1];\n  ++this->value[2];\n  ++this->value[3];\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x2<T, P>& tmat4x2<T, P>::operator--() {\n  --this->value[0];\n  --this->value[1];\n  --this->value[2];\n  --this->value[3];\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x2<T, P> tmat4x2<T, P>::operator++(int) {\n  tmat4x2<T, P> Result(*this);\n  ++*this;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x2<T, P> tmat4x2<T, P>::operator--(int) {\n  tmat4x2<T, P> Result(*this);\n  --*this;\n  return Result;\n}\n\n//////////////////////////////////////////////////////////////\n// Binary operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x2<T, P> operator+(tmat4x2<T, P> const& m, T const& s) {\n  return tmat4x2<T, P>(m[0] + s, m[1] + s, m[2] + s, m[3] + s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x2<T, P> operator+(tmat4x2<T, P> const& m1,\n                                           tmat4x2<T, P> const& m2) {\n  return tmat4x2<T, P>(m1[0] + m2[0], m1[1] + m2[1], m1[2] + m2[2],\n                       m1[3] + m2[3]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x2<T, P> operator-(tmat4x2<T, P> const& m, T const& s) {\n  return tmat4x2<T, P>(m[0] - s, m[1] - s, m[2] - s, m[3] - s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x2<T, P> operator-(tmat4x2<T, P> const& m1,\n                                           tmat4x2<T, P> const& m2) {\n  return tmat4x2<T, P>(m1[0] - m2[0], m1[1] - m2[1], m1[2] - m2[2],\n                       m1[3] - m2[3]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x2<T, P> operator*(tmat4x2<T, P> const& m, T const& s) {\n  return tmat4x2<T, P>(m[0] * s, m[1] * s, m[2] * s, m[3] * s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x2<T, P> operator*(T const& s, tmat4x2<T, P> const& m) {\n  return tmat4x2<T, P>(m[0] * s, m[1] * s, m[2] * s, m[3] * s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat4x2<T, P>::col_type operator*(\n    tmat4x2<T, P> const& m, typename tmat4x2<T, P>::row_type const& v) {\n  return typename tmat4x2<T, P>::col_type(\n      m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z + m[3][0] * v.w,\n      m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z + m[3][1] * v.w);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat4x2<T, P>::row_type operator*(\n    typename tmat4x2<T, P>::col_type const& v, tmat4x2<T, P> const& m) {\n  return typename tmat4x2<T, P>::row_type(\n      v.x * m[0][0] + v.y * m[0][1], v.x * m[1][0] + v.y * m[1][1],\n      v.x * m[2][0] + v.y * m[2][1], v.x * m[3][0] + v.y * m[3][1]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x2<T, P> operator*(tmat4x2<T, P> const& m1,\n                                           tmat2x4<T, P> const& m2) {\n  T const SrcA00 = m1[0][0];\n  T const SrcA01 = m1[0][1];\n  T const SrcA10 = m1[1][0];\n  T const SrcA11 = m1[1][1];\n  T const SrcA20 = m1[2][0];\n  T const SrcA21 = m1[2][1];\n  T const SrcA30 = m1[3][0];\n  T const SrcA31 = m1[3][1];\n\n  T const SrcB00 = m2[0][0];\n  T const SrcB01 = m2[0][1];\n  T const SrcB02 = m2[0][2];\n  T const SrcB03 = m2[0][3];\n  T const SrcB10 = m2[1][0];\n  T const SrcB11 = m2[1][1];\n  T const SrcB12 = m2[1][2];\n  T const SrcB13 = m2[1][3];\n\n  tmat2x2<T, P> Result(tmat2x2<T, P>::_null);\n  Result[0][0] =\n      SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02 + SrcA30 * SrcB03;\n  Result[0][1] =\n      SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02 + SrcA31 * SrcB03;\n  Result[1][0] =\n      SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12 + SrcA30 * SrcB13;\n  Result[1][1] =\n      SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12 + SrcA31 * SrcB13;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x2<T, P> operator*(tmat4x2<T, P> const& m1,\n                                           tmat3x4<T, P> const& m2) {\n  return tmat3x2<T, P>(m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] +\n                           m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3],\n                       m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] +\n                           m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3],\n                       m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] +\n                           m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3],\n                       m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] +\n                           m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3],\n                       m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] +\n                           m1[2][0] * m2[2][2] + m1[3][0] * m2[2][3],\n                       m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] +\n                           m1[2][1] * m2[2][2] + m1[3][1] * m2[2][3]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x2<T, P> operator*(tmat4x2<T, P> const& m1,\n                                           tmat4x4<T, P> const& m2) {\n  return tmat4x2<T, P>(m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] +\n                           m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3],\n                       m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] +\n                           m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3],\n                       m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] +\n                           m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3],\n                       m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] +\n                           m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3],\n                       m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] +\n                           m1[2][0] * m2[2][2] + m1[3][0] * m2[2][3],\n                       m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] +\n                           m1[2][1] * m2[2][2] + m1[3][1] * m2[2][3],\n                       m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1] +\n                           m1[2][0] * m2[3][2] + m1[3][0] * m2[3][3],\n                       m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] +\n                           m1[2][1] * m2[3][2] + m1[3][1] * m2[3][3]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x2<T, P> operator/(tmat4x2<T, P> const& m, T const& s) {\n  return tmat4x2<T, P>(m[0] / s, m[1] / s, m[2] / s, m[3] / s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x2<T, P> operator/(T const& s, tmat4x2<T, P> const& m) {\n  return tmat4x2<T, P>(s / m[0], s / m[1], s / m[2], s / m[3]);\n}\n\n// Unary constant operators\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x2<T, P> const operator-(tmat4x2<T, P> const& m) {\n  return tmat4x2<T, P>(-m[0], -m[1], -m[2], -m[3]);\n}\n\n//////////////////////////////////////\n// Boolean operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool operator==(tmat4x2<T, P> const& m1,\n                                   tmat4x2<T, P> const& m2) {\n  return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]) &&\n         (m1[3] == m2[3]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool operator!=(tmat4x2<T, P> const& m1,\n                                   tmat4x2<T, P> const& m2) {\n  return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]) ||\n         (m1[3] != m2[3]);\n}\n}  // namespace detail\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_mat4x3.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_mat4x3.hpp\n/// @date 2006-08-04 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_core_type_mat4x3\n#define glm_core_type_mat4x3\n\n#include <limits>\n\n#include \"../fwd.hpp\"\n#include \"type_mat.hpp\"\n#include \"type_vec3.hpp\"\n#include \"type_vec4.hpp\"\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nstruct tmat4x3 {\n  enum ctor { _null };\n  typedef T value_type;\n  typedef std::size_t size_type;\n  typedef tvec3<T, P> col_type;\n  typedef tvec4<T, P> row_type;\n  typedef tmat4x3<T, P> type;\n  typedef tmat3x4<T, P> transpose_type;\n\n  GLM_FUNC_DECL GLM_CONSTEXPR length_t length() const;\n\n private:\n  // Data\n  col_type value[4];\n\n public:\n  // Constructors\n  GLM_FUNC_DECL tmat4x3();\n  GLM_FUNC_DECL tmat4x3(tmat4x3<T, P> const& m);\n  template <precision Q>\n  GLM_FUNC_DECL tmat4x3(tmat4x3<T, Q> const& m);\n\n  GLM_FUNC_DECL explicit tmat4x3(ctor Null);\n  GLM_FUNC_DECL explicit tmat4x3(T const& x);\n  GLM_FUNC_DECL tmat4x3(T const& x0, T const& y0, T const& z0, T const& x1,\n                        T const& y1, T const& z1, T const& x2, T const& y2,\n                        T const& z2, T const& x3, T const& y3, T const& z3);\n  GLM_FUNC_DECL tmat4x3(col_type const& v0, col_type const& v1,\n                        col_type const& v2, col_type const& v3);\n\n  //////////////////////////////////////\n  // Conversions\n\n  template <typename X1, typename Y1, typename Z1, typename X2, typename Y2,\n            typename Z2, typename X3, typename Y3, typename Z3, typename X4,\n            typename Y4, typename Z4>\n  GLM_FUNC_DECL tmat4x3(X1 const& x1, Y1 const& y1, Z1 const& z1, X2 const& x2,\n                        Y2 const& y2, Z2 const& z2, X3 const& x3, Y3 const& y3,\n                        Z3 const& z3, X4 const& x4, Y4 const& y4, Z4 const& z4);\n\n  template <typename V1, typename V2, typename V3, typename V4>\n  GLM_FUNC_DECL tmat4x3(tvec3<V1, P> const& v1, tvec3<V2, P> const& v2,\n                        tvec3<V3, P> const& v3, tvec3<V4, P> const& v4);\n\n  // Matrix conversions\n  template <typename U, precision Q>\n  GLM_FUNC_DECL explicit tmat4x3(tmat4x3<U, Q> const& m);\n\n  GLM_FUNC_DECL explicit tmat4x3(tmat2x2<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat4x3(tmat3x3<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat4x3(tmat4x4<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat4x3(tmat2x3<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat4x3(tmat3x2<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat4x3(tmat2x4<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat4x3(tmat4x2<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat4x3(tmat3x4<T, P> const& x);\n\n  // Accesses\n  GLM_FUNC_DECL col_type& operator[](size_type i);\n  GLM_FUNC_DECL col_type const& operator[](size_type i) const;\n\n  // Unary updatable operators\n  GLM_FUNC_DECL tmat4x3<T, P>& operator=(tmat4x3<T, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat4x3<T, P>& operator=(tmat4x3<U, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat4x3<T, P>& operator+=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tmat4x3<T, P>& operator+=(tmat4x3<U, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat4x3<T, P>& operator-=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tmat4x3<T, P>& operator-=(tmat4x3<U, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat4x3<T, P>& operator*=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tmat4x3<T, P>& operator/=(U s);\n\n  //////////////////////////////////////\n  // Increment and decrement operators\n\n  GLM_FUNC_DECL tmat4x3<T, P>& operator++();\n  GLM_FUNC_DECL tmat4x3<T, P>& operator--();\n  GLM_FUNC_DECL tmat4x3<T, P> operator++(int);\n  GLM_FUNC_DECL tmat4x3<T, P> operator--(int);\n};\n\n// Binary operators\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x3<T, P> operator+(tmat4x3<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x3<T, P> operator+(tmat4x3<T, P> const& m1,\n                                      tmat4x3<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x3<T, P> operator-(tmat4x3<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x3<T, P> operator-(tmat4x3<T, P> const& m1,\n                                      tmat4x3<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x3<T, P> operator*(tmat4x3<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x3<T, P> operator*(T const& s, tmat4x3<T, P> const& m);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL typename tmat4x3<T, P>::col_type operator*(\n    tmat4x3<T, P> const& m, typename tmat4x3<T, P>::row_type const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL typename tmat4x3<T, P>::row_type operator*(\n    typename tmat4x3<T, P>::col_type const& v, tmat4x3<T, P> const& m);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x3<T, P> operator*(tmat4x3<T, P> const& m1,\n                                      tmat2x4<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x3<T, P> operator*(tmat4x3<T, P> const& m1,\n                                      tmat3x4<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x3<T, P> operator*(tmat4x3<T, P> const& m1,\n                                      tmat4x4<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x3<T, P> operator/(tmat4x3<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x3<T, P> operator/(T const& s, tmat4x3<T, P> const& m);\n\n// Unary constant operators\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x3<T, P> const operator-(tmat4x3<T, P> const& m);\n\n}  // namespace detail\n}  // namespace glm\n\n#ifndef GLM_EXTERNAL_TEMPLATE\n#include \"type_mat4x3.inl\"\n#endif  // GLM_EXTERNAL_TEMPLATE\n\n#endif  // glm_core_type_mat4x3\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_mat4x3.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_mat4x3.inl\n/// @date 2006-04-17 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER GLM_CONSTEXPR length_t tmat4x3<T, P>::length() const {\n  return 4;\n}\n\n//////////////////////////////////////\n// Accesses\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat4x3<T, P>::col_type& tmat4x3<T, P>::operator[](\n    size_type i) {\n  assert(i < this->length());\n  return this->value[i];\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat4x3<T, P>::col_type const&\ntmat4x3<T, P>::operator[](size_type i) const {\n  assert(i < this->length());\n  return this->value[i];\n}\n\n//////////////////////////////////////////////////////////////\n// Constructors\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3() {\n  value_type const Zero(0);\n  value_type const One(1);\n  this->value[0] = col_type(One, Zero, Zero);\n  this->value[1] = col_type(Zero, One, Zero);\n  this->value[2] = col_type(Zero, Zero, One);\n  this->value[3] = col_type(Zero, Zero, Zero);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat4x3<T, P> const& m) {\n  this->value[0] = m.value[0];\n  this->value[1] = m.value[1];\n  this->value[2] = m.value[2];\n  this->value[3] = m.value[3];\n}\n\ntemplate <typename T, precision P>\ntemplate <precision Q>\nGLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat4x3<T, Q> const& m) {\n  this->value[0] = m.value[0];\n  this->value[1] = m.value[1];\n  this->value[2] = m.value[2];\n  this->value[3] = m.value[3];\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(ctor) {}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(T const& s) {\n  value_type const Zero(0);\n  this->value[0] = col_type(s, Zero, Zero);\n  this->value[1] = col_type(Zero, s, Zero);\n  this->value[2] = col_type(Zero, Zero, s);\n  this->value[3] = col_type(Zero, Zero, Zero);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(T const& x0, T const& y0, T const& z0,\n                                          T const& x1, T const& y1, T const& z1,\n                                          T const& x2, T const& y2, T const& z2,\n                                          T const& x3, T const& y3,\n                                          T const& z3) {\n  this->value[0] = col_type(x0, y0, z0);\n  this->value[1] = col_type(x1, y1, z1);\n  this->value[2] = col_type(x2, y2, z2);\n  this->value[3] = col_type(x3, y3, z3);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(col_type const& v0,\n                                          col_type const& v1,\n                                          col_type const& v2,\n                                          col_type const& v3) {\n  this->value[0] = v0;\n  this->value[1] = v1;\n  this->value[2] = v2;\n  this->value[3] = v3;\n}\n\n//////////////////////////////////////\n// Conversion constructors\n\ntemplate <typename T, precision P>\ntemplate <typename X1, typename Y1, typename Z1, typename X2, typename Y2,\n          typename Z2, typename X3, typename Y3, typename Z3, typename X4,\n          typename Y4, typename Z4>\nGLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(X1 const& x1, Y1 const& y1,\n                                          Z1 const& z1, X2 const& x2,\n                                          Y2 const& y2, Z2 const& z2,\n                                          X3 const& x3, Y3 const& y3,\n                                          Z3 const& z3, X4 const& x4,\n                                          Y4 const& y4, Z4 const& z4) {\n  this->value[0] = col_type(static_cast<T>(x1), value_type(y1), value_type(z1));\n  this->value[1] = col_type(static_cast<T>(x2), value_type(y2), value_type(z2));\n  this->value[2] = col_type(static_cast<T>(x3), value_type(y3), value_type(z3));\n  this->value[3] = col_type(static_cast<T>(x4), value_type(y4), value_type(z4));\n}\n\ntemplate <typename T, precision P>\ntemplate <typename V1, typename V2, typename V3, typename V4>\nGLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tvec3<V1, P> const& v1,\n                                          tvec3<V2, P> const& v2,\n                                          tvec3<V3, P> const& v3,\n                                          tvec3<V4, P> const& v4) {\n  this->value[0] = col_type(v1);\n  this->value[1] = col_type(v2);\n  this->value[2] = col_type(v3);\n  this->value[3] = col_type(v4);\n}\n\n//////////////////////////////////////////////////////////////\n// Matrix conversions\n\ntemplate <typename T, precision P>\ntemplate <typename U, precision Q>\nGLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat4x3<U, Q> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n  this->value[2] = col_type(m[2]);\n  this->value[3] = col_type(m[3]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat2x2<T, P> const& m) {\n  this->value[0] = col_type(m[0], value_type(0));\n  this->value[1] = col_type(m[1], value_type(0));\n  this->value[2] = col_type(m[2], value_type(1));\n  this->value[3] = col_type(static_cast<T>(0));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat3x3<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n  this->value[2] = col_type(m[2]);\n  this->value[3] = col_type(static_cast<T>(0));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat4x4<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n  this->value[2] = col_type(m[2]);\n  this->value[3] = col_type(m[3]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat2x3<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n  this->value[2] = col_type(static_cast<T>(0), value_type(0), value_type(1));\n  this->value[3] = col_type(static_cast<T>(0));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat3x2<T, P> const& m) {\n  this->value[0] = col_type(m[0], value_type(0));\n  this->value[1] = col_type(m[1], value_type(0));\n  this->value[2] = col_type(m[2], value_type(1));\n  this->value[3] = col_type(static_cast<T>(0));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat2x4<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n  this->value[2] = col_type(static_cast<T>(0), value_type(0), value_type(1));\n  this->value[3] = col_type(static_cast<T>(0));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat4x2<T, P> const& m) {\n  this->value[0] = col_type(m[0], value_type(0));\n  this->value[1] = col_type(m[1], value_type(0));\n  this->value[2] = col_type(m[2], value_type(1));\n  this->value[3] = col_type(m[3], value_type(0));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P>::tmat4x3(tmat3x4<T, P> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n  this->value[2] = col_type(m[2]);\n  this->value[3] = col_type(static_cast<T>(0));\n}\n\n//////////////////////////////////////////////////////////////\n// Unary updatable operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P>& tmat4x3<T, P>::operator=(\n    tmat4x3<T, P> const& m) {\n  this->value[0] = m[0];\n  this->value[1] = m[1];\n  this->value[2] = m[2];\n  this->value[3] = m[3];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat4x3<T, P>& tmat4x3<T, P>::operator=(\n    tmat4x3<U, P> const& m) {\n  this->value[0] = m[0];\n  this->value[1] = m[1];\n  this->value[2] = m[2];\n  this->value[3] = m[3];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat4x3<T, P>& tmat4x3<T, P>::operator+=(U s) {\n  this->value[0] += s;\n  this->value[1] += s;\n  this->value[2] += s;\n  this->value[3] += s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat4x3<T, P>& tmat4x3<T, P>::operator+=(\n    tmat4x3<U, P> const& m) {\n  this->value[0] += m[0];\n  this->value[1] += m[1];\n  this->value[2] += m[2];\n  this->value[3] += m[3];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat4x3<T, P>& tmat4x3<T, P>::operator-=(U s) {\n  this->value[0] -= s;\n  this->value[1] -= s;\n  this->value[2] -= s;\n  this->value[3] -= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat4x3<T, P>& tmat4x3<T, P>::operator-=(\n    tmat4x3<U, P> const& m) {\n  this->value[0] -= m[0];\n  this->value[1] -= m[1];\n  this->value[2] -= m[2];\n  this->value[3] -= m[3];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat4x3<T, P>& tmat4x3<T, P>::operator*=(U s) {\n  this->value[0] *= s;\n  this->value[1] *= s;\n  this->value[2] *= s;\n  this->value[3] *= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat4x3<T, P>& tmat4x3<T, P>::operator/=(U s) {\n  this->value[0] /= s;\n  this->value[1] /= s;\n  this->value[2] /= s;\n  this->value[3] /= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P>& tmat4x3<T, P>::operator++() {\n  ++this->value[0];\n  ++this->value[1];\n  ++this->value[2];\n  ++this->value[3];\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P>& tmat4x3<T, P>::operator--() {\n  --this->value[0];\n  --this->value[1];\n  --this->value[2];\n  --this->value[3];\n  return *this;\n}\n\n//////////////////////////////////////////////////////////////\n// Binary operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P> operator+(tmat4x3<T, P> const& m, T const& s) {\n  return tmat4x3<T, P>(m[0] + s, m[1] + s, m[2] + s, m[3] + s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P> operator+(tmat4x3<T, P> const& m1,\n                                           tmat4x3<T, P> const& m2) {\n  return tmat4x3<T, P>(m1[0] + m2[0], m1[1] + m2[1], m1[2] + m2[2],\n                       m1[3] + m2[3]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P> operator-(tmat4x3<T, P> const& m, T const& s) {\n  return tmat4x3<T, P>(m[0] - s, m[1] - s, m[2] - s, m[3] - s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P> operator-(tmat4x3<T, P> const& m1,\n                                           tmat4x3<T, P> const& m2) {\n  return tmat4x3<T, P>(m1[0] - m2[0], m1[1] - m2[1], m1[2] - m2[2],\n                       m1[3] - m2[3]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P> operator*(tmat4x3<T, P> const& m, T const& s) {\n  return tmat4x3<T, P>(m[0] * s, m[1] * s, m[2] * s, m[3] * s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P> operator*(T const& s, tmat4x3<T, P> const& m) {\n  return tmat4x3<T, P>(m[0] * s, m[1] * s, m[2] * s, m[3] * s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat4x3<T, P>::col_type operator*(\n    tmat4x3<T, P> const& m, typename tmat4x3<T, P>::row_type const& v) {\n  return typename tmat4x3<T, P>::col_type(\n      m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z + m[3][0] * v.w,\n      m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z + m[3][1] * v.w,\n      m[0][2] * v.x + m[1][2] * v.y + m[2][2] * v.z + m[3][2] * v.w);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat4x3<T, P>::row_type operator*(\n    typename tmat4x3<T, P>::col_type const& v, tmat4x3<T, P> const& m) {\n  return typename tmat4x3<T, P>::row_type(\n      v.x * m[0][0] + v.y * m[0][1] + v.z * m[0][2],\n      v.x * m[1][0] + v.y * m[1][1] + v.z * m[1][2],\n      v.x * m[2][0] + v.y * m[2][1] + v.z * m[2][2],\n      v.x * m[3][0] + v.y * m[3][1] + v.z * m[3][2]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x3<T, P> operator*(tmat4x3<T, P> const& m1,\n                                           tmat2x4<T, P> const& m2) {\n  return tmat2x3<T, P>(m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] +\n                           m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3],\n                       m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] +\n                           m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3],\n                       m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] +\n                           m1[2][2] * m2[0][2] + m1[3][2] * m2[0][3],\n                       m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] +\n                           m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3],\n                       m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] +\n                           m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3],\n                       m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] +\n                           m1[2][2] * m2[1][2] + m1[3][2] * m2[1][3]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x3<T, P> operator*(tmat4x3<T, P> const& m1,\n                                           tmat3x4<T, P> const& m2) {\n  T const SrcA00 = m1[0][0];\n  T const SrcA01 = m1[0][1];\n  T const SrcA02 = m1[0][2];\n  T const SrcA10 = m1[1][0];\n  T const SrcA11 = m1[1][1];\n  T const SrcA12 = m1[1][2];\n  T const SrcA20 = m1[2][0];\n  T const SrcA21 = m1[2][1];\n  T const SrcA22 = m1[2][2];\n  T const SrcA30 = m1[3][0];\n  T const SrcA31 = m1[3][1];\n  T const SrcA32 = m1[3][2];\n\n  T const SrcB00 = m2[0][0];\n  T const SrcB01 = m2[0][1];\n  T const SrcB02 = m2[0][2];\n  T const SrcB03 = m2[0][3];\n  T const SrcB10 = m2[1][0];\n  T const SrcB11 = m2[1][1];\n  T const SrcB12 = m2[1][2];\n  T const SrcB13 = m2[1][3];\n  T const SrcB20 = m2[2][0];\n  T const SrcB21 = m2[2][1];\n  T const SrcB22 = m2[2][2];\n  T const SrcB23 = m2[2][3];\n\n  tmat3x3<T, P> Result(tmat3x3<T, P>::_null);\n  Result[0][0] =\n      SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02 + SrcA30 * SrcB03;\n  Result[0][1] =\n      SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02 + SrcA31 * SrcB03;\n  Result[0][2] =\n      SrcA02 * SrcB00 + SrcA12 * SrcB01 + SrcA22 * SrcB02 + SrcA32 * SrcB03;\n  Result[1][0] =\n      SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12 + SrcA30 * SrcB13;\n  Result[1][1] =\n      SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12 + SrcA31 * SrcB13;\n  Result[1][2] =\n      SrcA02 * SrcB10 + SrcA12 * SrcB11 + SrcA22 * SrcB12 + SrcA32 * SrcB13;\n  Result[2][0] =\n      SrcA00 * SrcB20 + SrcA10 * SrcB21 + SrcA20 * SrcB22 + SrcA30 * SrcB23;\n  Result[2][1] =\n      SrcA01 * SrcB20 + SrcA11 * SrcB21 + SrcA21 * SrcB22 + SrcA31 * SrcB23;\n  Result[2][2] =\n      SrcA02 * SrcB20 + SrcA12 * SrcB21 + SrcA22 * SrcB22 + SrcA32 * SrcB23;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P> operator*(tmat4x3<T, P> const& m1,\n                                           tmat4x4<T, P> const& m2) {\n  return tmat4x3<T, P>(m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] +\n                           m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3],\n                       m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] +\n                           m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3],\n                       m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] +\n                           m1[2][2] * m2[0][2] + m1[3][2] * m2[0][3],\n                       m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] +\n                           m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3],\n                       m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] +\n                           m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3],\n                       m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] +\n                           m1[2][2] * m2[1][2] + m1[3][2] * m2[1][3],\n                       m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] +\n                           m1[2][0] * m2[2][2] + m1[3][0] * m2[2][3],\n                       m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] +\n                           m1[2][1] * m2[2][2] + m1[3][1] * m2[2][3],\n                       m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1] +\n                           m1[2][2] * m2[2][2] + m1[3][2] * m2[2][3],\n                       m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1] +\n                           m1[2][0] * m2[3][2] + m1[3][0] * m2[3][3],\n                       m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] +\n                           m1[2][1] * m2[3][2] + m1[3][1] * m2[3][3],\n                       m1[0][2] * m2[3][0] + m1[1][2] * m2[3][1] +\n                           m1[2][2] * m2[3][2] + m1[3][2] * m2[3][3]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P> operator/(tmat4x3<T, P> const& m, T const& s) {\n  return tmat4x3<T, P>(m[0] / s, m[1] / s, m[2] / s, m[3] / s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P> operator/(T const& s, tmat4x3<T, P> const& m) {\n  return tmat4x3<T, P>(s / m[0], s / m[1], s / m[2], s / m[3]);\n}\n\n// Unary constant operators\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P> const operator-(tmat4x3<T, P> const& m) {\n  return tmat4x3<T, P>(-m[0], -m[1], -m[2], -m[3]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P> const operator++(tmat4x3<T, P> const& m, int) {\n  return tmat4x3<T, P>(m[0] + T(1), m[1] + T(1), m[2] + T(1), m[3] + T(1));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P> const operator--(tmat4x3<T, P> const& m, int) {\n  return tmat4x3<T, P>(m[0] - T(1), m[1] - T(1), m[2] - T(1), m[3] - T(1));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P> tmat4x3<T, P>::operator++(int) {\n  tmat4x3<T, P> Result(*this);\n  ++*this;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x3<T, P> tmat4x3<T, P>::operator--(int) {\n  tmat4x3<T, P> Result(*this);\n  --*this;\n  return Result;\n}\n\n//////////////////////////////////////\n// Boolean operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool operator==(tmat4x3<T, P> const& m1,\n                                   tmat4x3<T, P> const& m2) {\n  return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]) &&\n         (m1[3] == m2[3]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool operator!=(tmat4x3<T, P> const& m1,\n                                   tmat4x3<T, P> const& m2) {\n  return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]) ||\n         (m1[3] != m2[3]);\n}\n}  // namespace detail\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_mat4x4.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_mat4x4.hpp\n/// @date 2005-01-27 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_core_type_mat4x4\n#define glm_core_type_mat4x4\n\n#include <cstddef>\n#include <limits>\n\n#include \"../fwd.hpp\"\n#include \"type_mat.hpp\"\n#include \"type_vec4.hpp\"\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nstruct tmat4x4 {\n  enum ctor { _null };\n  typedef T value_type;\n  typedef std::size_t size_type;\n  typedef tvec4<T, P> col_type;\n  typedef tvec4<T, P> row_type;\n  typedef tmat4x4<T, P> type;\n  typedef tmat4x4<T, P> transpose_type;\n\n  GLM_FUNC_DECL GLM_CONSTEXPR length_t length() const;\n\n  template <typename U, precision Q>\n  friend tvec4<U, Q> operator/(tmat4x4<U, Q> const& m, tvec4<U, Q> const& v);\n  template <typename U, precision Q>\n  friend tvec4<U, Q> operator/(tvec4<U, Q> const& v, tmat4x4<U, Q> const& m);\n\n private:\n  /// @cond DETAIL\n  col_type value[4];\n\n public:\n  // Constructors\n  GLM_FUNC_DECL tmat4x4();\n  GLM_FUNC_DECL tmat4x4(tmat4x4<T, P> const& m);\n  template <precision Q>\n  GLM_FUNC_DECL tmat4x4(tmat4x4<T, Q> const& m);\n\n  GLM_FUNC_DECL explicit tmat4x4(ctor Null);\n  GLM_FUNC_DECL explicit tmat4x4(T const& x);\n  GLM_FUNC_DECL tmat4x4(T const& x0, T const& y0, T const& z0, T const& w0,\n                        T const& x1, T const& y1, T const& z1, T const& w1,\n                        T const& x2, T const& y2, T const& z2, T const& w2,\n                        T const& x3, T const& y3, T const& z3, T const& w3);\n  GLM_FUNC_DECL tmat4x4(col_type const& v0, col_type const& v1,\n                        col_type const& v2, col_type const& v3);\n\n  //////////////////////////////////////\n  // Conversions\n\n  template <typename X1, typename Y1, typename Z1, typename W1, typename X2,\n            typename Y2, typename Z2, typename W2, typename X3, typename Y3,\n            typename Z3, typename W3, typename X4, typename Y4, typename Z4,\n            typename W4>\n  GLM_FUNC_DECL tmat4x4(X1 const& x1, Y1 const& y1, Z1 const& z1, W1 const& w1,\n                        X2 const& x2, Y2 const& y2, Z2 const& z2, W2 const& w2,\n                        X3 const& x3, Y3 const& y3, Z3 const& z3, W3 const& w3,\n                        X4 const& x4, Y4 const& y4, Z4 const& z4, W4 const& w4);\n\n  template <typename V1, typename V2, typename V3, typename V4>\n  GLM_FUNC_DECL tmat4x4(tvec4<V1, P> const& v1, tvec4<V2, P> const& v2,\n                        tvec4<V3, P> const& v3, tvec4<V4, P> const& v4);\n\n  // Matrix conversions\n  template <typename U, precision Q>\n  GLM_FUNC_DECL explicit tmat4x4(tmat4x4<U, Q> const& m);\n\n  GLM_FUNC_DECL explicit tmat4x4(tmat2x2<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat4x4(tmat3x3<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat4x4(tmat2x3<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat4x4(tmat3x2<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat4x4(tmat2x4<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat4x4(tmat4x2<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat4x4(tmat3x4<T, P> const& x);\n  GLM_FUNC_DECL explicit tmat4x4(tmat4x3<T, P> const& x);\n\n  // Accesses\n  GLM_FUNC_DECL col_type& operator[](length_t i);\n  GLM_FUNC_DECL col_type const& operator[](length_t i) const;\n\n  // Unary updatable operators\n  GLM_FUNC_DECL tmat4x4<T, P>& operator=(tmat4x4<T, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat4x4<T, P>& operator=(tmat4x4<U, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat4x4<T, P>& operator+=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tmat4x4<T, P>& operator+=(tmat4x4<U, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat4x4<T, P>& operator-=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tmat4x4<T, P>& operator-=(tmat4x4<U, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat4x4<T, P>& operator*=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tmat4x4<T, P>& operator*=(tmat4x4<U, P> const& m);\n  template <typename U>\n  GLM_FUNC_DECL tmat4x4<T, P>& operator/=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tmat4x4<T, P>& operator/=(tmat4x4<U, P> const& m);\n\n  //////////////////////////////////////\n  // Increment and decrement operators\n\n  GLM_FUNC_DECL tmat4x4<T, P>& operator++();\n  GLM_FUNC_DECL tmat4x4<T, P>& operator--();\n  GLM_FUNC_DECL tmat4x4<T, P> operator++(int);\n  GLM_FUNC_DECL tmat4x4<T, P> operator--(int);\n};\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x4<T, P> compute_inverse_mat4(tmat4x4<T, P> const& m);\n\n// Binary operators\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x4<T, P> operator+(tmat4x4<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x4<T, P> operator+(T const& s, tmat4x4<T, P> const& m);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x4<T, P> operator+(tmat4x4<T, P> const& m1,\n                                      tmat4x4<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x4<T, P> operator-(tmat4x4<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x4<T, P> operator-(T const& s, tmat4x4<T, P> const& m);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x4<T, P> operator-(tmat4x4<T, P> const& m1,\n                                      tmat4x4<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x4<T, P> operator*(tmat4x4<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x4<T, P> operator*(T const& s, tmat4x4<T, P> const& m);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL typename tmat4x4<T, P>::col_type operator*(\n    tmat4x4<T, P> const& m, typename tmat4x4<T, P>::row_type const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL typename tmat4x4<T, P>::row_type operator*(\n    typename tmat4x4<T, P>::col_type const& v, tmat4x4<T, P> const& m);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat2x4<T, P> operator*(tmat4x4<T, P> const& m1,\n                                      tmat2x4<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat3x4<T, P> operator*(tmat4x4<T, P> const& m1,\n                                      tmat3x4<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x4<T, P> operator*(tmat4x4<T, P> const& m1,\n                                      tmat4x4<T, P> const& m2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x4<T, P> operator/(tmat4x4<T, P> const& m, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x4<T, P> operator/(T const& s, tmat4x4<T, P> const& m);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL typename tmat4x4<T, P>::col_type operator/(\n    tmat4x4<T, P> const& m, typename tmat4x4<T, P>::row_type const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL typename tmat4x4<T, P>::row_type operator/(\n    typename tmat4x4<T, P>::col_type& v, tmat4x4<T, P> const& m);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x4<T, P> operator/(tmat4x4<T, P> const& m1,\n                                      tmat4x4<T, P> const& m2);\n\n// Unary constant operators\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tmat4x4<T, P> const operator-(tmat4x4<T, P> const& m);\n\n}  // namespace detail\n}  // namespace glm\n\n#ifndef GLM_EXTERNAL_TEMPLATE\n#include \"type_mat4x4.inl\"\n#endif  // GLM_EXTERNAL_TEMPLATE\n\n#endif  // glm_core_type_mat4x4\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_mat4x4.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_mat4x4.inl\n/// @date 2005-01-27 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER GLM_CONSTEXPR length_t tmat4x4<T, P>::length() const {\n  return 4;\n}\n\n//////////////////////////////////////\n// Accesses\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat4x4<T, P>::col_type& tmat4x4<T, P>::operator[](\n    length_t i) {\n  assert(i < this->length());\n  return this->value[i];\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat4x4<T, P>::col_type const&\ntmat4x4<T, P>::operator[](length_t i) const {\n  assert(i < this->length());\n  return this->value[i];\n}\n\n//////////////////////////////////////////////////////////////\n// Constructors\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4() {\n  T Zero(0);\n  T One(1);\n  this->value[0] = col_type(One, Zero, Zero, Zero);\n  this->value[1] = col_type(Zero, One, Zero, Zero);\n  this->value[2] = col_type(Zero, Zero, One, Zero);\n  this->value[3] = col_type(Zero, Zero, Zero, One);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tmat4x4<T, P> const& m) {\n  this->value[0] = m[0];\n  this->value[1] = m[1];\n  this->value[2] = m[2];\n  this->value[3] = m[3];\n}\n\ntemplate <typename T, precision P>\ntemplate <precision Q>\nGLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tmat4x4<T, Q> const& m) {\n  this->value[0] = m[0];\n  this->value[1] = m[1];\n  this->value[2] = m[2];\n  this->value[3] = m[3];\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(ctor) {}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(T const& s) {\n  value_type const Zero(0);\n  this->value[0] = col_type(s, Zero, Zero, Zero);\n  this->value[1] = col_type(Zero, s, Zero, Zero);\n  this->value[2] = col_type(Zero, Zero, s, Zero);\n  this->value[3] = col_type(Zero, Zero, Zero, s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(T const& x0, T const& y0, T const& z0,\n                                          T const& w0, T const& x1, T const& y1,\n                                          T const& z1, T const& w1, T const& x2,\n                                          T const& y2, T const& z2, T const& w2,\n                                          T const& x3, T const& y3, T const& z3,\n                                          T const& w3) {\n  this->value[0] = col_type(x0, y0, z0, w0);\n  this->value[1] = col_type(x1, y1, z1, w1);\n  this->value[2] = col_type(x2, y2, z2, w2);\n  this->value[3] = col_type(x3, y3, z3, w3);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(col_type const& v0,\n                                          col_type const& v1,\n                                          col_type const& v2,\n                                          col_type const& v3) {\n  this->value[0] = v0;\n  this->value[1] = v1;\n  this->value[2] = v2;\n  this->value[3] = v3;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U, precision Q>\nGLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tmat4x4<U, Q> const& m) {\n  this->value[0] = col_type(m[0]);\n  this->value[1] = col_type(m[1]);\n  this->value[2] = col_type(m[2]);\n  this->value[3] = col_type(m[3]);\n}\n\n//////////////////////////////////////\n// Conversion constructors\ntemplate <typename T, precision P>\ntemplate <typename X1, typename Y1, typename Z1, typename W1, typename X2,\n          typename Y2, typename Z2, typename W2, typename X3, typename Y3,\n          typename Z3, typename W3, typename X4, typename Y4, typename Z4,\n          typename W4>\nGLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(\n    X1 const& x1, Y1 const& y1, Z1 const& z1, W1 const& w1, X2 const& x2,\n    Y2 const& y2, Z2 const& z2, W2 const& w2, X3 const& x3, Y3 const& y3,\n    Z3 const& z3, W3 const& w3, X4 const& x4, Y4 const& y4, Z4 const& z4,\n    W4 const& w4) {\n  GLM_STATIC_ASSERT(\n      std::numeric_limits<X1>::is_iec559 || std::numeric_limits<X1>::is_integer,\n      \"*mat4x4 constructor only takes float and integer types, 1st parameter \"\n      \"type invalid.\");\n  GLM_STATIC_ASSERT(\n      std::numeric_limits<Y1>::is_iec559 || std::numeric_limits<Y1>::is_integer,\n      \"*mat4x4 constructor only takes float and integer types, 2nd parameter \"\n      \"type invalid.\");\n  GLM_STATIC_ASSERT(\n      std::numeric_limits<Z1>::is_iec559 || std::numeric_limits<Z1>::is_integer,\n      \"*mat4x4 constructor only takes float and integer types, 3rd parameter \"\n      \"type invalid.\");\n  GLM_STATIC_ASSERT(\n      std::numeric_limits<W1>::is_iec559 || std::numeric_limits<W1>::is_integer,\n      \"*mat4x4 constructor only takes float and integer types, 4th parameter \"\n      \"type invalid.\");\n\n  GLM_STATIC_ASSERT(\n      std::numeric_limits<X2>::is_iec559 || std::numeric_limits<X2>::is_integer,\n      \"*mat4x4 constructor only takes float and integer types, 5th parameter \"\n      \"type invalid.\");\n  GLM_STATIC_ASSERT(\n      std::numeric_limits<Y2>::is_iec559 || std::numeric_limits<Y2>::is_integer,\n      \"*mat4x4 constructor only takes float and integer types, 6th parameter \"\n      \"type invalid.\");\n  GLM_STATIC_ASSERT(\n      std::numeric_limits<Z2>::is_iec559 || std::numeric_limits<Z2>::is_integer,\n      \"*mat4x4 constructor only takes float and integer types, 7th parameter \"\n      \"type invalid.\");\n  GLM_STATIC_ASSERT(\n      std::numeric_limits<W2>::is_iec559 || std::numeric_limits<W2>::is_integer,\n      \"*mat4x4 constructor only takes float and integer types, 8th parameter \"\n      \"type invalid.\");\n\n  GLM_STATIC_ASSERT(\n      std::numeric_limits<X3>::is_iec559 || std::numeric_limits<X3>::is_integer,\n      \"*mat4x4 constructor only takes float and integer types, 9th parameter \"\n      \"type invalid.\");\n  GLM_STATIC_ASSERT(\n      std::numeric_limits<Y3>::is_iec559 || std::numeric_limits<Y3>::is_integer,\n      \"*mat4x4 constructor only takes float and integer types, 10th parameter \"\n      \"type invalid.\");\n  GLM_STATIC_ASSERT(\n      std::numeric_limits<Z3>::is_iec559 || std::numeric_limits<Z3>::is_integer,\n      \"*mat4x4 constructor only takes float and integer types, 11th parameter \"\n      \"type invalid.\");\n  GLM_STATIC_ASSERT(\n      std::numeric_limits<W3>::is_iec559 || std::numeric_limits<W3>::is_integer,\n      \"*mat4x4 constructor only takes float and integer types, 12th parameter \"\n      \"type invalid.\");\n\n  GLM_STATIC_ASSERT(\n      std::numeric_limits<X4>::is_iec559 || std::numeric_limits<X4>::is_integer,\n      \"*mat4x4 constructor only takes float and integer types, 13th parameter \"\n      \"type invalid.\");\n  GLM_STATIC_ASSERT(\n      std::numeric_limits<Y4>::is_iec559 || std::numeric_limits<Y4>::is_integer,\n      \"*mat4x4 constructor only takes float and integer types, 14th parameter \"\n      \"type invalid.\");\n  GLM_STATIC_ASSERT(\n      std::numeric_limits<Z4>::is_iec559 || std::numeric_limits<Z4>::is_integer,\n      \"*mat4x4 constructor only takes float and integer types, 15th parameter \"\n      \"type invalid.\");\n  GLM_STATIC_ASSERT(\n      std::numeric_limits<W4>::is_iec559 || std::numeric_limits<W4>::is_integer,\n      \"*mat4x4 constructor only takes float and integer types, 16th parameter \"\n      \"type invalid.\");\n\n  this->value[0] = col_type(static_cast<T>(x1), value_type(y1), value_type(z1),\n                            value_type(w1));\n  this->value[1] = col_type(static_cast<T>(x2), value_type(y2), value_type(z2),\n                            value_type(w2));\n  this->value[2] = col_type(static_cast<T>(x3), value_type(y3), value_type(z3),\n                            value_type(w3));\n  this->value[3] = col_type(static_cast<T>(x4), value_type(y4), value_type(z4),\n                            value_type(w4));\n}\n\ntemplate <typename T, precision P>\ntemplate <typename V1, typename V2, typename V3, typename V4>\nGLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tvec4<V1, P> const& v1,\n                                          tvec4<V2, P> const& v2,\n                                          tvec4<V3, P> const& v3,\n                                          tvec4<V4, P> const& v4) {\n  GLM_STATIC_ASSERT(\n      std::numeric_limits<V1>::is_iec559 || std::numeric_limits<V1>::is_integer,\n      \"*mat4x4 constructor only takes float and integer types, 1st parameter \"\n      \"type invalid.\");\n  GLM_STATIC_ASSERT(\n      std::numeric_limits<V2>::is_iec559 || std::numeric_limits<V2>::is_integer,\n      \"*mat4x4 constructor only takes float and integer types, 2nd parameter \"\n      \"type invalid.\");\n  GLM_STATIC_ASSERT(\n      std::numeric_limits<V3>::is_iec559 || std::numeric_limits<V3>::is_integer,\n      \"*mat4x4 constructor only takes float and integer types, 3rd parameter \"\n      \"type invalid.\");\n  GLM_STATIC_ASSERT(\n      std::numeric_limits<V4>::is_iec559 || std::numeric_limits<V4>::is_integer,\n      \"*mat4x4 constructor only takes float and integer types, 4th parameter \"\n      \"type invalid.\");\n\n  this->value[0] = col_type(v1);\n  this->value[1] = col_type(v2);\n  this->value[2] = col_type(v3);\n  this->value[3] = col_type(v4);\n}\n\n//////////////////////////////////////\n// Matrix convertion constructors\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tmat2x2<T, P> const& m) {\n  this->value[0] = col_type(m[0], detail::tvec2<T, P>(0));\n  this->value[1] = col_type(m[1], detail::tvec2<T, P>(0));\n  this->value[2] = col_type(static_cast<T>(0));\n  this->value[3] =\n      col_type(static_cast<T>(0), value_type(0), value_type(0), value_type(1));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tmat3x3<T, P> const& m) {\n  this->value[0] = col_type(m[0], value_type(0));\n  this->value[1] = col_type(m[1], value_type(0));\n  this->value[2] = col_type(m[2], value_type(0));\n  this->value[3] =\n      col_type(static_cast<T>(0), value_type(0), value_type(0), value_type(1));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tmat2x3<T, P> const& m) {\n  this->value[0] = col_type(m[0], value_type(0));\n  this->value[1] = col_type(m[1], value_type(0));\n  this->value[2] = col_type(static_cast<T>(0));\n  this->value[3] =\n      col_type(static_cast<T>(0), value_type(0), value_type(0), value_type(1));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tmat3x2<T, P> const& m) {\n  this->value[0] = col_type(m[0], detail::tvec2<T, P>(0));\n  this->value[1] = col_type(m[1], detail::tvec2<T, P>(0));\n  this->value[2] = col_type(m[2], detail::tvec2<T, P>(0));\n  this->value[3] =\n      col_type(static_cast<T>(0), value_type(0), value_type(0), value_type(1));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tmat2x4<T, P> const& m) {\n  this->value[0] = m[0];\n  this->value[1] = m[1];\n  this->value[2] = col_type(T(0));\n  this->value[3] = col_type(T(0), T(0), T(0), T(1));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tmat4x2<T, P> const& m) {\n  this->value[0] = col_type(m[0], detail::tvec2<T, P>(0));\n  this->value[1] = col_type(m[1], detail::tvec2<T, P>(0));\n  this->value[2] = col_type(T(0));\n  this->value[3] = col_type(T(0), T(0), T(0), T(1));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tmat3x4<T, P> const& m) {\n  this->value[0] = m[0];\n  this->value[1] = m[1];\n  this->value[2] = m[2];\n  this->value[3] = col_type(T(0), T(0), T(0), T(1));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4(tmat4x3<T, P> const& m) {\n  this->value[0] = col_type(m[0], T(0));\n  this->value[1] = col_type(m[1], T(0));\n  this->value[2] = col_type(m[2], T(0));\n  this->value[3] = col_type(m[3], T(1));\n}\n\n//////////////////////////////////////////////////////////////\n// Operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P>& tmat4x4<T, P>::operator=(\n    tmat4x4<T, P> const& m) {\n  // memcpy could be faster\n  // memcpy(&this->value, &m.value, 16 * sizeof(valType));\n  this->value[0] = m[0];\n  this->value[1] = m[1];\n  this->value[2] = m[2];\n  this->value[3] = m[3];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat4x4<T, P>& tmat4x4<T, P>::operator=(\n    tmat4x4<U, P> const& m) {\n  // memcpy could be faster\n  // memcpy(&this->value, &m.value, 16 * sizeof(valType));\n  this->value[0] = m[0];\n  this->value[1] = m[1];\n  this->value[2] = m[2];\n  this->value[3] = m[3];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat4x4<T, P>& tmat4x4<T, P>::operator+=(U s) {\n  this->value[0] += s;\n  this->value[1] += s;\n  this->value[2] += s;\n  this->value[3] += s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat4x4<T, P>& tmat4x4<T, P>::operator+=(\n    tmat4x4<U, P> const& m) {\n  this->value[0] += m[0];\n  this->value[1] += m[1];\n  this->value[2] += m[2];\n  this->value[3] += m[3];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat4x4<T, P>& tmat4x4<T, P>::operator-=(U s) {\n  this->value[0] -= s;\n  this->value[1] -= s;\n  this->value[2] -= s;\n  this->value[3] -= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat4x4<T, P>& tmat4x4<T, P>::operator-=(\n    tmat4x4<U, P> const& m) {\n  this->value[0] -= m[0];\n  this->value[1] -= m[1];\n  this->value[2] -= m[2];\n  this->value[3] -= m[3];\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat4x4<T, P>& tmat4x4<T, P>::operator*=(U s) {\n  this->value[0] *= s;\n  this->value[1] *= s;\n  this->value[2] *= s;\n  this->value[3] *= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat4x4<T, P>& tmat4x4<T, P>::operator*=(\n    tmat4x4<U, P> const& m) {\n  return (*this = *this * m);\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat4x4<T, P>& tmat4x4<T, P>::operator/=(U s) {\n  this->value[0] /= s;\n  this->value[1] /= s;\n  this->value[2] /= s;\n  this->value[3] /= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tmat4x4<T, P>& tmat4x4<T, P>::operator/=(\n    tmat4x4<U, P> const& m) {\n  return (*this =\n              *this * detail::compute_inverse<detail::tmat4x4, T, P>::call(m));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P>& tmat4x4<T, P>::operator++() {\n  ++this->value[0];\n  ++this->value[1];\n  ++this->value[2];\n  ++this->value[3];\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P>& tmat4x4<T, P>::operator--() {\n  --this->value[0];\n  --this->value[1];\n  --this->value[2];\n  --this->value[3];\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P> tmat4x4<T, P>::operator++(int) {\n  tmat4x4<T, P> Result(*this);\n  ++*this;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P> tmat4x4<T, P>::operator--(int) {\n  tmat4x4<T, P> Result(*this);\n  --*this;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nstruct compute_inverse<detail::tmat4x4, T, P> {\n  static detail::tmat4x4<T, P> call(detail::tmat4x4<T, P> const& m) {\n    T Coef00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];\n    T Coef02 = m[1][2] * m[3][3] - m[3][2] * m[1][3];\n    T Coef03 = m[1][2] * m[2][3] - m[2][2] * m[1][3];\n\n    T Coef04 = m[2][1] * m[3][3] - m[3][1] * m[2][3];\n    T Coef06 = m[1][1] * m[3][3] - m[3][1] * m[1][3];\n    T Coef07 = m[1][1] * m[2][3] - m[2][1] * m[1][3];\n\n    T Coef08 = m[2][1] * m[3][2] - m[3][1] * m[2][2];\n    T Coef10 = m[1][1] * m[3][2] - m[3][1] * m[1][2];\n    T Coef11 = m[1][1] * m[2][2] - m[2][1] * m[1][2];\n\n    T Coef12 = m[2][0] * m[3][3] - m[3][0] * m[2][3];\n    T Coef14 = m[1][0] * m[3][3] - m[3][0] * m[1][3];\n    T Coef15 = m[1][0] * m[2][3] - m[2][0] * m[1][3];\n\n    T Coef16 = m[2][0] * m[3][2] - m[3][0] * m[2][2];\n    T Coef18 = m[1][0] * m[3][2] - m[3][0] * m[1][2];\n    T Coef19 = m[1][0] * m[2][2] - m[2][0] * m[1][2];\n\n    T Coef20 = m[2][0] * m[3][1] - m[3][0] * m[2][1];\n    T Coef22 = m[1][0] * m[3][1] - m[3][0] * m[1][1];\n    T Coef23 = m[1][0] * m[2][1] - m[2][0] * m[1][1];\n\n    detail::tvec4<T, P> Fac0(Coef00, Coef00, Coef02, Coef03);\n    detail::tvec4<T, P> Fac1(Coef04, Coef04, Coef06, Coef07);\n    detail::tvec4<T, P> Fac2(Coef08, Coef08, Coef10, Coef11);\n    detail::tvec4<T, P> Fac3(Coef12, Coef12, Coef14, Coef15);\n    detail::tvec4<T, P> Fac4(Coef16, Coef16, Coef18, Coef19);\n    detail::tvec4<T, P> Fac5(Coef20, Coef20, Coef22, Coef23);\n\n    detail::tvec4<T, P> Vec0(m[1][0], m[0][0], m[0][0], m[0][0]);\n    detail::tvec4<T, P> Vec1(m[1][1], m[0][1], m[0][1], m[0][1]);\n    detail::tvec4<T, P> Vec2(m[1][2], m[0][2], m[0][2], m[0][2]);\n    detail::tvec4<T, P> Vec3(m[1][3], m[0][3], m[0][3], m[0][3]);\n\n    detail::tvec4<T, P> Inv0(Vec1 * Fac0 - Vec2 * Fac1 + Vec3 * Fac2);\n    detail::tvec4<T, P> Inv1(Vec0 * Fac0 - Vec2 * Fac3 + Vec3 * Fac4);\n    detail::tvec4<T, P> Inv2(Vec0 * Fac1 - Vec1 * Fac3 + Vec3 * Fac5);\n    detail::tvec4<T, P> Inv3(Vec0 * Fac2 - Vec1 * Fac4 + Vec2 * Fac5);\n\n    detail::tvec4<T, P> SignA(+1, -1, +1, -1);\n    detail::tvec4<T, P> SignB(-1, +1, -1, +1);\n    detail::tmat4x4<T, P> Inverse(Inv0 * SignA, Inv1 * SignB, Inv2 * SignA,\n                                  Inv3 * SignB);\n\n    detail::tvec4<T, P> Row0(Inverse[0][0], Inverse[1][0], Inverse[2][0],\n                             Inverse[3][0]);\n\n    detail::tvec4<T, P> Dot0(m[0] * Row0);\n    T Dot1 = (Dot0.x + Dot0.y) + (Dot0.z + Dot0.w);\n\n    T OneOverDeterminant = static_cast<T>(1) / Dot1;\n\n    return Inverse * OneOverDeterminant;\n  }\n};\n\n// Binary operators\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P> operator+(tmat4x4<T, P> const& m, T const& s) {\n  return tmat4x4<T, P>(m[0] + s, m[1] + s, m[2] + s, m[3] + s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P> operator+(T const& s, tmat4x4<T, P> const& m) {\n  return tmat4x4<T, P>(m[0] + s, m[1] + s, m[2] + s, m[3] + s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P> operator+(tmat4x4<T, P> const& m1,\n                                           tmat4x4<T, P> const& m2) {\n  return tmat4x4<T, P>(m1[0] + m2[0], m1[1] + m2[1], m1[2] + m2[2],\n                       m1[3] + m2[3]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P> operator-(tmat4x4<T, P> const& m, T const& s) {\n  return tmat4x4<T, P>(m[0] - s, m[1] - s, m[2] - s, m[3] - s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P> operator-(T const& s, tmat4x4<T, P> const& m) {\n  return tmat4x4<T, P>(s - m[0], s - m[1], s - m[2], s - m[3]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P> operator-(tmat4x4<T, P> const& m1,\n                                           tmat4x4<T, P> const& m2) {\n  return tmat4x4<T, P>(m1[0] - m2[0], m1[1] - m2[1], m1[2] - m2[2],\n                       m1[3] - m2[3]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P> operator*(tmat4x4<T, P> const& m, T const& s) {\n  return tmat4x4<T, P>(m[0] * s, m[1] * s, m[2] * s, m[3] * s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P> operator*(T const& s, tmat4x4<T, P> const& m) {\n  return tmat4x4<T, P>(m[0] * s, m[1] * s, m[2] * s, m[3] * s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat4x4<T, P>::col_type operator*(\n    tmat4x4<T, P> const& m, typename tmat4x4<T, P>::row_type const& v) {\n  /*\n                  __m128 v0 = _mm_shuffle_ps(v.data, v.data, _MM_SHUFFLE(0, 0,\n     0, 0));\n                  __m128 v1 = _mm_shuffle_ps(v.data, v.data, _MM_SHUFFLE(1, 1,\n     1, 1));\n                  __m128 v2 = _mm_shuffle_ps(v.data, v.data, _MM_SHUFFLE(2, 2,\n     2, 2));\n                  __m128 v3 = _mm_shuffle_ps(v.data, v.data, _MM_SHUFFLE(3, 3,\n     3, 3));\n\n                  __m128 m0 = _mm_mul_ps(m[0].data, v0);\n                  __m128 m1 = _mm_mul_ps(m[1].data, v1);\n                  __m128 a0 = _mm_add_ps(m0, m1);\n\n                  __m128 m2 = _mm_mul_ps(m[2].data, v2);\n                  __m128 m3 = _mm_mul_ps(m[3].data, v3);\n                  __m128 a1 = _mm_add_ps(m2, m3);\n\n                  __m128 a2 = _mm_add_ps(a0, a1);\n\n                  return typename tmat4x4<T, P>::col_type(a2);\n  */\n\n  typename tmat4x4<T, P>::col_type const Mov0(v[0]);\n  typename tmat4x4<T, P>::col_type const Mov1(v[1]);\n  typename tmat4x4<T, P>::col_type const Mul0 = m[0] * Mov0;\n  typename tmat4x4<T, P>::col_type const Mul1 = m[1] * Mov1;\n  typename tmat4x4<T, P>::col_type const Add0 = Mul0 + Mul1;\n  typename tmat4x4<T, P>::col_type const Mov2(v[2]);\n  typename tmat4x4<T, P>::col_type const Mov3(v[3]);\n  typename tmat4x4<T, P>::col_type const Mul2 = m[2] * Mov2;\n  typename tmat4x4<T, P>::col_type const Mul3 = m[3] * Mov3;\n  typename tmat4x4<T, P>::col_type const Add1 = Mul2 + Mul3;\n  typename tmat4x4<T, P>::col_type const Add2 = Add0 + Add1;\n  return Add2;\n\n  /*\n                  return typename tmat4x4<T, P>::col_type(\n                          m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2] +\n     m[3][0] * v[3], m[0][1] * v[0] + m[1][1] * v[1] + m[2][1] * v[2] + m[3][1]\n     * v[3], m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2] + m[3][2] * v[3],\n                          m[0][3] * v[0] + m[1][3] * v[1] + m[2][3] * v[2] +\n     m[3][3] * v[3]);\n  */\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat4x4<T, P>::row_type operator*(\n    typename tmat4x4<T, P>::col_type const& v, tmat4x4<T, P> const& m) {\n  return typename tmat4x4<T, P>::row_type(\n      m[0][0] * v[0] + m[0][1] * v[1] + m[0][2] * v[2] + m[0][3] * v[3],\n      m[1][0] * v[0] + m[1][1] * v[1] + m[1][2] * v[2] + m[1][3] * v[3],\n      m[2][0] * v[0] + m[2][1] * v[1] + m[2][2] * v[2] + m[2][3] * v[3],\n      m[3][0] * v[0] + m[3][1] * v[1] + m[3][2] * v[2] + m[3][3] * v[3]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat2x4<T, P> operator*(tmat4x4<T, P> const& m1,\n                                           tmat2x4<T, P> const& m2) {\n  return tmat2x4<T, P>(m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] +\n                           m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3],\n                       m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] +\n                           m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3],\n                       m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] +\n                           m1[2][2] * m2[0][2] + m1[3][2] * m2[0][3],\n                       m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1] +\n                           m1[2][3] * m2[0][2] + m1[3][3] * m2[0][3],\n                       m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] +\n                           m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3],\n                       m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] +\n                           m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3],\n                       m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] +\n                           m1[2][2] * m2[1][2] + m1[3][2] * m2[1][3],\n                       m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1] +\n                           m1[2][3] * m2[1][2] + m1[3][3] * m2[1][3]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat3x4<T, P> operator*(tmat4x4<T, P> const& m1,\n                                           tmat3x4<T, P> const& m2) {\n  return tmat3x4<T, P>(m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] +\n                           m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3],\n                       m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] +\n                           m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3],\n                       m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] +\n                           m1[2][2] * m2[0][2] + m1[3][2] * m2[0][3],\n                       m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1] +\n                           m1[2][3] * m2[0][2] + m1[3][3] * m2[0][3],\n                       m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] +\n                           m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3],\n                       m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] +\n                           m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3],\n                       m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] +\n                           m1[2][2] * m2[1][2] + m1[3][2] * m2[1][3],\n                       m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1] +\n                           m1[2][3] * m2[1][2] + m1[3][3] * m2[1][3],\n                       m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] +\n                           m1[2][0] * m2[2][2] + m1[3][0] * m2[2][3],\n                       m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] +\n                           m1[2][1] * m2[2][2] + m1[3][1] * m2[2][3],\n                       m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1] +\n                           m1[2][2] * m2[2][2] + m1[3][2] * m2[2][3],\n                       m1[0][3] * m2[2][0] + m1[1][3] * m2[2][1] +\n                           m1[2][3] * m2[2][2] + m1[3][3] * m2[2][3]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P> operator*(tmat4x4<T, P> const& m1,\n                                           tmat4x4<T, P> const& m2) {\n  typename tmat4x4<T, P>::col_type const SrcA0 = m1[0];\n  typename tmat4x4<T, P>::col_type const SrcA1 = m1[1];\n  typename tmat4x4<T, P>::col_type const SrcA2 = m1[2];\n  typename tmat4x4<T, P>::col_type const SrcA3 = m1[3];\n\n  typename tmat4x4<T, P>::col_type const SrcB0 = m2[0];\n  typename tmat4x4<T, P>::col_type const SrcB1 = m2[1];\n  typename tmat4x4<T, P>::col_type const SrcB2 = m2[2];\n  typename tmat4x4<T, P>::col_type const SrcB3 = m2[3];\n\n  tmat4x4<T, P> Result(tmat4x4<T, P>::_null);\n  Result[0] =\n      SrcA0 * SrcB0[0] + SrcA1 * SrcB0[1] + SrcA2 * SrcB0[2] + SrcA3 * SrcB0[3];\n  Result[1] =\n      SrcA0 * SrcB1[0] + SrcA1 * SrcB1[1] + SrcA2 * SrcB1[2] + SrcA3 * SrcB1[3];\n  Result[2] =\n      SrcA0 * SrcB2[0] + SrcA1 * SrcB2[1] + SrcA2 * SrcB2[2] + SrcA3 * SrcB2[3];\n  Result[3] =\n      SrcA0 * SrcB3[0] + SrcA1 * SrcB3[1] + SrcA2 * SrcB3[2] + SrcA3 * SrcB3[3];\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P> operator/(tmat4x4<T, P> const& m, T const& s) {\n  return tmat4x4<T, P>(m[0] / s, m[1] / s, m[2] / s, m[3] / s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P> operator/(T const& s, tmat4x4<T, P> const& m) {\n  return tmat4x4<T, P>(s / m[0], s / m[1], s / m[2], s / m[3]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat4x4<T, P>::col_type operator/(\n    tmat4x4<T, P> const& m, typename tmat4x4<T, P>::row_type const& v) {\n  return detail::compute_inverse<detail::tmat4x4, T, P>::call(m) * v;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tmat4x4<T, P>::row_type operator/(\n    typename tmat4x4<T, P>::col_type const& v, tmat4x4<T, P> const& m) {\n  return v * detail::compute_inverse<detail::tmat4x4, T, P>::call(m);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P> operator/(tmat4x4<T, P> const& m1,\n                                           tmat4x4<T, P> const& m2) {\n  tmat4x4<T, P> m1_copy(m1);\n  return m1_copy /= m2;\n}\n\n// Unary constant operators\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P> const operator-(tmat4x4<T, P> const& m) {\n  return tmat4x4<T, P>(-m[0], -m[1], -m[2], -m[3]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P> const operator++(tmat4x4<T, P> const& m, int) {\n  return tmat4x4<T, P>(m[0] + static_cast<T>(1), m[1] + static_cast<T>(1),\n                       m[2] + static_cast<T>(1), m[3] + static_cast<T>(1));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tmat4x4<T, P> const operator--(tmat4x4<T, P> const& m, int) {\n  return tmat4x4<T, P>(m[0] - static_cast<T>(1), m[1] - static_cast<T>(1),\n                       m[2] - static_cast<T>(1), m[3] - static_cast<T>(1));\n}\n\n//////////////////////////////////////\n// Boolean operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool operator==(tmat4x4<T, P> const& m1,\n                                   tmat4x4<T, P> const& m2) {\n  return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]) &&\n         (m1[3] == m2[3]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool operator!=(tmat4x4<T, P> const& m1,\n                                   tmat4x4<T, P> const& m2) {\n  return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]) ||\n         (m1[3] != m2[3]);\n}\n\n}  // namespace detail\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_vec.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_vec.hpp\n/// @date 2010-01-26 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_core_type_vec\n#define glm_core_type_vec\n\n#include \"precision.hpp\"\n#include \"type_int.hpp\"\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nstruct tvec1;\ntemplate <typename T, precision P>\nstruct tvec2;\ntemplate <typename T, precision P>\nstruct tvec3;\ntemplate <typename T, precision P>\nstruct tvec4;\n}  // namespace detail\n\ntypedef detail::tvec1<float, highp> highp_vec1_t;\ntypedef detail::tvec1<float, mediump> mediump_vec1_t;\ntypedef detail::tvec1<float, lowp> lowp_vec1_t;\ntypedef detail::tvec1<int, highp> highp_ivec1_t;\ntypedef detail::tvec1<int, mediump> mediump_ivec1_t;\ntypedef detail::tvec1<int, lowp> lowp_ivec1_t;\ntypedef detail::tvec1<uint, highp> highp_uvec1_t;\ntypedef detail::tvec1<uint, mediump> mediump_uvec1_t;\ntypedef detail::tvec1<uint, lowp> lowp_uvec1_t;\ntypedef detail::tvec1<bool, highp> highp_bvec1_t;\ntypedef detail::tvec1<bool, mediump> mediump_bvec1_t;\ntypedef detail::tvec1<bool, lowp> lowp_bvec1_t;\n\n/// @addtogroup core_precision\n/// @{\n\n/// 2 components vector of high single-precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec2<float, highp> highp_vec2;\n\n/// 2 components vector of medium single-precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec2<float, mediump> mediump_vec2;\n\n/// 2 components vector of low single-precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec2<float, lowp> lowp_vec2;\n\n/// 2 components vector of high double-precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec2<double, highp> highp_dvec2;\n\n/// 2 components vector of medium double-precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec2<double, mediump> mediump_dvec2;\n\n/// 2 components vector of low double-precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec2<double, lowp> lowp_dvec2;\n\n/// 2 components vector of high precision signed integer numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec2<int, highp> highp_ivec2;\n\n/// 2 components vector of medium precision signed integer numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec2<int, mediump> mediump_ivec2;\n\n/// 2 components vector of low precision signed integer numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec2<int, lowp> lowp_ivec2;\n\n/// 2 components vector of high precision unsigned integer numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec2<uint, highp> highp_uvec2;\n\n/// 2 components vector of medium precision unsigned integer numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec2<uint, mediump> mediump_uvec2;\n\n/// 2 components vector of low precision unsigned integer numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec2<uint, lowp> lowp_uvec2;\n\n/// 2 components vector of high precision bool numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec2<bool, highp> highp_bvec2;\n\n/// 2 components vector of medium precision bool numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec2<bool, mediump> mediump_bvec2;\n\n/// 2 components vector of low precision bool numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec2<bool, lowp> lowp_bvec2;\n\n/// @}\n\n/// @addtogroup core_precision\n/// @{\n\n/// 3 components vector of high single-precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec3<float, highp> highp_vec3;\n\n/// 3 components vector of medium single-precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec3<float, mediump> mediump_vec3;\n\n/// 3 components vector of low single-precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec3<float, lowp> lowp_vec3;\n\n/// 3 components vector of high double-precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec3<double, highp> highp_dvec3;\n\n/// 3 components vector of medium double-precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec3<double, mediump> mediump_dvec3;\n\n/// 3 components vector of low double-precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec3<double, lowp> lowp_dvec3;\n\n/// 3 components vector of high precision signed integer numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec3<int, highp> highp_ivec3;\n\n/// 3 components vector of medium precision signed integer numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec3<int, mediump> mediump_ivec3;\n\n/// 3 components vector of low precision signed integer numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec3<int, lowp> lowp_ivec3;\n\n/// 3 components vector of high precision unsigned integer numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec3<uint, highp> highp_uvec3;\n\n/// 3 components vector of medium precision unsigned integer numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec3<uint, mediump> mediump_uvec3;\n\n/// 3 components vector of low precision unsigned integer numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec3<uint, lowp> lowp_uvec3;\n\n/// 3 components vector of high precision bool numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec3<bool, highp> highp_bvec3;\n\n/// 3 components vector of medium precision bool numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec3<bool, mediump> mediump_bvec3;\n\n/// 3 components vector of low precision bool numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec3<bool, lowp> lowp_bvec3;\n\n/// @}\n\n/// @addtogroup core_precision\n/// @{\n\n/// 4 components vector of high single-precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec4<float, highp> highp_vec4;\n\n/// 4 components vector of medium single-precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec4<float, mediump> mediump_vec4;\n\n/// 4 components vector of low single-precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec4<float, lowp> lowp_vec4;\n\n/// 4 components vector of high double-precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec4<double, highp> highp_dvec4;\n\n/// 4 components vector of medium double-precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec4<double, mediump> mediump_dvec4;\n\n/// 4 components vector of low double-precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec4<double, lowp> lowp_dvec4;\n\n/// 4 components vector of high precision signed integer numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec4<int, highp> highp_ivec4;\n\n/// 4 components vector of medium precision signed integer numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec4<int, mediump> mediump_ivec4;\n\n/// 4 components vector of low precision signed integer numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec4<int, lowp> lowp_ivec4;\n\n/// 4 components vector of high precision unsigned integer numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec4<uint, highp> highp_uvec4;\n\n/// 4 components vector of medium precision unsigned integer numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec4<uint, mediump> mediump_uvec4;\n\n/// 4 components vector of low precision unsigned integer numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec4<uint, lowp> lowp_uvec4;\n\n/// 4 components vector of high precision bool numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec4<bool, highp> highp_bvec4;\n\n/// 4 components vector of medium precision bool numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec4<bool, mediump> mediump_bvec4;\n\n/// 4 components vector of low precision bool numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tvec4<bool, lowp> lowp_bvec4;\n\n/// @}\n\n/// @addtogroup core_types\n/// @{\n\n//////////////////////////\n// Default float definition\n\n#if (defined(GLM_PRECISION_LOWP_FLOAT))\ntypedef lowp_vec2 vec2;\ntypedef lowp_vec3 vec3;\ntypedef lowp_vec4 vec4;\n#elif (defined(GLM_PRECISION_MEDIUMP_FLOAT))\ntypedef mediump_vec2 vec2;\ntypedef mediump_vec3 vec3;\ntypedef mediump_vec4 vec4;\n#else  // defined(GLM_PRECISION_HIGHP_FLOAT)\n       /// 2 components vector of floating-point numbers.\n       ///\n       /// @see <a\n       /// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n       /// specification, section 4.1.5 Vectors</a>\ntypedef highp_vec2 vec2;\n\n//! 3 components vector of floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\ntypedef highp_vec3 vec3;\n\n//! 4 components vector of floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\ntypedef highp_vec4 vec4;\n#endif  // GLM_PRECISION\n\n//////////////////////////\n// Default double definition\n\n#if (defined(GLM_PRECISION_LOWP_DOUBLE))\ntypedef lowp_dvec2 dvec2;\ntypedef lowp_dvec3 dvec3;\ntypedef lowp_dvec4 dvec4;\n#elif (defined(GLM_PRECISION_MEDIUMP_DOUBLE))\ntypedef mediump_dvec2 dvec2;\ntypedef mediump_dvec3 dvec3;\ntypedef mediump_dvec4 dvec4;\n#else  // defined(GLM_PRECISION_HIGHP_DOUBLE)\n       /// 2 components vector of double-precision floating-point numbers.\n       ///\n       /// @see <a\n       /// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n       /// specification, section 4.1.5 Vectors</a>\ntypedef highp_dvec2 dvec2;\n\n//! 3 components vector of double-precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\ntypedef highp_dvec3 dvec3;\n\n//! 4 components vector of double-precision floating-point numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\ntypedef highp_dvec4 dvec4;\n#endif  // GLM_PRECISION\n\n//////////////////////////\n// Signed integer definition\n\n#if (defined(GLM_PRECISION_LOWP_INT))\ntypedef lowp_ivec2 ivec2;\ntypedef lowp_ivec3 ivec3;\ntypedef lowp_ivec4 ivec4;\n#elif (defined(GLM_PRECISION_MEDIUMP_INT))\ntypedef mediump_ivec2 ivec2;\ntypedef mediump_ivec3 ivec3;\ntypedef mediump_ivec4 ivec4;\n#else  // defined(GLM_PRECISION_HIGHP_INT)\n       //! 2 components vector of signed integer numbers.\n       ///\n       /// @see <a\n       /// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n       /// specification, section 4.1.5 Vectors</a>\ntypedef highp_ivec2 ivec2;\n\n//! 3 components vector of signed integer numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\ntypedef highp_ivec3 ivec3;\n\n//! 4 components vector of signed integer numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\ntypedef highp_ivec4 ivec4;\n#endif  // GLM_PRECISION\n\n//////////////////////////\n// Unsigned integer definition\n\n#if (defined(GLM_PRECISION_LOWP_UINT))\ntypedef lowp_uvec2 uvec2;\ntypedef lowp_uvec3 uvec3;\ntypedef lowp_uvec4 uvec4;\n#elif (defined(GLM_PRECISION_MEDIUMP_UINT))\ntypedef mediump_uvec2 uvec2;\ntypedef mediump_uvec3 uvec3;\ntypedef mediump_uvec4 uvec4;\n#else  // defined(GLM_PRECISION_HIGHP_UINT)\n       /// 2 components vector of unsigned integer numbers.\n       ///\n       /// @see <a\n       /// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n       /// specification, section 4.1.5 Vectors</a>\ntypedef highp_uvec2 uvec2;\n\n/// 3 components vector of unsigned integer numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\ntypedef highp_uvec3 uvec3;\n\n/// 4 components vector of unsigned integer numbers.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\ntypedef highp_uvec4 uvec4;\n#endif  // GLM_PRECISION\n\n//////////////////////////\n// Boolean definition\n\n#if (defined(GLM_PRECISION_LOWP_BOOL))\ntypedef lowp_bvec2 bvec2;\ntypedef lowp_bvec3 bvec3;\ntypedef lowp_bvec4 bvec4;\n#elif (defined(GLM_PRECISION_MEDIUMP_BOOL))\ntypedef mediump_bvec2 bvec2;\ntypedef mediump_bvec3 bvec3;\ntypedef mediump_bvec4 bvec4;\n#else  // defined(GLM_PRECISION_HIGHP_BOOL)\n       //! 2 components vector of boolean.\n       ///\n       /// @see <a\n       /// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n       /// specification, section 4.1.5 Vectors</a>\ntypedef highp_bvec2 bvec2;\n\n//! 3 components vector of boolean.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\ntypedef highp_bvec3 bvec3;\n\n//! 4 components vector of boolean.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.5 Vectors</a>\ntypedef highp_bvec4 bvec4;\n#endif  // GLM_PRECISION\n\n/// @}\n}  // namespace glm\n\n#endif  // glm_core_type_vec\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_vec.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_vec.inl\n/// @date 2011-06-15 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_vec1.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_vec1.hpp\n/// @date 2008-08-25 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_core_type_gentype1\n#define glm_core_type_gentype1\n\n#include \"../fwd.hpp\"\n#include \"type_vec.hpp\"\n#ifdef GLM_SWIZZLE\n#if GLM_HAS_ANONYMOUS_UNION\n#include \"_swizzle.hpp\"\n#else\n#include \"_swizzle_func.hpp\"\n#endif\n#endif  // GLM_SWIZZLE\n#include <cstddef>\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nstruct tvec1 {\n  //////////////////////////////////////\n  // Implementation detail\n\n  enum ctor { _null };\n\n  typedef tvec1<T, P> type;\n  typedef tvec1<bool, P> bool_type;\n  typedef T value_type;\n\n  //////////////////////////////////////\n  // Helper\n\n  GLM_FUNC_DECL GLM_CONSTEXPR length_t length() const;\n\n  //////////////////////////////////////\n  // Data\n\n  union {\n    T x, r, s;\n  };\n\n  //////////////////////////////////////\n  // Accesses\n\n  GLM_FUNC_DECL T& operator[](length_t i);\n  GLM_FUNC_DECL T const& operator[](length_t i) const;\n\n  //////////////////////////////////////\n  // Implicit basic constructors\n\n  GLM_FUNC_DECL tvec1();\n  GLM_FUNC_DECL tvec1(tvec1<T, P> const& v);\n  template <precision Q>\n  GLM_FUNC_DECL tvec1(tvec1<T, Q> const& v);\n\n  //////////////////////////////////////\n  // Explicit basic constructors\n\n  GLM_FUNC_DECL explicit tvec1(ctor);\n  GLM_FUNC_DECL tvec1(T const& s);\n\n  //////////////////////////////////////\n  // Conversion vector constructors\n\n  //! Explicit conversions (From section 5.4.1 Conversion and scalar\n  //! constructors of GLSL 1.30.08 specification)\n  template <typename U, precision Q>\n  GLM_FUNC_DECL explicit tvec1(tvec1<U, Q> const& v);\n  //! Explicit conversions (From section 5.4.1 Conversion and scalar\n  //! constructors of GLSL 1.30.08 specification)\n  template <typename U, precision Q>\n  GLM_FUNC_DECL explicit tvec1(tvec2<U, Q> const& v);\n  //! Explicit conversions (From section 5.4.1 Conversion and scalar\n  //! constructors of GLSL 1.30.08 specification)\n  template <typename U, precision Q>\n  GLM_FUNC_DECL explicit tvec1(tvec3<U, Q> const& v);\n  //! Explicit conversions (From section 5.4.1 Conversion and scalar\n  //! constructors of GLSL 1.30.08 specification)\n  template <typename U, precision Q>\n  GLM_FUNC_DECL explicit tvec1(tvec4<U, Q> const& v);\n\n  //////////////////////////////////////\n  // Unary arithmetic operators\n\n  GLM_FUNC_DECL tvec1<T, P>& operator=(tvec1<T, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec1<T, P>& operator=(tvec1<U, P> const& v);\n\n  template <typename U>\n  GLM_FUNC_DECL tvec1<T, P>& operator+=(U const& s);\n  template <typename U>\n  GLM_FUNC_DECL tvec1<T, P>& operator+=(tvec1<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec1<T, P>& operator-=(U const& s);\n  template <typename U>\n  GLM_FUNC_DECL tvec1<T, P>& operator-=(tvec1<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec1<T, P>& operator*=(U const& s);\n  template <typename U>\n  GLM_FUNC_DECL tvec1<T, P>& operator*=(tvec1<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec1<T, P>& operator/=(U const& s);\n  template <typename U>\n  GLM_FUNC_DECL tvec1<T, P>& operator/=(tvec1<U, P> const& v);\n\n  //////////////////////////////////////\n  // Increment and decrement operators\n\n  GLM_FUNC_DECL tvec1<T, P>& operator++();\n  GLM_FUNC_DECL tvec1<T, P>& operator--();\n  GLM_FUNC_DECL tvec1<T, P> operator++(int);\n  GLM_FUNC_DECL tvec1<T, P> operator--(int);\n\n  //////////////////////////////////////\n  // Unary bit operators\n\n  template <typename U>\n  GLM_FUNC_DECL tvec1<T, P>& operator%=(U const& s);\n  template <typename U>\n  GLM_FUNC_DECL tvec1<T, P>& operator%=(tvec1<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec1<T, P>& operator&=(U const& s);\n  template <typename U>\n  GLM_FUNC_DECL tvec1<T, P>& operator&=(tvec1<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec1<T, P>& operator|=(U const& s);\n  template <typename U>\n  GLM_FUNC_DECL tvec1<T, P>& operator|=(tvec1<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec1<T, P>& operator^=(U const& s);\n  template <typename U>\n  GLM_FUNC_DECL tvec1<T, P>& operator^=(tvec1<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec1<T, P>& operator<<=(U const& s);\n  template <typename U>\n  GLM_FUNC_DECL tvec1<T, P>& operator<<=(tvec1<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec1<T, P>& operator>>=(U const& s);\n  template <typename U>\n  GLM_FUNC_DECL tvec1<T, P>& operator>>=(tvec1<U, P> const& v);\n};\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator+(tvec1<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator+(T const& s, tvec1<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator+(tvec1<T, P> const& v1,\n                                    tvec1<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator-(tvec1<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator-(T const& s, tvec1<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator-(tvec1<T, P> const& v1,\n                                    tvec1<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator*(tvec1<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator*(T const& s, tvec1<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator*(tvec1<T, P> const& v1,\n                                    tvec1<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator/(tvec1<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator/(T const& s, tvec1<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator/(tvec1<T, P> const& v1,\n                                    tvec1<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator-(tvec1<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL bool operator==(tvec1<T, P> const& v1, tvec1<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL bool operator!=(tvec1<T, P> const& v1, tvec1<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator%(tvec1<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator%(T const& s, tvec1<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator%(tvec1<T, P> const& v1,\n                                    tvec1<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator&(tvec1<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator&(T const& s, tvec1<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator&(tvec1<T, P> const& v1,\n                                    tvec1<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator|(tvec1<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator|(T const& s, tvec1<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator|(tvec1<T, P> const& v1,\n                                    tvec1<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator^(tvec1<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator^(T const& s, tvec1<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator^(tvec1<T, P> const& v1,\n                                    tvec1<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator<<(tvec1<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator<<(T const& s, tvec1<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator<<(tvec1<T, P> const& v1,\n                                     tvec1<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator>>(tvec1<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator>>(T const& s, tvec1<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator>>(tvec1<T, P> const& v1,\n                                     tvec1<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec1<T, P> operator~(tvec1<T, P> const& v);\n\n}  // namespace detail\n}  // namespace glm\n\n#ifndef GLM_EXTERNAL_TEMPLATE\n#include \"type_vec1.inl\"\n#endif  // GLM_EXTERNAL_TEMPLATE\n\n#endif  // glm_core_type_gentype1\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_vec1.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_vec1.inl\n/// @date 2008-08-25 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER GLM_CONSTEXPR length_t tvec1<T, P>::length() const {\n  return 1;\n}\n\n//////////////////////////////////////\n// Accesses\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T& tvec1<T, P>::operator[](length_t i) {\n  assert(i >= 0 && i < this->length());\n  return (&x)[i];\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T const& tvec1<T, P>::operator[](length_t i) const {\n  assert(i >= 0 && i < this->length());\n  return (&x)[i];\n}\n\n//////////////////////////////////////\n// Implicit basic constructors\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P>::tvec1() : x(static_cast<T>(0)) {}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P>::tvec1(tvec1<T, P> const& v) : x(v.x) {}\n\ntemplate <typename T, precision P>\ntemplate <precision Q>\nGLM_FUNC_QUALIFIER tvec1<T, P>::tvec1(tvec1<T, Q> const& v) : x(v.x) {}\n\n//////////////////////////////////////\n// Explicit basic constructors\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P>::tvec1(ctor) {}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P>::tvec1(T const& s) : x(s) {}\n\n//////////////////////////////////////\n// Conversion vector constructors\n\ntemplate <typename T, precision P>\ntemplate <typename U, precision Q>\nGLM_FUNC_QUALIFIER tvec1<T, P>::tvec1(tvec1<U, Q> const& v)\n    : x(static_cast<T>(v.x)) {}\n\ntemplate <typename T, precision P>\ntemplate <typename U, precision Q>\nGLM_FUNC_QUALIFIER tvec1<T, P>::tvec1(tvec2<U, Q> const& v)\n    : x(static_cast<T>(v.x)) {}\n\ntemplate <typename T, precision P>\ntemplate <typename U, precision Q>\nGLM_FUNC_QUALIFIER tvec1<T, P>::tvec1(tvec3<U, Q> const& v)\n    : x(static_cast<T>(v.x)) {}\n\ntemplate <typename T, precision P>\ntemplate <typename U, precision Q>\nGLM_FUNC_QUALIFIER tvec1<T, P>::tvec1(tvec4<U, Q> const& v)\n    : x(static_cast<T>(v.x)) {}\n\n//////////////////////////////////////\n// Unary arithmetic operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P>& tvec1<T, P>::operator=(tvec1<T, P> const& v) {\n  this->x = v.x;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec1<T, P>& tvec1<T, P>::operator=(tvec1<U, P> const& v) {\n  this->x = static_cast<T>(v.x);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec1<T, P>& tvec1<T, P>::operator+=(U const& s) {\n  this->x += static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec1<T, P>& tvec1<T, P>::operator+=(tvec1<U, P> const& v) {\n  this->x += static_cast<T>(v.x);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec1<T, P>& tvec1<T, P>::operator-=(U const& s) {\n  this->x -= static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec1<T, P>& tvec1<T, P>::operator-=(tvec1<U, P> const& v) {\n  this->x -= static_cast<T>(v.x);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec1<T, P>& tvec1<T, P>::operator*=(U const& s) {\n  this->x *= static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec1<T, P>& tvec1<T, P>::operator*=(tvec1<U, P> const& v) {\n  this->x *= static_cast<T>(v.x);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec1<T, P>& tvec1<T, P>::operator/=(U const& s) {\n  this->x /= static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec1<T, P>& tvec1<T, P>::operator/=(tvec1<U, P> const& v) {\n  this->x /= static_cast<T>(v.x);\n  return *this;\n}\n\n//////////////////////////////////////\n// Increment and decrement operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P>& tvec1<T, P>::operator++() {\n  ++this->x;\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P>& tvec1<T, P>::operator--() {\n  --this->x;\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> tvec1<T, P>::operator++(int) {\n  tvec1<T, P> Result(*this);\n  ++*this;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> tvec1<T, P>::operator--(int) {\n  tvec1<T, P> Result(*this);\n  --*this;\n  return Result;\n}\n\n//////////////////////////////////////\n// Boolean operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool operator==(tvec1<T, P> const& v1,\n                                   tvec1<T, P> const& v2) {\n  return (v1.x == v2.x);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool operator!=(tvec1<T, P> const& v1,\n                                   tvec1<T, P> const& v2) {\n  return (v1.x != v2.x);\n}\n\n//////////////////////////////////////\n// Unary bit operators\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec1<T, P>& tvec1<T, P>::operator%=(U const& s) {\n  this->x %= static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec1<T, P>& tvec1<T, P>::operator%=(tvec1<U, P> const& v) {\n  this->x %= static_cast<T>(v.x);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec1<T, P>& tvec1<T, P>::operator&=(U const& s) {\n  this->x &= static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec1<T, P>& tvec1<T, P>::operator&=(tvec1<U, P> const& v) {\n  this->x &= static_cast<T>(v.x);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec1<T, P>& tvec1<T, P>::operator|=(U const& s) {\n  this->x |= static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec1<T, P>& tvec1<T, P>::operator|=(tvec1<U, P> const& v) {\n  this->x |= U(v.x);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec1<T, P>& tvec1<T, P>::operator^=(U const& s) {\n  this->x ^= static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec1<T, P>& tvec1<T, P>::operator^=(tvec1<U, P> const& v) {\n  this->x ^= static_cast<T>(v.x);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec1<T, P>& tvec1<T, P>::operator<<=(U const& s) {\n  this->x <<= static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec1<T, P>& tvec1<T, P>::operator<<=(tvec1<U, P> const& v) {\n  this->x <<= static_cast<T>(v.x);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec1<T, P>& tvec1<T, P>::operator>>=(U const& s) {\n  this->x >>= static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec1<T, P>& tvec1<T, P>::operator>>=(tvec1<U, P> const& v) {\n  this->x >>= static_cast<T>(v.x);\n  return *this;\n}\n\n//////////////////////////////////////\n// Binary arithmetic operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator+(tvec1<T, P> const& v, T const& s) {\n  return tvec1<T, P>(v.x + s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator+(T const& s, tvec1<T, P> const& v) {\n  return tvec1<T, P>(s + v.x);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator+(tvec1<T, P> const& v1,\n                                         tvec1<T, P> const& v2) {\n  return tvec1<T, P>(v1.x + v2.x);\n}\n\n// operator-\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator-(tvec1<T, P> const& v, T const& s) {\n  return tvec1<T, P>(v.x - s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator-(T const& s, tvec1<T, P> const& v) {\n  return tvec1<T, P>(s - v.x);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator-(tvec1<T, P> const& v1,\n                                         tvec1<T, P> const& v2) {\n  return tvec1<T, P>(v1.x - v2.x);\n}\n\n// operator*\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator*(tvec1<T, P> const& v, T const& s) {\n  return tvec1<T, P>(v.x * s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator*(T const& s, tvec1<T, P> const& v) {\n  return tvec1<T, P>(s * v.x);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator*(tvec1<T, P> const& v1,\n                                         tvec1<T, P> const& v2) {\n  return tvec1<T, P>(v1.x * v2.x);\n}\n\n// operator/\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator/(tvec1<T, P> const& v, T const& s) {\n  return tvec1<T, P>(v.x / s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator/(T const& s, tvec1<T, P> const& v) {\n  return tvec1<T, P>(s / v.x);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator/(tvec1<T, P> const& v1,\n                                         tvec1<T, P> const& v2) {\n  return tvec1<T, P>(v1.x / v2.x);\n}\n\n// Unary constant operators\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator-(tvec1<T, P> const& v) {\n  return tvec1<T, P>(-v.x);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator++(tvec1<T, P> const& v, int) {\n  return tvec1<T, P>(v.x + T(1));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator--(tvec1<T, P> const& v, int) {\n  return tvec1<T, P>(v.x - T(1));\n}\n\n//////////////////////////////////////\n// Binary bit operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator%(tvec1<T, P> const& v, T const& s) {\n  return tvec1<T, P>(v.x % s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator%(T const& s, tvec1<T, P> const& v) {\n  return tvec1<T, P>(s % v.x);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator%(tvec1<T, P> const& v1,\n                                         tvec1<T, P> const& v2) {\n  return tvec1<T, P>(v1.x % v2.x);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator&(tvec1<T, P> const& v, T const& s) {\n  return tvec1<T, P>(v.x & s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator&(T const& s, tvec1<T, P> const& v) {\n  return tvec1<T, P>(s & v.x);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator&(tvec1<T, P> const& v1,\n                                         tvec1<T, P> const& v2) {\n  return tvec1<T, P>(v1.x & v2.x);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator|(tvec1<T, P> const& v, T const& s) {\n  return tvec1<T, P>(v.x | s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator|(T const& s, tvec1<T, P> const& v) {\n  return tvec1<T, P>(s | v.x);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator|(tvec1<T, P> const& v1,\n                                         tvec1<T, P> const& v2) {\n  return tvec1<T, P>(v1.x | v2.x);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator^(tvec1<T, P> const& v, T const& s) {\n  return tvec1<T, P>(v.x ^ s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator^(T const& s, tvec1<T, P> const& v) {\n  return tvec1<T, P>(s ^ v.x);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator^(tvec1<T, P> const& v1,\n                                         tvec1<T, P> const& v2) {\n  return tvec1<T, P>(v1.x ^ v2.x);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator<<(tvec1<T, P> const& v, T const& s) {\n  return tvec1<T, P>(v.x << s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator<<(T const& s, tvec1<T, P> const& v) {\n  return tvec1<T, P>(s << v.x);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator<<(tvec1<T, P> const& v1,\n                                          tvec1<T, P> const& v2) {\n  return tvec1<T, P>(v1.x << v2.x);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator>>(tvec1<T, P> const& v, T const& s) {\n  return tvec1<T, P>(v.x >> s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator>>(T const& s, tvec1<T, P> const& v) {\n  return tvec1<T, P>(s >> v.x);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator>>(tvec1<T, P> const& v1,\n                                          tvec1<T, P> const& v2) {\n  return tvec1<T, P>(v1.x >> v2.x);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec1<T, P> operator~(tvec1<T, P> const& v) {\n  return tvec1<T, P>(~v.x);\n}\n\n}  // namespace detail\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_vec2.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_vec2.hpp\n/// @date 2008-08-18 / 2013-08-27\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_core_type_gentype2\n#define glm_core_type_gentype2\n\n// #include \"../fwd.hpp\"\n#include \"type_vec.hpp\"\n#ifdef GLM_SWIZZLE\n#if GLM_HAS_ANONYMOUS_UNION\n#include \"_swizzle.hpp\"\n#else\n#include \"_swizzle_func.hpp\"\n#endif\n#endif  // GLM_SWIZZLE\n#include <cstddef>\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nstruct tvec2 {\n  //////////////////////////////////////\n  // Implementation detail\n\n  enum ctor { _null };\n\n  typedef tvec2<T, P> type;\n  typedef tvec2<bool, P> bool_type;\n  typedef T value_type;\n  typedef int size_type;\n\n  //////////////////////////////////////\n  // Helper\n\n  GLM_FUNC_DECL GLM_CONSTEXPR length_t length() const;\n\n  //////////////////////////////////////\n  // Data\n\n#if (GLM_HAS_ANONYMOUS_UNION && defined(GLM_SWIZZLE))\n  union {\n    struct {\n      T x, y;\n    };\n    struct {\n      T r, g;\n    };\n    struct {\n      T s, t;\n    };\n\n    _GLM_SWIZZLE2_2_MEMBERS(T, P, tvec2, x, y)\n    _GLM_SWIZZLE2_2_MEMBERS(T, P, tvec2, r, g)\n    _GLM_SWIZZLE2_2_MEMBERS(T, P, tvec2, s, t)\n    _GLM_SWIZZLE2_3_MEMBERS(T, P, tvec3, x, y)\n    _GLM_SWIZZLE2_3_MEMBERS(T, P, tvec3, r, g)\n    _GLM_SWIZZLE2_3_MEMBERS(T, P, tvec3, s, t)\n    _GLM_SWIZZLE2_4_MEMBERS(T, P, tvec4, x, y)\n    _GLM_SWIZZLE2_4_MEMBERS(T, P, tvec4, r, g)\n    _GLM_SWIZZLE2_4_MEMBERS(T, P, tvec4, s, t)\n  };\n#else\n  union {\n    T x, r, s;\n  };\n  union {\n    T y, g, t;\n  };\n\n#ifdef GLM_SWIZZLE\n  GLM_SWIZZLE_GEN_VEC_FROM_VEC2(T, P, detail::tvec2, detail::tvec2,\n                                detail::tvec3, detail::tvec4)\n#endif\n#endif\n\n  //////////////////////////////////////\n  // Accesses\n\n  GLM_FUNC_DECL T& operator[](length_t i);\n  GLM_FUNC_DECL T const& operator[](length_t i) const;\n\n  //////////////////////////////////////\n  // Implicit basic constructors\n\n  GLM_FUNC_DECL tvec2();\n  GLM_FUNC_DECL tvec2(tvec2<T, P> const& v);\n  template <precision Q>\n  GLM_FUNC_DECL tvec2(tvec2<T, Q> const& v);\n\n  //////////////////////////////////////\n  // Explicit basic constructors\n\n  GLM_FUNC_DECL explicit tvec2(ctor);\n  GLM_FUNC_DECL explicit tvec2(T const& s);\n  GLM_FUNC_DECL tvec2(T const& s1, T const& s2);\n\n  //////////////////////////////////////\n  // Swizzle constructors\n\n#if (GLM_HAS_ANONYMOUS_UNION && defined(GLM_SWIZZLE))\n  template <int E0, int E1>\n  GLM_FUNC_DECL tvec2(\n      _swizzle<2, T, P, tvec2<T, P>, E0, E1, -1, -2> const& that) {\n    *this = that();\n  }\n#endif  //(GLM_HAS_ANONYMOUS_UNION && defined(GLM_SWIZZLE))\n\n  //////////////////////////////////////\n  // Conversion constructors\n\n  //! Explicit converions (From section 5.4.1 Conversion and scalar constructors\n  //! of GLSL 1.30.08 specification)\n  template <typename U, typename V>\n  GLM_FUNC_DECL tvec2(U const& x, V const& y);\n\n  //////////////////////////////////////\n  // Conversion vector constructors\n\n  //! Explicit conversions (From section 5.4.1 Conversion and scalar\n  //! constructors of GLSL 1.30.08 specification)\n  template <typename U, precision Q>\n  GLM_FUNC_DECL tvec2(tvec2<U, Q> const& v);\n  //! Explicit conversions (From section 5.4.1 Conversion and scalar\n  //! constructors of GLSL 1.30.08 specification)\n  template <typename U, precision Q>\n  GLM_FUNC_DECL explicit tvec2(tvec3<U, Q> const& v);\n  //! Explicit conversions (From section 5.4.1 Conversion and scalar\n  //! constructors of GLSL 1.30.08 specification)\n  template <typename U, precision Q>\n  GLM_FUNC_DECL explicit tvec2(tvec4<U, Q> const& v);\n\n  //////////////////////////////////////\n  // Unary arithmetic operators\n\n  GLM_FUNC_DECL tvec2<T, P>& operator=(tvec2<T, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec2<T, P>& operator=(tvec2<U, P> const& v);\n\n  template <typename U>\n  GLM_FUNC_DECL tvec2<T, P>& operator+=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tvec2<T, P>& operator+=(tvec2<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec2<T, P>& operator-=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tvec2<T, P>& operator-=(tvec2<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec2<T, P>& operator*=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tvec2<T, P>& operator*=(tvec2<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec2<T, P>& operator/=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tvec2<T, P>& operator/=(tvec2<U, P> const& v);\n\n  //////////////////////////////////////\n  // Increment and decrement operators\n\n  GLM_FUNC_DECL tvec2<T, P>& operator++();\n  GLM_FUNC_DECL tvec2<T, P>& operator--();\n  GLM_FUNC_DECL tvec2<T, P> operator++(int);\n  GLM_FUNC_DECL tvec2<T, P> operator--(int);\n\n  //////////////////////////////////////\n  // Unary bit operators\n\n  template <typename U>\n  GLM_FUNC_DECL tvec2<T, P>& operator%=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tvec2<T, P>& operator%=(tvec2<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec2<T, P>& operator&=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tvec2<T, P>& operator&=(tvec2<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec2<T, P>& operator|=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tvec2<T, P>& operator|=(tvec2<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec2<T, P>& operator^=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tvec2<T, P>& operator^=(tvec2<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec2<T, P>& operator<<=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tvec2<T, P>& operator<<=(tvec2<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec2<T, P>& operator>>=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tvec2<T, P>& operator>>=(tvec2<U, P> const& v);\n};\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator+(tvec2<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator+(T const& s, tvec2<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator+(tvec2<T, P> const& v1,\n                                    tvec2<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator-(tvec2<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator-(T const& s, tvec2<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator-(tvec2<T, P> const& v1,\n                                    tvec2<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator*(tvec2<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator*(T const& s, tvec2<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator*(tvec2<T, P> const& v1,\n                                    tvec2<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator/(tvec2<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator/(T const& s, tvec2<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator/(tvec2<T, P> const& v1,\n                                    tvec2<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator-(tvec2<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator%(tvec2<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator%(T const& s, tvec2<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator%(tvec2<T, P> const& v1,\n                                    tvec2<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator&(tvec2<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator&(T const& s, tvec2<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator&(tvec2<T, P> const& v1,\n                                    tvec2<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator|(tvec2<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator|(T const& s, tvec2<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator|(tvec2<T, P> const& v1,\n                                    tvec2<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator^(tvec2<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator^(T const& s, tvec2<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator^(tvec2<T, P> const& v1,\n                                    tvec2<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator<<(tvec2<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator<<(T const& s, tvec2<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator<<(tvec2<T, P> const& v1,\n                                     tvec2<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator>>(tvec2<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator>>(T const& s, tvec2<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator>>(tvec2<T, P> const& v1,\n                                     tvec2<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec2<T, P> operator~(tvec2<T, P> const& v);\n\n}  // namespace detail\n}  // namespace glm\n\n#ifndef GLM_EXTERNAL_TEMPLATE\n#include \"type_vec2.inl\"\n#endif  // GLM_EXTERNAL_TEMPLATE\n\n#endif  // glm_core_type_gentype2\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_vec2.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_tvec2.inl\n/// @date 2008-08-18 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER GLM_CONSTEXPR length_t tvec2<T, P>::length() const {\n  return 2;\n}\n\n//////////////////////////////////////\n// Accesses\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T& tvec2<T, P>::operator[](length_t i) {\n  assert(i >= 0 && i < this->length());\n  return (&x)[i];\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T const& tvec2<T, P>::operator[](length_t i) const {\n  assert(i >= 0 && i < this->length());\n  return (&x)[i];\n}\n\n//////////////////////////////////////\n// Implicit basic constructors\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P>::tvec2() : x(0), y(0) {}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P>::tvec2(tvec2<T, P> const& v) : x(v.x), y(v.y) {}\n\ntemplate <typename T, precision P>\ntemplate <precision Q>\nGLM_FUNC_QUALIFIER tvec2<T, P>::tvec2(tvec2<T, Q> const& v) : x(v.x), y(v.y) {}\n\n//////////////////////////////////////\n// Explicit basic constructors\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P>::tvec2(ctor) {}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P>::tvec2(T const& s) : x(s), y(s) {}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P>::tvec2(T const& s1, T const& s2)\n    : x(s1), y(s2) {}\n\n//////////////////////////////////////\n// Conversion scalar constructors\n\ntemplate <typename T, precision P>\ntemplate <typename U, typename V>\nGLM_FUNC_QUALIFIER tvec2<T, P>::tvec2(U const& a, V const& b)\n    : x(static_cast<T>(a)), y(static_cast<T>(b)) {}\n\n//////////////////////////////////////\n// Conversion vector constructors\n\ntemplate <typename T, precision P>\ntemplate <typename U, precision Q>\nGLM_FUNC_QUALIFIER tvec2<T, P>::tvec2(tvec2<U, Q> const& v)\n    : x(static_cast<T>(v.x)), y(static_cast<T>(v.y)) {}\n\ntemplate <typename T, precision P>\ntemplate <typename U, precision Q>\nGLM_FUNC_QUALIFIER tvec2<T, P>::tvec2(tvec3<U, Q> const& v)\n    : x(static_cast<T>(v.x)), y(static_cast<T>(v.y)) {}\n\ntemplate <typename T, precision P>\ntemplate <typename U, precision Q>\nGLM_FUNC_QUALIFIER tvec2<T, P>::tvec2(tvec4<U, Q> const& v)\n    : x(static_cast<T>(v.x)), y(static_cast<T>(v.y)) {}\n\n//////////////////////////////////////\n// Unary arithmetic operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P>& tvec2<T, P>::operator=(tvec2<T, P> const& v) {\n  this->x = v.x;\n  this->y = v.y;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec2<T, P>& tvec2<T, P>::operator=(tvec2<U, P> const& v) {\n  this->x = static_cast<T>(v.x);\n  this->y = static_cast<T>(v.y);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec2<T, P>& tvec2<T, P>::operator+=(U s) {\n  this->x += static_cast<T>(s);\n  this->y += static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec2<T, P>& tvec2<T, P>::operator+=(tvec2<U, P> const& v) {\n  this->x += static_cast<T>(v.x);\n  this->y += static_cast<T>(v.y);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec2<T, P>& tvec2<T, P>::operator-=(U s) {\n  this->x -= static_cast<T>(s);\n  this->y -= static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec2<T, P>& tvec2<T, P>::operator-=(tvec2<U, P> const& v) {\n  this->x -= static_cast<T>(v.x);\n  this->y -= static_cast<T>(v.y);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec2<T, P>& tvec2<T, P>::operator*=(U s) {\n  this->x *= static_cast<T>(s);\n  this->y *= static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec2<T, P>& tvec2<T, P>::operator*=(tvec2<U, P> const& v) {\n  this->x *= static_cast<T>(v.x);\n  this->y *= static_cast<T>(v.y);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec2<T, P>& tvec2<T, P>::operator/=(U s) {\n  this->x /= static_cast<T>(s);\n  this->y /= static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec2<T, P>& tvec2<T, P>::operator/=(tvec2<U, P> const& v) {\n  this->x /= static_cast<T>(v.x);\n  this->y /= static_cast<T>(v.y);\n  return *this;\n}\n\n//////////////////////////////////////\n// Increment and decrement operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P>& tvec2<T, P>::operator++() {\n  ++this->x;\n  ++this->y;\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P>& tvec2<T, P>::operator--() {\n  --this->x;\n  --this->y;\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> tvec2<T, P>::operator++(int) {\n  tvec2<T, P> Result(*this);\n  ++*this;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> tvec2<T, P>::operator--(int) {\n  tvec2<T, P> Result(*this);\n  --*this;\n  return Result;\n}\n\n//////////////////////////////////////\n// Boolean operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool operator==(tvec2<T, P> const& v1,\n                                   tvec2<T, P> const& v2) {\n  return (v1.x == v2.x) && (v1.y == v2.y);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool operator!=(tvec2<T, P> const& v1,\n                                   tvec2<T, P> const& v2) {\n  return (v1.x != v2.x) || (v1.y != v2.y);\n}\n\n//////////////////////////////////////\n// Unary bit operators\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec2<T, P>& tvec2<T, P>::operator%=(U s) {\n  this->x %= static_cast<T>(s);\n  this->y %= static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec2<T, P>& tvec2<T, P>::operator%=(tvec2<U, P> const& v) {\n  this->x %= static_cast<T>(v.x);\n  this->y %= static_cast<T>(v.y);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec2<T, P>& tvec2<T, P>::operator&=(U s) {\n  this->x &= static_cast<T>(s);\n  this->y &= static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec2<T, P>& tvec2<T, P>::operator&=(tvec2<U, P> const& v) {\n  this->x &= static_cast<T>(v.x);\n  this->y &= static_cast<T>(v.y);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec2<T, P>& tvec2<T, P>::operator|=(U s) {\n  this->x |= static_cast<T>(s);\n  this->y |= static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec2<T, P>& tvec2<T, P>::operator|=(tvec2<U, P> const& v) {\n  this->x |= static_cast<T>(v.x);\n  this->y |= static_cast<T>(v.y);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec2<T, P>& tvec2<T, P>::operator^=(U s) {\n  this->x ^= static_cast<T>(s);\n  this->y ^= static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec2<T, P>& tvec2<T, P>::operator^=(tvec2<U, P> const& v) {\n  this->x ^= static_cast<T>(v.x);\n  this->y ^= static_cast<T>(v.y);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec2<T, P>& tvec2<T, P>::operator<<=(U s) {\n  this->x <<= static_cast<T>(s);\n  this->y <<= static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec2<T, P>& tvec2<T, P>::operator<<=(tvec2<U, P> const& v) {\n  this->x <<= static_cast<T>(v.x);\n  this->y <<= static_cast<T>(v.y);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec2<T, P>& tvec2<T, P>::operator>>=(U s) {\n  this->x >>= static_cast<T>(s);\n  this->y >>= static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec2<T, P>& tvec2<T, P>::operator>>=(tvec2<U, P> const& v) {\n  this->x >>= static_cast<T>(v.x);\n  this->y >>= static_cast<T>(v.y);\n  return *this;\n}\n\n//////////////////////////////////////\n// Binary arithmetic operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator+(tvec2<T, P> const& v, T const& s) {\n  return tvec2<T, P>(v.x + s, v.y + s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator+(T const& s, tvec2<T, P> const& v) {\n  return tvec2<T, P>(s + v.x, s + v.y);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator+(tvec2<T, P> const& v1,\n                                         tvec2<T, P> const& v2) {\n  return tvec2<T, P>(v1.x + v2.x, v1.y + v2.y);\n}\n\n// operator-\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator-(tvec2<T, P> const& v, T const& s) {\n  return tvec2<T, P>(v.x - s, v.y - s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator-(T const& s, tvec2<T, P> const& v) {\n  return tvec2<T, P>(s - v.x, s - v.y);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator-(tvec2<T, P> const& v1,\n                                         tvec2<T, P> const& v2) {\n  return tvec2<T, P>(v1.x - v2.x, v1.y - v2.y);\n}\n\n// operator*\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator*(tvec2<T, P> const& v, T const& s) {\n  return tvec2<T, P>(v.x * s, v.y * s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator*(T const& s, tvec2<T, P> const& v) {\n  return tvec2<T, P>(s * v.x, s * v.y);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator*(tvec2<T, P> const& v1,\n                                         tvec2<T, P> const& v2) {\n  return tvec2<T, P>(v1.x * v2.x, v1.y * v2.y);\n}\n\n// operator/\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator/(tvec2<T, P> const& v, T const& s) {\n  return tvec2<T, P>(v.x / s, v.y / s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator/(T const& s, tvec2<T, P> const& v) {\n  return tvec2<T, P>(s / v.x, s / v.y);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator/(tvec2<T, P> const& v1,\n                                         tvec2<T, P> const& v2) {\n  return tvec2<T, P>(v1.x / v2.x, v1.y / v2.y);\n}\n\n// Unary constant operators\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator-(tvec2<T, P> const& v) {\n  return tvec2<T, P>(-v.x, -v.y);\n}\n\n//////////////////////////////////////\n// Binary bit operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator%(tvec2<T, P> const& v, T const& s) {\n  return tvec2<T, P>(v.x % s, v.y % s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator%(T const& s, tvec2<T, P> const& v) {\n  return tvec2<T, P>(s % v.x, s % v.y);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator%(tvec2<T, P> const& v1,\n                                         tvec2<T, P> const& v2) {\n  return tvec2<T, P>(v1.x % v2.x, v1.y % v2.y);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator&(tvec2<T, P> const& v, T const& s) {\n  return tvec2<T, P>(v.x & s, v.y & s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator&(T const& s, tvec2<T, P> const& v) {\n  return tvec2<T, P>(s & v.x, s & v.y);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator&(tvec2<T, P> const& v1,\n                                         tvec2<T, P> const& v2) {\n  return tvec2<T, P>(v1.x & v2.x, v1.y & v2.y);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator|(tvec2<T, P> const& v, T const& s) {\n  return tvec2<T, P>(v.x | s, v.y | s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator|(T const& s, tvec2<T, P> const& v) {\n  return tvec2<T, P>(s | v.x, s | v.y);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator|(tvec2<T, P> const& v1,\n                                         tvec2<T, P> const& v2) {\n  return tvec2<T, P>(v1.x | v2.x, v1.y | v2.y);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator^(tvec2<T, P> const& v, T const& s) {\n  return tvec2<T, P>(v.x ^ s, v.y ^ s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator^(T const& s, tvec2<T, P> const& v) {\n  return tvec2<T, P>(s ^ v.x, s ^ v.y);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator^(tvec2<T, P> const& v1,\n                                         tvec2<T, P> const& v2) {\n  return tvec2<T, P>(v1.x ^ v2.x, v1.y ^ v2.y);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator<<(tvec2<T, P> const& v, T const& s) {\n  return tvec2<T, P>(v.x << s, v.y << s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator<<(T const& s, tvec2<T, P> const& v) {\n  return tvec2<T, P>(s << v.x, s << v.y);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator<<(tvec2<T, P> const& v1,\n                                          tvec2<T, P> const& v2) {\n  return tvec2<T, P>(v1.x << v2.x, v1.y << v2.y);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator>>(tvec2<T, P> const& v, T const& s) {\n  return tvec2<T, P>(v.x >> s, v.y >> s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator>>(T const& s, tvec2<T, P> const& v) {\n  return tvec2<T, P>(s >> v.x, s >> v.y);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator>>(tvec2<T, P> const& v1,\n                                          tvec2<T, P> const& v2) {\n  return tvec2<T, P>(v1.x >> v2.x, v1.y >> v2.y);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec2<T, P> operator~(tvec2<T, P> const& v) {\n  return tvec2<T, P>(~v.x, ~v.y);\n}\n\n}  // namespace detail\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_vec3.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_vec3.hpp\n/// @date 2008-08-22 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_core_type_gentype3\n#define glm_core_type_gentype3\n\n// #include \"../fwd.hpp\"\n#include \"type_vec.hpp\"\n#ifdef GLM_SWIZZLE\n#if GLM_HAS_ANONYMOUS_UNION\n#include \"_swizzle.hpp\"\n#else\n#include \"_swizzle_func.hpp\"\n#endif\n#endif  // GLM_SWIZZLE\n#include <cstddef>\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nstruct tvec3 {\n  //////////////////////////////////////\n  // Implementation detail\n\n  enum ctor { _null };\n\n  typedef tvec3<T, P> type;\n  typedef tvec3<bool, P> bool_type;\n  typedef T value_type;\n  typedef int size_type;\n\n  //////////////////////////////////////\n  // Helper\n\n  GLM_FUNC_DECL GLM_CONSTEXPR length_t length() const;\n\n  //////////////////////////////////////\n  // Data\n\n#if (GLM_HAS_ANONYMOUS_UNION && defined(GLM_SWIZZLE))\n  union {\n    struct {\n      T x, y, z;\n    };\n    struct {\n      T r, g, b;\n    };\n    struct {\n      T s, t, p;\n    };\n\n    _GLM_SWIZZLE3_2_MEMBERS(T, P, tvec2, x, y, z)\n    _GLM_SWIZZLE3_2_MEMBERS(T, P, tvec2, r, g, b)\n    _GLM_SWIZZLE3_2_MEMBERS(T, P, tvec2, s, t, p)\n    _GLM_SWIZZLE3_3_MEMBERS(T, P, tvec3, x, y, z)\n    _GLM_SWIZZLE3_3_MEMBERS(T, P, tvec3, r, g, b)\n    _GLM_SWIZZLE3_3_MEMBERS(T, P, tvec3, s, t, p)\n    _GLM_SWIZZLE3_4_MEMBERS(T, P, tvec4, x, y, z)\n    _GLM_SWIZZLE3_4_MEMBERS(T, P, tvec4, r, g, b)\n    _GLM_SWIZZLE3_4_MEMBERS(T, P, tvec4, s, t, p)\n  };\n#else\n  union {\n    T x, r, s;\n  };\n  union {\n    T y, g, t;\n  };\n  union {\n    T z, b, p;\n  };\n\n#ifdef GLM_SWIZZLE\n  GLM_SWIZZLE_GEN_VEC_FROM_VEC3(T, P, detail::tvec3, detail::tvec2,\n                                detail::tvec3, detail::tvec4)\n#endif\n#endif  // GLM_LANG\n\n  //////////////////////////////////////\n  // Accesses\n\n  GLM_FUNC_DECL T& operator[](length_t i);\n  GLM_FUNC_DECL T const& operator[](length_t i) const;\n\n  //////////////////////////////////////\n  // Implicit basic constructors\n\n  GLM_FUNC_DECL tvec3();\n  GLM_FUNC_DECL tvec3(tvec3<T, P> const& v);\n  template <precision Q>\n  GLM_FUNC_DECL tvec3(tvec3<T, Q> const& v);\n\n  //////////////////////////////////////\n  // Explicit basic constructors\n\n  GLM_FUNC_DECL explicit tvec3(ctor);\n  GLM_FUNC_DECL explicit tvec3(T const& s);\n  GLM_FUNC_DECL tvec3(T const& s1, T const& s2, T const& s3);\n\n  //////////////////////////////////////\n  // Conversion scalar constructors\n\n  //! Explicit converions (From section 5.4.1 Conversion and scalar constructors\n  //! of GLSL 1.30.08 specification)\n  template <typename U, typename V, typename W>\n  GLM_FUNC_DECL tvec3(U const& x, V const& y, W const& z);\n\n  //////////////////////////////////////\n  // Conversion vector constructors\n\n  //! Explicit conversions (From section 5.4.1 Conversion and scalar\n  //! constructors of GLSL 1.30.08 specification)\n  template <typename A, typename B, precision Q>\n  GLM_FUNC_DECL explicit tvec3(tvec2<A, Q> const& v, B const& s);\n  //! Explicit conversions (From section 5.4.1 Conversion and scalar\n  //! constructors of GLSL 1.30.08 specification)\n  template <typename A, typename B, precision Q>\n  GLM_FUNC_DECL explicit tvec3(A const& s, tvec2<B, Q> const& v);\n  //! Explicit conversions (From section 5.4.1 Conversion and scalar\n  //! constructors of GLSL 1.30.08 specification)\n  template <typename U, precision Q>\n  GLM_FUNC_DECL explicit tvec3(tvec3<U, Q> const& v);\n  //! Explicit conversions (From section 5.4.1 Conversion and scalar\n  //! constructors of GLSL 1.30.08 specification)\n  template <typename U, precision Q>\n  GLM_FUNC_DECL explicit tvec3(tvec4<U, Q> const& v);\n\n  //////////////////////////////////////\n  // Swizzle constructors\n\n#if (GLM_HAS_ANONYMOUS_UNION && defined(GLM_SWIZZLE))\n  template <int E0, int E1, int E2>\n  GLM_FUNC_DECL tvec3(\n      _swizzle<3, T, P, tvec3<T, P>, E0, E1, E2, -1> const& that) {\n    *this = that();\n  }\n\n  template <int E0, int E1>\n  GLM_FUNC_DECL tvec3(_swizzle<2, T, P, tvec2<T, P>, E0, E1, -1, -2> const& v,\n                      T const& s) {\n    *this = tvec3<T, P>(v(), s);\n  }\n\n  template <int E0, int E1>\n  GLM_FUNC_DECL tvec3(T const& s,\n                      _swizzle<2, T, P, tvec2<T, P>, E0, E1, -1, -2> const& v) {\n    *this = tvec3<T, P>(s, v());\n  }\n#endif  //(GLM_HAS_ANONYMOUS_UNION && defined(GLM_SWIZZLE))\n\n  //////////////////////////////////////\n  // Unary arithmetic operators\n\n  GLM_FUNC_DECL tvec3<T, P>& operator=(tvec3<T, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec3<T, P>& operator=(tvec3<U, P> const& v);\n\n  template <typename U>\n  GLM_FUNC_DECL tvec3<T, P>& operator+=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tvec3<T, P>& operator+=(tvec3<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec3<T, P>& operator-=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tvec3<T, P>& operator-=(tvec3<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec3<T, P>& operator*=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tvec3<T, P>& operator*=(tvec3<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec3<T, P>& operator/=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tvec3<T, P>& operator/=(tvec3<U, P> const& v);\n\n  //////////////////////////////////////\n  // Increment and decrement operators\n\n  GLM_FUNC_DECL tvec3<T, P>& operator++();\n  GLM_FUNC_DECL tvec3<T, P>& operator--();\n  GLM_FUNC_DECL tvec3<T, P> operator++(int);\n  GLM_FUNC_DECL tvec3<T, P> operator--(int);\n\n  //////////////////////////////////////\n  // Unary bit operators\n\n  template <typename U>\n  GLM_FUNC_DECL tvec3<T, P>& operator%=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tvec3<T, P>& operator%=(tvec3<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec3<T, P>& operator&=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tvec3<T, P>& operator&=(tvec3<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec3<T, P>& operator|=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tvec3<T, P>& operator|=(tvec3<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec3<T, P>& operator^=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tvec3<T, P>& operator^=(tvec3<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec3<T, P>& operator<<=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tvec3<T, P>& operator<<=(tvec3<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec3<T, P>& operator>>=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tvec3<T, P>& operator>>=(tvec3<U, P> const& v);\n};\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator+(tvec3<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator+(T const& s, tvec3<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator+(tvec3<T, P> const& v1,\n                                    tvec3<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator-(tvec3<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator-(T const& s, tvec3<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator-(tvec3<T, P> const& v1,\n                                    tvec3<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator*(tvec3<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator*(T const& s, tvec3<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator*(tvec3<T, P> const& v1,\n                                    tvec3<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator/(tvec3<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator/(T const& s, tvec3<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator/(tvec3<T, P> const& v1,\n                                    tvec3<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator-(tvec3<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator%(tvec3<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator%(T const& s, tvec3<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator%(tvec3<T, P> const& v1,\n                                    tvec3<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator&(tvec3<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator&(T const& s, tvec3<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator&(tvec3<T, P> const& v1,\n                                    tvec3<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator|(tvec3<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator|(T const& s, tvec3<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator|(tvec3<T, P> const& v1,\n                                    tvec3<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator^(tvec3<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator^(T const& s, tvec3<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator^(tvec3<T, P> const& v1,\n                                    tvec3<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator<<(tvec3<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator<<(T const& s, tvec3<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator<<(tvec3<T, P> const& v1,\n                                     tvec3<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator>>(tvec3<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator>>(T const& s, tvec3<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator>>(tvec3<T, P> const& v1,\n                                     tvec3<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec3<T, P> operator~(tvec3<T, P> const& v);\n\n}  // namespace detail\n}  // namespace glm\n\n#ifndef GLM_EXTERNAL_TEMPLATE\n#include \"type_vec3.inl\"\n#endif  // GLM_EXTERNAL_TEMPLATE\n\n#endif  // glm_core_type_gentype3\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_vec3.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_tvec3.inl\n/// @date 2008-08-22 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER GLM_CONSTEXPR length_t tvec3<T, P>::length() const {\n  return 3;\n}\n\n//////////////////////////////////////\n// Accesses\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T& tvec3<T, P>::operator[](length_t i) {\n  assert(i >= 0 && i < this->length());\n  return (&x)[i];\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T const& tvec3<T, P>::operator[](length_t i) const {\n  assert(i >= 0 && i < this->length());\n  return (&x)[i];\n}\n\n//////////////////////////////////////\n// Implicit basic constructors\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P>::tvec3() : x(0), y(0), z(0) {}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P>::tvec3(tvec3<T, P> const& v)\n    : x(v.x), y(v.y), z(v.z) {}\n\ntemplate <typename T, precision P>\ntemplate <precision Q>\nGLM_FUNC_QUALIFIER tvec3<T, P>::tvec3(tvec3<T, Q> const& v)\n    : x(v.x), y(v.y), z(v.z) {}\n\n//////////////////////////////////////\n// Explicit basic constructors\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P>::tvec3(ctor) {}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P>::tvec3(T const& s) : x(s), y(s), z(s) {}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P>::tvec3(T const& s0, T const& s1, T const& s2)\n    : x(s0), y(s1), z(s2) {}\n\n//////////////////////////////////////\n// Conversion scalar constructors\n\ntemplate <typename T, precision P>\ntemplate <typename A, typename B, typename C>\nGLM_FUNC_QUALIFIER tvec3<T, P>::tvec3(A const& x, B const& y, C const& z)\n    : x(static_cast<T>(x)), y(static_cast<T>(y)), z(static_cast<T>(z)) {}\n\n//////////////////////////////////////\n// Conversion vector constructors\n\ntemplate <typename T, precision P>\ntemplate <typename A, typename B, precision Q>\nGLM_FUNC_QUALIFIER tvec3<T, P>::tvec3(tvec2<A, Q> const& v, B const& s)\n    : x(static_cast<T>(v.x)), y(static_cast<T>(v.y)), z(static_cast<T>(s)) {}\n\ntemplate <typename T, precision P>\ntemplate <typename A, typename B, precision Q>\nGLM_FUNC_QUALIFIER tvec3<T, P>::tvec3(A const& s, tvec2<B, Q> const& v)\n    : x(static_cast<T>(s)), y(static_cast<T>(v.x)), z(static_cast<T>(v.y)) {}\n\ntemplate <typename T, precision P>\ntemplate <typename U, precision Q>\nGLM_FUNC_QUALIFIER tvec3<T, P>::tvec3(tvec3<U, Q> const& v)\n    : x(static_cast<T>(v.x)), y(static_cast<T>(v.y)), z(static_cast<T>(v.z)) {}\n\ntemplate <typename T, precision P>\ntemplate <typename U, precision Q>\nGLM_FUNC_QUALIFIER tvec3<T, P>::tvec3(tvec4<U, Q> const& v)\n    : x(static_cast<T>(v.x)), y(static_cast<T>(v.y)), z(static_cast<T>(v.z)) {}\n\n//////////////////////////////////////\n// Unary arithmetic operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P>& tvec3<T, P>::operator=(tvec3<T, P> const& v) {\n  this->x = v.x;\n  this->y = v.y;\n  this->z = v.z;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec3<T, P>& tvec3<T, P>::operator=(tvec3<U, P> const& v) {\n  this->x = static_cast<T>(v.x);\n  this->y = static_cast<T>(v.y);\n  this->z = static_cast<T>(v.z);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec3<T, P>& tvec3<T, P>::operator+=(U s) {\n  this->x += static_cast<T>(s);\n  this->y += static_cast<T>(s);\n  this->z += static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec3<T, P>& tvec3<T, P>::operator+=(tvec3<U, P> const& v) {\n  this->x += static_cast<T>(v.x);\n  this->y += static_cast<T>(v.y);\n  this->z += static_cast<T>(v.z);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec3<T, P>& tvec3<T, P>::operator-=(U s) {\n  this->x -= static_cast<T>(s);\n  this->y -= static_cast<T>(s);\n  this->z -= static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec3<T, P>& tvec3<T, P>::operator-=(tvec3<U, P> const& v) {\n  this->x -= static_cast<T>(v.x);\n  this->y -= static_cast<T>(v.y);\n  this->z -= static_cast<T>(v.z);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec3<T, P>& tvec3<T, P>::operator*=(U s) {\n  this->x *= static_cast<T>(s);\n  this->y *= static_cast<T>(s);\n  this->z *= static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec3<T, P>& tvec3<T, P>::operator*=(tvec3<U, P> const& v) {\n  this->x *= static_cast<T>(v.x);\n  this->y *= static_cast<T>(v.y);\n  this->z *= static_cast<T>(v.z);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec3<T, P>& tvec3<T, P>::operator/=(U s) {\n  this->x /= static_cast<T>(s);\n  this->y /= static_cast<T>(s);\n  this->z /= static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec3<T, P>& tvec3<T, P>::operator/=(tvec3<U, P> const& v) {\n  this->x /= static_cast<T>(v.x);\n  this->y /= static_cast<T>(v.y);\n  this->z /= static_cast<T>(v.z);\n  return *this;\n}\n\n//////////////////////////////////////\n// Increment and decrement operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P>& tvec3<T, P>::operator++() {\n  ++this->x;\n  ++this->y;\n  ++this->z;\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P>& tvec3<T, P>::operator--() {\n  --this->x;\n  --this->y;\n  --this->z;\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> tvec3<T, P>::operator++(int) {\n  tvec3<T, P> Result(*this);\n  ++*this;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> tvec3<T, P>::operator--(int) {\n  tvec3<T, P> Result(*this);\n  --*this;\n  return Result;\n}\n\n//////////////////////////////////////\n// Boolean operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool operator==(tvec3<T, P> const& v1,\n                                   tvec3<T, P> const& v2) {\n  return (v1.x == v2.x) && (v1.y == v2.y) && (v1.z == v2.z);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool operator!=(tvec3<T, P> const& v1,\n                                   tvec3<T, P> const& v2) {\n  return (v1.x != v2.x) || (v1.y != v2.y) || (v1.z != v2.z);\n}\n\n//////////////////////////////////////\n// Unary bit operators\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec3<T, P>& tvec3<T, P>::operator%=(U s) {\n  this->x %= s;\n  this->y %= s;\n  this->z %= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec3<T, P>& tvec3<T, P>::operator%=(tvec3<U, P> const& v) {\n  this->x %= v.x;\n  this->y %= v.y;\n  this->z %= v.z;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec3<T, P>& tvec3<T, P>::operator&=(U s) {\n  this->x &= s;\n  this->y &= s;\n  this->z &= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec3<T, P>& tvec3<T, P>::operator&=(tvec3<U, P> const& v) {\n  this->x &= v.x;\n  this->y &= v.y;\n  this->z &= v.z;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec3<T, P>& tvec3<T, P>::operator|=(U s) {\n  this->x |= s;\n  this->y |= s;\n  this->z |= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec3<T, P>& tvec3<T, P>::operator|=(tvec3<U, P> const& v) {\n  this->x |= v.x;\n  this->y |= v.y;\n  this->z |= v.z;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec3<T, P>& tvec3<T, P>::operator^=(U s) {\n  this->x ^= s;\n  this->y ^= s;\n  this->z ^= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec3<T, P>& tvec3<T, P>::operator^=(tvec3<U, P> const& v) {\n  this->x ^= v.x;\n  this->y ^= v.y;\n  this->z ^= v.z;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec3<T, P>& tvec3<T, P>::operator<<=(U s) {\n  this->x <<= s;\n  this->y <<= s;\n  this->z <<= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec3<T, P>& tvec3<T, P>::operator<<=(tvec3<U, P> const& v) {\n  this->x <<= static_cast<T>(v.x);\n  this->y <<= static_cast<T>(v.y);\n  this->z <<= static_cast<T>(v.z);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec3<T, P>& tvec3<T, P>::operator>>=(U s) {\n  this->x >>= static_cast<T>(s);\n  this->y >>= static_cast<T>(s);\n  this->z >>= static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec3<T, P>& tvec3<T, P>::operator>>=(tvec3<U, P> const& v) {\n  this->x >>= static_cast<T>(v.x);\n  this->y >>= static_cast<T>(v.y);\n  this->z >>= static_cast<T>(v.z);\n  return *this;\n}\n\n//////////////////////////////////////\n// Binary arithmetic operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator+(tvec3<T, P> const& v, T const& s) {\n  return tvec3<T, P>(v.x + s, v.y + s, v.z + s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator+(T const& s, tvec3<T, P> const& v) {\n  return tvec3<T, P>(s + v.x, s + v.y, s + v.z);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator+(tvec3<T, P> const& v1,\n                                         tvec3<T, P> const& v2) {\n  return tvec3<T, P>(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z);\n}\n\n// operator-\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator-(tvec3<T, P> const& v, T const& s) {\n  return tvec3<T, P>(v.x - s, v.y - s, v.z - s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator-(T const& s, tvec3<T, P> const& v) {\n  return tvec3<T, P>(s - v.x, s - v.y, s - v.z);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator-(tvec3<T, P> const& v1,\n                                         tvec3<T, P> const& v2) {\n  return tvec3<T, P>(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z);\n}\n\n// operator*\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator*(tvec3<T, P> const& v, T const& s) {\n  return tvec3<T, P>(v.x * s, v.y * s, v.z * s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator*(T const& s, tvec3<T, P> const& v) {\n  return tvec3<T, P>(s * v.x, s * v.y, s * v.z);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator*(tvec3<T, P> const& v1,\n                                         tvec3<T, P> const& v2) {\n  return tvec3<T, P>(v1.x * v2.x, v1.y * v2.y, v1.z * v2.z);\n}\n\n// operator/\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator/(tvec3<T, P> const& v, T const& s) {\n  return tvec3<T, P>(v.x / s, v.y / s, v.z / s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator/(T const& s, tvec3<T, P> const& v) {\n  return tvec3<T, P>(s / v.x, s / v.y, s / v.z);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator/(tvec3<T, P> const& v1,\n                                         tvec3<T, P> const& v2) {\n  return tvec3<T, P>(v1.x / v2.x, v1.y / v2.y, v1.z / v2.z);\n}\n\n// Unary constant operators\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator-(tvec3<T, P> const& v) {\n  return tvec3<T, P>(-v.x, -v.y, -v.z);\n}\n\n//////////////////////////////////////\n// Binary bit operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator%(tvec3<T, P> const& v, T const& s) {\n  return tvec3<T, P>(v.x % s, v.y % s, v.z % s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator%(T const& s, tvec3<T, P> const& v) {\n  return tvec3<T, P>(s % v.x, s % v.y, s % v.z);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator%(tvec3<T, P> const& v1,\n                                         tvec3<T, P> const& v2) {\n  return tvec3<T, P>(v1.x % v2.x, v1.y % v2.y, v1.z % v2.z);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator&(tvec3<T, P> const& v, T const& s) {\n  return tvec3<T, P>(v.x & s, v.y & s, v.z & s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator&(T const& s, tvec3<T, P> const& v) {\n  return tvec3<T, P>(s & v.x, s & v.y, s & v.z);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator&(tvec3<T, P> const& v1,\n                                         tvec3<T, P> const& v2) {\n  return tvec3<T, P>(v1.x & v2.x, v1.y & v2.y, v1.z & v2.z);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator|(tvec3<T, P> const& v, T const& s) {\n  return tvec3<T, P>(v.x | s, v.y | s, v.z | s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator|(T const& s, tvec3<T, P> const& v) {\n  return tvec3<T, P>(s | v.x, s | v.y, s | v.z);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator|(tvec3<T, P> const& v1,\n                                         tvec3<T, P> const& v2) {\n  return tvec3<T, P>(v1.x | v2.x, v1.y | v2.y, v1.z | v2.z);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator^(tvec3<T, P> const& v, T const& s) {\n  return tvec3<T, P>(v.x ^ s, v.y ^ s, v.z ^ s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator^(T const& s, tvec3<T, P> const& v) {\n  return tvec3<T, P>(T(s) ^ v.x, T(s) ^ v.y, T(s) ^ v.z);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator^(tvec3<T, P> const& v1,\n                                         tvec3<T, P> const& v2) {\n  return tvec3<T, P>(v1.x ^ T(v2.x), v1.y ^ T(v2.y), v1.z ^ T(v2.z));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator<<(tvec3<T, P> const& v, T const& s) {\n  return tvec3<T, P>(v.x << T(s), v.y << T(s), v.z << T(s));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator<<(T const& s, tvec3<T, P> const& v) {\n  return tvec3<T, P>(T(s) << v.x, T(s) << v.y, T(s) << v.z);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator<<(tvec3<T, P> const& v1,\n                                          tvec3<T, P> const& v2) {\n  return tvec3<T, P>(v1.x << T(v2.x), v1.y << T(v2.y), v1.z << T(v2.z));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator>>(tvec3<T, P> const& v, T const& s) {\n  return tvec3<T, P>(v.x >> T(s), v.y >> T(s), v.z >> T(s));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator>>(T const& s, tvec3<T, P> const& v) {\n  return tvec3<T, P>(s >> T(v.x), s >> T(v.y), s >> T(v.z));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator>>(tvec3<T, P> const& v1,\n                                          tvec3<T, P> const& v2) {\n  return tvec3<T, P>(v1.x >> T(v2.x), v1.y >> T(v2.y), v1.z >> T(v2.z));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec3<T, P> operator~(tvec3<T, P> const& v) {\n  return tvec3<T, P>(~v.x, ~v.y, ~v.z);\n}\n\n}  // namespace detail\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_vec4.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_vec4.hpp\n/// @date 2008-08-22 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_core_type_gentype4\n#define glm_core_type_gentype4\n\n// #include \"../fwd.hpp\"\n#include \"setup.hpp\"\n#include \"type_vec.hpp\"\n#ifdef GLM_SWIZZLE\n#if GLM_HAS_ANONYMOUS_UNION\n#include \"_swizzle.hpp\"\n#else\n#include \"_swizzle_func.hpp\"\n#endif\n#endif  // GLM_SWIZZLE\n#include <cstddef>\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nstruct tvec4 {\n  //////////////////////////////////////\n  // Implementation detail\n\n  enum ctor { _null };\n\n  typedef tvec4<T, P> type;\n  typedef tvec4<bool, P> bool_type;\n  typedef T value_type;\n  typedef int size_type;\n\n  //////////////////////////////////////\n  // Helper\n\n  GLM_FUNC_DECL GLM_CONSTEXPR length_t length() const;\n\n  //////////////////////////////////////\n  // Data\n\n#if (GLM_HAS_ANONYMOUS_UNION && defined(GLM_SWIZZLE))\n  union {\n    struct {\n      T r, g, b, a;\n    };\n    struct {\n      T s, t, p, q;\n    };\n    struct {\n      T x, y, z, w;\n    };\n\n    _GLM_SWIZZLE4_2_MEMBERS(T, P, tvec2, x, y, z, w)\n    _GLM_SWIZZLE4_2_MEMBERS(T, P, tvec2, r, g, b, a)\n    _GLM_SWIZZLE4_2_MEMBERS(T, P, tvec2, s, t, p, q)\n    _GLM_SWIZZLE4_3_MEMBERS(T, P, tvec3, x, y, z, w)\n    _GLM_SWIZZLE4_3_MEMBERS(T, P, tvec3, r, g, b, a)\n    _GLM_SWIZZLE4_3_MEMBERS(T, P, tvec3, s, t, p, q)\n    _GLM_SWIZZLE4_4_MEMBERS(T, P, tvec4, x, y, z, w)\n    _GLM_SWIZZLE4_4_MEMBERS(T, P, tvec4, r, g, b, a)\n    _GLM_SWIZZLE4_4_MEMBERS(T, P, tvec4, s, t, p, q)\n  };\n#else\n  union {\n    T x, r, s;\n  };\n  union {\n    T y, g, t;\n  };\n  union {\n    T z, b, p;\n  };\n  union {\n    T w, a, q;\n  };\n\n#ifdef GLM_SWIZZLE\n  GLM_SWIZZLE_GEN_VEC_FROM_VEC4(T, P, detail::tvec4, detail::tvec2,\n                                detail::tvec3, detail::tvec4)\n#endif\n#endif  // GLM_LANG\n\n  //////////////////////////////////////\n  // Accesses\n\n  GLM_FUNC_DECL T& operator[](length_t i);\n  GLM_FUNC_DECL T const& operator[](length_t i) const;\n\n  //////////////////////////////////////\n  // Implicit basic constructors\n\n  GLM_FUNC_DECL tvec4();\n  GLM_FUNC_DECL tvec4(type const& v);\n  template <precision Q>\n  GLM_FUNC_DECL tvec4(tvec4<T, Q> const& v);\n\n  //////////////////////////////////////\n  // Explicit basic constructors\n\n  GLM_FUNC_DECL explicit tvec4(ctor);\n  GLM_FUNC_DECL explicit tvec4(T const& s);\n  GLM_FUNC_DECL tvec4(T const& s0, T const& s1, T const& s2, T const& s3);\n\n  //////////////////////////////////////\n  // Conversion scalar constructors\n\n  /// Explicit converions (From section 5.4.1 Conversion and scalar constructors\n  /// of GLSL 1.30.08 specification)\n  template <typename A, typename B, typename C, typename D>\n  GLM_FUNC_DECL tvec4(A const& x, B const& y, C const& z, D const& w);\n\n  //////////////////////////////////////\n  // Conversion vector constructors\n\n  //! Explicit conversions (From section 5.4.1 Conversion and scalar\n  //! constructors of GLSL 1.30.08 specification)\n  template <typename A, typename B, typename C, precision Q>\n  GLM_FUNC_DECL explicit tvec4(tvec2<A, Q> const& v, B const& s1, C const& s2);\n  //! Explicit conversions (From section 5.4.1 Conversion and scalar\n  //! constructors of GLSL 1.30.08 specification)\n  template <typename A, typename B, typename C, precision Q>\n  GLM_FUNC_DECL explicit tvec4(A const& s1, tvec2<B, Q> const& v, C const& s2);\n  //! Explicit conversions (From section 5.4.1 Conversion and scalar\n  //! constructors of GLSL 1.30.08 specification)\n  template <typename A, typename B, typename C, precision Q>\n  GLM_FUNC_DECL explicit tvec4(A const& s1, B const& s2, tvec2<C, Q> const& v);\n  //! Explicit conversions (From section 5.4.1 Conversion and scalar\n  //! constructors of GLSL 1.30.08 specification)\n  template <typename A, typename B, precision Q>\n  GLM_FUNC_DECL explicit tvec4(tvec3<A, Q> const& v, B const& s);\n  //! Explicit conversions (From section 5.4.1 Conversion and scalar\n  //! constructors of GLSL 1.30.08 specification)\n  template <typename A, typename B, precision Q>\n  GLM_FUNC_DECL explicit tvec4(A const& s, tvec3<B, Q> const& v);\n  //! Explicit conversions (From section 5.4.1 Conversion and scalar\n  //! constructors of GLSL 1.30.08 specification)\n  template <typename A, typename B, precision Q>\n  GLM_FUNC_DECL explicit tvec4(tvec2<A, Q> const& v1, tvec2<B, Q> const& v2);\n  //! Explicit conversions (From section 5.4.1 Conversion and scalar\n  //! constructors of GLSL 1.30.08 specification)\n  template <typename U, precision Q>\n  GLM_FUNC_DECL explicit tvec4(tvec4<U, Q> const& v);\n\n  //////////////////////////////////////\n  // Swizzle constructors\n\n#if (GLM_HAS_ANONYMOUS_UNION && defined(GLM_SWIZZLE))\n  template <int E0, int E1, int E2, int E3>\n  GLM_FUNC_DECL tvec4(\n      _swizzle<4, T, P, tvec4<T, P>, E0, E1, E2, E3> const& that) {\n    *this = that();\n  }\n\n  template <int E0, int E1, int F0, int F1>\n  GLM_FUNC_DECL tvec4(_swizzle<2, T, P, tvec2<T, P>, E0, E1, -1, -2> const& v,\n                      _swizzle<2, T, P, tvec2<T, P>, F0, F1, -1, -2> const& u) {\n    *this = tvec4<T, P>(v(), u());\n  }\n\n  template <int E0, int E1>\n  GLM_FUNC_DECL tvec4(T const& x, T const& y,\n                      _swizzle<2, T, P, tvec2<T, P>, E0, E1, -1, -2> const& v) {\n    *this = tvec4<T, P>(x, y, v());\n  }\n\n  template <int E0, int E1>\n  GLM_FUNC_DECL tvec4(T const& x,\n                      _swizzle<2, T, P, tvec2<T, P>, E0, E1, -1, -2> const& v,\n                      T const& w) {\n    *this = tvec4<T, P>(x, v(), w);\n  }\n\n  template <int E0, int E1>\n  GLM_FUNC_DECL tvec4(_swizzle<2, T, P, tvec2<T, P>, E0, E1, -1, -2> const& v,\n                      T const& z, T const& w) {\n    *this = tvec4<T, P>(v(), z, w);\n  }\n\n  template <int E0, int E1, int E2>\n  GLM_FUNC_DECL tvec4(_swizzle<3, T, P, tvec3<T, P>, E0, E1, E2, -1> const& v,\n                      T const& w) {\n    *this = tvec4<T, P>(v(), w);\n  }\n\n  template <int E0, int E1, int E2>\n  GLM_FUNC_DECL tvec4(T const& x,\n                      _swizzle<3, T, P, tvec3<T, P>, E0, E1, E2, -1> const& v) {\n    *this = tvec4<T, P>(x, v());\n  }\n#endif  //(GLM_HAS_ANONYMOUS_UNION && defined(GLM_SWIZZLE))\n\n  //////////////////////////////////////\n  // Unary arithmetic operators\n\n  GLM_FUNC_DECL tvec4<T, P>& operator=(tvec4<T, P> const& v);\n  template <typename U, precision Q>\n  GLM_FUNC_DECL tvec4<T, P>& operator=(tvec4<U, Q> const& v);\n\n  template <typename U>\n  GLM_FUNC_DECL tvec4<T, P>& operator+=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tvec4<T, P>& operator+=(tvec4<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec4<T, P>& operator-=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tvec4<T, P>& operator-=(tvec4<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec4<T, P>& operator*=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tvec4<T, P>& operator*=(tvec4<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec4<T, P>& operator/=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tvec4<T, P>& operator/=(tvec4<U, P> const& v);\n\n  //////////////////////////////////////\n  // Increment and decrement operators\n\n  GLM_FUNC_DECL tvec4<T, P>& operator++();\n  GLM_FUNC_DECL tvec4<T, P>& operator--();\n  GLM_FUNC_DECL tvec4<T, P> operator++(int);\n  GLM_FUNC_DECL tvec4<T, P> operator--(int);\n\n  //////////////////////////////////////\n  // Unary bit operators\n\n  template <typename U>\n  GLM_FUNC_DECL tvec4<T, P>& operator%=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tvec4<T, P>& operator%=(tvec4<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec4<T, P>& operator&=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tvec4<T, P>& operator&=(tvec4<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec4<T, P>& operator|=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tvec4<T, P>& operator|=(tvec4<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec4<T, P>& operator^=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tvec4<T, P>& operator^=(tvec4<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec4<T, P>& operator<<=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tvec4<T, P>& operator<<=(tvec4<U, P> const& v);\n  template <typename U>\n  GLM_FUNC_DECL tvec4<T, P>& operator>>=(U s);\n  template <typename U>\n  GLM_FUNC_DECL tvec4<T, P>& operator>>=(tvec4<U, P> const& v);\n};\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator+(tvec4<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator+(T const& s, tvec4<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator+(tvec4<T, P> const& v1,\n                                    tvec4<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator-(tvec4<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator-(T const& s, tvec4<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator-(tvec4<T, P> const& v1,\n                                    tvec4<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator*(tvec4<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator*(T const& s, tvec4<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator*(tvec4<T, P> const& v1,\n                                    tvec4<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator/(tvec4<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator/(T const& s, tvec4<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator/(tvec4<T, P> const& v1,\n                                    tvec4<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator-(tvec4<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL bool operator==(tvec4<T, P> const& v1, tvec4<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL bool operator!=(tvec4<T, P> const& v1, tvec4<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator%(tvec4<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator%(T const& s, tvec4<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator%(tvec4<T, P> const& v1,\n                                    tvec4<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator&(tvec4<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator&(T const& s, tvec4<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator&(tvec4<T, P> const& v1,\n                                    tvec4<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator|(tvec4<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator|(T const& s, tvec4<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator|(tvec4<T, P> const& v1,\n                                    tvec4<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator^(tvec4<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator^(T const& s, tvec4<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator^(tvec4<T, P> const& v1,\n                                    tvec4<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator<<(tvec4<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator<<(T const& s, tvec4<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator<<(tvec4<T, P> const& v1,\n                                     tvec4<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator>>(tvec4<T, P> const& v, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator>>(T const& s, tvec4<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator>>(tvec4<T, P> const& v1,\n                                     tvec4<T, P> const& v2);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL tvec4<T, P> operator~(tvec4<T, P> const& v);\n\n}  // namespace detail\n}  // namespace glm\n\n#ifndef GLM_EXTERNAL_TEMPLATE\n#include \"type_vec4.inl\"\n#endif  // GLM_EXTERNAL_TEMPLATE\n\n#endif  // glm_core_type_gentype4\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/detail/type_vec4.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/core/type_tvec4.inl\n/// @date 2008-08-23 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER GLM_CONSTEXPR length_t tvec4<T, P>::length() const {\n  return 4;\n}\n\n//////////////////////////////////////\n// Accesses\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T& tvec4<T, P>::operator[](length_t i) {\n  assert(i >= 0 && i < this->length());\n  return (&x)[i];\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T const& tvec4<T, P>::operator[](length_t i) const {\n  assert(i >= 0 && i < this->length());\n  return (&x)[i];\n}\n\n//////////////////////////////////////\n// Implicit basic constructors\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P>::tvec4() : x(0), y(0), z(0), w(0) {}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P>::tvec4(tvec4<T, P> const& v)\n    : x(v.x), y(v.y), z(v.z), w(v.w) {}\n\ntemplate <typename T, precision P>\ntemplate <precision Q>\nGLM_FUNC_QUALIFIER tvec4<T, P>::tvec4(tvec4<T, Q> const& v)\n    : x(v.x), y(v.y), z(v.z), w(v.w) {}\n\n//////////////////////////////////////\n// Explicit basic constructors\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P>::tvec4(ctor) {}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P>::tvec4(T const& s) : x(s), y(s), z(s), w(s) {}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P>::tvec4(T const& s1, T const& s2, T const& s3,\n                                      T const& s4)\n    : x(s1), y(s2), z(s3), w(s4) {}\n\n//////////////////////////////////////\n// Conversion scalar constructors\n\ntemplate <typename T, precision P>\ntemplate <typename A, typename B, typename C, typename D>\nGLM_FUNC_QUALIFIER tvec4<T, P>::tvec4(A const& x, B const& y, C const& z,\n                                      D const& w)\n    : x(static_cast<T>(x)),\n      y(static_cast<T>(y)),\n      z(static_cast<T>(z)),\n      w(static_cast<T>(w)) {}\n\ntemplate <typename T, precision P>\ntemplate <typename U, precision Q>\nGLM_FUNC_QUALIFIER tvec4<T, P>::tvec4(tvec4<U, Q> const& v)\n    : x(static_cast<T>(v.x)),\n      y(static_cast<T>(v.y)),\n      z(static_cast<T>(v.z)),\n      w(static_cast<T>(v.w)) {}\n\n//////////////////////////////////////\n// Conversion vector constructors\n\ntemplate <typename T, precision P>\ntemplate <typename A, typename B, typename C, precision Q>\nGLM_FUNC_QUALIFIER tvec4<T, P>::tvec4(tvec2<A, Q> const& v, B const& s1,\n                                      C const& s2)\n    : x(static_cast<T>(v.x)),\n      y(static_cast<T>(v.y)),\n      z(static_cast<T>(s1)),\n      w(static_cast<T>(s2)) {}\n\ntemplate <typename T, precision P>\ntemplate <typename A, typename B, typename C, precision Q>\nGLM_FUNC_QUALIFIER tvec4<T, P>::tvec4(A const& s1, tvec2<B, Q> const& v,\n                                      C const& s2)\n    : x(static_cast<T>(s1)),\n      y(static_cast<T>(v.x)),\n      z(static_cast<T>(v.y)),\n      w(static_cast<T>(s2)) {}\n\ntemplate <typename T, precision P>\ntemplate <typename A, typename B, typename C, precision Q>\nGLM_FUNC_QUALIFIER tvec4<T, P>::tvec4(A const& s1, B const& s2,\n                                      tvec2<C, Q> const& v)\n    : x(static_cast<T>(s1)),\n      y(static_cast<T>(s2)),\n      z(static_cast<T>(v.x)),\n      w(static_cast<T>(v.y)) {}\n\ntemplate <typename T, precision P>\ntemplate <typename A, typename B, precision Q>\nGLM_FUNC_QUALIFIER tvec4<T, P>::tvec4(tvec3<A, Q> const& v, B const& s)\n    : x(static_cast<T>(v.x)),\n      y(static_cast<T>(v.y)),\n      z(static_cast<T>(v.z)),\n      w(static_cast<T>(s)) {}\n\ntemplate <typename T, precision P>\ntemplate <typename A, typename B, precision Q>\nGLM_FUNC_QUALIFIER tvec4<T, P>::tvec4(A const& s, tvec3<B, Q> const& v)\n    : x(static_cast<T>(s)),\n      y(static_cast<T>(v.x)),\n      z(static_cast<T>(v.y)),\n      w(static_cast<T>(v.z)) {}\n\ntemplate <typename T, precision P>\ntemplate <typename A, typename B, precision Q>\nGLM_FUNC_QUALIFIER tvec4<T, P>::tvec4(tvec2<A, Q> const& v1,\n                                      tvec2<B, Q> const& v2)\n    : x(static_cast<T>(v1.x)),\n      y(static_cast<T>(v1.y)),\n      z(static_cast<T>(v2.x)),\n      w(static_cast<T>(v2.y)) {}\n\n//////////////////////////////////////\n// Unary arithmetic operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P>& tvec4<T, P>::operator=(tvec4<T, P> const& v) {\n  this->x = v.x;\n  this->y = v.y;\n  this->z = v.z;\n  this->w = v.w;\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U, precision Q>\nGLM_FUNC_QUALIFIER tvec4<T, P>& tvec4<T, P>::operator=(tvec4<U, Q> const& v) {\n  this->x = static_cast<T>(v.x);\n  this->y = static_cast<T>(v.y);\n  this->z = static_cast<T>(v.z);\n  this->w = static_cast<T>(v.w);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec4<T, P>& tvec4<T, P>::operator+=(U s) {\n  this->x += static_cast<T>(s);\n  this->y += static_cast<T>(s);\n  this->z += static_cast<T>(s);\n  this->w += static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec4<T, P>& tvec4<T, P>::operator+=(tvec4<U, P> const& v) {\n  this->x += static_cast<T>(v.x);\n  this->y += static_cast<T>(v.y);\n  this->z += static_cast<T>(v.z);\n  this->w += static_cast<T>(v.w);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec4<T, P>& tvec4<T, P>::operator-=(U s) {\n  this->x -= static_cast<T>(s);\n  this->y -= static_cast<T>(s);\n  this->z -= static_cast<T>(s);\n  this->w -= static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec4<T, P>& tvec4<T, P>::operator-=(tvec4<U, P> const& v) {\n  this->x -= static_cast<T>(v.x);\n  this->y -= static_cast<T>(v.y);\n  this->z -= static_cast<T>(v.z);\n  this->w -= static_cast<T>(v.w);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec4<T, P>& tvec4<T, P>::operator*=(U s) {\n  this->x *= static_cast<T>(s);\n  this->y *= static_cast<T>(s);\n  this->z *= static_cast<T>(s);\n  this->w *= static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec4<T, P>& tvec4<T, P>::operator*=(tvec4<U, P> const& v) {\n  this->x *= static_cast<T>(v.x);\n  this->y *= static_cast<T>(v.y);\n  this->z *= static_cast<T>(v.z);\n  this->w *= static_cast<T>(v.w);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec4<T, P>& tvec4<T, P>::operator/=(U s) {\n  this->x /= static_cast<T>(s);\n  this->y /= static_cast<T>(s);\n  this->z /= static_cast<T>(s);\n  this->w /= static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec4<T, P>& tvec4<T, P>::operator/=(tvec4<U, P> const& v) {\n  this->x /= static_cast<T>(v.x);\n  this->y /= static_cast<T>(v.y);\n  this->z /= static_cast<T>(v.z);\n  this->w /= static_cast<T>(v.w);\n  return *this;\n}\n\n//////////////////////////////////////\n// Increment and decrement operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P>& tvec4<T, P>::operator++() {\n  ++this->x;\n  ++this->y;\n  ++this->z;\n  ++this->w;\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P>& tvec4<T, P>::operator--() {\n  --this->x;\n  --this->y;\n  --this->z;\n  --this->w;\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> tvec4<T, P>::operator++(int) {\n  tvec4<T, P> Result(*this);\n  ++*this;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> tvec4<T, P>::operator--(int) {\n  tvec4<T, P> Result(*this);\n  --*this;\n  return Result;\n}\n\n//////////////////////////////////////\n// Unary bit operators\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec4<T, P>& tvec4<T, P>::operator%=(U s) {\n  this->x %= static_cast<T>(s);\n  this->y %= static_cast<T>(s);\n  this->z %= static_cast<T>(s);\n  this->w %= static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec4<T, P>& tvec4<T, P>::operator%=(tvec4<U, P> const& v) {\n  this->x %= static_cast<T>(v.x);\n  this->y %= static_cast<T>(v.y);\n  this->z %= static_cast<T>(v.z);\n  this->w %= static_cast<T>(v.w);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec4<T, P>& tvec4<T, P>::operator&=(U s) {\n  this->x &= static_cast<T>(s);\n  this->y &= static_cast<T>(s);\n  this->z &= static_cast<T>(s);\n  this->w &= static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec4<T, P>& tvec4<T, P>::operator&=(tvec4<U, P> const& v) {\n  this->x &= static_cast<T>(v.x);\n  this->y &= static_cast<T>(v.y);\n  this->z &= static_cast<T>(v.z);\n  this->w &= static_cast<T>(v.w);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec4<T, P>& tvec4<T, P>::operator|=(U s) {\n  this->x |= static_cast<T>(s);\n  this->y |= static_cast<T>(s);\n  this->z |= static_cast<T>(s);\n  this->w |= static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec4<T, P>& tvec4<T, P>::operator|=(tvec4<U, P> const& v) {\n  this->x |= static_cast<T>(v.x);\n  this->y |= static_cast<T>(v.y);\n  this->z |= static_cast<T>(v.z);\n  this->w |= static_cast<T>(v.w);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec4<T, P>& tvec4<T, P>::operator^=(U s) {\n  this->x ^= static_cast<T>(s);\n  this->y ^= static_cast<T>(s);\n  this->z ^= static_cast<T>(s);\n  this->w ^= static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec4<T, P>& tvec4<T, P>::operator^=(tvec4<U, P> const& v) {\n  this->x ^= static_cast<T>(v.x);\n  this->y ^= static_cast<T>(v.y);\n  this->z ^= static_cast<T>(v.z);\n  this->w ^= static_cast<T>(v.w);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec4<T, P>& tvec4<T, P>::operator<<=(U s) {\n  this->x <<= static_cast<T>(s);\n  this->y <<= static_cast<T>(s);\n  this->z <<= static_cast<T>(s);\n  this->w <<= static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec4<T, P>& tvec4<T, P>::operator<<=(tvec4<U, P> const& v) {\n  this->x <<= static_cast<T>(v.x);\n  this->y <<= static_cast<T>(v.y);\n  this->z <<= static_cast<T>(v.z);\n  this->w <<= static_cast<T>(v.w);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec4<T, P>& tvec4<T, P>::operator>>=(U s) {\n  this->x >>= static_cast<T>(s);\n  this->y >>= static_cast<T>(s);\n  this->z >>= static_cast<T>(s);\n  this->w >>= static_cast<T>(s);\n  return *this;\n}\n\ntemplate <typename T, precision P>\ntemplate <typename U>\nGLM_FUNC_QUALIFIER tvec4<T, P>& tvec4<T, P>::operator>>=(tvec4<U, P> const& v) {\n  this->x >>= static_cast<T>(v.x);\n  this->y >>= static_cast<T>(v.y);\n  this->z >>= static_cast<T>(v.z);\n  this->w >>= static_cast<T>(v.w);\n  return *this;\n}\n\n//////////////////////////////////////\n// Binary arithmetic operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator+(tvec4<T, P> const& v, T const& s) {\n  return tvec4<T, P>(v.x + s, v.y + s, v.z + s, v.w + s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator+(T const& s, tvec4<T, P> const& v) {\n  return tvec4<T, P>(s + v.x, s + v.y, s + v.z, s + v.w);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator+(tvec4<T, P> const& v1,\n                                         tvec4<T, P> const& v2) {\n  return tvec4<T, P>(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z, v1.w + v2.w);\n}\n\n// operator-\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator-(tvec4<T, P> const& v, T const& s) {\n  return tvec4<T, P>(v.x - s, v.y - s, v.z - s, v.w - s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator-(T const& s, tvec4<T, P> const& v) {\n  return tvec4<T, P>(s - v.x, s - v.y, s - v.z, s - v.w);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator-(tvec4<T, P> const& v1,\n                                         tvec4<T, P> const& v2) {\n  return tvec4<T, P>(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z, v1.w - v2.w);\n}\n\n// operator*\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator*(tvec4<T, P> const& v, T const& s) {\n  return tvec4<T, P>(v.x * s, v.y * s, v.z * s, v.w * s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator*(T const& s, tvec4<T, P> const& v) {\n  return tvec4<T, P>(s * v.x, s * v.y, s * v.z, s * v.w);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator*(tvec4<T, P> const& v1,\n                                         tvec4<T, P> const& v2) {\n  return tvec4<T, P>(v1.x * v2.x, v1.y * v2.y, v1.z * v2.z, v1.w * v2.w);\n}\n\n// operator/\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator/(tvec4<T, P> const& v, T const& s) {\n  return tvec4<T, P>(v.x / s, v.y / s, v.z / s, v.w / s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator/(T const& s, tvec4<T, P> const& v) {\n  return tvec4<T, P>(s / v.x, s / v.y, s / v.z, s / v.w);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator/(tvec4<T, P> const& v1,\n                                         tvec4<T, P> const& v2) {\n  return tvec4<T, P>(v1.x / v2.x, v1.y / v2.y, v1.z / v2.z, v1.w / v2.w);\n}\n\n// Unary constant operators\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator-(tvec4<T, P> const& v) {\n  return tvec4<T, P>(-v.x, -v.y, -v.z, -v.w);\n}\n\n//////////////////////////////////////\n// Boolean operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool operator==(tvec4<T, P> const& v1,\n                                   tvec4<T, P> const& v2) {\n  return (v1.x == v2.x) && (v1.y == v2.y) && (v1.z == v2.z) && (v1.w == v2.w);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool operator!=(tvec4<T, P> const& v1,\n                                   tvec4<T, P> const& v2) {\n  return (v1.x != v2.x) || (v1.y != v2.y) || (v1.z != v2.z) || (v1.w != v2.w);\n}\n\n//////////////////////////////////////\n// Binary bit operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator%(tvec4<T, P> const& v, T const& s) {\n  return tvec4<T, P>(v.x % s, v.y % s, v.z % s, v.w % s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator%(T const& s, tvec4<T, P> const& v) {\n  return tvec4<T, P>(s % v.x, s % v.y, s % v.z, s % v.w);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator%(tvec4<T, P> const& v1,\n                                         tvec4<T, P> const& v2) {\n  return tvec4<T, P>(v1.x % v2.x, v1.y % v2.y, v1.z % v2.z, v1.w % v2.w);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator&(tvec4<T, P> const& v, T const& s) {\n  return tvec4<T, P>(v.x & s, v.y & s, v.z & s, v.w & s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator&(T const& s, tvec4<T, P> const& v) {\n  return tvec4<T, P>(s & v.x, s & v.y, s & v.z, s & v.w);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator&(tvec4<T, P> const& v1,\n                                         tvec4<T, P> const& v2) {\n  return tvec4<T, P>(v1.x & v2.x, v1.y & v2.y, v1.z & v2.z, v1.w & v2.w);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator|(tvec4<T, P> const& v, T const& s) {\n  return tvec4<T, P>(v.x | s, v.y | s, v.z | s, v.w | s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator|(T const& s, tvec4<T, P> const& v) {\n  return tvec4<T, P>(s | v.x, s | v.y, s | v.z, s | v.w);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator|(tvec4<T, P> const& v1,\n                                         tvec4<T, P> const& v2) {\n  return tvec4<T, P>(v1.x | v2.x, v1.y | v2.y, v1.z | v2.z, v1.w | v2.w);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator^(tvec4<T, P> const& v, T const& s) {\n  return tvec4<T, P>(v.x ^ s, v.y ^ s, v.z ^ s, v.w ^ s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator^(T const& s, tvec4<T, P> const& v) {\n  return tvec4<T, P>(s ^ v.x, s ^ v.y, s ^ v.z, s ^ v.w);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator^(tvec4<T, P> const& v1,\n                                         tvec4<T, P> const& v2) {\n  return tvec4<T, P>(v1.x ^ v2.x, v1.y ^ v2.y, v1.z ^ v2.z, v1.w ^ v2.w);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator<<(tvec4<T, P> const& v, T const& s) {\n  return tvec4<T, P>(v.x << s, v.y << s, v.z << s, v.w << s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator<<(T const& s, tvec4<T, P> const& v) {\n  return tvec4<T, P>(s << v.x, s << v.y, s << v.z, s << v.w);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator<<(tvec4<T, P> const& v1,\n                                          tvec4<T, P> const& v2) {\n  return tvec4<T, P>(v1.x << v2.x, v1.y << v2.y, v1.z << v2.z, v1.w << v2.w);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator>>(tvec4<T, P> const& v, T const& s) {\n  return tvec4<T, P>(v.x >> s, v.y >> s, v.z >> s, v.w >> s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator>>(T const& s, tvec4<T, P> const& v) {\n  return tvec4<T, P>(s >> v.x, s >> v.y, s >> v.z, s >> v.w);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator>>(tvec4<T, P> const& v1,\n                                          tvec4<T, P> const& v2) {\n  return tvec4<T, P>(v1.x >> v2.x, v1.y >> v2.y, v1.z >> v2.z, v1.w >> v2.w);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tvec4<T, P> operator~(tvec4<T, P> const& v) {\n  return tvec4<T, P>(~v.x, ~v.y, ~v.z, ~v.w);\n}\n\n}  // namespace detail\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/exponential.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/exponential.hpp\n/// @date 2013-12-24 / 2013-12-24\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_EXPONENTIAL_INCLUDED\n#define GLM_EXPONENTIAL_INCLUDED\n\n#include \"detail/func_exponential.hpp\"\n\n#endif  // GLM_EXPONENTIAL_INCLUDED\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/ext.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @file glm/glm.hpp\n/// @date 2009-05-01 / 2011-05-16\n/// @author Christophe Riccio\n///\n/// @ref core (Dependence)\n///\n/// @defgroup gtc GTC Extensions (Stable)\n///\n/// @brief Functions and types that the GLSL specification doesn't define, but\n/// useful to have for a C++ program.\n///\n/// GTC extensions aim to be stable.\n///\n/// Even if it's highly unrecommended, it's possible to include all the\n/// extensions at once by including <glm/ext.hpp>. Otherwise, each extension\n/// needs to be included  a specific file.\n///\n/// @defgroup gtx GTX Extensions (Experimental)\n///\n/// @brief Functions and types that the GLSL specification doesn't define, but\n/// useful to have for a C++ program.\n///\n/// Experimental extensions are useful functions and types, but the development\n/// of their API and functionality is not necessarily stable. They can change\n/// substantially between versions. Backwards compatibility is not much of an\n/// issue for them.\n///\n/// Even if it's highly unrecommended, it's possible to include all the\n/// extensions at once by including <glm/ext.hpp>. Otherwise, each extension\n/// needs to be included  a specific file.\n///\n/// @defgroup virtrev VIRTREV Extensions\n///\n/// @brief Extensions develop and maintain by Mathieu [matrem] Roumillac\n/// (http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showprofile&User=22660).\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_EXT_INCLUDED\n#define GLM_EXT_INCLUDED\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_EXT_INCLUDED_DISPLAYED))\n#define GLM_MESSAGE_EXT_INCLUDED_DISPLAYED\n#pragma message(\"GLM: All extensions included (not recommanded)\")\n#endif  // GLM_MESSAGES\n\n#include \"./gtc/constants.hpp\"\n#include \"./gtc/epsilon.hpp\"\n#include \"./gtc/matrix_access.hpp\"\n#include \"./gtc/matrix_integer.hpp\"\n#include \"./gtc/matrix_inverse.hpp\"\n#include \"./gtc/matrix_transform.hpp\"\n#include \"./gtc/noise.hpp\"\n#include \"./gtc/packing.hpp\"\n#include \"./gtc/quaternion.hpp\"\n#include \"./gtc/random.hpp\"\n#include \"./gtc/reciprocal.hpp\"\n#include \"./gtc/type_precision.hpp\"\n#include \"./gtc/type_ptr.hpp\"\n#include \"./gtc/ulp.hpp\"\n#include \"./gtx/associated_min_max.hpp\"\n#include \"./gtx/bit.hpp\"\n#include \"./gtx/closest_point.hpp\"\n#include \"./gtx/color_space.hpp\"\n#include \"./gtx/color_space_YCoCg.hpp\"\n#include \"./gtx/compatibility.hpp\"\n#include \"./gtx/component_wise.hpp\"\n#include \"./gtx/dual_quaternion.hpp\"\n#include \"./gtx/euler_angles.hpp\"\n#include \"./gtx/extend.hpp\"\n#include \"./gtx/extented_min_max.hpp\"\n#include \"./gtx/fast_exponential.hpp\"\n#include \"./gtx/fast_square_root.hpp\"\n#include \"./gtx/fast_trigonometry.hpp\"\n#include \"./gtx/gradient_paint.hpp\"\n#include \"./gtx/handed_coordinate_space.hpp\"\n#include \"./gtx/inertia.hpp\"\n#include \"./gtx/int_10_10_10_2.hpp\"\n#include \"./gtx/integer.hpp\"\n#include \"./gtx/intersect.hpp\"\n#include \"./gtx/log_base.hpp\"\n#include \"./gtx/matrix_cross_product.hpp\"\n#include \"./gtx/matrix_interpolation.hpp\"\n#include \"./gtx/matrix_major_storage.hpp\"\n#include \"./gtx/matrix_operation.hpp\"\n#include \"./gtx/matrix_query.hpp\"\n#include \"./gtx/mixed_product.hpp\"\n#include \"./gtx/multiple.hpp\"\n#include \"./gtx/norm.hpp\"\n#include \"./gtx/normal.hpp\"\n#include \"./gtx/normalize_dot.hpp\"\n#include \"./gtx/number_precision.hpp\"\n#include \"./gtx/optimum_pow.hpp\"\n#include \"./gtx/orthonormalize.hpp\"\n#include \"./gtx/perpendicular.hpp\"\n#include \"./gtx/polar_coordinates.hpp\"\n#include \"./gtx/projection.hpp\"\n#include \"./gtx/quaternion.hpp\"\n#include \"./gtx/raw_data.hpp\"\n#include \"./gtx/rotate_vector.hpp\"\n#include \"./gtx/spline.hpp\"\n#include \"./gtx/std_based_type.hpp\"\n#if (!(GLM_COMPILER & GLM_COMPILER_CUDA))\n#include \"./gtx/string_cast.hpp\"\n#endif\n#include \"./gtx/transform.hpp\"\n#include \"./gtx/transform2.hpp\"\n#include \"./gtx/vec1.hpp\"\n#include \"./gtx/vector_angle.hpp\"\n#include \"./gtx/vector_query.hpp\"\n#include \"./gtx/wrap.hpp\"\n\n#if (GLM_ARCH & GLM_ARCH_SSE2)\n#include \"./gtx/simd_mat4.hpp\"\n#include \"./gtx/simd_vec4.hpp\"\n#endif\n\n#endif  // GLM_EXT_INCLUDED\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/fwd.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/fwd.hpp\n/// @date 2013-03-30 / 2013-03-31\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_FWD_INCLUDED\n#define GLM_FWD_INCLUDED\n\n#include \"detail/type_float.hpp\"\n#include \"detail/type_int.hpp\"\n#include \"detail/type_mat.hpp\"\n#include \"detail/type_vec.hpp\"\n\n//////////////////////\n// GLM_GTC_quaternion\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nstruct tquat;\n}  // namespace detail\n\n/// Quaternion of low single-precision floating-point numbers.\n///\n/// @see gtc_quaternion\ntypedef detail::tquat<float, lowp> lowp_quat;\n\n/// Quaternion of medium single-precision floating-point numbers.\n///\n/// @see gtc_quaternion\ntypedef detail::tquat<float, mediump> mediump_quat;\n\n/// Quaternion of high single-precision floating-point numbers.\n///\n/// @see gtc_quaternion\ntypedef detail::tquat<float, highp> highp_quat;\n\n#if (defined(GLM_PRECISION_HIGHP_FLOAT) &&    \\\n     !defined(GLM_PRECISION_MEDIUMP_FLOAT) && \\\n     !defined(GLM_PRECISION_LOWP_FLOAT))\ntypedef highp_quat quat;\n#elif (!defined(GLM_PRECISION_HIGHP_FLOAT) &&  \\\n       defined(GLM_PRECISION_MEDIUMP_FLOAT) && \\\n       !defined(GLM_PRECISION_LOWP_FLOAT))\ntypedef mediump_quat quat;\n#elif (!defined(GLM_PRECISION_HIGHP_FLOAT) &&   \\\n       !defined(GLM_PRECISION_MEDIUMP_FLOAT) && \\\n       defined(GLM_PRECISION_LOWP_FLOAT))\ntypedef lowp_quat quat;\n#elif (!defined(GLM_PRECISION_HIGHP_FLOAT) &&   \\\n       !defined(GLM_PRECISION_MEDIUMP_FLOAT) && \\\n       !defined(GLM_PRECISION_LOWP_FLOAT))\n/// Quaternion of default single-precision floating-point numbers.\ntypedef highp_quat quat;\n#endif\n\n/// Quaternion of low single-precision floating-point numbers.\n///\n/// @see gtc_quaternion\ntypedef lowp_quat lowp_fquat;\n\n/// Quaternion of medium single-precision floating-point numbers.\n///\n/// @see gtc_quaternion\ntypedef mediump_quat mediump_fquat;\n\n/// Quaternion of high single-precision floating-point numbers.\n///\n/// @see gtc_quaternion\ntypedef highp_quat highp_fquat;\n\n/// Quaternion of default single-precision floating-point numbers.\n///\n/// @see gtc_quaternion\ntypedef quat fquat;\n\n/// Quaternion of low double-precision floating-point numbers.\n///\n/// @see gtc_quaternion\ntypedef detail::tquat<double, lowp> lowp_dquat;\n\n/// Quaternion of medium double-precision floating-point numbers.\n///\n/// @see gtc_quaternion\ntypedef detail::tquat<double, mediump> mediump_dquat;\n\n/// Quaternion of high double-precision floating-point numbers.\n///\n/// @see gtc_quaternion\ntypedef detail::tquat<double, highp> highp_dquat;\n\n#if (defined(GLM_PRECISION_HIGHP_DOUBLE) &&    \\\n     !defined(GLM_PRECISION_MEDIUMP_DOUBLE) && \\\n     !defined(GLM_PRECISION_LOWP_DOUBLE))\ntypedef highp_dquat dquat;\n#elif (!defined(GLM_PRECISION_HIGHP_DOUBLE) &&  \\\n       defined(GLM_PRECISION_MEDIUMP_DOUBLE) && \\\n       !defined(GLM_PRECISION_LOWP_DOUBLE))\ntypedef mediump_dquat dquat;\n#elif (!defined(GLM_PRECISION_HIGHP_DOUBLE) &&   \\\n       !defined(GLM_PRECISION_MEDIUMP_DOUBLE) && \\\n       defined(GLM_PRECISION_LOWP_DOUBLE))\ntypedef lowp_dquat dquat;\n#elif (!defined(GLM_PRECISION_HIGHP_DOUBLE) &&   \\\n       !defined(GLM_PRECISION_MEDIUMP_DOUBLE) && \\\n       !defined(GLM_PRECISION_LOWP_DOUBLE))\n/// Quaternion of default double-precision floating-point numbers.\n///\n/// @see gtc_quaternion\ntypedef highp_dquat dquat;\n#endif\n\n}  // namespace glm\n\n//////////////////////\n// GLM_GTC_precision\nnamespace glm {\n/// @addtogroup gtc_type_precision\n/// @{\n\n/// Low precision 8 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int8 lowp_int8;\n\n/// Low precision 16 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int16 lowp_int16;\n\n/// Low precision 32 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int32 lowp_int32;\n\n/// Low precision 64 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int64 lowp_int64;\n\n/// Low precision 8 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int8 lowp_int8_t;\n\n/// Low precision 16 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int16 lowp_int16_t;\n\n/// Low precision 32 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int32 lowp_int32_t;\n\n/// Low precision 64 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int64 lowp_int64_t;\n\n/// Low precision 8 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int8 lowp_i8;\n\n/// Low precision 16 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int16 lowp_i16;\n\n/// Low precision 32 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int32 lowp_i32;\n\n/// Low precision 64 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int64 lowp_i64;\n\n/// Medium precision 8 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int8 mediump_int8;\n\n/// Medium precision 16 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int16 mediump_int16;\n\n/// Medium precision 32 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int32 mediump_int32;\n\n/// Medium precision 64 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int64 mediump_int64;\n\n/// Medium precision 8 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int8 mediump_int8_t;\n\n/// Medium precision 16 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int16 mediump_int16_t;\n\n/// Medium precision 32 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int32 mediump_int32_t;\n\n/// Medium precision 64 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int64 mediump_int64_t;\n\n/// Medium precision 8 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int8 mediump_i8;\n\n/// Medium precision 16 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int16 mediump_i16;\n\n/// Medium precision 32 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int32 mediump_i32;\n\n/// Medium precision 64 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int64 mediump_i64;\n\n/// High precision 8 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int8 highp_int8;\n\n/// High precision 16 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int16 highp_int16;\n\n/// High precision 32 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int32 highp_int32;\n\n/// High precision 64 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int64 highp_int64;\n\n/// High precision 8 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int8 highp_int8_t;\n\n/// High precision 16 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int16 highp_int16_t;\n\n/// 32 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int32 highp_int32_t;\n\n/// High precision 64 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int64 highp_int64_t;\n\n/// High precision 8 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int8 highp_i8;\n\n/// High precision 16 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int16 highp_i16;\n\n/// High precision 32 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int32 highp_i32;\n\n/// High precision 64 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int64 highp_i64;\n\n/// 8 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int8 int8;\n\n/// 16 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int16 int16;\n\n/// 32 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int32 int32;\n\n/// 64 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int64 int64;\n\n/// 8 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int8 int8_t;\n\n/// 16 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int16 int16_t;\n\n/// 32 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int32 int32_t;\n\n/// 64 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int64 int64_t;\n\n/// 8 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int8 i8;\n\n/// 16 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int16 i16;\n\n/// 32 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int32 i32;\n\n/// 64 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int64 i64;\n\n/// Low precision 8 bit signed integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<i8, lowp> lowp_i8vec1;\n\n/// Low precision 8 bit signed integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<i8, lowp> lowp_i8vec2;\n\n/// Low precision 8 bit signed integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<i8, lowp> lowp_i8vec3;\n\n/// Low precision 8 bit signed integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<i8, lowp> lowp_i8vec4;\n\n/// Medium precision 8 bit signed integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<i8, mediump> mediump_i8vec1;\n\n/// Medium precision 8 bit signed integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<i8, mediump> mediump_i8vec2;\n\n/// Medium precision 8 bit signed integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<i8, mediump> mediump_i8vec3;\n\n/// Medium precision 8 bit signed integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<i8, mediump> mediump_i8vec4;\n\n/// High precision 8 bit signed integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<i8, highp> highp_i8vec1;\n\n/// High precision 8 bit signed integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<i8, highp> highp_i8vec2;\n\n/// High precision 8 bit signed integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<i8, highp> highp_i8vec3;\n\n/// High precision 8 bit signed integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<i8, highp> highp_i8vec4;\n\n#if (defined(GLM_PRECISION_LOWP_INT))\ntypedef lowp_i8vec1 i8vec1;\ntypedef lowp_i8vec2 i8vec2;\ntypedef lowp_i8vec3 i8vec3;\ntypedef lowp_i8vec4 i8vec4;\n#elif (defined(GLM_PRECISION_MEDIUMP_INT))\ntypedef mediump_i8vec1 i8vec1;\ntypedef mediump_i8vec2 i8vec2;\ntypedef mediump_i8vec3 i8vec3;\ntypedef mediump_i8vec4 i8vec4;\n#else\n/// Default precision 8 bit signed integer scalar type.\n/// @see gtc_type_precision\ntypedef highp_i8vec1 i8vec1;\n\n/// Default precision 8 bit signed integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef highp_i8vec2 i8vec2;\n\n/// Default precision 8 bit signed integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef highp_i8vec3 i8vec3;\n\n/// Default precision 8 bit signed integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef highp_i8vec4 i8vec4;\n#endif\n\n/// Low precision 16 bit signed integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<i16, lowp> lowp_i16vec1;\n\n/// Low precision 16 bit signed integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<i16, lowp> lowp_i16vec2;\n\n/// Low precision 16 bit signed integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<i16, lowp> lowp_i16vec3;\n\n/// Low precision 16 bit signed integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<i16, lowp> lowp_i16vec4;\n\n/// Medium precision 16 bit signed integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<i16, mediump> mediump_i16vec1;\n\n/// Medium precision 16 bit signed integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<i16, mediump> mediump_i16vec2;\n\n/// Medium precision 16 bit signed integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<i16, mediump> mediump_i16vec3;\n\n/// Medium precision 16 bit signed integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<i16, mediump> mediump_i16vec4;\n\n/// High precision 16 bit signed integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<i16, highp> highp_i16vec1;\n\n/// High precision 16 bit signed integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<i16, highp> highp_i16vec2;\n\n/// High precision 16 bit signed integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<i16, highp> highp_i16vec3;\n\n/// High precision 16 bit signed integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<i16, highp> highp_i16vec4;\n\n#if (defined(GLM_PRECISION_LOWP_INT))\ntypedef lowp_i16vec1 i16vec1;\ntypedef lowp_i16vec2 i16vec2;\ntypedef lowp_i16vec3 i16vec3;\ntypedef lowp_i16vec4 i16vec4;\n#elif (defined(GLM_PRECISION_MEDIUMP_INT))\ntypedef mediump_i16vec1 i16vec1;\ntypedef mediump_i16vec2 i16vec2;\ntypedef mediump_i16vec3 i16vec3;\ntypedef mediump_i16vec4 i16vec4;\n#else\n/// Default precision 16 bit signed integer scalar type.\n/// @see gtc_type_precision\ntypedef highp_i16vec1 i16vec1;\n\n/// Default precision 16 bit signed integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef highp_i16vec2 i16vec2;\n\n/// Default precision 16 bit signed integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef highp_i16vec3 i16vec3;\n\n/// Default precision 16 bit signed integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef highp_i16vec4 i16vec4;\n#endif\n\n/// Low precision 32 bit signed integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<i32, lowp> lowp_i32vec1;\n\n/// Low precision 32 bit signed integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<i32, lowp> lowp_i32vec2;\n\n/// Low precision 32 bit signed integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<i32, lowp> lowp_i32vec3;\n\n/// Low precision 32 bit signed integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<i32, lowp> lowp_i32vec4;\n\n/// Medium precision 32 bit signed integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<i32, mediump> mediump_i32vec1;\n\n/// Medium precision 32 bit signed integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<i32, mediump> mediump_i32vec2;\n\n/// Medium precision 32 bit signed integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<i32, mediump> mediump_i32vec3;\n\n/// Medium precision 32 bit signed integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<i32, mediump> mediump_i32vec4;\n\n/// High precision 32 bit signed integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<i32, highp> highp_i32vec1;\n\n/// High precision 32 bit signed integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<i32, highp> highp_i32vec2;\n\n/// High precision 32 bit signed integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<i32, highp> highp_i32vec3;\n\n/// High precision 32 bit signed integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<i32, highp> highp_i32vec4;\n\n#if (defined(GLM_PRECISION_LOWP_INT))\ntypedef lowp_i32vec1 i32vec1;\ntypedef lowp_i32vec2 i32vec2;\ntypedef lowp_i32vec3 i32vec3;\ntypedef lowp_i32vec4 i32vec4;\n#elif (defined(GLM_PRECISION_MEDIUMP_INT))\ntypedef mediump_i32vec1 i32vec1;\ntypedef mediump_i32vec2 i32vec2;\ntypedef mediump_i32vec3 i32vec3;\ntypedef mediump_i32vec4 i32vec4;\n#else\n/// Default precision 32 bit signed integer scalar type.\n/// @see gtc_type_precision\ntypedef highp_i32vec1 i32vec1;\n\n/// Default precision 32 bit signed integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef highp_i32vec2 i32vec2;\n\n/// Default precision 32 bit signed integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef highp_i32vec3 i32vec3;\n\n/// Default precision 32 bit signed integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef highp_i32vec4 i32vec4;\n#endif\n\n/// Low precision 32 bit signed integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<i32, lowp> lowp_i32vec1;\n\n/// Low precision 32 bit signed integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<i32, lowp> lowp_i32vec2;\n\n/// Low precision 32 bit signed integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<i32, lowp> lowp_i32vec3;\n\n/// Low precision 32 bit signed integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<i32, lowp> lowp_i32vec4;\n\n/// Medium precision 32 bit signed integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<i32, mediump> mediump_i32vec1;\n\n/// Medium precision 32 bit signed integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<i32, mediump> mediump_i32vec2;\n\n/// Medium precision 32 bit signed integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<i32, mediump> mediump_i32vec3;\n\n/// Medium precision 32 bit signed integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<i32, mediump> mediump_i32vec4;\n\n/// High precision 32 bit signed integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<i32, highp> highp_i32vec1;\n\n/// High precision 32 bit signed integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<i32, highp> highp_i32vec2;\n\n/// High precision 32 bit signed integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<i32, highp> highp_i32vec3;\n\n/// High precision 32 bit signed integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<i32, highp> highp_i32vec4;\n\n#if (defined(GLM_PRECISION_LOWP_INT))\ntypedef lowp_i32vec1 i32vec1;\ntypedef lowp_i32vec2 i32vec2;\ntypedef lowp_i32vec3 i32vec3;\ntypedef lowp_i32vec4 i32vec4;\n#elif (defined(GLM_PRECISION_MEDIUMP_INT))\ntypedef mediump_i32vec1 i32vec1;\ntypedef mediump_i32vec2 i32vec2;\ntypedef mediump_i32vec3 i32vec3;\ntypedef mediump_i32vec4 i32vec4;\n#else\n/// Default precision 32 bit signed integer scalar type.\n/// @see gtc_type_precision\ntypedef highp_i32vec1 i32vec1;\n\n/// Default precision 32 bit signed integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef highp_i32vec2 i32vec2;\n\n/// Default precision 32 bit signed integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef highp_i32vec3 i32vec3;\n\n/// Default precision 32 bit signed integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef highp_i32vec4 i32vec4;\n#endif\n\n/// Low precision 64 bit signed integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<i64, lowp> lowp_i64vec1;\n\n/// Low precision 64 bit signed integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<i64, lowp> lowp_i64vec2;\n\n/// Low precision 64 bit signed integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<i64, lowp> lowp_i64vec3;\n\n/// Low precision 64 bit signed integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<i64, lowp> lowp_i64vec4;\n\n/// Medium precision 64 bit signed integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<i64, mediump> mediump_i64vec1;\n\n/// Medium precision 64 bit signed integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<i64, mediump> mediump_i64vec2;\n\n/// Medium precision 64 bit signed integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<i64, mediump> mediump_i64vec3;\n\n/// Medium precision 64 bit signed integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<i64, mediump> mediump_i64vec4;\n\n/// High precision 64 bit signed integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<i64, highp> highp_i64vec1;\n\n/// High precision 64 bit signed integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<i64, highp> highp_i64vec2;\n\n/// High precision 64 bit signed integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<i64, highp> highp_i64vec3;\n\n/// High precision 64 bit signed integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<i64, highp> highp_i64vec4;\n\n#if (defined(GLM_PRECISION_LOWP_INT))\ntypedef lowp_i64vec1 i64vec1;\ntypedef lowp_i64vec2 i64vec2;\ntypedef lowp_i64vec3 i64vec3;\ntypedef lowp_i64vec4 i64vec4;\n#elif (defined(GLM_PRECISION_MEDIUMP_INT))\ntypedef mediump_i64vec1 i64vec1;\ntypedef mediump_i64vec2 i64vec2;\ntypedef mediump_i64vec3 i64vec3;\ntypedef mediump_i64vec4 i64vec4;\n#else\n/// Default precision 64 bit signed integer scalar type.\n/// @see gtc_type_precision\ntypedef highp_i64vec1 i64vec1;\n\n/// Default precision 64 bit signed integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef highp_i64vec2 i64vec2;\n\n/// Default precision 64 bit signed integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef highp_i64vec3 i64vec3;\n\n/// Default precision 64 bit signed integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef highp_i64vec4 i64vec4;\n#endif\n\n/////////////////////////////\n// Unsigned int vector types\n\n/// Low precision 8 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint8 lowp_uint8;\n\n/// Low precision 16 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint16 lowp_uint16;\n\n/// Low precision 32 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint32 lowp_uint32;\n\n/// Low precision 64 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint64 lowp_uint64;\n\n/// Low precision 8 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint8 lowp_uint8_t;\n\n/// Low precision 16 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint16 lowp_uint16_t;\n\n/// Low precision 32 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint32 lowp_uint32_t;\n\n/// Low precision 64 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint64 lowp_uint64_t;\n\n/// Low precision 8 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint8 lowp_u8;\n\n/// Low precision 16 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint16 lowp_u16;\n\n/// Low precision 32 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint32 lowp_u32;\n\n/// Low precision 64 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint64 lowp_u64;\n\n/// Medium precision 8 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint8 mediump_uint8;\n\n/// Medium precision 16 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint16 mediump_uint16;\n\n/// Medium precision 32 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint32 mediump_uint32;\n\n/// Medium precision 64 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint64 mediump_uint64;\n\n/// Medium precision 8 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint8 mediump_uint8_t;\n\n/// Medium precision 16 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint16 mediump_uint16_t;\n\n/// Medium precision 32 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint32 mediump_uint32_t;\n\n/// Medium precision 64 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint64 mediump_uint64_t;\n\n/// Medium precision 8 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint8 mediump_u8;\n\n/// Medium precision 16 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint16 mediump_u16;\n\n/// Medium precision 32 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint32 mediump_u32;\n\n/// Medium precision 64 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint64 mediump_u64;\n\n/// Medium precision 8 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint8 highp_uint8;\n\n/// Medium precision 16 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint16 highp_uint16;\n\n/// Medium precision 32 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint32 highp_uint32;\n\n/// Medium precision 64 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint64 highp_uint64;\n\n/// Medium precision 8 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint8 highp_uint8_t;\n\n/// Medium precision 16 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint16 highp_uint16_t;\n\n/// Medium precision 32 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint32 highp_uint32_t;\n\n/// Medium precision 64 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint64 highp_uint64_t;\n\n/// Medium precision 8 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint8 highp_u8;\n\n/// Medium precision 16 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint16 highp_u16;\n\n/// Medium precision 32 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint32 highp_u32;\n\n/// Medium precision 64 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint64 highp_u64;\n\n/// 8 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint8 uint8;\n\n/// 16 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint16 uint16;\n\n/// 32 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint32 uint32;\n\n/// 64 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint64 uint64;\n\n/// 8 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint8 uint8_t;\n\n/// 16 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint16 uint16_t;\n\n/// 32 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint32 uint32_t;\n\n/// 64 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint64 uint64_t;\n\n/// 8 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint8 u8;\n\n/// 16 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint16 u16;\n\n/// 32 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint32 u32;\n\n/// 64 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint64 u64;\n\n/// Low precision 8 bit unsigned integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<u8, lowp> lowp_u8vec1;\n\n/// Low precision 8 bit unsigned integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<u8, lowp> lowp_u8vec2;\n\n/// Low precision 8 bit unsigned integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<u8, lowp> lowp_u8vec3;\n\n/// Low precision 8 bit unsigned integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<u8, lowp> lowp_u8vec4;\n\n/// Medium precision 8 bit unsigned integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<u8, mediump> mediump_u8vec1;\n\n/// Medium precision 8 bit unsigned integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<u8, mediump> mediump_u8vec2;\n\n/// Medium precision 8 bit unsigned integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<u8, mediump> mediump_u8vec3;\n\n/// Medium precision 8 bit unsigned integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<u8, mediump> mediump_u8vec4;\n\n/// High precision 8 bit unsigned integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<u8, highp> highp_u8vec1;\n\n/// High precision 8 bit unsigned integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<u8, highp> highp_u8vec2;\n\n/// High precision 8 bit unsigned integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<u8, highp> highp_u8vec3;\n\n/// High precision 8 bit unsigned integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<u8, highp> highp_u8vec4;\n\n#if (defined(GLM_PRECISION_LOWP_INT))\ntypedef lowp_u8vec1 u8vec1;\ntypedef lowp_u8vec2 u8vec2;\ntypedef lowp_u8vec3 u8vec3;\ntypedef lowp_u8vec4 u8vec4;\n#elif (defined(GLM_PRECISION_MEDIUMP_INT))\ntypedef mediump_u8vec1 u8vec1;\ntypedef mediump_u8vec2 u8vec2;\ntypedef mediump_u8vec3 u8vec3;\ntypedef mediump_u8vec4 u8vec4;\n#else\n/// Default precision 8 bit unsigned integer scalar type.\n/// @see gtc_type_precision\ntypedef highp_u8vec1 u8vec1;\n\n/// Default precision 8 bit unsigned integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef highp_u8vec2 u8vec2;\n\n/// Default precision 8 bit unsigned integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef highp_u8vec3 u8vec3;\n\n/// Default precision 8 bit unsigned integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef highp_u8vec4 u8vec4;\n#endif\n\n/// Low precision 16 bit unsigned integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<u16, lowp> lowp_u16vec1;\n\n/// Low precision 16 bit unsigned integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<u16, lowp> lowp_u16vec2;\n\n/// Low precision 16 bit unsigned integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<u16, lowp> lowp_u16vec3;\n\n/// Low precision 16 bit unsigned integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<u16, lowp> lowp_u16vec4;\n\n/// Medium precision 16 bit unsigned integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<u16, mediump> mediump_u16vec1;\n\n/// Medium precision 16 bit unsigned integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<u16, mediump> mediump_u16vec2;\n\n/// Medium precision 16 bit unsigned integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<u16, mediump> mediump_u16vec3;\n\n/// Medium precision 16 bit unsigned integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<u16, mediump> mediump_u16vec4;\n\n/// High precision 16 bit unsigned integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<u16, highp> highp_u16vec1;\n\n/// High precision 16 bit unsigned integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<u16, highp> highp_u16vec2;\n\n/// High precision 16 bit unsigned integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<u16, highp> highp_u16vec3;\n\n/// High precision 16 bit unsigned integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<u16, highp> highp_u16vec4;\n\n#if (defined(GLM_PRECISION_LOWP_INT))\ntypedef lowp_u16vec1 u16vec1;\ntypedef lowp_u16vec2 u16vec2;\ntypedef lowp_u16vec3 u16vec3;\ntypedef lowp_u16vec4 u16vec4;\n#elif (defined(GLM_PRECISION_MEDIUMP_INT))\ntypedef mediump_u16vec1 u16vec1;\ntypedef mediump_u16vec2 u16vec2;\ntypedef mediump_u16vec3 u16vec3;\ntypedef mediump_u16vec4 u16vec4;\n#else\n/// Default precision 16 bit unsigned integer scalar type.\n/// @see gtc_type_precision\ntypedef highp_u16vec1 u16vec1;\n\n/// Default precision 16 bit unsigned integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef highp_u16vec2 u16vec2;\n\n/// Default precision 16 bit unsigned integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef highp_u16vec3 u16vec3;\n\n/// Default precision 16 bit unsigned integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef highp_u16vec4 u16vec4;\n#endif\n\n/// Low precision 32 bit unsigned integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<u32, lowp> lowp_u32vec1;\n\n/// Low precision 32 bit unsigned integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<u32, lowp> lowp_u32vec2;\n\n/// Low precision 32 bit unsigned integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<u32, lowp> lowp_u32vec3;\n\n/// Low precision 32 bit unsigned integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<u32, lowp> lowp_u32vec4;\n\n/// Medium precision 32 bit unsigned integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<u32, mediump> mediump_u32vec1;\n\n/// Medium precision 32 bit unsigned integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<u32, mediump> mediump_u32vec2;\n\n/// Medium precision 32 bit unsigned integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<u32, mediump> mediump_u32vec3;\n\n/// Medium precision 32 bit unsigned integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<u32, mediump> mediump_u32vec4;\n\n/// High precision 32 bit unsigned integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<u32, highp> highp_u32vec1;\n\n/// High precision 32 bit unsigned integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<u32, highp> highp_u32vec2;\n\n/// High precision 32 bit unsigned integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<u32, highp> highp_u32vec3;\n\n/// High precision 32 bit unsigned integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<u32, highp> highp_u32vec4;\n\n#if (defined(GLM_PRECISION_LOWP_INT))\ntypedef lowp_u32vec1 u32vec1;\ntypedef lowp_u32vec2 u32vec2;\ntypedef lowp_u32vec3 u32vec3;\ntypedef lowp_u32vec4 u32vec4;\n#elif (defined(GLM_PRECISION_MEDIUMP_INT))\ntypedef mediump_u32vec1 u32vec1;\ntypedef mediump_u32vec2 u32vec2;\ntypedef mediump_u32vec3 u32vec3;\ntypedef mediump_u32vec4 u32vec4;\n#else\n/// Default precision 32 bit unsigned integer scalar type.\n/// @see gtc_type_precision\ntypedef highp_u32vec1 u32vec1;\n\n/// Default precision 32 bit unsigned integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef highp_u32vec2 u32vec2;\n\n/// Default precision 32 bit unsigned integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef highp_u32vec3 u32vec3;\n\n/// Default precision 32 bit unsigned integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef highp_u32vec4 u32vec4;\n#endif\n\n/// Low precision 32 bit unsigned integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<u32, lowp> lowp_u32vec1;\n\n/// Low precision 32 bit unsigned integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<u32, lowp> lowp_u32vec2;\n\n/// Low precision 32 bit unsigned integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<u32, lowp> lowp_u32vec3;\n\n/// Low precision 32 bit unsigned integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<u32, lowp> lowp_u32vec4;\n\n/// Medium precision 32 bit unsigned integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<u32, mediump> mediump_u32vec1;\n\n/// Medium precision 32 bit unsigned integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<u32, mediump> mediump_u32vec2;\n\n/// Medium precision 32 bit unsigned integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<u32, mediump> mediump_u32vec3;\n\n/// Medium precision 32 bit unsigned integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<u32, mediump> mediump_u32vec4;\n\n/// High precision 32 bit unsigned integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<u32, highp> highp_u32vec1;\n\n/// High precision 32 bit unsigned integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<u32, highp> highp_u32vec2;\n\n/// High precision 32 bit unsigned integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<u32, highp> highp_u32vec3;\n\n/// High precision 32 bit unsigned integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<u32, highp> highp_u32vec4;\n\n#if (defined(GLM_PRECISION_LOWP_INT))\ntypedef lowp_u32vec1 u32vec1;\ntypedef lowp_u32vec2 u32vec2;\ntypedef lowp_u32vec3 u32vec3;\ntypedef lowp_u32vec4 u32vec4;\n#elif (defined(GLM_PRECISION_MEDIUMP_INT))\ntypedef mediump_u32vec1 u32vec1;\ntypedef mediump_u32vec2 u32vec2;\ntypedef mediump_u32vec3 u32vec3;\ntypedef mediump_u32vec4 u32vec4;\n#else\n/// Default precision 32 bit unsigned integer scalar type.\n/// @see gtc_type_precision\ntypedef highp_u32vec1 u32vec1;\n\n/// Default precision 32 bit unsigned integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef highp_u32vec2 u32vec2;\n\n/// Default precision 32 bit unsigned integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef highp_u32vec3 u32vec3;\n\n/// Default precision 32 bit unsigned integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef highp_u32vec4 u32vec4;\n#endif\n\n/// Low precision 64 bit unsigned integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<u64, lowp> lowp_u64vec1;\n\n/// Low precision 64 bit unsigned integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<u64, lowp> lowp_u64vec2;\n\n/// Low precision 64 bit unsigned integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<u64, lowp> lowp_u64vec3;\n\n/// Low precision 64 bit unsigned integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<u64, lowp> lowp_u64vec4;\n\n/// Medium precision 64 bit unsigned integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<u64, mediump> mediump_u64vec1;\n\n/// Medium precision 64 bit unsigned integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<u64, mediump> mediump_u64vec2;\n\n/// Medium precision 64 bit unsigned integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<u64, mediump> mediump_u64vec3;\n\n/// Medium precision 64 bit unsigned integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<u64, mediump> mediump_u64vec4;\n\n/// High precision 64 bit unsigned integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<u64, highp> highp_u64vec1;\n\n/// High precision 64 bit unsigned integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<u64, highp> highp_u64vec2;\n\n/// High precision 64 bit unsigned integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<u64, highp> highp_u64vec3;\n\n/// High precision 64 bit unsigned integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<u64, highp> highp_u64vec4;\n\n#if (defined(GLM_PRECISION_LOWP_UINT))\ntypedef lowp_u64vec1 u64vec1;\ntypedef lowp_u64vec2 u64vec2;\ntypedef lowp_u64vec3 u64vec3;\ntypedef lowp_u64vec4 u64vec4;\n#elif (defined(GLM_PRECISION_MEDIUMP_UINT))\ntypedef mediump_u64vec1 u64vec1;\ntypedef mediump_u64vec2 u64vec2;\ntypedef mediump_u64vec3 u64vec3;\ntypedef mediump_u64vec4 u64vec4;\n#else\n/// Default precision 64 bit unsigned integer scalar type.\n/// @see gtc_type_precision\ntypedef highp_u64vec1 u64vec1;\n\n/// Default precision 64 bit unsigned integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef highp_u64vec2 u64vec2;\n\n/// Default precision 64 bit unsigned integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef highp_u64vec3 u64vec3;\n\n/// Default precision 64 bit unsigned integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef highp_u64vec4 u64vec4;\n#endif\n\n//////////////////////\n// Float vector types\n\n/// Low 32 bit single-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef detail::float32 lowp_float32;\n\n/// Low 64 bit double-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef detail::float64 lowp_float64;\n\n/// Low 32 bit single-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef detail::float32 lowp_float32_t;\n\n/// Low 64 bit double-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef detail::float64 lowp_float64_t;\n\n/// Low 32 bit single-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef float32 lowp_f32;\n\n/// Low 64 bit double-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef float64 lowp_f64;\n\n/// Low 32 bit single-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef detail::float32 lowp_float32;\n\n/// Low 64 bit double-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef detail::float64 lowp_float64;\n\n/// Low 32 bit single-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef detail::float32 lowp_float32_t;\n\n/// Low 64 bit double-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef detail::float64 lowp_float64_t;\n\n/// Low 32 bit single-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef float32 lowp_f32;\n\n/// Low 64 bit double-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef float64 lowp_f64;\n\n/// Low 32 bit single-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef detail::float32 lowp_float32;\n\n/// Low 64 bit double-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef detail::float64 lowp_float64;\n\n/// Low 32 bit single-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef detail::float32 lowp_float32_t;\n\n/// Low 64 bit double-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef detail::float64 lowp_float64_t;\n\n/// Low 32 bit single-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef float32 lowp_f32;\n\n/// Low 64 bit double-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef float64 lowp_f64;\n\n/// Medium 32 bit single-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef detail::float32 mediump_float32;\n\n/// Medium 64 bit double-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef detail::float64 mediump_float64;\n\n/// Medium 32 bit single-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef detail::float32 mediump_float32_t;\n\n/// Medium 64 bit double-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef detail::float64 mediump_float64_t;\n\n/// Medium 32 bit single-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef float32 mediump_f32;\n\n/// Medium 64 bit double-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef float64 mediump_f64;\n\n/// High 32 bit single-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef detail::float32 highp_float32;\n\n/// High 64 bit double-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef detail::float64 highp_float64;\n\n/// High 32 bit single-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef detail::float32 highp_float32_t;\n\n/// High 64 bit double-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef detail::float64 highp_float64_t;\n\n/// High 32 bit single-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef float32 highp_f32;\n\n/// High 64 bit double-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef float64 highp_f64;\n\n#if (defined(GLM_PRECISION_LOWP_FLOAT))\n/// Default 32 bit single-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef lowp_float32 float32;\n\n/// Default 64 bit double-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef lowp_float64 float64;\n\n/// Default 32 bit single-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef lowp_float32_t float32_t;\n\n/// Default 64 bit double-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef lowp_float64_t float64_t;\n\n/// Default 32 bit single-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef lowp_f32 f32;\n\n/// Default 64 bit double-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef lowp_f64 f64;\n\n#elif (defined(GLM_PRECISION_MEDIUMP_FLOAT))\n\n/// Default 32 bit single-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef mediump_float32 float32;\n\n/// Default 64 bit double-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef mediump_float64 float64;\n\n/// Default 32 bit single-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef mediump_float32 float32_t;\n\n/// Default 64 bit double-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef mediump_float64 float64_t;\n\n/// Default 32 bit single-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef mediump_float32 f32;\n\n/// Default 64 bit double-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef mediump_float64 f64;\n\n#else  //(defined(GLM_PRECISION_HIGHP_FLOAT))\n\n/// Default 32 bit single-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef highp_float32 float32;\n\n/// Default 64 bit double-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef highp_float64 float64;\n\n/// Default 32 bit single-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef highp_float32_t float32_t;\n\n/// Default 64 bit double-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef highp_float64_t float64_t;\n\n/// Default 32 bit single-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef highp_float32_t f32;\n\n/// Default 64 bit double-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef highp_float64_t f64;\n#endif\n\n/// Low single-precision floating-point vector of 1 component.\n/// @see gtc_type_precision\ntypedef detail::tvec1<float, lowp> lowp_vec1;\n\n/// Low single-precision floating-point vector of 2 components.\n/// @see gtc_type_precision\ntypedef detail::tvec2<float, lowp> lowp_vec2;\n\n/// Low single-precision floating-point vector of 3 components.\n/// @see gtc_type_precision\ntypedef detail::tvec3<float, lowp> lowp_vec3;\n\n/// Low single-precision floating-point vector of 4 components.\n/// @see gtc_type_precision\ntypedef detail::tvec4<float, lowp> lowp_vec4;\n\n/// Low single-precision floating-point vector of 1 component.\n/// @see gtc_type_precision\ntypedef detail::tvec1<float, lowp> lowp_fvec1;\n\n/// Low single-precision floating-point vector of 2 components.\n/// @see gtc_type_precision\ntypedef detail::tvec2<float, lowp> lowp_fvec2;\n\n/// Low single-precision floating-point vector of 3 components.\n/// @see gtc_type_precision\ntypedef detail::tvec3<float, lowp> lowp_fvec3;\n\n/// Low single-precision floating-point vector of 4 components.\n/// @see gtc_type_precision\ntypedef detail::tvec4<float, lowp> lowp_fvec4;\n\n/// Medium single-precision floating-point vector of 1 component.\n/// @see gtc_type_precision\ntypedef detail::tvec1<float, mediump> mediump_vec1;\n\n/// Medium Single-precision floating-point vector of 2 components.\n/// @see gtc_type_precision\ntypedef detail::tvec2<float, mediump> mediump_vec2;\n\n/// Medium Single-precision floating-point vector of 3 components.\n/// @see gtc_type_precision\ntypedef detail::tvec3<float, mediump> mediump_vec3;\n\n/// Medium Single-precision floating-point vector of 4 components.\n/// @see gtc_type_precision\ntypedef detail::tvec4<float, mediump> mediump_vec4;\n\n/// Medium single-precision floating-point vector of 1 component.\n/// @see gtc_type_precision\ntypedef detail::tvec1<float, mediump> mediump_fvec1;\n\n/// Medium Single-precision floating-point vector of 2 components.\n/// @see gtc_type_precision\ntypedef detail::tvec2<float, mediump> mediump_fvec2;\n\n/// Medium Single-precision floating-point vector of 3 components.\n/// @see gtc_type_precision\ntypedef detail::tvec3<float, mediump> mediump_fvec3;\n\n/// Medium Single-precision floating-point vector of 4 components.\n/// @see gtc_type_precision\ntypedef detail::tvec4<float, mediump> mediump_fvec4;\n\n/// High single-precision floating-point vector of 1 component.\n/// @see gtc_type_precision\ntypedef detail::tvec1<float, highp> highp_vec1;\n\n/// High Single-precision floating-point vector of 2 components.\n/// @see gtc_type_precision\ntypedef detail::tvec2<float, highp> highp_vec2;\n\n/// High Single-precision floating-point vector of 3 components.\n/// @see gtc_type_precision\ntypedef detail::tvec3<float, highp> highp_vec3;\n\n/// High Single-precision floating-point vector of 4 components.\n/// @see gtc_type_precision\ntypedef detail::tvec4<float, highp> highp_vec4;\n\n/// High single-precision floating-point vector of 1 component.\n/// @see gtc_type_precision\ntypedef detail::tvec1<float, highp> highp_fvec1;\n\n/// High Single-precision floating-point vector of 2 components.\n/// @see gtc_type_precision\ntypedef detail::tvec2<float, highp> highp_fvec2;\n\n/// High Single-precision floating-point vector of 3 components.\n/// @see gtc_type_precision\ntypedef detail::tvec3<float, highp> highp_fvec3;\n\n/// High Single-precision floating-point vector of 4 components.\n/// @see gtc_type_precision\ntypedef detail::tvec4<float, highp> highp_fvec4;\n\n/// Low single-precision floating-point vector of 1 component.\n/// @see gtc_type_precision\ntypedef detail::tvec1<f32, lowp> lowp_f32vec1;\n\n/// Low single-precision floating-point vector of 2 components.\n/// @see gtc_type_precision\ntypedef detail::tvec2<f32, lowp> lowp_f32vec2;\n\n/// Low single-precision floating-point vector of 3 components.\n/// @see gtc_type_precision\ntypedef detail::tvec3<f32, lowp> lowp_f32vec3;\n\n/// Low single-precision floating-point vector of 4 components.\n/// @see gtc_type_precision\ntypedef detail::tvec4<f32, lowp> lowp_f32vec4;\n\n/// Medium single-precision floating-point vector of 1 component.\n/// @see gtc_type_precision\ntypedef detail::tvec1<f32, mediump> mediump_f32vec1;\n\n/// Medium single-precision floating-point vector of 2 components.\n/// @see gtc_type_precision\ntypedef detail::tvec2<f32, mediump> mediump_f32vec2;\n\n/// Medium single-precision floating-point vector of 3 components.\n/// @see gtc_type_precision\ntypedef detail::tvec3<f32, mediump> mediump_f32vec3;\n\n/// Medium single-precision floating-point vector of 4 components.\n/// @see gtc_type_precision\ntypedef detail::tvec4<f32, mediump> mediump_f32vec4;\n\n/// High single-precision floating-point vector of 1 component.\n/// @see gtc_type_precision\ntypedef detail::tvec1<f32, highp> highp_f32vec1;\n\n/// High single-precision floating-point vector of 2 components.\n/// @see gtc_type_precision\ntypedef detail::tvec2<f32, highp> highp_f32vec2;\n\n/// High single-precision floating-point vector of 3 components.\n/// @see gtc_type_precision\ntypedef detail::tvec3<f32, highp> highp_f32vec3;\n\n/// High single-precision floating-point vector of 4 components.\n/// @see gtc_type_precision\ntypedef detail::tvec4<f32, highp> highp_f32vec4;\n\n/// Low double-precision floating-point vector of 1 component.\n/// @see gtc_type_precision\ntypedef detail::tvec1<f64, lowp> lowp_f64vec1;\n\n/// Low double-precision floating-point vector of 2 components.\n/// @see gtc_type_precision\ntypedef detail::tvec2<f64, lowp> lowp_f64vec2;\n\n/// Low double-precision floating-point vector of 3 components.\n/// @see gtc_type_precision\ntypedef detail::tvec3<f64, lowp> lowp_f64vec3;\n\n/// Low double-precision floating-point vector of 4 components.\n/// @see gtc_type_precision\ntypedef detail::tvec4<f64, lowp> lowp_f64vec4;\n\n/// Medium double-precision floating-point vector of 1 component.\n/// @see gtc_type_precision\ntypedef detail::tvec1<f64, mediump> mediump_f64vec1;\n\n/// Medium double-precision floating-point vector of 2 components.\n/// @see gtc_type_precision\ntypedef detail::tvec2<f64, mediump> mediump_f64vec2;\n\n/// Medium double-precision floating-point vector of 3 components.\n/// @see gtc_type_precision\ntypedef detail::tvec3<f64, mediump> mediump_f64vec3;\n\n/// Medium double-precision floating-point vector of 4 components.\n/// @see gtc_type_precision\ntypedef detail::tvec4<f64, mediump> mediump_f64vec4;\n\n/// High double-precision floating-point vector of 1 component.\n/// @see gtc_type_precision\ntypedef detail::tvec1<f64, highp> highp_f64vec1;\n\n/// High double-precision floating-point vector of 2 components.\n/// @see gtc_type_precision\ntypedef detail::tvec2<f64, highp> highp_f64vec2;\n\n/// High double-precision floating-point vector of 3 components.\n/// @see gtc_type_precision\ntypedef detail::tvec3<f64, highp> highp_f64vec3;\n\n/// High double-precision floating-point vector of 4 components.\n/// @see gtc_type_precision\ntypedef detail::tvec4<f64, highp> highp_f64vec4;\n\n//////////////////////\n// Float matrix types\n\n/// Low single-precision floating-point 1x1 matrix.\n/// @see gtc_type_precision\n// typedef lowp_f32 lowp_fmat1x1;\n\n/// Low single-precision floating-point 2x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x2<f32, lowp> lowp_fmat2x2;\n\n/// Low single-precision floating-point 2x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x3<f32, lowp> lowp_fmat2x3;\n\n/// Low single-precision floating-point 2x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x4<f32, lowp> lowp_fmat2x4;\n\n/// Low single-precision floating-point 3x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x2<f32, lowp> lowp_fmat3x2;\n\n/// Low single-precision floating-point 3x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x3<f32, lowp> lowp_fmat3x3;\n\n/// Low single-precision floating-point 3x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x4<f32, lowp> lowp_fmat3x4;\n\n/// Low single-precision floating-point 4x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x2<f32, lowp> lowp_fmat4x2;\n\n/// Low single-precision floating-point 4x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x3<f32, lowp> lowp_fmat4x3;\n\n/// Low single-precision floating-point 4x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x4<f32, lowp> lowp_fmat4x4;\n\n/// Low single-precision floating-point 1x1 matrix.\n/// @see gtc_type_precision\n// typedef lowp_fmat1x1 lowp_fmat1;\n\n/// Low single-precision floating-point 2x2 matrix.\n/// @see gtc_type_precision\ntypedef lowp_fmat2x2 lowp_fmat2;\n\n/// Low single-precision floating-point 3x3 matrix.\n/// @see gtc_type_precision\ntypedef lowp_fmat3x3 lowp_fmat3;\n\n/// Low single-precision floating-point 4x4 matrix.\n/// @see gtc_type_precision\ntypedef lowp_fmat4x4 lowp_fmat4;\n\n/// Medium single-precision floating-point 1x1 matrix.\n/// @see gtc_type_precision\n// typedef mediump_f32 mediump_fmat1x1;\n\n/// Medium single-precision floating-point 2x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x2<f32, mediump> mediump_fmat2x2;\n\n/// Medium single-precision floating-point 2x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x3<f32, mediump> mediump_fmat2x3;\n\n/// Medium single-precision floating-point 2x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x4<f32, mediump> mediump_fmat2x4;\n\n/// Medium single-precision floating-point 3x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x2<f32, mediump> mediump_fmat3x2;\n\n/// Medium single-precision floating-point 3x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x3<f32, mediump> mediump_fmat3x3;\n\n/// Medium single-precision floating-point 3x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x4<f32, mediump> mediump_fmat3x4;\n\n/// Medium single-precision floating-point 4x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x2<f32, mediump> mediump_fmat4x2;\n\n/// Medium single-precision floating-point 4x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x3<f32, mediump> mediump_fmat4x3;\n\n/// Medium single-precision floating-point 4x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x4<f32, mediump> mediump_fmat4x4;\n\n/// Medium single-precision floating-point 1x1 matrix.\n/// @see gtc_type_precision\n// typedef mediump_fmat1x1 mediump_fmat1;\n\n/// Medium single-precision floating-point 2x2 matrix.\n/// @see gtc_type_precision\ntypedef mediump_fmat2x2 mediump_fmat2;\n\n/// Medium single-precision floating-point 3x3 matrix.\n/// @see gtc_type_precision\ntypedef mediump_fmat3x3 mediump_fmat3;\n\n/// Medium single-precision floating-point 4x4 matrix.\n/// @see gtc_type_precision\ntypedef mediump_fmat4x4 mediump_fmat4;\n\n/// High single-precision floating-point 1x1 matrix.\n/// @see gtc_type_precision\n// typedef highp_f32 highp_fmat1x1;\n\n/// High single-precision floating-point 2x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x2<f32, highp> highp_fmat2x2;\n\n/// High single-precision floating-point 2x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x3<f32, highp> highp_fmat2x3;\n\n/// High single-precision floating-point 2x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x4<f32, highp> highp_fmat2x4;\n\n/// High single-precision floating-point 3x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x2<f32, highp> highp_fmat3x2;\n\n/// High single-precision floating-point 3x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x3<f32, highp> highp_fmat3x3;\n\n/// High single-precision floating-point 3x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x4<f32, highp> highp_fmat3x4;\n\n/// High single-precision floating-point 4x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x2<f32, highp> highp_fmat4x2;\n\n/// High single-precision floating-point 4x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x3<f32, highp> highp_fmat4x3;\n\n/// High single-precision floating-point 4x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x4<f32, highp> highp_fmat4x4;\n\n/// High single-precision floating-point 1x1 matrix.\n/// @see gtc_type_precision\n// typedef highp_fmat1x1 highp_fmat1;\n\n/// High single-precision floating-point 2x2 matrix.\n/// @see gtc_type_precision\ntypedef highp_fmat2x2 highp_fmat2;\n\n/// High single-precision floating-point 3x3 matrix.\n/// @see gtc_type_precision\ntypedef highp_fmat3x3 highp_fmat3;\n\n/// High single-precision floating-point 4x4 matrix.\n/// @see gtc_type_precision\ntypedef highp_fmat4x4 highp_fmat4;\n\n/// Low single-precision floating-point 1x1 matrix.\n/// @see gtc_type_precision\n// typedef f32 lowp_f32mat1x1;\n\n/// Low single-precision floating-point 2x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x2<f32, lowp> lowp_f32mat2x2;\n\n/// Low single-precision floating-point 2x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x3<f32, lowp> lowp_f32mat2x3;\n\n/// Low single-precision floating-point 2x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x4<f32, lowp> lowp_f32mat2x4;\n\n/// Low single-precision floating-point 3x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x2<f32, lowp> lowp_f32mat3x2;\n\n/// Low single-precision floating-point 3x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x3<f32, lowp> lowp_f32mat3x3;\n\n/// Low single-precision floating-point 3x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x4<f32, lowp> lowp_f32mat3x4;\n\n/// Low single-precision floating-point 4x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x2<f32, lowp> lowp_f32mat4x2;\n\n/// Low single-precision floating-point 4x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x3<f32, lowp> lowp_f32mat4x3;\n\n/// Low single-precision floating-point 4x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x4<f32, lowp> lowp_f32mat4x4;\n\n/// Low single-precision floating-point 1x1 matrix.\n/// @see gtc_type_precision\n// typedef detail::tmat1x1<f32, lowp> lowp_f32mat1;\n\n/// Low single-precision floating-point 2x2 matrix.\n/// @see gtc_type_precision\ntypedef lowp_f32mat2x2 lowp_f32mat2;\n\n/// Low single-precision floating-point 3x3 matrix.\n/// @see gtc_type_precision\ntypedef lowp_f32mat3x3 lowp_f32mat3;\n\n/// Low single-precision floating-point 4x4 matrix.\n/// @see gtc_type_precision\ntypedef lowp_f32mat4x4 lowp_f32mat4;\n\n/// High single-precision floating-point 1x1 matrix.\n/// @see gtc_type_precision\n// typedef f32 mediump_f32mat1x1;\n\n/// Low single-precision floating-point 2x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x2<f32, mediump> mediump_f32mat2x2;\n\n/// Medium single-precision floating-point 2x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x3<f32, mediump> mediump_f32mat2x3;\n\n/// Medium single-precision floating-point 2x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x4<f32, mediump> mediump_f32mat2x4;\n\n/// Medium single-precision floating-point 3x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x2<f32, mediump> mediump_f32mat3x2;\n\n/// Medium single-precision floating-point 3x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x3<f32, mediump> mediump_f32mat3x3;\n\n/// Medium single-precision floating-point 3x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x4<f32, mediump> mediump_f32mat3x4;\n\n/// Medium single-precision floating-point 4x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x2<f32, mediump> mediump_f32mat4x2;\n\n/// Medium single-precision floating-point 4x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x3<f32, mediump> mediump_f32mat4x3;\n\n/// Medium single-precision floating-point 4x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x4<f32, mediump> mediump_f32mat4x4;\n\n/// Medium single-precision floating-point 1x1 matrix.\n/// @see gtc_type_precision\n// typedef detail::tmat1x1<f32, mediump> f32mat1;\n\n/// Medium single-precision floating-point 2x2 matrix.\n/// @see gtc_type_precision\ntypedef mediump_f32mat2x2 mediump_f32mat2;\n\n/// Medium single-precision floating-point 3x3 matrix.\n/// @see gtc_type_precision\ntypedef mediump_f32mat3x3 mediump_f32mat3;\n\n/// Medium single-precision floating-point 4x4 matrix.\n/// @see gtc_type_precision\ntypedef mediump_f32mat4x4 mediump_f32mat4;\n\n/// High single-precision floating-point 1x1 matrix.\n/// @see gtc_type_precision\n// typedef f32 highp_f32mat1x1;\n\n/// High single-precision floating-point 2x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x2<f32, highp> highp_f32mat2x2;\n\n/// High single-precision floating-point 2x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x3<f32, highp> highp_f32mat2x3;\n\n/// High single-precision floating-point 2x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x4<f32, highp> highp_f32mat2x4;\n\n/// High single-precision floating-point 3x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x2<f32, highp> highp_f32mat3x2;\n\n/// High single-precision floating-point 3x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x3<f32, highp> highp_f32mat3x3;\n\n/// High single-precision floating-point 3x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x4<f32, highp> highp_f32mat3x4;\n\n/// High single-precision floating-point 4x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x2<f32, highp> highp_f32mat4x2;\n\n/// High single-precision floating-point 4x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x3<f32, highp> highp_f32mat4x3;\n\n/// High single-precision floating-point 4x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x4<f32, highp> highp_f32mat4x4;\n\n/// High single-precision floating-point 1x1 matrix.\n/// @see gtc_type_precision\n// typedef detail::tmat1x1<f32, highp> f32mat1;\n\n/// High single-precision floating-point 2x2 matrix.\n/// @see gtc_type_precision\ntypedef highp_f32mat2x2 highp_f32mat2;\n\n/// High single-precision floating-point 3x3 matrix.\n/// @see gtc_type_precision\ntypedef highp_f32mat3x3 highp_f32mat3;\n\n/// High single-precision floating-point 4x4 matrix.\n/// @see gtc_type_precision\ntypedef highp_f32mat4x4 highp_f32mat4;\n\n/// Low double-precision floating-point 1x1 matrix.\n/// @see gtc_type_precision\n// typedef f64 lowp_f64mat1x1;\n\n/// Low double-precision floating-point 2x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x2<f64, lowp> lowp_f64mat2x2;\n\n/// Low double-precision floating-point 2x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x3<f64, lowp> lowp_f64mat2x3;\n\n/// Low double-precision floating-point 2x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x4<f64, lowp> lowp_f64mat2x4;\n\n/// Low double-precision floating-point 3x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x2<f64, lowp> lowp_f64mat3x2;\n\n/// Low double-precision floating-point 3x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x3<f64, lowp> lowp_f64mat3x3;\n\n/// Low double-precision floating-point 3x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x4<f64, lowp> lowp_f64mat3x4;\n\n/// Low double-precision floating-point 4x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x2<f64, lowp> lowp_f64mat4x2;\n\n/// Low double-precision floating-point 4x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x3<f64, lowp> lowp_f64mat4x3;\n\n/// Low double-precision floating-point 4x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x4<f64, lowp> lowp_f64mat4x4;\n\n/// Low double-precision floating-point 1x1 matrix.\n/// @see gtc_type_precision\n// typedef lowp_f64mat1x1 lowp_f64mat1;\n\n/// Low double-precision floating-point 2x2 matrix.\n/// @see gtc_type_precision\ntypedef lowp_f64mat2x2 lowp_f64mat2;\n\n/// Low double-precision floating-point 3x3 matrix.\n/// @see gtc_type_precision\ntypedef lowp_f64mat3x3 lowp_f64mat3;\n\n/// Low double-precision floating-point 4x4 matrix.\n/// @see gtc_type_precision\ntypedef lowp_f64mat4x4 lowp_f64mat4;\n\n/// Medium double-precision floating-point 1x1 matrix.\n/// @see gtc_type_precision\n// typedef f64 Highp_f64mat1x1;\n\n/// Medium double-precision floating-point 2x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x2<f64, mediump> mediump_f64mat2x2;\n\n/// Medium double-precision floating-point 2x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x3<f64, mediump> mediump_f64mat2x3;\n\n/// Medium double-precision floating-point 2x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x4<f64, mediump> mediump_f64mat2x4;\n\n/// Medium double-precision floating-point 3x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x2<f64, mediump> mediump_f64mat3x2;\n\n/// Medium double-precision floating-point 3x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x3<f64, mediump> mediump_f64mat3x3;\n\n/// Medium double-precision floating-point 3x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x4<f64, mediump> mediump_f64mat3x4;\n\n/// Medium double-precision floating-point 4x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x2<f64, mediump> mediump_f64mat4x2;\n\n/// Medium double-precision floating-point 4x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x3<f64, mediump> mediump_f64mat4x3;\n\n/// Medium double-precision floating-point 4x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x4<f64, mediump> mediump_f64mat4x4;\n\n/// Medium double-precision floating-point 1x1 matrix.\n/// @see gtc_type_precision\n// typedef mediump_f64mat1x1 mediump_f64mat1;\n\n/// Medium double-precision floating-point 2x2 matrix.\n/// @see gtc_type_precision\ntypedef mediump_f64mat2x2 mediump_f64mat2;\n\n/// Medium double-precision floating-point 3x3 matrix.\n/// @see gtc_type_precision\ntypedef mediump_f64mat3x3 mediump_f64mat3;\n\n/// Medium double-precision floating-point 4x4 matrix.\n/// @see gtc_type_precision\ntypedef mediump_f64mat4x4 mediump_f64mat4;\n\n/// High double-precision floating-point 1x1 matrix.\n/// @see gtc_type_precision\n// typedef f64 highp_f64mat1x1;\n\n/// High double-precision floating-point 2x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x2<f64, highp> highp_f64mat2x2;\n\n/// High double-precision floating-point 2x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x3<f64, highp> highp_f64mat2x3;\n\n/// High double-precision floating-point 2x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x4<f64, highp> highp_f64mat2x4;\n\n/// High double-precision floating-point 3x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x2<f64, highp> highp_f64mat3x2;\n\n/// High double-precision floating-point 3x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x3<f64, highp> highp_f64mat3x3;\n\n/// High double-precision floating-point 3x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x4<f64, highp> highp_f64mat3x4;\n\n/// High double-precision floating-point 4x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x2<f64, highp> highp_f64mat4x2;\n\n/// High double-precision floating-point 4x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x3<f64, highp> highp_f64mat4x3;\n\n/// High double-precision floating-point 4x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x4<f64, highp> highp_f64mat4x4;\n\n/// High double-precision floating-point 1x1 matrix.\n/// @see gtc_type_precision\n// typedef highp_f64mat1x1 highp_f64mat1;\n\n/// High double-precision floating-point 2x2 matrix.\n/// @see gtc_type_precision\ntypedef highp_f64mat2x2 highp_f64mat2;\n\n/// High double-precision floating-point 3x3 matrix.\n/// @see gtc_type_precision\ntypedef highp_f64mat3x3 highp_f64mat3;\n\n/// High double-precision floating-point 4x4 matrix.\n/// @see gtc_type_precision\ntypedef highp_f64mat4x4 highp_f64mat4;\n\n//////////////////////////\n// Quaternion types\n\n/// Low single-precision floating-point quaternion.\n/// @see gtc_type_precision\ntypedef detail::tquat<f32, lowp> lowp_f32quat;\n\n/// Low double-precision floating-point quaternion.\n/// @see gtc_type_precision\ntypedef detail::tquat<f64, lowp> lowp_f64quat;\n\n/// Medium single-precision floating-point quaternion.\n/// @see gtc_type_precision\ntypedef detail::tquat<f32, mediump> mediump_f32quat;\n\n/// Medium double-precision floating-point quaternion.\n/// @see gtc_type_precision\ntypedef detail::tquat<f64, mediump> mediump_f64quat;\n\n/// High single-precision floating-point quaternion.\n/// @see gtc_type_precision\ntypedef detail::tquat<f32, highp> highp_f32quat;\n\n/// High double-precision floating-point quaternion.\n/// @see gtc_type_precision\ntypedef detail::tquat<f64, highp> highp_f64quat;\n\n#if (defined(GLM_PRECISION_LOWP_FLOAT))\ntypedef lowp_f32vec1 fvec1;\ntypedef lowp_f32vec2 fvec2;\ntypedef lowp_f32vec3 fvec3;\ntypedef lowp_f32vec4 fvec4;\ntypedef lowp_f32mat2 fmat2;\ntypedef lowp_f32mat3 fmat3;\ntypedef lowp_f32mat4 fmat4;\ntypedef lowp_f32mat2x2 fmat2x2;\ntypedef lowp_f32mat3x2 fmat3x2;\ntypedef lowp_f32mat4x2 fmat4x2;\ntypedef lowp_f32mat2x3 fmat2x3;\ntypedef lowp_f32mat3x3 fmat3x3;\ntypedef lowp_f32mat4x3 fmat4x3;\ntypedef lowp_f32mat2x4 fmat2x4;\ntypedef lowp_f32mat3x4 fmat3x4;\ntypedef lowp_f32mat4x4 fmat4x4;\ntypedef lowp_f32quat fquat;\n\ntypedef lowp_f32vec1 f32vec1;\ntypedef lowp_f32vec2 f32vec2;\ntypedef lowp_f32vec3 f32vec3;\ntypedef lowp_f32vec4 f32vec4;\ntypedef lowp_f32mat2 f32mat2;\ntypedef lowp_f32mat3 f32mat3;\ntypedef lowp_f32mat4 f32mat4;\ntypedef lowp_f32mat2x2 f32mat2x2;\ntypedef lowp_f32mat3x2 f32mat3x2;\ntypedef lowp_f32mat4x2 f32mat4x2;\ntypedef lowp_f32mat2x3 f32mat2x3;\ntypedef lowp_f32mat3x3 f32mat3x3;\ntypedef lowp_f32mat4x3 f32mat4x3;\ntypedef lowp_f32mat2x4 f32mat2x4;\ntypedef lowp_f32mat3x4 f32mat3x4;\ntypedef lowp_f32mat4x4 f32mat4x4;\ntypedef lowp_f32quat f32quat;\n#elif (defined(GLM_PRECISION_MEDIUMP_FLOAT))\ntypedef mediump_f32vec1 fvec1;\ntypedef mediump_f32vec2 fvec2;\ntypedef mediump_f32vec3 fvec3;\ntypedef mediump_f32vec4 fvec4;\ntypedef mediump_f32mat2 fmat2;\ntypedef mediump_f32mat3 fmat3;\ntypedef mediump_f32mat4 fmat4;\ntypedef mediump_f32mat2x2 fmat2x2;\ntypedef mediump_f32mat3x2 fmat3x2;\ntypedef mediump_f32mat4x2 fmat4x2;\ntypedef mediump_f32mat2x3 fmat2x3;\ntypedef mediump_f32mat3x3 fmat3x3;\ntypedef mediump_f32mat4x3 fmat4x3;\ntypedef mediump_f32mat2x4 fmat2x4;\ntypedef mediump_f32mat3x4 fmat3x4;\ntypedef mediump_f32mat4x4 fmat4x4;\ntypedef mediump_f32quat fquat;\n\ntypedef mediump_f32vec1 f32vec1;\ntypedef mediump_f32vec2 f32vec2;\ntypedef mediump_f32vec3 f32vec3;\ntypedef mediump_f32vec4 f32vec4;\ntypedef mediump_f32mat2 f32mat2;\ntypedef mediump_f32mat3 f32mat3;\ntypedef mediump_f32mat4 f32mat4;\ntypedef mediump_f32mat2x2 f32mat2x2;\ntypedef mediump_f32mat3x2 f32mat3x2;\ntypedef mediump_f32mat4x2 f32mat4x2;\ntypedef mediump_f32mat2x3 f32mat2x3;\ntypedef mediump_f32mat3x3 f32mat3x3;\ntypedef mediump_f32mat4x3 f32mat4x3;\ntypedef mediump_f32mat2x4 f32mat2x4;\ntypedef mediump_f32mat3x4 f32mat3x4;\ntypedef mediump_f32mat4x4 f32mat4x4;\ntypedef mediump_f32quat f32quat;\n#else  // if(defined(GLM_PRECISION_HIGHP_FLOAT))\n       /// Default single-precision floating-point vector of 1 components.\n       /// @see gtc_type_precision\ntypedef highp_f32vec1 fvec1;\n\n/// Default single-precision floating-point vector of 2 components.\n/// @see gtc_type_precision\ntypedef highp_f32vec2 fvec2;\n\n/// Default single-precision floating-point vector of 3 components.\n/// @see gtc_type_precision\ntypedef highp_f32vec3 fvec3;\n\n/// Default single-precision floating-point vector of 4 components.\n/// @see gtc_type_precision\ntypedef highp_f32vec4 fvec4;\n\n/// Default single-precision floating-point 2x2 matrix.\n/// @see gtc_type_precision\ntypedef highp_f32mat2x2 fmat2x2;\n\n/// Default single-precision floating-point 2x3 matrix.\n/// @see gtc_type_precision\ntypedef highp_f32mat2x3 fmat2x3;\n\n/// Default single-precision floating-point 2x4 matrix.\n/// @see gtc_type_precision\ntypedef highp_f32mat2x4 fmat2x4;\n\n/// Default single-precision floating-point 3x2 matrix.\n/// @see gtc_type_precision\ntypedef highp_f32mat3x2 fmat3x2;\n\n/// Default single-precision floating-point 3x3 matrix.\n/// @see gtc_type_precision\ntypedef highp_f32mat3x3 fmat3x3;\n\n/// Default single-precision floating-point 3x4 matrix.\n/// @see gtc_type_precision\ntypedef highp_f32mat3x4 fmat3x4;\n\n/// Default single-precision floating-point 4x2 matrix.\n/// @see gtc_type_precision\ntypedef highp_f32mat4x2 fmat4x2;\n\n/// Default single-precision floating-point 4x3 matrix.\n/// @see gtc_type_precision\ntypedef highp_f32mat4x3 fmat4x3;\n\n/// Default single-precision floating-point 4x4 matrix.\n/// @see gtc_type_precision\ntypedef highp_f32mat4x4 fmat4x4;\n\n/// Default single-precision floating-point 2x2 matrix.\n/// @see gtc_type_precision\ntypedef fmat2x2 fmat2;\n\n/// Default single-precision floating-point 3x3 matrix.\n/// @see gtc_type_precision\ntypedef fmat3x3 fmat3;\n\n/// Default single-precision floating-point 4x4 matrix.\n/// @see gtc_type_precision\ntypedef fmat4x4 fmat4;\n\n/// Default single-precision floating-point quaternion.\n/// @see gtc_type_precision\ntypedef highp_fquat fquat;\n\n/// Default single-precision floating-point vector of 1 components.\n/// @see gtc_type_precision\ntypedef highp_f32vec1 f32vec1;\n\n/// Default single-precision floating-point vector of 2 components.\n/// @see gtc_type_precision\ntypedef highp_f32vec2 f32vec2;\n\n/// Default single-precision floating-point vector of 3 components.\n/// @see gtc_type_precision\ntypedef highp_f32vec3 f32vec3;\n\n/// Default single-precision floating-point vector of 4 components.\n/// @see gtc_type_precision\ntypedef highp_f32vec4 f32vec4;\n\n/// Default single-precision floating-point 2x2 matrix.\n/// @see gtc_type_precision\ntypedef highp_f32mat2x2 f32mat2x2;\n\n/// Default single-precision floating-point 2x3 matrix.\n/// @see gtc_type_precision\ntypedef highp_f32mat2x3 f32mat2x3;\n\n/// Default single-precision floating-point 2x4 matrix.\n/// @see gtc_type_precision\ntypedef highp_f32mat2x4 f32mat2x4;\n\n/// Default single-precision floating-point 3x2 matrix.\n/// @see gtc_type_precision\ntypedef highp_f32mat3x2 f32mat3x2;\n\n/// Default single-precision floating-point 3x3 matrix.\n/// @see gtc_type_precision\ntypedef highp_f32mat3x3 f32mat3x3;\n\n/// Default single-precision floating-point 3x4 matrix.\n/// @see gtc_type_precision\ntypedef highp_f32mat3x4 f32mat3x4;\n\n/// Default single-precision floating-point 4x2 matrix.\n/// @see gtc_type_precision\ntypedef highp_f32mat4x2 f32mat4x2;\n\n/// Default single-precision floating-point 4x3 matrix.\n/// @see gtc_type_precision\ntypedef highp_f32mat4x3 f32mat4x3;\n\n/// Default single-precision floating-point 4x4 matrix.\n/// @see gtc_type_precision\ntypedef highp_f32mat4x4 f32mat4x4;\n\n/// Default single-precision floating-point 2x2 matrix.\n/// @see gtc_type_precision\ntypedef f32mat2x2 f32mat2;\n\n/// Default single-precision floating-point 3x3 matrix.\n/// @see gtc_type_precision\ntypedef f32mat3x3 f32mat3;\n\n/// Default single-precision floating-point 4x4 matrix.\n/// @see gtc_type_precision\ntypedef f32mat4x4 f32mat4;\n\n/// Default single-precision floating-point quaternion.\n/// @see gtc_type_precision\ntypedef highp_f32quat f32quat;\n#endif\n\n#if (defined(GLM_PRECISION_LOWP_DOUBLE))\ntypedef lowp_f64vec1 f64vec1;\ntypedef lowp_f64vec2 f64vec2;\ntypedef lowp_f64vec3 f64vec3;\ntypedef lowp_f64vec4 f64vec4;\ntypedef lowp_f64mat2 f64mat2;\ntypedef lowp_f64mat3 f64mat3;\ntypedef lowp_f64mat4 f64mat4;\ntypedef lowp_f64mat2x2 f64mat2x2;\ntypedef lowp_f64mat3x2 f64mat3x2;\ntypedef lowp_f64mat4x2 f64mat4x2;\ntypedef lowp_f64mat2x3 f64mat2x3;\ntypedef lowp_f64mat3x3 f64mat3x3;\ntypedef lowp_f64mat4x3 f64mat4x3;\ntypedef lowp_f64mat2x4 f64mat2x4;\ntypedef lowp_f64mat3x4 f64mat3x4;\ntypedef lowp_f64mat4x4 f64mat4x4;\ntypedef lowp_f64quat f64quat;\n#elif (defined(GLM_PRECISION_MEDIUMP_DOUBLE))\ntypedef mediump_f64vec1 f64vec1;\ntypedef mediump_f64vec2 f64vec2;\ntypedef mediump_f64vec3 f64vec3;\ntypedef mediump_f64vec4 f64vec4;\ntypedef mediump_f64mat2 f64mat2;\ntypedef mediump_f64mat3 f64mat3;\ntypedef mediump_f64mat4 f64mat4;\ntypedef mediump_f64mat2x2 f64mat2x2;\ntypedef mediump_f64mat3x2 f64mat3x2;\ntypedef mediump_f64mat4x2 f64mat4x2;\ntypedef mediump_f64mat2x3 f64mat2x3;\ntypedef mediump_f64mat3x3 f64mat3x3;\ntypedef mediump_f64mat4x3 f64mat4x3;\ntypedef mediump_f64mat2x4 f64mat2x4;\ntypedef mediump_f64mat3x4 f64mat3x4;\ntypedef mediump_f64mat4x4 f64mat4x4;\ntypedef mediump_f64quat f64quat;\n#else\n/// Default double-precision floating-point vector of 1 components.\n/// @see gtc_type_precision\ntypedef highp_f64vec1 f64vec1;\n\n/// Default double-precision floating-point vector of 2 components.\n/// @see gtc_type_precision\ntypedef highp_f64vec2 f64vec2;\n\n/// Default double-precision floating-point vector of 3 components.\n/// @see gtc_type_precision\ntypedef highp_f64vec3 f64vec3;\n\n/// Default double-precision floating-point vector of 4 components.\n/// @see gtc_type_precision\ntypedef highp_f64vec4 f64vec4;\n\n/// Default double-precision floating-point 2x2 matrix.\n/// @see gtc_type_precision\ntypedef highp_f64mat2x2 f64mat2x2;\n\n/// Default double-precision floating-point 2x3 matrix.\n/// @see gtc_type_precision\ntypedef highp_f64mat2x3 f64mat2x3;\n\n/// Default double-precision floating-point 2x4 matrix.\n/// @see gtc_type_precision\ntypedef highp_f64mat2x4 f64mat2x4;\n\n/// Default double-precision floating-point 3x2 matrix.\n/// @see gtc_type_precision\ntypedef highp_f64mat3x2 f64mat3x2;\n\n/// Default double-precision floating-point 3x3 matrix.\n/// @see gtc_type_precision\ntypedef highp_f64mat3x3 f64mat3x3;\n\n/// Default double-precision floating-point 3x4 matrix.\n/// @see gtc_type_precision\ntypedef highp_f64mat3x4 f64mat3x4;\n\n/// Default double-precision floating-point 4x2 matrix.\n/// @see gtc_type_precision\ntypedef highp_f64mat4x2 f64mat4x2;\n\n/// Default double-precision floating-point 4x3 matrix.\n/// @see gtc_type_precision\ntypedef highp_f64mat4x3 f64mat4x3;\n\n/// Default double-precision floating-point 4x4 matrix.\n/// @see gtc_type_precision\ntypedef highp_f64mat4x4 f64mat4x4;\n\n/// Default double-precision floating-point 2x2 matrix.\n/// @see gtc_type_precision\ntypedef f64mat2x2 f64mat2;\n\n/// Default double-precision floating-point 3x3 matrix.\n/// @see gtc_type_precision\ntypedef f64mat3x3 f64mat3;\n\n/// Default double-precision floating-point 4x4 matrix.\n/// @see gtc_type_precision\ntypedef f64mat4x4 f64mat4;\n\n/// Default double-precision floating-point quaternion.\n/// @see gtc_type_precision\ntypedef highp_f64quat f64quat;\n#endif\n}  // namespace glm\n\n#endif  // GLM_FWD_INCLUDED\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/geometric.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/geometric.hpp\n/// @date 2013-12-24 / 2013-12-24\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GEOMETRIC_INCLUDED\n#define GLM_GEOMETRIC_INCLUDED\n\n#include \"detail/func_geometric.hpp\"\n\n#endif  // GLM_GEOMETRIC_INCLUDED\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/glm.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/glm.hpp\n/// @date 2005-01-14 / 2011-10-24\n/// @author Christophe Riccio\n///\n///\t@defgroup core GLM Core\n///\n///\t@brief The core of GLM, which implements exactly and only the GLSL\n/// specification to the degree possible.\n///\n/// The GLM core consists of @ref core_types \"C++ types that mirror GLSL types\"\n/// and C++ functions that mirror the GLSL functions. It also includes\n/// @ref core_precision \"a set of precision-based types\" that can be used in the\n/// appropriate functions. The C++ types are all based on a basic set of @ref\n/// core_template \"template types\".\n///\n/// The best documentation for GLM Core is the current GLSL specification,\n/// <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.clean.pdf\">version\n/// 4.2 (pdf file)</a>. There are a few @ref pg_differences \"differences\"\n/// between GLM core and GLSL.\n///\n/// GLM core functionnalities require <glm/glm.hpp> to be included to be used.\n///\n/// @defgroup core_types Types\n///\n/// @brief The standard types defined by the specification.\n///\n/// These types are all typedefs of more generalized, template types. To see the\n/// definiton of these template types, go to @ref core_template.\n///\n/// @ingroup core\n///\n/// @defgroup core_precision Precision types\n///\n/// @brief Non-GLSL types that are used to define precision-based types.\n///\n/// The GLSL language allows the user to define the precision of a particular\n/// variable. In OpenGL's GLSL, these precision qualifiers have no effect; they\n/// are there for compatibility with OpenGL ES's precision qualifiers, where\n/// they @em do have an effect.\n///\n/// C++ has no language equivalent to precision qualifiers. So GLM provides the\n/// next-best thing: a number of typedefs of the @ref core_template that use a\n/// particular precision.\n///\n/// None of these types make any guarantees about the actual precision used.\n///\n/// @ingroup core\n///\n/// @defgroup core_template Template types\n///\n/// @brief The generic template types used as the basis for the core types.\n///\n/// These types are all templates used to define the actual @ref core_types.\n/// These templetes are implementation details of GLM types and should not be\n/// used explicitly.\n///\n/// @ingroup core\n///////////////////////////////////////////////////////////////////////////////////\n\n#include \"detail/_fixes.hpp\"\n\n#ifndef GLM_INCLUDED\n#define GLM_INCLUDED\n\n#include <cassert>\n#include <cfloat>\n#include <climits>\n#include <cmath>\n#include <limits>\n\n#include \"fwd.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_CORE_INCLUDED_DISPLAYED))\n#define GLM_MESSAGE_CORE_INCLUDED_DISPLAYED\n#pragma message(\"GLM: Core library included\")\n#endif  // GLM_MESSAGE\n\n#include \"common.hpp\"\n#include \"exponential.hpp\"\n#include \"geometric.hpp\"\n#include \"integer.hpp\"\n#include \"mat2x2.hpp\"\n#include \"mat2x3.hpp\"\n#include \"mat2x4.hpp\"\n#include \"mat3x2.hpp\"\n#include \"mat3x3.hpp\"\n#include \"mat3x4.hpp\"\n#include \"mat4x2.hpp\"\n#include \"mat4x3.hpp\"\n#include \"mat4x4.hpp\"\n#include \"matrix.hpp\"\n#include \"packing.hpp\"\n#include \"trigonometric.hpp\"\n#include \"vec2.hpp\"\n#include \"vec3.hpp\"\n#include \"vec4.hpp\"\n#include \"vector_relational.hpp\"\n\n#endif  // GLM_INCLUDED\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtc/constants.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtc_constants\n/// @file glm/gtc/constants.hpp\n/// @date 2011-09-30 / 2012-01-25\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtc_half_float (dependence)\n///\n/// @defgroup gtc_constants GLM_GTC_constants\n/// @ingroup gtc\n///\n/// @brief Provide a list of constants and precomputed useful values.\n///\n/// <glm/gtc/constants.hpp> need to be included to use these features.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTC_constants\n#define GLM_GTC_constants\n\n// Dependencies\n#include \"../detail/setup.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTC_constants extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtc_constants\n/// @{\n\n/// Return the epsilon constant for floating point types.\n/// @todo Implement epsilon for half-precision floating point type.\n/// @see gtc_constants\ntemplate <typename genType>\nGLM_FUNC_DECL genType epsilon();\n\n/// Return 0.\n/// @see gtc_constants\ntemplate <typename genType>\nGLM_FUNC_DECL genType zero();\n\n/// Return 1.\n/// @see gtc_constants\ntemplate <typename genType>\nGLM_FUNC_DECL genType one();\n\n/// Return the pi constant.\n/// @see gtc_constants\ntemplate <typename genType>\nGLM_FUNC_DECL genType pi();\n\n/// Return square root of pi.\n/// @see gtc_constants\ntemplate <typename genType>\nGLM_FUNC_DECL genType root_pi();\n\n/// Return pi / 2.\n/// @see gtc_constants\ntemplate <typename genType>\nGLM_FUNC_DECL genType half_pi();\n\n/// Return pi / 4.\n/// @see gtc_constants\ntemplate <typename genType>\nGLM_FUNC_DECL genType quarter_pi();\n\n/// Return 1 / pi.\n/// @see gtc_constants\ntemplate <typename genType>\nGLM_FUNC_DECL genType one_over_pi();\n\n/// Return 2 / pi.\n/// @see gtc_constants\ntemplate <typename genType>\nGLM_FUNC_DECL genType two_over_pi();\n\n/// Return 2 / sqrt(pi).\n/// @see gtc_constants\ntemplate <typename genType>\nGLM_FUNC_DECL genType two_over_root_pi();\n\n/// Return 1 / sqrt(2).\n/// @see gtc_constants\ntemplate <typename genType>\nGLM_FUNC_DECL genType one_over_root_two();\n\n/// Return sqrt(pi / 2).\n/// @see gtc_constants\ntemplate <typename genType>\nGLM_FUNC_DECL genType root_half_pi();\n\n/// Return sqrt(2 * pi).\n/// @see gtc_constants\ntemplate <typename genType>\nGLM_FUNC_DECL genType root_two_pi();\n\n/// Return sqrt(ln(4)).\n/// @see gtc_constants\ntemplate <typename genType>\nGLM_FUNC_DECL genType root_ln_four();\n\n/// Return e constant.\n/// @see gtc_constants\ntemplate <typename genType>\nGLM_FUNC_DECL genType e();\n\n/// Return Euler's constant.\n/// @see gtc_constants\ntemplate <typename genType>\nGLM_FUNC_DECL genType euler();\n\n/// Return sqrt(2).\n/// @see gtc_constants\ntemplate <typename genType>\nGLM_FUNC_DECL genType root_two();\n\n/// Return sqrt(3).\n/// @see gtc_constants\ntemplate <typename genType>\nGLM_FUNC_DECL genType root_three();\n\n/// Return sqrt(5).\n/// @see gtc_constants\ntemplate <typename genType>\nGLM_FUNC_DECL genType root_five();\n\n/// Return ln(2).\n/// @see gtc_constants\ntemplate <typename genType>\nGLM_FUNC_DECL genType ln_two();\n\n/// Return ln(10).\n/// @see gtc_constants\ntemplate <typename genType>\nGLM_FUNC_DECL genType ln_ten();\n\n/// Return ln(ln(2)).\n/// @see gtc_constants\ntemplate <typename genType>\nGLM_FUNC_DECL genType ln_ln_two();\n\n/// Return 1 / 3.\n/// @see gtc_constants\ntemplate <typename genType>\nGLM_FUNC_DECL genType third();\n\n/// Return 2 / 3.\n/// @see gtc_constants\ntemplate <typename genType>\nGLM_FUNC_DECL genType two_thirds();\n\n/// Return the golden ratio constant.\n/// @see gtc_constants\ntemplate <typename genType>\nGLM_FUNC_DECL genType golden_ratio();\n\n/// @}\n}  // namespace glm\n\n#include \"constants.inl\"\n\n#endif  // GLM_GTC_constants\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtc/constants.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_constants\n/// @file glm/gtx/constants.inl\n/// @date 2011-10-14 / 2012-01-25\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#include <limits>\n\nnamespace glm {\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType epsilon() {\n  return std::numeric_limits<genType>::epsilon();\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType zero() {\n  return genType(0);\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType one() {\n  return genType(1);\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType pi() {\n  return genType(3.14159265358979323846264338327950288);\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType root_pi() {\n  return genType(1.772453850905516027);\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType half_pi() {\n  return genType(1.57079632679489661923132169163975144);\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType quarter_pi() {\n  return genType(0.785398163397448309615660845819875721);\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType one_over_pi() {\n  return genType(0.318309886183790671537767526745028724);\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType two_over_pi() {\n  return genType(0.636619772367581343075535053490057448);\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType two_over_root_pi() {\n  return genType(1.12837916709551257389615890312154517);\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType one_over_root_two() {\n  return genType(0.707106781186547524400844362104849039);\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType root_half_pi() {\n  return genType(1.253314137315500251);\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType root_two_pi() {\n  return genType(2.506628274631000502);\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType root_ln_four() {\n  return genType(1.17741002251547469);\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType e() {\n  return genType(2.71828182845904523536);\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType euler() {\n  return genType(0.577215664901532860606);\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType root_two() {\n  return genType(1.41421356237309504880168872420969808);\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType root_three() {\n  return genType(1.73205080756887729352744634150587236);\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType root_five() {\n  return genType(2.23606797749978969640917366873127623);\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType ln_two() {\n  return genType(0.693147180559945309417232121458176568);\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType ln_ten() {\n  return genType(2.30258509299404568401799145468436421);\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType ln_ln_two() {\n  return genType(-0.3665129205816643);\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType third() {\n  return genType(0.3333333333333333333333333333333333333333);\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType two_thirds() {\n  return genType(0.666666666666666666666666666666666666667);\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType golden_ratio() {\n  return genType(1.61803398874989484820458683436563811);\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtc/epsilon.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtc_epsilon\n/// @file glm/gtc/epsilon.hpp\n/// @date 2012-04-07 / 2012-04-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtc_half_float (dependence)\n/// @see gtc_quaternion (dependence)\n///\n/// @defgroup gtc_epsilon GLM_GTC_epsilon\n/// @ingroup gtc\n///\n/// @brief Comparison functions for a user defined epsilon values.\n///\n/// <glm/gtc/epsilon.hpp> need to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTC_epsilon\n#define GLM_GTC_epsilon\n\n// Dependencies\n#include \"../detail/precision.hpp\"\n#include \"../detail/setup.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTC_epsilon extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtc_epsilon\n/// @{\n\n/// Returns the component-wise comparison of |x - y| < epsilon.\n/// True if this expression is satisfied.\n///\n/// @see gtc_epsilon\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_DECL vecType<bool, P> epsilonEqual(vecType<T, P> const& x,\n                                            vecType<T, P> const& y,\n                                            T const& epsilon);\n\n/// Returns the component-wise comparison of |x - y| < epsilon.\n/// True if this expression is satisfied.\n///\n/// @see gtc_epsilon\ntemplate <typename genType>\nGLM_FUNC_DECL bool epsilonEqual(genType const& x, genType const& y,\n                                genType const& epsilon);\n\n/// Returns the component-wise comparison of |x - y| < epsilon.\n/// True if this expression is not satisfied.\n///\n/// @see gtc_epsilon\ntemplate <typename genType>\nGLM_FUNC_DECL typename genType::boolType epsilonNotEqual(\n    genType const& x, genType const& y,\n    typename genType::value_type const& epsilon);\n\n/// Returns the component-wise comparison of |x - y| >= epsilon.\n/// True if this expression is not satisfied.\n///\n/// @see gtc_epsilon\ntemplate <typename genType>\nGLM_FUNC_DECL bool epsilonNotEqual(genType const& x, genType const& y,\n                                   genType const& epsilon);\n\n/// @}\n}  // namespace glm\n\n#include \"epsilon.inl\"\n\n#endif  // GLM_GTC_epsilon\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtc/epsilon.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtc_epsilon\n/// @file glm/gtc/epsilon.inl\n/// @date 2012-04-07 / 2012-04-07\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n// Dependency:\n#include \"../common.hpp\"\n#include \"../vec2.hpp\"\n#include \"../vec3.hpp\"\n#include \"../vec4.hpp\"\n#include \"../vector_relational.hpp\"\n#include \"quaternion.hpp\"\n\nnamespace glm {\ntemplate <>\nGLM_FUNC_QUALIFIER bool epsilonEqual(float const& x, float const& y,\n                                     float const& epsilon) {\n  return abs(x - y) < epsilon;\n}\n\ntemplate <>\nGLM_FUNC_QUALIFIER bool epsilonEqual(double const& x, double const& y,\n                                     double const& epsilon) {\n  return abs(x - y) < epsilon;\n}\n\ntemplate <>\nGLM_FUNC_QUALIFIER bool epsilonNotEqual(float const& x, float const& y,\n                                        float const& epsilon) {\n  return abs(x - y) >= epsilon;\n}\n\ntemplate <>\nGLM_FUNC_QUALIFIER bool epsilonNotEqual(double const& x, double const& y,\n                                        double const& epsilon) {\n  return abs(x - y) >= epsilon;\n}\n\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER vecType<bool, P> epsilonEqual(vecType<T, P> const& x,\n                                                 vecType<T, P> const& y,\n                                                 T const& epsilon) {\n  return lessThan(abs(x - y), vecType<T, P>(epsilon));\n}\n\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER vecType<bool, P> epsilonEqual(vecType<T, P> const& x,\n                                                 vecType<T, P> const& y,\n                                                 vecType<T, P> const& epsilon) {\n  return lessThan(abs(x - y), vecType<T, P>(epsilon));\n}\n\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER vecType<bool, P> epsilonNotEqual(vecType<T, P> const& x,\n                                                    vecType<T, P> const& y,\n                                                    T const& epsilon) {\n  return greaterThanEqual(abs(x - y), vecType<T, P>(epsilon));\n}\n\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER vecType<bool, P> epsilonNotEqual(\n    vecType<T, P> const& x, vecType<T, P> const& y,\n    vecType<T, P> const& epsilon) {\n  return greaterThanEqual(abs(x - y), vecType<T, P>(epsilon));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<bool, P> epsilonEqual(\n    detail::tquat<T, P> const& x, detail::tquat<T, P> const& y,\n    T const& epsilon) {\n  detail::tvec4<T, P> v(x.x - y.x, x.y - y.y, x.z - y.z, x.w - y.w);\n  return lessThan(abs(v), detail::tvec4<T, P>(epsilon));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<bool, P> epsilonNotEqual(\n    detail::tquat<T, P> const& x, detail::tquat<T, P> const& y,\n    T const& epsilon) {\n  detail::tvec4<T, P> v(x.x - y.x, x.y - y.y, x.z - y.z, x.w - y.w);\n  return greaterThanEqual(abs(v), detail::tvec4<T, P>(epsilon));\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtc/matrix_access.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtc_matrix_access\n/// @file glm/gtc/matrix_access.hpp\n/// @date 2005-12-27 / 2011-05-16\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n///\n/// @defgroup gtc_matrix_access GLM_GTC_matrix_access\n/// @ingroup gtc\n///\n/// Defines functions to access rows or columns of a matrix easily.\n/// <glm/gtc/matrix_access.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTC_matrix_access\n#define GLM_GTC_matrix_access\n\n// Dependency:\n#include \"../detail/setup.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTC_matrix_access extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtc_matrix_access\n/// @{\n\n/// Get a specific row of a matrix.\n/// @see gtc_matrix_access\ntemplate <typename genType>\nGLM_FUNC_DECL typename genType::row_type row(genType const& m,\n                                             length_t const& index);\n\n/// Set a specific row to a matrix.\n/// @see gtc_matrix_access\ntemplate <typename genType>\nGLM_FUNC_DECL genType row(genType const& m, length_t const& index,\n                          typename genType::row_type const& x);\n\n/// Get a specific column of a matrix.\n/// @see gtc_matrix_access\ntemplate <typename genType>\nGLM_FUNC_DECL typename genType::col_type column(genType const& m,\n                                                length_t const& index);\n\n/// Set a specific column to a matrix.\n/// @see gtc_matrix_access\ntemplate <typename genType>\nGLM_FUNC_DECL genType column(genType const& m, length_t const& index,\n                             typename genType::col_type const& x);\n\n/// @}\n}  // namespace glm\n\n#include \"matrix_access.inl\"\n\n#endif  // GLM_GTC_matrix_access\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtc/matrix_access.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtc_matrix_access\n/// @file glm/gtc/matrix_access.inl\n/// @date 2005-12-27 / 2011-06-05\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType row(genType const& m, length_t const& index,\n                               typename genType::row_type const& x) {\n  assert(index >= 0 && index < m[0].length());\n\n  genType Result = m;\n  for (length_t i = 0; i < m.length(); ++i) Result[i][index] = x[i];\n  return Result;\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER typename genType::row_type row(genType const& m,\n                                                  length_t const& index) {\n  assert(index >= 0 && index < m[0].length());\n\n  typename genType::row_type Result;\n  for (length_t i = 0; i < m.length(); ++i) Result[i] = m[i][index];\n  return Result;\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType column(genType const& m, length_t const& index,\n                                  typename genType::col_type const& x) {\n  assert(index >= 0 && index < m.length());\n\n  genType Result = m;\n  Result[index] = x;\n  return Result;\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER typename genType::col_type column(genType const& m,\n                                                     length_t const& index) {\n  assert(index >= 0 && index < m.length());\n\n  return m[index];\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtc/matrix_integer.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtc_matrix_integer\n/// @file glm/gtc/matrix_integer.hpp\n/// @date 2011-01-20 / 2011-06-05\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n///\n/// @defgroup gtc_matrix_integer GLM_GTC_matrix_integer\n/// @ingroup gtc\n///\n/// Defines a number of matrices with integer types.\n/// <glm/gtc/matrix_integer.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTC_matrix_integer\n#define GLM_GTC_matrix_integer\n\n// Dependency:\n#include \"../mat2x2.hpp\"\n#include \"../mat2x3.hpp\"\n#include \"../mat2x4.hpp\"\n#include \"../mat3x2.hpp\"\n#include \"../mat3x3.hpp\"\n#include \"../mat3x4.hpp\"\n#include \"../mat4x2.hpp\"\n#include \"../mat4x3.hpp\"\n#include \"../mat4x4.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTC_matrix_integer extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtc_matrix_integer\n/// @{\n\n/// High-precision signed integer 2x2 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat2x2<int, highp> highp_imat2;\n\n/// High-precision signed integer 3x3 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat3x3<int, highp> highp_imat3;\n\n/// High-precision signed integer 4x4 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat4x4<int, highp> highp_imat4;\n\n/// High-precision signed integer 2x2 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat2x2<int, highp> highp_imat2x2;\n\n/// High-precision signed integer 2x3 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat2x3<int, highp> highp_imat2x3;\n\n/// High-precision signed integer 2x4 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat2x4<int, highp> highp_imat2x4;\n\n/// High-precision signed integer 3x2 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat3x2<int, highp> highp_imat3x2;\n\n/// High-precision signed integer 3x3 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat3x3<int, highp> highp_imat3x3;\n\n/// High-precision signed integer 3x4 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat3x4<int, highp> highp_imat3x4;\n\n/// High-precision signed integer 4x2 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat4x2<int, highp> highp_imat4x2;\n\n/// High-precision signed integer 4x3 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat4x3<int, highp> highp_imat4x3;\n\n/// High-precision signed integer 4x4 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat4x4<int, highp> highp_imat4x4;\n\n/// Medium-precision signed integer 2x2 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat2x2<int, mediump> mediump_imat2;\n\n/// Medium-precision signed integer 3x3 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat3x3<int, mediump> mediump_imat3;\n\n/// Medium-precision signed integer 4x4 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat4x4<int, mediump> mediump_imat4;\n\n/// Medium-precision signed integer 2x2 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat2x2<int, mediump> mediump_imat2x2;\n\n/// Medium-precision signed integer 2x3 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat2x3<int, mediump> mediump_imat2x3;\n\n/// Medium-precision signed integer 2x4 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat2x4<int, mediump> mediump_imat2x4;\n\n/// Medium-precision signed integer 3x2 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat3x2<int, mediump> mediump_imat3x2;\n\n/// Medium-precision signed integer 3x3 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat3x3<int, mediump> mediump_imat3x3;\n\n/// Medium-precision signed integer 3x4 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat3x4<int, mediump> mediump_imat3x4;\n\n/// Medium-precision signed integer 4x2 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat4x2<int, mediump> mediump_imat4x2;\n\n/// Medium-precision signed integer 4x3 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat4x3<int, mediump> mediump_imat4x3;\n\n/// Medium-precision signed integer 4x4 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat4x4<int, mediump> mediump_imat4x4;\n\n/// Low-precision signed integer 2x2 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat2x2<int, lowp> lowp_imat2;\n\n/// Low-precision signed integer 3x3 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat3x3<int, lowp> lowp_imat3;\n\n/// Low-precision signed integer 4x4 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat4x4<int, lowp> lowp_imat4;\n\n/// Low-precision signed integer 2x2 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat2x2<int, lowp> lowp_imat2x2;\n\n/// Low-precision signed integer 2x3 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat2x3<int, lowp> lowp_imat2x3;\n\n/// Low-precision signed integer 2x4 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat2x4<int, lowp> lowp_imat2x4;\n\n/// Low-precision signed integer 3x2 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat3x2<int, lowp> lowp_imat3x2;\n\n/// Low-precision signed integer 3x3 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat3x3<int, lowp> lowp_imat3x3;\n\n/// Low-precision signed integer 3x4 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat3x4<int, lowp> lowp_imat3x4;\n\n/// Low-precision signed integer 4x2 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat4x2<int, lowp> lowp_imat4x2;\n\n/// Low-precision signed integer 4x3 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat4x3<int, lowp> lowp_imat4x3;\n\n/// Low-precision signed integer 4x4 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat4x4<int, lowp> lowp_imat4x4;\n\n/// High-precision unsigned integer 2x2 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat2x2<uint, highp> highp_umat2;\n\n/// High-precision unsigned integer 3x3 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat3x3<uint, highp> highp_umat3;\n\n/// High-precision unsigned integer 4x4 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat4x4<uint, highp> highp_umat4;\n\n/// High-precision unsigned integer 2x2 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat2x2<uint, highp> highp_umat2x2;\n\n/// High-precision unsigned integer 2x3 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat2x3<uint, highp> highp_umat2x3;\n\n/// High-precision unsigned integer 2x4 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat2x4<uint, highp> highp_umat2x4;\n\n/// High-precision unsigned integer 3x2 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat3x2<uint, highp> highp_umat3x2;\n\n/// High-precision unsigned integer 3x3 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat3x3<uint, highp> highp_umat3x3;\n\n/// High-precision unsigned integer 3x4 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat3x4<uint, highp> highp_umat3x4;\n\n/// High-precision unsigned integer 4x2 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat4x2<uint, highp> highp_umat4x2;\n\n/// High-precision unsigned integer 4x3 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat4x3<uint, highp> highp_umat4x3;\n\n/// High-precision unsigned integer 4x4 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat4x4<uint, highp> highp_umat4x4;\n\n/// Medium-precision unsigned integer 2x2 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat2x2<uint, mediump> mediump_umat2;\n\n/// Medium-precision unsigned integer 3x3 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat3x3<uint, mediump> mediump_umat3;\n\n/// Medium-precision unsigned integer 4x4 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat4x4<uint, mediump> mediump_umat4;\n\n/// Medium-precision unsigned integer 2x2 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat2x2<uint, mediump> mediump_umat2x2;\n\n/// Medium-precision unsigned integer 2x3 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat2x3<uint, mediump> mediump_umat2x3;\n\n/// Medium-precision unsigned integer 2x4 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat2x4<uint, mediump> mediump_umat2x4;\n\n/// Medium-precision unsigned integer 3x2 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat3x2<uint, mediump> mediump_umat3x2;\n\n/// Medium-precision unsigned integer 3x3 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat3x3<uint, mediump> mediump_umat3x3;\n\n/// Medium-precision unsigned integer 3x4 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat3x4<uint, mediump> mediump_umat3x4;\n\n/// Medium-precision unsigned integer 4x2 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat4x2<uint, mediump> mediump_umat4x2;\n\n/// Medium-precision unsigned integer 4x3 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat4x3<uint, mediump> mediump_umat4x3;\n\n/// Medium-precision unsigned integer 4x4 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat4x4<uint, mediump> mediump_umat4x4;\n\n/// Low-precision unsigned integer 2x2 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat2x2<uint, lowp> lowp_umat2;\n\n/// Low-precision unsigned integer 3x3 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat3x3<uint, lowp> lowp_umat3;\n\n/// Low-precision unsigned integer 4x4 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat4x4<uint, lowp> lowp_umat4;\n\n/// Low-precision unsigned integer 2x2 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat2x2<uint, lowp> lowp_umat2x2;\n\n/// Low-precision unsigned integer 2x3 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat2x3<uint, lowp> lowp_umat2x3;\n\n/// Low-precision unsigned integer 2x4 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat2x4<uint, lowp> lowp_umat2x4;\n\n/// Low-precision unsigned integer 3x2 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat3x2<uint, lowp> lowp_umat3x2;\n\n/// Low-precision unsigned integer 3x3 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat3x3<uint, lowp> lowp_umat3x3;\n\n/// Low-precision unsigned integer 3x4 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat3x4<uint, lowp> lowp_umat3x4;\n\n/// Low-precision unsigned integer 4x2 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat4x2<uint, lowp> lowp_umat4x2;\n\n/// Low-precision unsigned integer 4x3 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat4x3<uint, lowp> lowp_umat4x3;\n\n/// Low-precision unsigned integer 4x4 matrix.\n/// @see gtc_matrix_integer\ntypedef detail::tmat4x4<uint, lowp> lowp_umat4x4;\n\n#if (defined(GLM_PRECISION_HIGHP_INT))\ntypedef highp_imat2 imat2;\ntypedef highp_imat3 imat3;\ntypedef highp_imat4 imat4;\ntypedef highp_imat2x2 imat2x2;\ntypedef highp_imat2x3 imat2x3;\ntypedef highp_imat2x4 imat2x4;\ntypedef highp_imat3x2 imat3x2;\ntypedef highp_imat3x3 imat3x3;\ntypedef highp_imat3x4 imat3x4;\ntypedef highp_imat4x2 imat4x2;\ntypedef highp_imat4x3 imat4x3;\ntypedef highp_imat4x4 imat4x4;\n#elif (defined(GLM_PRECISION_LOWP_INT))\ntypedef lowp_imat2 imat2;\ntypedef lowp_imat3 imat3;\ntypedef lowp_imat4 imat4;\ntypedef lowp_imat2x2 imat2x2;\ntypedef lowp_imat2x3 imat2x3;\ntypedef lowp_imat2x4 imat2x4;\ntypedef lowp_imat3x2 imat3x2;\ntypedef lowp_imat3x3 imat3x3;\ntypedef lowp_imat3x4 imat3x4;\ntypedef lowp_imat4x2 imat4x2;\ntypedef lowp_imat4x3 imat4x3;\ntypedef lowp_imat4x4 imat4x4;\n#else   // if(defined(GLM_PRECISION_MEDIUMP_INT))\n\n/// Signed integer 2x2 matrix.\n/// @see gtc_matrix_integer\ntypedef mediump_imat2 imat2;\n\n/// Signed integer 3x3 matrix.\n/// @see gtc_matrix_integer\ntypedef mediump_imat3 imat3;\n\n/// Signed integer 4x4 matrix.\n/// @see gtc_matrix_integer\ntypedef mediump_imat4 imat4;\n\n/// Signed integer 2x2 matrix.\n/// @see gtc_matrix_integer\ntypedef mediump_imat2x2 imat2x2;\n\n/// Signed integer 2x3 matrix.\n/// @see gtc_matrix_integer\ntypedef mediump_imat2x3 imat2x3;\n\n/// Signed integer 2x4 matrix.\n/// @see gtc_matrix_integer\ntypedef mediump_imat2x4 imat2x4;\n\n/// Signed integer 3x2 matrix.\n/// @see gtc_matrix_integer\ntypedef mediump_imat3x2 imat3x2;\n\n/// Signed integer 3x3 matrix.\n/// @see gtc_matrix_integer\ntypedef mediump_imat3x3 imat3x3;\n\n/// Signed integer 3x4 matrix.\n/// @see gtc_matrix_integer\ntypedef mediump_imat3x4 imat3x4;\n\n/// Signed integer 4x2 matrix.\n/// @see gtc_matrix_integer\ntypedef mediump_imat4x2 imat4x2;\n\n/// Signed integer 4x3 matrix.\n/// @see gtc_matrix_integer\ntypedef mediump_imat4x3 imat4x3;\n\n/// Signed integer 4x4 matrix.\n/// @see gtc_matrix_integer\ntypedef mediump_imat4x4 imat4x4;\n#endif  // GLM_PRECISION\n\n#if (defined(GLM_PRECISION_HIGHP_UINT))\ntypedef highp_umat2 umat2;\ntypedef highp_umat3 umat3;\ntypedef highp_umat4 umat4;\ntypedef highp_umat2x2 umat2x2;\ntypedef highp_umat2x3 umat2x3;\ntypedef highp_umat2x4 umat2x4;\ntypedef highp_umat3x2 umat3x2;\ntypedef highp_umat3x3 umat3x3;\ntypedef highp_umat3x4 umat3x4;\ntypedef highp_umat4x2 umat4x2;\ntypedef highp_umat4x3 umat4x3;\ntypedef highp_umat4x4 umat4x4;\n#elif (defined(GLM_PRECISION_LOWP_UINT))\ntypedef lowp_umat2 umat2;\ntypedef lowp_umat3 umat3;\ntypedef lowp_umat4 umat4;\ntypedef lowp_umat2x2 umat2x2;\ntypedef lowp_umat2x3 umat2x3;\ntypedef lowp_umat2x4 umat2x4;\ntypedef lowp_umat3x2 umat3x2;\ntypedef lowp_umat3x3 umat3x3;\ntypedef lowp_umat3x4 umat3x4;\ntypedef lowp_umat4x2 umat4x2;\ntypedef lowp_umat4x3 umat4x3;\ntypedef lowp_umat4x4 umat4x4;\n#else   // if(defined(GLM_PRECISION_MEDIUMP_UINT))\n\n/// Unsigned integer 2x2 matrix.\n/// @see gtc_matrix_integer\ntypedef mediump_umat2 umat2;\n\n/// Unsigned integer 3x3 matrix.\n/// @see gtc_matrix_integer\ntypedef mediump_umat3 umat3;\n\n/// Unsigned integer 4x4 matrix.\n/// @see gtc_matrix_integer\ntypedef mediump_umat4 umat4;\n\n/// Unsigned integer 2x2 matrix.\n/// @see gtc_matrix_integer\ntypedef mediump_umat2x2 umat2x2;\n\n/// Unsigned integer 2x3 matrix.\n/// @see gtc_matrix_integer\ntypedef mediump_umat2x3 umat2x3;\n\n/// Unsigned integer 2x4 matrix.\n/// @see gtc_matrix_integer\ntypedef mediump_umat2x4 umat2x4;\n\n/// Unsigned integer 3x2 matrix.\n/// @see gtc_matrix_integer\ntypedef mediump_umat3x2 umat3x2;\n\n/// Unsigned integer 3x3 matrix.\n/// @see gtc_matrix_integer\ntypedef mediump_umat3x3 umat3x3;\n\n/// Unsigned integer 3x4 matrix.\n/// @see gtc_matrix_integer\ntypedef mediump_umat3x4 umat3x4;\n\n/// Unsigned integer 4x2 matrix.\n/// @see gtc_matrix_integer\ntypedef mediump_umat4x2 umat4x2;\n\n/// Unsigned integer 4x3 matrix.\n/// @see gtc_matrix_integer\ntypedef mediump_umat4x3 umat4x3;\n\n/// Unsigned integer 4x4 matrix.\n/// @see gtc_matrix_integer\ntypedef mediump_umat4x4 umat4x4;\n#endif  // GLM_PRECISION\n\n/// @}\n}  // namespace glm\n\n#endif  // GLM_GTC_matrix_integer\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtc/matrix_inverse.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtc_matrix_inverse\n/// @file glm/gtc/matrix_inverse.hpp\n/// @date 2005-12-21 / 2011-06-05\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n///\n/// @defgroup gtc_matrix_inverse GLM_GTC_matrix_inverse\n/// @ingroup gtc\n///\n/// Defines additional matrix inverting functions.\n/// <glm/gtc/matrix_inverse.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTC_matrix_inverse\n#define GLM_GTC_matrix_inverse\n\n// Dependencies\n#include \"../detail/setup.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTC_matrix_inverse extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtc_matrix_inverse\n/// @{\n\n/// Fast matrix inverse for affine matrix.\n///\n/// @param m Input matrix to invert.\n/// @tparam genType Squared floating-point matrix: half, float or double.\n/// Inverse of matrix based of half-precision floating point value is highly\n/// innacurate.\n/// @see gtc_matrix_inverse\ntemplate <typename genType>\nGLM_FUNC_DECL genType affineInverse(genType const& m);\n\n/// Compute the inverse transpose of a matrix.\n///\n/// @param m Input matrix to invert transpose.\n/// @tparam genType Squared floating-point matrix: half, float or double.\n/// Inverse of matrix based of half-precision floating point value is highly\n/// innacurate.\n/// @see gtc_matrix_inverse\ntemplate <typename genType>\nGLM_FUNC_DECL typename genType::value_type inverseTranspose(genType const& m);\n\n/// @}\n}  // namespace glm\n\n#include \"matrix_inverse.inl\"\n\n#endif  // GLM_GTC_matrix_inverse\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtc/matrix_inverse.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtc_matrix_inverse\n/// @file glm/gtc/matrix_inverse.inl\n/// @date 2005-12-21 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#include \"../mat2x2.hpp\"\n#include \"../mat3x3.hpp\"\n#include \"../mat4x4.hpp\"\n\nnamespace glm {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat3x3<T, P> affineInverse(\n    detail::tmat3x3<T, P> const& m) {\n  detail::tmat3x3<T, P> Result(m);\n  Result[2] = detail::tvec3<T, P>(0, 0, 1);\n  Result = transpose(Result);\n  detail::tvec3<T, P> Translation =\n      Result * detail::tvec3<T, P>(-detail::tvec2<T, P>(m[2]), m[2][2]);\n  Result[2] = Translation;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> affineInverse(\n    detail::tmat4x4<T, P> const& m) {\n  detail::tmat4x4<T, P> Result(m);\n  Result[3] = detail::tvec4<T, P>(0, 0, 0, 1);\n  Result = transpose(Result);\n  detail::tvec4<T, P> Translation =\n      Result * detail::tvec4<T, P>(-detail::tvec3<T, P>(m[3]), m[3][3]);\n  Result[3] = Translation;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat2x2<T, P> inverseTranspose(\n    detail::tmat2x2<T, P> const& m) {\n  T Determinant = m[0][0] * m[1][1] - m[1][0] * m[0][1];\n\n  detail::tmat2x2<T, P> Inverse(+m[1][1] / Determinant, -m[0][1] / Determinant,\n                                -m[1][0] / Determinant, +m[0][0] / Determinant);\n\n  return Inverse;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat3x3<T, P> inverseTranspose(\n    detail::tmat3x3<T, P> const& m) {\n  T Determinant = +m[0][0] * (m[1][1] * m[2][2] - m[1][2] * m[2][1]) -\n                  m[0][1] * (m[1][0] * m[2][2] - m[1][2] * m[2][0]) +\n                  m[0][2] * (m[1][0] * m[2][1] - m[1][1] * m[2][0]);\n\n  detail::tmat3x3<T, P> Inverse;\n  Inverse[0][0] = +(m[1][1] * m[2][2] - m[2][1] * m[1][2]);\n  Inverse[0][1] = -(m[1][0] * m[2][2] - m[2][0] * m[1][2]);\n  Inverse[0][2] = +(m[1][0] * m[2][1] - m[2][0] * m[1][1]);\n  Inverse[1][0] = -(m[0][1] * m[2][2] - m[2][1] * m[0][2]);\n  Inverse[1][1] = +(m[0][0] * m[2][2] - m[2][0] * m[0][2]);\n  Inverse[1][2] = -(m[0][0] * m[2][1] - m[2][0] * m[0][1]);\n  Inverse[2][0] = +(m[0][1] * m[1][2] - m[1][1] * m[0][2]);\n  Inverse[2][1] = -(m[0][0] * m[1][2] - m[1][0] * m[0][2]);\n  Inverse[2][2] = +(m[0][0] * m[1][1] - m[1][0] * m[0][1]);\n  Inverse /= Determinant;\n\n  return Inverse;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> inverseTranspose(\n    detail::tmat4x4<T, P> const& m) {\n  T SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];\n  T SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];\n  T SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];\n  T SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];\n  T SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];\n  T SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];\n  T SubFactor06 = m[1][2] * m[3][3] - m[3][2] * m[1][3];\n  T SubFactor07 = m[1][1] * m[3][3] - m[3][1] * m[1][3];\n  T SubFactor08 = m[1][1] * m[3][2] - m[3][1] * m[1][2];\n  T SubFactor09 = m[1][0] * m[3][3] - m[3][0] * m[1][3];\n  T SubFactor10 = m[1][0] * m[3][2] - m[3][0] * m[1][2];\n  T SubFactor11 = m[1][1] * m[3][3] - m[3][1] * m[1][3];\n  T SubFactor12 = m[1][0] * m[3][1] - m[3][0] * m[1][1];\n  T SubFactor13 = m[1][2] * m[2][3] - m[2][2] * m[1][3];\n  T SubFactor14 = m[1][1] * m[2][3] - m[2][1] * m[1][3];\n  T SubFactor15 = m[1][1] * m[2][2] - m[2][1] * m[1][2];\n  T SubFactor16 = m[1][0] * m[2][3] - m[2][0] * m[1][3];\n  T SubFactor17 = m[1][0] * m[2][2] - m[2][0] * m[1][2];\n  T SubFactor18 = m[1][0] * m[2][1] - m[2][0] * m[1][1];\n\n  detail::tmat4x4<T, P> Inverse;\n  Inverse[0][0] =\n      +(m[1][1] * SubFactor00 - m[1][2] * SubFactor01 + m[1][3] * SubFactor02);\n  Inverse[0][1] =\n      -(m[1][0] * SubFactor00 - m[1][2] * SubFactor03 + m[1][3] * SubFactor04);\n  Inverse[0][2] =\n      +(m[1][0] * SubFactor01 - m[1][1] * SubFactor03 + m[1][3] * SubFactor05);\n  Inverse[0][3] =\n      -(m[1][0] * SubFactor02 - m[1][1] * SubFactor04 + m[1][2] * SubFactor05);\n\n  Inverse[1][0] =\n      -(m[0][1] * SubFactor00 - m[0][2] * SubFactor01 + m[0][3] * SubFactor02);\n  Inverse[1][1] =\n      +(m[0][0] * SubFactor00 - m[0][2] * SubFactor03 + m[0][3] * SubFactor04);\n  Inverse[1][2] =\n      -(m[0][0] * SubFactor01 - m[0][1] * SubFactor03 + m[0][3] * SubFactor05);\n  Inverse[1][3] =\n      +(m[0][0] * SubFactor02 - m[0][1] * SubFactor04 + m[0][2] * SubFactor05);\n\n  Inverse[2][0] =\n      +(m[0][1] * SubFactor06 - m[0][2] * SubFactor07 + m[0][3] * SubFactor08);\n  Inverse[2][1] =\n      -(m[0][0] * SubFactor06 - m[0][2] * SubFactor09 + m[0][3] * SubFactor10);\n  Inverse[2][2] =\n      +(m[0][0] * SubFactor11 - m[0][1] * SubFactor09 + m[0][3] * SubFactor12);\n  Inverse[2][3] =\n      -(m[0][0] * SubFactor08 - m[0][1] * SubFactor10 + m[0][2] * SubFactor12);\n\n  Inverse[3][0] =\n      -(m[0][1] * SubFactor13 - m[0][2] * SubFactor14 + m[0][3] * SubFactor15);\n  Inverse[3][1] =\n      +(m[0][0] * SubFactor13 - m[0][2] * SubFactor16 + m[0][3] * SubFactor17);\n  Inverse[3][2] =\n      -(m[0][0] * SubFactor14 - m[0][1] * SubFactor16 + m[0][3] * SubFactor18);\n  Inverse[3][3] =\n      +(m[0][0] * SubFactor15 - m[0][1] * SubFactor17 + m[0][2] * SubFactor18);\n\n  T Determinant = +m[0][0] * Inverse[0][0] + m[0][1] * Inverse[0][1] +\n                  m[0][2] * Inverse[0][2] + m[0][3] * Inverse[0][3];\n\n  Inverse /= Determinant;\n\n  return Inverse;\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtc/matrix_transform.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtc_matrix_transform\n/// @file glm/gtc/matrix_transform.hpp\n/// @date 2009-04-29 / 2011-05-16\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtx_transform\n/// @see gtx_transform2\n///\n/// @defgroup gtc_matrix_transform GLM_GTC_matrix_transform\n/// @ingroup gtc\n///\n/// @brief Defines functions that generate common transformation matrices.\n///\n/// The matrices generated by this extension use standard OpenGL fixed-function\n/// conventions. For example, the lookAt function generates a transform from\n/// world space into the specific eye space that the projective matrix functions\n/// (perspective, ortho, etc) are designed to expect. The OpenGL compatibility\n/// specifications defines the particular layout of this eye space.\n///\n/// <glm/gtc/matrix_transform.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTC_matrix_transform\n#define GLM_GTC_matrix_transform\n\n// Dependency:\n#include \"../mat4x4.hpp\"\n#include \"../vec2.hpp\"\n#include \"../vec3.hpp\"\n#include \"../vec4.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTC_matrix_transform extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtc_matrix_transform\n/// @{\n\n/// Builds a translation 4 * 4 matrix created from a vector of 3 components.\n///\n/// @param m Input matrix multiplied by this translation matrix.\n/// @param v Coordinates of a translation vector.\n/// @tparam T Value type used to build the matrix. Currently supported: half\n/// (not recommanded), float or double.\n/// @code\n/// #include <glm/glm.hpp>\n/// #include <glm/gtc/matrix_transform.hpp>\n/// ...\n/// glm::mat4 m = glm::translate(glm::mat4(1.0f), glm::vec3(1.0f));\n/// // m[0][0] == 1.0f, m[0][1] == 0.0f, m[0][2] == 0.0f, m[0][3] == 0.0f\n/// // m[1][0] == 0.0f, m[1][1] == 1.0f, m[1][2] == 0.0f, m[1][3] == 0.0f\n/// // m[2][0] == 0.0f, m[2][1] == 0.0f, m[2][2] == 1.0f, m[2][3] == 0.0f\n/// // m[3][0] == 1.0f, m[3][1] == 1.0f, m[3][2] == 1.0f, m[3][3] == 1.0f\n/// @endcode\n/// @see gtc_matrix_transform\n/// @see gtx_transform\n/// @see - translate(T x, T y, T z)\n/// @see - translate(detail::tmat4x4<T, P> const & m, T x, T y, T z)\n/// @see - translate(detail::tvec3<T, P> const & v)\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x4<T, P> translate(detail::tmat4x4<T, P> const& m,\n                                              detail::tvec3<T, P> const& v);\n\n/// Builds a rotation 4 * 4 matrix created from an axis vector and an angle.\n///\n/// @param m Input matrix multiplied by this rotation matrix.\n/// @param angle Rotation angle expressed in radians if GLM_FORCE_RADIANS is\n/// define or degrees otherwise.\n/// @param axis Rotation axis, recommanded to be normalized.\n/// @tparam T Value type used to build the matrix. Supported: half, float or\n/// double.\n/// @see gtc_matrix_transform\n/// @see gtx_transform\n/// @see - rotate(T angle, T x, T y, T z)\n/// @see - rotate(detail::tmat4x4<T, P> const & m, T angle, T x, T y, T z)\n/// @see - rotate(T angle, detail::tvec3<T, P> const & v)\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x4<T, P> rotate(detail::tmat4x4<T, P> const& m,\n                                           T const& angle,\n                                           detail::tvec3<T, P> const& axis);\n\n/// Builds a scale 4 * 4 matrix created from 3 scalars.\n///\n/// @param m Input matrix multiplied by this scale matrix.\n/// @param v Ratio of scaling for each axis.\n/// @tparam T Value type used to build the matrix. Currently supported: half\n/// (not recommanded), float or double.\n/// @see gtc_matrix_transform\n/// @see gtx_transform\n/// @see - scale(T x, T y, T z) scale(T const & x, T const & y, T const & z)\n/// @see - scale(detail::tmat4x4<T, P> const & m, T x, T y, T z)\n/// @see - scale(detail::tvec3<T, P> const & v)\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x4<T, P> scale(detail::tmat4x4<T, P> const& m,\n                                          detail::tvec3<T, P> const& v);\n\n/// Creates a matrix for an orthographic parallel viewing volume.\n///\n/// @param left\n/// @param right\n/// @param bottom\n/// @param top\n/// @param zNear\n/// @param zFar\n/// @tparam T Value type used to build the matrix. Currently supported: half\n/// (not recommanded), float or double.\n/// @see gtc_matrix_transform\n/// @see - glm::ortho(T const & left, T const & right, T const & bottom, T const\n/// & top)\ntemplate <typename T>\nGLM_FUNC_DECL detail::tmat4x4<T, defaultp> ortho(T const& left, T const& right,\n                                                 T const& bottom, T const& top,\n                                                 T const& zNear, T const& zFar);\n\n/// Creates a matrix for projecting two-dimensional coordinates onto the screen.\n///\n/// @param left\n/// @param right\n/// @param bottom\n/// @param top\n/// @tparam T Value type used to build the matrix. Currently supported: half\n/// (not recommanded), float or double.\n/// @see gtc_matrix_transform\n/// @see - glm::ortho(T const & left, T const & right, T const & bottom, T const\n/// & top, T const & zNear, T const & zFar)\ntemplate <typename T>\nGLM_FUNC_DECL detail::tmat4x4<T, defaultp> ortho(T const& left, T const& right,\n                                                 T const& bottom, T const& top);\n\n/// Creates a frustum matrix.\n///\n/// @param left\n/// @param right\n/// @param bottom\n/// @param top\n/// @param near\n/// @param far\n/// @tparam T Value type used to build the matrix. Currently supported: half\n/// (not recommanded), float or double.\n/// @see gtc_matrix_transform\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x4<T, P> frustum(T const& left, T const& right,\n                                            T const& bottom, T const& top,\n                                            T const& near, T const& far);\n\n/// Creates a matrix for a symetric perspective-view frustum.\n///\n/// @param fovy Expressed in radians if GLM_FORCE_RADIANS is define or degrees\n/// otherwise.\n/// @param aspect\n/// @param near\n/// @param far\n/// @tparam T Value type used to build the matrix. Currently supported: half\n/// (not recommanded), float or double.\n/// @see gtc_matrix_transform\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x4<T, P> perspective(T const& fovy, T const& aspect,\n                                                T const& near, T const& far);\n\n/// Builds a perspective projection matrix based on a field of view.\n///\n/// @param fov Expressed in radians if GLM_FORCE_RADIANS is define or degrees\n/// otherwise.\n/// @param width\n/// @param height\n/// @param near\n/// @param far\n/// @tparam T Value type used to build the matrix. Currently supported: half\n/// (not recommanded), float or double.\n/// @see gtc_matrix_transform\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x4<T, P> perspectiveFov(T const& fov, T const& width,\n                                                   T const& height,\n                                                   T const& near, T const& far);\n\n/// Creates a matrix for a symmetric perspective-view frustum with far plane at\n/// infinite.\n///\n/// @param fovy Expressed in radians if GLM_FORCE_RADIANS is define or degrees\n/// otherwise.\n/// @param aspect\n/// @param near\n/// @tparam T Value type used to build the matrix. Currently supported: half\n/// (not recommanded), float or double.\n/// @see gtc_matrix_transform\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x4<T, P> infinitePerspective(T fovy, T aspect,\n                                                        T near);\n\n/// Creates a matrix for a symmetric perspective-view frustum with far plane at\n/// infinite for graphics hardware that doesn't support depth clamping.\n///\n/// @param fovy Expressed in radians if GLM_FORCE_RADIANS is define or degrees\n/// otherwise.\n/// @param aspect\n/// @param near\n/// @tparam T Value type used to build the matrix. Currently supported: half\n/// (not recommanded), float or double.\n/// @see gtc_matrix_transform\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x4<T, P> tweakedInfinitePerspective(T fovy, T aspect,\n                                                               T near);\n\n/// Map the specified object coordinates (obj.x, obj.y, obj.z) into window\n/// coordinates.\n///\n/// @param obj\n/// @param model\n/// @param proj\n/// @param viewport\n/// @tparam T Native type used for the computation. Currently supported: half\n/// (not recommanded), float or double.\n/// @tparam U Currently supported: Floating-point types and integer types.\n/// @see gtc_matrix_transform\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_DECL detail::tvec3<T, P> project(detail::tvec3<T, P> const& obj,\n                                          detail::tmat4x4<T, P> const& model,\n                                          detail::tmat4x4<T, P> const& proj,\n                                          detail::tvec4<U, P> const& viewport);\n\n/// Map the specified window coordinates (win.x, win.y, win.z) into object\n/// coordinates.\n///\n/// @param win\n/// @param model\n/// @param proj\n/// @param viewport\n/// @tparam T Native type used for the computation. Currently supported: half\n/// (not recommanded), float or double.\n/// @tparam U Currently supported: Floating-point types and integer types.\n/// @see gtc_matrix_transform\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_DECL detail::tvec3<T, P> unProject(\n    detail::tvec3<T, P> const& win, detail::tmat4x4<T, P> const& model,\n    detail::tmat4x4<T, P> const& proj, detail::tvec4<U, P> const& viewport);\n\n/// Define a picking region\n///\n/// @param center\n/// @param delta\n/// @param viewport\n/// @tparam T Native type used for the computation. Currently supported: half\n/// (not recommanded), float or double.\n/// @tparam U Currently supported: Floating-point types and integer types.\n/// @see gtc_matrix_transform\ntemplate <typename T, precision P, typename U>\nGLM_FUNC_DECL detail::tmat4x4<T, P> pickMatrix(\n    detail::tvec2<T, P> const& center, detail::tvec2<T, P> const& delta,\n    detail::tvec4<U, P> const& viewport);\n\n/// Build a look at view matrix.\n///\n/// @param eye Position of the camera\n/// @param center Position where the camera is looking at\n/// @param up Normalized up vector, how the camera is oriented. Typically (0, 0,\n/// 1)\n/// @see gtc_matrix_transform\n/// @see - frustum(T const & left, T const & right, T const & bottom, T const &\n/// top, T const & nearVal, T const & farVal) frustum(T const & left, T const &\n/// right, T const & bottom, T const & top, T const & nearVal, T const & farVal)\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x4<T, P> lookAt(detail::tvec3<T, P> const& eye,\n                                           detail::tvec3<T, P> const& center,\n                                           detail::tvec3<T, P> const& up);\n\n/// @}\n}  // namespace glm\n\n#include \"matrix_transform.inl\"\n\n#endif  // GLM_GTC_matrix_transform\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtc/matrix_transform.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtc_matrix_transform\n/// @file glm/gtc/matrix_transform.inl\n/// @date 2009-04-29 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#include \"../geometric.hpp\"\n#include \"../matrix.hpp\"\n#include \"../trigonometric.hpp\"\n\nnamespace glm {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> translate(\n    detail::tmat4x4<T, P> const& m, detail::tvec3<T, P> const& v) {\n  detail::tmat4x4<T, P> Result(m);\n  Result[3] = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3];\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> rotate(detail::tmat4x4<T, P> const& m,\n                                                T const& angle,\n                                                detail::tvec3<T, P> const& v) {\n#ifdef GLM_FORCE_RADIANS\n  T a = angle;\n#else\n#pragma message( \\\n        \"GLM: rotate function taking degrees as a parameter is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.\")\n  T a = radians(angle);\n#endif\n  T c = cos(a);\n  T s = sin(a);\n\n  detail::tvec3<T, P> axis(normalize(v));\n  detail::tvec3<T, P> temp((T(1) - c) * axis);\n\n  detail::tmat4x4<T, P> Rotate(detail::tmat4x4<T, P>::_null);\n  Rotate[0][0] = c + temp[0] * axis[0];\n  Rotate[0][1] = 0 + temp[0] * axis[1] + s * axis[2];\n  Rotate[0][2] = 0 + temp[0] * axis[2] - s * axis[1];\n\n  Rotate[1][0] = 0 + temp[1] * axis[0] - s * axis[2];\n  Rotate[1][1] = c + temp[1] * axis[1];\n  Rotate[1][2] = 0 + temp[1] * axis[2] + s * axis[0];\n\n  Rotate[2][0] = 0 + temp[2] * axis[0] + s * axis[1];\n  Rotate[2][1] = 0 + temp[2] * axis[1] - s * axis[0];\n  Rotate[2][2] = c + temp[2] * axis[2];\n\n  detail::tmat4x4<T, P> Result(detail::tmat4x4<T, P>::_null);\n  Result[0] = m[0] * Rotate[0][0] + m[1] * Rotate[0][1] + m[2] * Rotate[0][2];\n  Result[1] = m[0] * Rotate[1][0] + m[1] * Rotate[1][1] + m[2] * Rotate[1][2];\n  Result[2] = m[0] * Rotate[2][0] + m[1] * Rotate[2][1] + m[2] * Rotate[2][2];\n  Result[3] = m[3];\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> rotate_slow(\n    detail::tmat4x4<T, P> const& m, T const& angle,\n    detail::tvec3<T, P> const& v) {\n#ifdef GLM_FORCE_RADIANS\n  T const a = angle;\n#else\n#pragma message( \\\n        \"GLM: rotate_slow function taking degrees as a parameter is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.\")\n  T const a = radians(angle);\n#endif\n  T c = cos(a);\n  T s = sin(a);\n  detail::tmat4x4<T, P> Result;\n\n  detail::tvec3<T, P> axis = normalize(v);\n\n  Result[0][0] = c + (1 - c) * axis.x * axis.x;\n  Result[0][1] = (1 - c) * axis.x * axis.y + s * axis.z;\n  Result[0][2] = (1 - c) * axis.x * axis.z - s * axis.y;\n  Result[0][3] = 0;\n\n  Result[1][0] = (1 - c) * axis.y * axis.x - s * axis.z;\n  Result[1][1] = c + (1 - c) * axis.y * axis.y;\n  Result[1][2] = (1 - c) * axis.y * axis.z + s * axis.x;\n  Result[1][3] = 0;\n\n  Result[2][0] = (1 - c) * axis.z * axis.x + s * axis.y;\n  Result[2][1] = (1 - c) * axis.z * axis.y - s * axis.x;\n  Result[2][2] = c + (1 - c) * axis.z * axis.z;\n  Result[2][3] = 0;\n\n  Result[3] = detail::tvec4<T, P>(0, 0, 0, 1);\n  return m * Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> scale(detail::tmat4x4<T, P> const& m,\n                                               detail::tvec3<T, P> const& v) {\n  detail::tmat4x4<T, P> Result(detail::tmat4x4<T, P>::_null);\n  Result[0] = m[0] * v[0];\n  Result[1] = m[1] * v[1];\n  Result[2] = m[2] * v[2];\n  Result[3] = m[3];\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> scale_slow(\n    detail::tmat4x4<T, P> const& m, detail::tvec3<T, P> const& v) {\n  detail::tmat4x4<T, P> Result(T(1));\n  Result[0][0] = v.x;\n  Result[1][1] = v.y;\n  Result[2][2] = v.z;\n  return m * Result;\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, defaultp> ortho(\n    T const& left, T const& right, T const& bottom, T const& top,\n    T const& zNear, T const& zFar) {\n  detail::tmat4x4<T, defaultp> Result(1);\n  Result[0][0] = static_cast<T>(2) / (right - left);\n  Result[1][1] = static_cast<T>(2) / (top - bottom);\n  Result[2][2] = -T(2) / (zFar - zNear);\n  Result[3][0] = -(right + left) / (right - left);\n  Result[3][1] = -(top + bottom) / (top - bottom);\n  Result[3][2] = -(zFar + zNear) / (zFar - zNear);\n  return Result;\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, defaultp> ortho(T const& left,\n                                                      T const& right,\n                                                      T const& bottom,\n                                                      T const& top) {\n  detail::tmat4x4<T, defaultp> Result(1);\n  Result[0][0] = static_cast<T>(2) / (right - left);\n  Result[1][1] = static_cast<T>(2) / (top - bottom);\n  Result[2][2] = -T(1);\n  Result[3][0] = -(right + left) / (right - left);\n  Result[3][1] = -(top + bottom) / (top - bottom);\n  return Result;\n}\n\ntemplate <typename valType>\nGLM_FUNC_QUALIFIER detail::tmat4x4<valType, defaultp> frustum(\n    valType const& left, valType const& right, valType const& bottom,\n    valType const& top, valType const& nearVal, valType const& farVal) {\n  detail::tmat4x4<valType, defaultp> Result(0);\n  Result[0][0] = (valType(2) * nearVal) / (right - left);\n  Result[1][1] = (valType(2) * nearVal) / (top - bottom);\n  Result[2][0] = (right + left) / (right - left);\n  Result[2][1] = (top + bottom) / (top - bottom);\n  Result[2][2] = -(farVal + nearVal) / (farVal - nearVal);\n  Result[2][3] = valType(-1);\n  Result[3][2] = -(valType(2) * farVal * nearVal) / (farVal - nearVal);\n  return Result;\n}\n\ntemplate <typename valType>\nGLM_FUNC_QUALIFIER detail::tmat4x4<valType, defaultp> perspective(\n    valType const& fovy, valType const& aspect, valType const& zNear,\n    valType const& zFar) {\n  assert(aspect != valType(0));\n  assert(zFar != zNear);\n\n#ifdef GLM_FORCE_RADIANS\n  valType const rad = fovy;\n#else\n#pragma message( \\\n        \"GLM: perspective function taking degrees as a parameter is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.\")\n  valType const rad = glm::radians(fovy);\n#endif\n\n  valType tanHalfFovy = tan(rad / valType(2));\n\n  detail::tmat4x4<valType, defaultp> Result(valType(0));\n  Result[0][0] = valType(1) / (aspect * tanHalfFovy);\n  Result[1][1] = valType(1) / (tanHalfFovy);\n  Result[2][2] = -(zFar + zNear) / (zFar - zNear);\n  Result[2][3] = -valType(1);\n  Result[3][2] = -(valType(2) * zFar * zNear) / (zFar - zNear);\n  return Result;\n}\n\ntemplate <typename valType>\nGLM_FUNC_QUALIFIER detail::tmat4x4<valType, defaultp> perspectiveFov(\n    valType const& fov, valType const& width, valType const& height,\n    valType const& zNear, valType const& zFar) {\n  assert(width > valType(0));\n  assert(height > valType(0));\n  assert(fov > valType(0));\n\n#ifdef GLM_FORCE_RADIANS\n  valType rad = fov;\n#else\n#pragma message( \\\n        \"GLM: perspectiveFov function taking degrees as a parameter is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.\")\n  valType rad = glm::radians(fov);\n#endif\n  valType h = glm::cos(valType(0.5) * rad) / glm::sin(valType(0.5) * rad);\n  valType w =\n      h * height / width;  /// todo max(width , Height) / min(width , Height)?\n\n  detail::tmat4x4<valType, defaultp> Result(valType(0));\n  Result[0][0] = w;\n  Result[1][1] = h;\n  Result[2][2] = -(zFar + zNear) / (zFar - zNear);\n  Result[2][3] = -valType(1);\n  Result[3][2] = -(valType(2) * zFar * zNear) / (zFar - zNear);\n  return Result;\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, defaultp> infinitePerspective(T fovy,\n                                                                    T aspect,\n                                                                    T zNear) {\n#ifdef GLM_FORCE_RADIANS\n  T const range = tan(fovy / T(2)) * zNear;\n#else\n#pragma message( \\\n        \"GLM: infinitePerspective function taking degrees as a parameter is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.\")\n  T const range = tan(radians(fovy / T(2))) * zNear;\n#endif\n  T left = -range * aspect;\n  T right = range * aspect;\n  T bottom = -range;\n  T top = range;\n\n  detail::tmat4x4<T, defaultp> Result(T(0));\n  Result[0][0] = (T(2) * zNear) / (right - left);\n  Result[1][1] = (T(2) * zNear) / (top - bottom);\n  Result[2][2] = -T(1);\n  Result[2][3] = -T(1);\n  Result[3][2] = -T(2) * zNear;\n  return Result;\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, defaultp> tweakedInfinitePerspective(\n    T fovy, T aspect, T zNear) {\n#ifdef GLM_FORCE_RADIANS\n  T range = tan(fovy / T(2)) * zNear;\n#else\n#pragma message( \\\n        \"GLM: tweakedInfinitePerspective function taking degrees as a parameter is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.\")\n  T range = tan(radians(fovy / T(2))) * zNear;\n#endif\n  T left = -range * aspect;\n  T right = range * aspect;\n  T bottom = -range;\n  T top = range;\n\n  detail::tmat4x4<T, defaultp> Result(T(0));\n  Result[0][0] = (T(2) * zNear) / (right - left);\n  Result[1][1] = (T(2) * zNear) / (top - bottom);\n  Result[2][2] = static_cast<T>(0.0001) - T(1);\n  Result[2][3] = static_cast<T>(-1);\n  Result[3][2] = -(T(0.0001) - T(2)) * zNear;\n  return Result;\n}\n\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> project(\n    detail::tvec3<T, P> const& obj, detail::tmat4x4<T, P> const& model,\n    detail::tmat4x4<T, P> const& proj, detail::tvec4<U, P> const& viewport) {\n  detail::tvec4<T, P> tmp = detail::tvec4<T, P>(obj, T(1));\n  tmp = model * tmp;\n  tmp = proj * tmp;\n\n  tmp /= tmp.w;\n  tmp = tmp * T(0.5) + T(0.5);\n  tmp[0] = tmp[0] * T(viewport[2]) + T(viewport[0]);\n  tmp[1] = tmp[1] * T(viewport[3]) + T(viewport[1]);\n\n  return detail::tvec3<T, P>(tmp);\n}\n\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> unProject(\n    detail::tvec3<T, P> const& win, detail::tmat4x4<T, P> const& model,\n    detail::tmat4x4<T, P> const& proj, detail::tvec4<U, P> const& viewport) {\n  detail::tmat4x4<T, P> Inverse = inverse(proj * model);\n\n  detail::tvec4<T, P> tmp = detail::tvec4<T, P>(win, T(1));\n  tmp.x = (tmp.x - T(viewport[0])) / T(viewport[2]);\n  tmp.y = (tmp.y - T(viewport[1])) / T(viewport[3]);\n  tmp = tmp * T(2) - T(1);\n\n  detail::tvec4<T, P> obj = Inverse * tmp;\n  obj /= obj.w;\n\n  return detail::tvec3<T, P>(obj);\n}\n\ntemplate <typename T, precision P, typename U>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> pickMatrix(\n    detail::tvec2<T, P> const& center, detail::tvec2<T, P> const& delta,\n    detail::tvec4<U, P> const& viewport) {\n  assert(delta.x > T(0) && delta.y > T(0));\n  detail::tmat4x4<T, P> Result(1.0f);\n\n  if (!(delta.x > T(0) && delta.y > T(0))) return Result;  // Error\n\n  detail::tvec3<T, P> Temp(\n      (T(viewport[2]) - T(2) * (center.x - T(viewport[0]))) / delta.x,\n      (T(viewport[3]) - T(2) * (center.y - T(viewport[1]))) / delta.y, T(0));\n\n  // Translate and scale the picked region to the entire window\n  Result = translate(Result, Temp);\n  return scale(Result, detail::tvec3<T, P>(T(viewport[2]) / delta.x,\n                                           T(viewport[3]) / delta.y, T(1)));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> lookAt(\n    detail::tvec3<T, P> const& eye, detail::tvec3<T, P> const& center,\n    detail::tvec3<T, P> const& up) {\n  detail::tvec3<T, P> f(normalize(center - eye));\n  detail::tvec3<T, P> s(normalize(cross(f, up)));\n  detail::tvec3<T, P> u(cross(s, f));\n\n  detail::tmat4x4<T, P> Result(1);\n  Result[0][0] = s.x;\n  Result[1][0] = s.y;\n  Result[2][0] = s.z;\n  Result[0][1] = u.x;\n  Result[1][1] = u.y;\n  Result[2][1] = u.z;\n  Result[0][2] = -f.x;\n  Result[1][2] = -f.y;\n  Result[2][2] = -f.z;\n  Result[3][0] = -dot(s, eye);\n  Result[3][1] = -dot(u, eye);\n  Result[3][2] = dot(f, eye);\n  return Result;\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtc/noise.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtc_noise\n/// @file glm/gtc/noise.hpp\n/// @date 2011-04-21 / 2011-09-27\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n///\n/// @defgroup gtc_noise GLM_GTC_noise\n/// @ingroup gtc\n///\n/// Defines 2D, 3D and 4D procedural noise functions\n/// Based on the work of Stefan Gustavson and Ashima Arts on \"webgl-noise\":\n/// https://github.com/ashima/webgl-noise\n/// Following Stefan Gustavson's paper \"Simplex noise demystified\":\n/// http://www.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf\n/// <glm/gtc/noise.hpp> need to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTC_noise\n#define GLM_GTC_noise\n\n// Dependencies\n#include \"../detail/precision.hpp\"\n#include \"../detail/setup.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTC_noise extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtc_noise\n/// @{\n\n/// Classic perlin noise.\n/// @see gtc_noise\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_DECL T perlin(vecType<T, P> const& p);\n\n/// Periodic perlin noise.\n/// @see gtc_noise\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_DECL T perlin(vecType<T, P> const& p, vecType<T, P> const& rep);\n\n/// Simplex noise.\n/// @see gtc_noise\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_DECL T simplex(vecType<T, P> const& p);\n\n/// @}\n}  // namespace glm\n\n#include \"noise.inl\"\n\n#endif  // GLM_GTC_noise\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtc/noise.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtc_noise\n/// @file glm/gtc/noise.inl\n/// @date 2011-04-21 / 2012-04-07\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n// Based on the work of Stefan Gustavson and Ashima Arts on \"webgl-noise\":\n// https://github.com/ashima/webgl-noise\n// Following Stefan Gustavson's paper \"Simplex noise demystified\":\n// http://www.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf\n///////////////////////////////////////////////////////////////////////////////////\n\n#include \"../common.hpp\"\n#include \"../detail/_noise.hpp\"\n#include \"../geometric.hpp\"\n#include \"../vector_relational.hpp\"\n\nnamespace glm {\nnamespace gtc {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> grad4(T const& j,\n                                             detail::tvec4<T, P> const& ip) {\n  detail::tvec3<T, P> pXYZ =\n      floor(fract(detail::tvec3<T, P>(j) * detail::tvec3<T, P>(ip)) * T(7)) *\n          ip[2] -\n      T(1);\n  T pW = static_cast<T>(1.5) - dot(abs(pXYZ), detail::tvec3<T, P>(1));\n  detail::tvec4<T, P> s = detail::tvec4<T, P>(\n      lessThan(detail::tvec4<T, P>(pXYZ, pW), detail::tvec4<T, P>(0.0)));\n  pXYZ = pXYZ + (detail::tvec3<T, P>(s) * T(2) - T(1)) * s.w;\n  return detail::tvec4<T, P>(pXYZ, pW);\n}\n}  // namespace gtc\n\n// Classic Perlin noise\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T perlin(detail::tvec2<T, P> const& Position) {\n  detail::tvec4<T, P> Pi =\n      glm::floor(\n          detail::tvec4<T, P>(Position.x, Position.y, Position.x, Position.y)) +\n      detail::tvec4<T, P>(0.0, 0.0, 1.0, 1.0);\n  detail::tvec4<T, P> Pf =\n      glm::fract(\n          detail::tvec4<T, P>(Position.x, Position.y, Position.x, Position.y)) -\n      detail::tvec4<T, P>(0.0, 0.0, 1.0, 1.0);\n  Pi = mod(Pi, detail::tvec4<T, P>(\n                   289));  // To avoid truncation effects in permutation\n  detail::tvec4<T, P> ix(Pi.x, Pi.z, Pi.x, Pi.z);\n  detail::tvec4<T, P> iy(Pi.y, Pi.y, Pi.w, Pi.w);\n  detail::tvec4<T, P> fx(Pf.x, Pf.z, Pf.x, Pf.z);\n  detail::tvec4<T, P> fy(Pf.y, Pf.y, Pf.w, Pf.w);\n\n  detail::tvec4<T, P> i = detail::permute(detail::permute(ix) + iy);\n\n  detail::tvec4<T, P> gx = static_cast<T>(2) * glm::fract(i / T(41)) - T(1);\n  detail::tvec4<T, P> gy = glm::abs(gx) - T(0.5);\n  detail::tvec4<T, P> tx = glm::floor(gx + T(0.5));\n  gx = gx - tx;\n\n  detail::tvec2<T, P> g00(gx.x, gy.x);\n  detail::tvec2<T, P> g10(gx.y, gy.y);\n  detail::tvec2<T, P> g01(gx.z, gy.z);\n  detail::tvec2<T, P> g11(gx.w, gy.w);\n\n  detail::tvec4<T, P> norm = taylorInvSqrt(detail::tvec4<T, P>(\n      dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11)));\n  g00 *= norm.x;\n  g01 *= norm.y;\n  g10 *= norm.z;\n  g11 *= norm.w;\n\n  T n00 = dot(g00, detail::tvec2<T, P>(fx.x, fy.x));\n  T n10 = dot(g10, detail::tvec2<T, P>(fx.y, fy.y));\n  T n01 = dot(g01, detail::tvec2<T, P>(fx.z, fy.z));\n  T n11 = dot(g11, detail::tvec2<T, P>(fx.w, fy.w));\n\n  detail::tvec2<T, P> fade_xy = fade(detail::tvec2<T, P>(Pf.x, Pf.y));\n  detail::tvec2<T, P> n_x = mix(detail::tvec2<T, P>(n00, n01),\n                                detail::tvec2<T, P>(n10, n11), fade_xy.x);\n  T n_xy = mix(n_x.x, n_x.y, fade_xy.y);\n  return T(2.3) * n_xy;\n}\n\n// Classic Perlin noise\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T perlin(detail::tvec3<T, P> const& Position) {\n  detail::tvec3<T, P> Pi0 = floor(Position);  // Integer part for indexing\n  detail::tvec3<T, P> Pi1 = Pi0 + T(1);       // Integer part + 1\n  Pi0 = mod289(Pi0);\n  Pi1 = mod289(Pi1);\n  detail::tvec3<T, P> Pf0 =\n      fract(Position);                   // Fractional part for interpolation\n  detail::tvec3<T, P> Pf1 = Pf0 - T(1);  // Fractional part - 1.0\n  detail::tvec4<T, P> ix(Pi0.x, Pi1.x, Pi0.x, Pi1.x);\n  detail::tvec4<T, P> iy = detail::tvec4<T, P>(detail::tvec2<T, P>(Pi0.y),\n                                               detail::tvec2<T, P>(Pi1.y));\n  detail::tvec4<T, P> iz0(Pi0.z);\n  detail::tvec4<T, P> iz1(Pi1.z);\n\n  detail::tvec4<T, P> ixy = detail::permute(detail::permute(ix) + iy);\n  detail::tvec4<T, P> ixy0 = detail::permute(ixy + iz0);\n  detail::tvec4<T, P> ixy1 = detail::permute(ixy + iz1);\n\n  detail::tvec4<T, P> gx0 = ixy0 * T(1.0 / 7.0);\n  detail::tvec4<T, P> gy0 = fract(floor(gx0) * T(1.0 / 7.0)) - T(0.5);\n  gx0 = fract(gx0);\n  detail::tvec4<T, P> gz0 = detail::tvec4<T, P>(0.5) - abs(gx0) - abs(gy0);\n  detail::tvec4<T, P> sz0 = step(gz0, detail::tvec4<T, P>(0.0));\n  gx0 -= sz0 * (step(T(0), gx0) - T(0.5));\n  gy0 -= sz0 * (step(T(0), gy0) - T(0.5));\n\n  detail::tvec4<T, P> gx1 = ixy1 * T(1.0 / 7.0);\n  detail::tvec4<T, P> gy1 = fract(floor(gx1) * T(1.0 / 7.0)) - T(0.5);\n  gx1 = fract(gx1);\n  detail::tvec4<T, P> gz1 = detail::tvec4<T, P>(0.5) - abs(gx1) - abs(gy1);\n  detail::tvec4<T, P> sz1 = step(gz1, detail::tvec4<T, P>(0.0));\n  gx1 -= sz1 * (step(T(0), gx1) - T(0.5));\n  gy1 -= sz1 * (step(T(0), gy1) - T(0.5));\n\n  detail::tvec3<T, P> g000(gx0.x, gy0.x, gz0.x);\n  detail::tvec3<T, P> g100(gx0.y, gy0.y, gz0.y);\n  detail::tvec3<T, P> g010(gx0.z, gy0.z, gz0.z);\n  detail::tvec3<T, P> g110(gx0.w, gy0.w, gz0.w);\n  detail::tvec3<T, P> g001(gx1.x, gy1.x, gz1.x);\n  detail::tvec3<T, P> g101(gx1.y, gy1.y, gz1.y);\n  detail::tvec3<T, P> g011(gx1.z, gy1.z, gz1.z);\n  detail::tvec3<T, P> g111(gx1.w, gy1.w, gz1.w);\n\n  detail::tvec4<T, P> norm0 = detail::taylorInvSqrt(detail::tvec4<T, P>(\n      dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110)));\n  g000 *= norm0.x;\n  g010 *= norm0.y;\n  g100 *= norm0.z;\n  g110 *= norm0.w;\n  detail::tvec4<T, P> norm1 = detail::taylorInvSqrt(detail::tvec4<T, P>(\n      dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111)));\n  g001 *= norm1.x;\n  g011 *= norm1.y;\n  g101 *= norm1.z;\n  g111 *= norm1.w;\n\n  T n000 = dot(g000, Pf0);\n  T n100 = dot(g100, detail::tvec3<T, P>(Pf1.x, Pf0.y, Pf0.z));\n  T n010 = dot(g010, detail::tvec3<T, P>(Pf0.x, Pf1.y, Pf0.z));\n  T n110 = dot(g110, detail::tvec3<T, P>(Pf1.x, Pf1.y, Pf0.z));\n  T n001 = dot(g001, detail::tvec3<T, P>(Pf0.x, Pf0.y, Pf1.z));\n  T n101 = dot(g101, detail::tvec3<T, P>(Pf1.x, Pf0.y, Pf1.z));\n  T n011 = dot(g011, detail::tvec3<T, P>(Pf0.x, Pf1.y, Pf1.z));\n  T n111 = dot(g111, Pf1);\n\n  detail::tvec3<T, P> fade_xyz = fade(Pf0);\n  detail::tvec4<T, P> n_z =\n      mix(detail::tvec4<T, P>(n000, n100, n010, n110),\n          detail::tvec4<T, P>(n001, n101, n011, n111), fade_xyz.z);\n  detail::tvec2<T, P> n_yz = mix(detail::tvec2<T, P>(n_z.x, n_z.y),\n                                 detail::tvec2<T, P>(n_z.z, n_z.w), fade_xyz.y);\n  T n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x);\n  return T(2.2) * n_xyz;\n}\n/*\n// Classic Perlin noise\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T perlin(detail::tvec3<T, P> const & P)\n{\n        detail::tvec3<T, P> Pi0 = floor(P); // Integer part for indexing\n        detail::tvec3<T, P> Pi1 = Pi0 + T(1); // Integer part + 1\n        Pi0 = mod(Pi0, T(289));\n        Pi1 = mod(Pi1, T(289));\n        detail::tvec3<T, P> Pf0 = fract(P); // Fractional part for interpolation\n        detail::tvec3<T, P> Pf1 = Pf0 - T(1); // Fractional part - 1.0\n        detail::tvec4<T, P> ix(Pi0.x, Pi1.x, Pi0.x, Pi1.x);\n        detail::tvec4<T, P> iy(Pi0.y, Pi0.y, Pi1.y, Pi1.y);\n        detail::tvec4<T, P> iz0(Pi0.z);\n        detail::tvec4<T, P> iz1(Pi1.z);\n\n        detail::tvec4<T, P> ixy = permute(permute(ix) + iy);\n        detail::tvec4<T, P> ixy0 = permute(ixy + iz0);\n        detail::tvec4<T, P> ixy1 = permute(ixy + iz1);\n\n        detail::tvec4<T, P> gx0 = ixy0 / T(7);\n        detail::tvec4<T, P> gy0 = fract(floor(gx0) / T(7)) - T(0.5);\n        gx0 = fract(gx0);\n        detail::tvec4<T, P> gz0 = detail::tvec4<T, P>(0.5) - abs(gx0) -\nabs(gy0); detail::tvec4<T, P> sz0 = step(gz0, detail::tvec4<T, P>(0.0)); gx0 -=\nsz0 * (step(0.0, gx0) - T(0.5)); gy0 -= sz0 * (step(0.0, gy0) - T(0.5));\n\n        detail::tvec4<T, P> gx1 = ixy1 / T(7);\n        detail::tvec4<T, P> gy1 = fract(floor(gx1) / T(7)) - T(0.5);\n        gx1 = fract(gx1);\n        detail::tvec4<T, P> gz1 = detail::tvec4<T, P>(0.5) - abs(gx1) -\nabs(gy1); detail::tvec4<T, P> sz1 = step(gz1, detail::tvec4<T, P>(0.0)); gx1 -=\nsz1 * (step(T(0), gx1) - T(0.5)); gy1 -= sz1 * (step(T(0), gy1) - T(0.5));\n\n        detail::tvec3<T, P> g000(gx0.x, gy0.x, gz0.x);\n        detail::tvec3<T, P> g100(gx0.y, gy0.y, gz0.y);\n        detail::tvec3<T, P> g010(gx0.z, gy0.z, gz0.z);\n        detail::tvec3<T, P> g110(gx0.w, gy0.w, gz0.w);\n        detail::tvec3<T, P> g001(gx1.x, gy1.x, gz1.x);\n        detail::tvec3<T, P> g101(gx1.y, gy1.y, gz1.y);\n        detail::tvec3<T, P> g011(gx1.z, gy1.z, gz1.z);\n        detail::tvec3<T, P> g111(gx1.w, gy1.w, gz1.w);\n\n        detail::tvec4<T, P> norm0 = taylorInvSqrt(detail::tvec4<T, P>(dot(g000,\ng000), dot(g010, g010), dot(g100, g100), dot(g110, g110))); g000 *= norm0.x;\n        g010 *= norm0.y;\n        g100 *= norm0.z;\n        g110 *= norm0.w;\n        detail::tvec4<T, P> norm1 = taylorInvSqrt(detail::tvec4<T, P>(dot(g001,\ng001), dot(g011, g011), dot(g101, g101), dot(g111, g111))); g001 *= norm1.x;\n        g011 *= norm1.y;\n        g101 *= norm1.z;\n        g111 *= norm1.w;\n\n        T n000 = dot(g000, Pf0);\n        T n100 = dot(g100, detail::tvec3<T, P>(Pf1.x, Pf0.y, Pf0.z));\n        T n010 = dot(g010, detail::tvec3<T, P>(Pf0.x, Pf1.y, Pf0.z));\n        T n110 = dot(g110, detail::tvec3<T, P>(Pf1.x, Pf1.y, Pf0.z));\n        T n001 = dot(g001, detail::tvec3<T, P>(Pf0.x, Pf0.y, Pf1.z));\n        T n101 = dot(g101, detail::tvec3<T, P>(Pf1.x, Pf0.y, Pf1.z));\n        T n011 = dot(g011, detail::tvec3<T, P>(Pf0.x, Pf1.y, Pf1.z));\n        T n111 = dot(g111, Pf1);\n\n        detail::tvec3<T, P> fade_xyz = fade(Pf0);\n        detail::tvec4<T, P> n_z = mix(detail::tvec4<T, P>(n000, n100, n010,\nn110), detail::tvec4<T, P>(n001, n101, n011, n111), fade_xyz.z);\n        detail::tvec2<T, P> n_yz = mix(\n                detail::tvec2<T, P>(n_z.x, n_z.y),\n                detail::tvec2<T, P>(n_z.z, n_z.w), fade_xyz.y);\n        T n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x);\n        return T(2.2) * n_xyz;\n}\n*/\n// Classic Perlin noise\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T perlin(detail::tvec4<T, P> const& Position) {\n  detail::tvec4<T, P> Pi0 = floor(Position);  // Integer part for indexing\n  detail::tvec4<T, P> Pi1 = Pi0 + T(1);       // Integer part + 1\n  Pi0 = mod(Pi0, detail::tvec4<T, P>(289));\n  Pi1 = mod(Pi1, detail::tvec4<T, P>(289));\n  detail::tvec4<T, P> Pf0 =\n      fract(Position);                   // Fractional part for interpolation\n  detail::tvec4<T, P> Pf1 = Pf0 - T(1);  // Fractional part - 1.0\n  detail::tvec4<T, P> ix(Pi0.x, Pi1.x, Pi0.x, Pi1.x);\n  detail::tvec4<T, P> iy(Pi0.y, Pi0.y, Pi1.y, Pi1.y);\n  detail::tvec4<T, P> iz0(Pi0.z);\n  detail::tvec4<T, P> iz1(Pi1.z);\n  detail::tvec4<T, P> iw0(Pi0.w);\n  detail::tvec4<T, P> iw1(Pi1.w);\n\n  detail::tvec4<T, P> ixy = detail::permute(detail::permute(ix) + iy);\n  detail::tvec4<T, P> ixy0 = detail::permute(ixy + iz0);\n  detail::tvec4<T, P> ixy1 = detail::permute(ixy + iz1);\n  detail::tvec4<T, P> ixy00 = detail::permute(ixy0 + iw0);\n  detail::tvec4<T, P> ixy01 = detail::permute(ixy0 + iw1);\n  detail::tvec4<T, P> ixy10 = detail::permute(ixy1 + iw0);\n  detail::tvec4<T, P> ixy11 = detail::permute(ixy1 + iw1);\n\n  detail::tvec4<T, P> gx00 = ixy00 / T(7);\n  detail::tvec4<T, P> gy00 = floor(gx00) / T(7);\n  detail::tvec4<T, P> gz00 = floor(gy00) / T(6);\n  gx00 = fract(gx00) - T(0.5);\n  gy00 = fract(gy00) - T(0.5);\n  gz00 = fract(gz00) - T(0.5);\n  detail::tvec4<T, P> gw00 =\n      detail::tvec4<T, P>(0.75) - abs(gx00) - abs(gy00) - abs(gz00);\n  detail::tvec4<T, P> sw00 = step(gw00, detail::tvec4<T, P>(0.0));\n  gx00 -= sw00 * (step(T(0), gx00) - T(0.5));\n  gy00 -= sw00 * (step(T(0), gy00) - T(0.5));\n\n  detail::tvec4<T, P> gx01 = ixy01 / T(7);\n  detail::tvec4<T, P> gy01 = floor(gx01) / T(7);\n  detail::tvec4<T, P> gz01 = floor(gy01) / T(6);\n  gx01 = fract(gx01) - T(0.5);\n  gy01 = fract(gy01) - T(0.5);\n  gz01 = fract(gz01) - T(0.5);\n  detail::tvec4<T, P> gw01 =\n      detail::tvec4<T, P>(0.75) - abs(gx01) - abs(gy01) - abs(gz01);\n  detail::tvec4<T, P> sw01 = step(gw01, detail::tvec4<T, P>(0.0));\n  gx01 -= sw01 * (step(T(0), gx01) - T(0.5));\n  gy01 -= sw01 * (step(T(0), gy01) - T(0.5));\n\n  detail::tvec4<T, P> gx10 = ixy10 / T(7);\n  detail::tvec4<T, P> gy10 = floor(gx10) / T(7);\n  detail::tvec4<T, P> gz10 = floor(gy10) / T(6);\n  gx10 = fract(gx10) - T(0.5);\n  gy10 = fract(gy10) - T(0.5);\n  gz10 = fract(gz10) - T(0.5);\n  detail::tvec4<T, P> gw10 =\n      detail::tvec4<T, P>(0.75) - abs(gx10) - abs(gy10) - abs(gz10);\n  detail::tvec4<T, P> sw10 = step(gw10, detail::tvec4<T, P>(0));\n  gx10 -= sw10 * (step(T(0), gx10) - T(0.5));\n  gy10 -= sw10 * (step(T(0), gy10) - T(0.5));\n\n  detail::tvec4<T, P> gx11 = ixy11 / T(7);\n  detail::tvec4<T, P> gy11 = floor(gx11) / T(7);\n  detail::tvec4<T, P> gz11 = floor(gy11) / T(6);\n  gx11 = fract(gx11) - T(0.5);\n  gy11 = fract(gy11) - T(0.5);\n  gz11 = fract(gz11) - T(0.5);\n  detail::tvec4<T, P> gw11 =\n      detail::tvec4<T, P>(0.75) - abs(gx11) - abs(gy11) - abs(gz11);\n  detail::tvec4<T, P> sw11 = step(gw11, detail::tvec4<T, P>(0.0));\n  gx11 -= sw11 * (step(T(0), gx11) - T(0.5));\n  gy11 -= sw11 * (step(T(0), gy11) - T(0.5));\n\n  detail::tvec4<T, P> g0000(gx00.x, gy00.x, gz00.x, gw00.x);\n  detail::tvec4<T, P> g1000(gx00.y, gy00.y, gz00.y, gw00.y);\n  detail::tvec4<T, P> g0100(gx00.z, gy00.z, gz00.z, gw00.z);\n  detail::tvec4<T, P> g1100(gx00.w, gy00.w, gz00.w, gw00.w);\n  detail::tvec4<T, P> g0010(gx10.x, gy10.x, gz10.x, gw10.x);\n  detail::tvec4<T, P> g1010(gx10.y, gy10.y, gz10.y, gw10.y);\n  detail::tvec4<T, P> g0110(gx10.z, gy10.z, gz10.z, gw10.z);\n  detail::tvec4<T, P> g1110(gx10.w, gy10.w, gz10.w, gw10.w);\n  detail::tvec4<T, P> g0001(gx01.x, gy01.x, gz01.x, gw01.x);\n  detail::tvec4<T, P> g1001(gx01.y, gy01.y, gz01.y, gw01.y);\n  detail::tvec4<T, P> g0101(gx01.z, gy01.z, gz01.z, gw01.z);\n  detail::tvec4<T, P> g1101(gx01.w, gy01.w, gz01.w, gw01.w);\n  detail::tvec4<T, P> g0011(gx11.x, gy11.x, gz11.x, gw11.x);\n  detail::tvec4<T, P> g1011(gx11.y, gy11.y, gz11.y, gw11.y);\n  detail::tvec4<T, P> g0111(gx11.z, gy11.z, gz11.z, gw11.z);\n  detail::tvec4<T, P> g1111(gx11.w, gy11.w, gz11.w, gw11.w);\n\n  detail::tvec4<T, P> norm00 = detail::taylorInvSqrt(\n      detail::tvec4<T, P>(dot(g0000, g0000), dot(g0100, g0100),\n                          dot(g1000, g1000), dot(g1100, g1100)));\n  g0000 *= norm00.x;\n  g0100 *= norm00.y;\n  g1000 *= norm00.z;\n  g1100 *= norm00.w;\n\n  detail::tvec4<T, P> norm01 = detail::taylorInvSqrt(\n      detail::tvec4<T, P>(dot(g0001, g0001), dot(g0101, g0101),\n                          dot(g1001, g1001), dot(g1101, g1101)));\n  g0001 *= norm01.x;\n  g0101 *= norm01.y;\n  g1001 *= norm01.z;\n  g1101 *= norm01.w;\n\n  detail::tvec4<T, P> norm10 = detail::taylorInvSqrt(\n      detail::tvec4<T, P>(dot(g0010, g0010), dot(g0110, g0110),\n                          dot(g1010, g1010), dot(g1110, g1110)));\n  g0010 *= norm10.x;\n  g0110 *= norm10.y;\n  g1010 *= norm10.z;\n  g1110 *= norm10.w;\n\n  detail::tvec4<T, P> norm11 = detail::taylorInvSqrt(\n      detail::tvec4<T, P>(dot(g0011, g0011), dot(g0111, g0111),\n                          dot(g1011, g1011), dot(g1111, g1111)));\n  g0011 *= norm11.x;\n  g0111 *= norm11.y;\n  g1011 *= norm11.z;\n  g1111 *= norm11.w;\n\n  T n0000 = dot(g0000, Pf0);\n  T n1000 = dot(g1000, detail::tvec4<T, P>(Pf1.x, Pf0.y, Pf0.z, Pf0.w));\n  T n0100 = dot(g0100, detail::tvec4<T, P>(Pf0.x, Pf1.y, Pf0.z, Pf0.w));\n  T n1100 = dot(g1100, detail::tvec4<T, P>(Pf1.x, Pf1.y, Pf0.z, Pf0.w));\n  T n0010 = dot(g0010, detail::tvec4<T, P>(Pf0.x, Pf0.y, Pf1.z, Pf0.w));\n  T n1010 = dot(g1010, detail::tvec4<T, P>(Pf1.x, Pf0.y, Pf1.z, Pf0.w));\n  T n0110 = dot(g0110, detail::tvec4<T, P>(Pf0.x, Pf1.y, Pf1.z, Pf0.w));\n  T n1110 = dot(g1110, detail::tvec4<T, P>(Pf1.x, Pf1.y, Pf1.z, Pf0.w));\n  T n0001 = dot(g0001, detail::tvec4<T, P>(Pf0.x, Pf0.y, Pf0.z, Pf1.w));\n  T n1001 = dot(g1001, detail::tvec4<T, P>(Pf1.x, Pf0.y, Pf0.z, Pf1.w));\n  T n0101 = dot(g0101, detail::tvec4<T, P>(Pf0.x, Pf1.y, Pf0.z, Pf1.w));\n  T n1101 = dot(g1101, detail::tvec4<T, P>(Pf1.x, Pf1.y, Pf0.z, Pf1.w));\n  T n0011 = dot(g0011, detail::tvec4<T, P>(Pf0.x, Pf0.y, Pf1.z, Pf1.w));\n  T n1011 = dot(g1011, detail::tvec4<T, P>(Pf1.x, Pf0.y, Pf1.z, Pf1.w));\n  T n0111 = dot(g0111, detail::tvec4<T, P>(Pf0.x, Pf1.y, Pf1.z, Pf1.w));\n  T n1111 = dot(g1111, Pf1);\n\n  detail::tvec4<T, P> fade_xyzw = fade(Pf0);\n  detail::tvec4<T, P> n_0w =\n      mix(detail::tvec4<T, P>(n0000, n1000, n0100, n1100),\n          detail::tvec4<T, P>(n0001, n1001, n0101, n1101), fade_xyzw.w);\n  detail::tvec4<T, P> n_1w =\n      mix(detail::tvec4<T, P>(n0010, n1010, n0110, n1110),\n          detail::tvec4<T, P>(n0011, n1011, n0111, n1111), fade_xyzw.w);\n  detail::tvec4<T, P> n_zw = mix(n_0w, n_1w, fade_xyzw.z);\n  detail::tvec2<T, P> n_yzw =\n      mix(detail::tvec2<T, P>(n_zw.x, n_zw.y),\n          detail::tvec2<T, P>(n_zw.z, n_zw.w), fade_xyzw.y);\n  T n_xyzw = mix(n_yzw.x, n_yzw.y, fade_xyzw.x);\n  return T(2.2) * n_xyzw;\n}\n\n// Classic Perlin noise, periodic variant\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T perlin(detail::tvec2<T, P> const& Position,\n                            detail::tvec2<T, P> const& rep) {\n  detail::tvec4<T, P> Pi = floor(detail::tvec4<T, P>(Position.x, Position.y,\n                                                     Position.x, Position.y)) +\n                           detail::tvec4<T, P>(0.0, 0.0, 1.0, 1.0);\n  detail::tvec4<T, P> Pf = fract(detail::tvec4<T, P>(Position.x, Position.y,\n                                                     Position.x, Position.y)) -\n                           detail::tvec4<T, P>(0.0, 0.0, 1.0, 1.0);\n  Pi = mod(Pi,\n           detail::tvec4<T, P>(rep.x, rep.y, rep.x,\n                               rep.y));  // To create noise with explicit period\n  Pi = mod(Pi, detail::tvec4<T, P>(\n                   289));  // To avoid truncation effects in permutation\n  detail::tvec4<T, P> ix(Pi.x, Pi.z, Pi.x, Pi.z);\n  detail::tvec4<T, P> iy(Pi.y, Pi.y, Pi.w, Pi.w);\n  detail::tvec4<T, P> fx(Pf.x, Pf.z, Pf.x, Pf.z);\n  detail::tvec4<T, P> fy(Pf.y, Pf.y, Pf.w, Pf.w);\n\n  detail::tvec4<T, P> i = detail::permute(detail::permute(ix) + iy);\n\n  detail::tvec4<T, P> gx = static_cast<T>(2) * fract(i / T(41)) - T(1);\n  detail::tvec4<T, P> gy = abs(gx) - T(0.5);\n  detail::tvec4<T, P> tx = floor(gx + T(0.5));\n  gx = gx - tx;\n\n  detail::tvec2<T, P> g00(gx.x, gy.x);\n  detail::tvec2<T, P> g10(gx.y, gy.y);\n  detail::tvec2<T, P> g01(gx.z, gy.z);\n  detail::tvec2<T, P> g11(gx.w, gy.w);\n\n  detail::tvec4<T, P> norm = detail::taylorInvSqrt(detail::tvec4<T, P>(\n      dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11)));\n  g00 *= norm.x;\n  g01 *= norm.y;\n  g10 *= norm.z;\n  g11 *= norm.w;\n\n  T n00 = dot(g00, detail::tvec2<T, P>(fx.x, fy.x));\n  T n10 = dot(g10, detail::tvec2<T, P>(fx.y, fy.y));\n  T n01 = dot(g01, detail::tvec2<T, P>(fx.z, fy.z));\n  T n11 = dot(g11, detail::tvec2<T, P>(fx.w, fy.w));\n\n  detail::tvec2<T, P> fade_xy = fade(detail::tvec2<T, P>(Pf.x, Pf.y));\n  detail::tvec2<T, P> n_x = mix(detail::tvec2<T, P>(n00, n01),\n                                detail::tvec2<T, P>(n10, n11), fade_xy.x);\n  T n_xy = mix(n_x.x, n_x.y, fade_xy.y);\n  return T(2.3) * n_xy;\n}\n\n// Classic Perlin noise, periodic variant\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T perlin(detail::tvec3<T, P> const& Position,\n                            detail::tvec3<T, P> const& rep) {\n  detail::tvec3<T, P> Pi0 =\n      mod(floor(Position), rep);  // Integer part, modulo period\n  detail::tvec3<T, P> Pi1 = mod(Pi0 + detail::tvec3<T, P>(T(1)),\n                                rep);  // Integer part + 1, mod period\n  Pi0 = mod(Pi0, detail::tvec3<T, P>(289));\n  Pi1 = mod(Pi1, detail::tvec3<T, P>(289));\n  detail::tvec3<T, P> Pf0 =\n      fract(Position);  // Fractional part for interpolation\n  detail::tvec3<T, P> Pf1 =\n      Pf0 - detail::tvec3<T, P>(T(1));  // Fractional part - 1.0\n  detail::tvec4<T, P> ix = detail::tvec4<T, P>(Pi0.x, Pi1.x, Pi0.x, Pi1.x);\n  detail::tvec4<T, P> iy = detail::tvec4<T, P>(Pi0.y, Pi0.y, Pi1.y, Pi1.y);\n  detail::tvec4<T, P> iz0(Pi0.z);\n  detail::tvec4<T, P> iz1(Pi1.z);\n\n  detail::tvec4<T, P> ixy = detail::permute(detail::permute(ix) + iy);\n  detail::tvec4<T, P> ixy0 = detail::permute(ixy + iz0);\n  detail::tvec4<T, P> ixy1 = detail::permute(ixy + iz1);\n\n  detail::tvec4<T, P> gx0 = ixy0 / T(7);\n  detail::tvec4<T, P> gy0 = fract(floor(gx0) / T(7)) - T(0.5);\n  gx0 = fract(gx0);\n  detail::tvec4<T, P> gz0 = detail::tvec4<T, P>(0.5) - abs(gx0) - abs(gy0);\n  detail::tvec4<T, P> sz0 = step(gz0, detail::tvec4<T, P>(0));\n  gx0 -= sz0 * (step(T(0), gx0) - T(0.5));\n  gy0 -= sz0 * (step(T(0), gy0) - T(0.5));\n\n  detail::tvec4<T, P> gx1 = ixy1 / T(7);\n  detail::tvec4<T, P> gy1 = fract(floor(gx1) / T(7)) - T(0.5);\n  gx1 = fract(gx1);\n  detail::tvec4<T, P> gz1 = detail::tvec4<T, P>(0.5) - abs(gx1) - abs(gy1);\n  detail::tvec4<T, P> sz1 = step(gz1, detail::tvec4<T, P>(T(0)));\n  gx1 -= sz1 * (step(T(0), gx1) - T(0.5));\n  gy1 -= sz1 * (step(T(0), gy1) - T(0.5));\n\n  detail::tvec3<T, P> g000 = detail::tvec3<T, P>(gx0.x, gy0.x, gz0.x);\n  detail::tvec3<T, P> g100 = detail::tvec3<T, P>(gx0.y, gy0.y, gz0.y);\n  detail::tvec3<T, P> g010 = detail::tvec3<T, P>(gx0.z, gy0.z, gz0.z);\n  detail::tvec3<T, P> g110 = detail::tvec3<T, P>(gx0.w, gy0.w, gz0.w);\n  detail::tvec3<T, P> g001 = detail::tvec3<T, P>(gx1.x, gy1.x, gz1.x);\n  detail::tvec3<T, P> g101 = detail::tvec3<T, P>(gx1.y, gy1.y, gz1.y);\n  detail::tvec3<T, P> g011 = detail::tvec3<T, P>(gx1.z, gy1.z, gz1.z);\n  detail::tvec3<T, P> g111 = detail::tvec3<T, P>(gx1.w, gy1.w, gz1.w);\n\n  detail::tvec4<T, P> norm0 = detail::taylorInvSqrt(detail::tvec4<T, P>(\n      dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110)));\n  g000 *= norm0.x;\n  g010 *= norm0.y;\n  g100 *= norm0.z;\n  g110 *= norm0.w;\n  detail::tvec4<T, P> norm1 = detail::taylorInvSqrt(detail::tvec4<T, P>(\n      dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111)));\n  g001 *= norm1.x;\n  g011 *= norm1.y;\n  g101 *= norm1.z;\n  g111 *= norm1.w;\n\n  T n000 = dot(g000, Pf0);\n  T n100 = dot(g100, detail::tvec3<T, P>(Pf1.x, Pf0.y, Pf0.z));\n  T n010 = dot(g010, detail::tvec3<T, P>(Pf0.x, Pf1.y, Pf0.z));\n  T n110 = dot(g110, detail::tvec3<T, P>(Pf1.x, Pf1.y, Pf0.z));\n  T n001 = dot(g001, detail::tvec3<T, P>(Pf0.x, Pf0.y, Pf1.z));\n  T n101 = dot(g101, detail::tvec3<T, P>(Pf1.x, Pf0.y, Pf1.z));\n  T n011 = dot(g011, detail::tvec3<T, P>(Pf0.x, Pf1.y, Pf1.z));\n  T n111 = dot(g111, Pf1);\n\n  detail::tvec3<T, P> fade_xyz = fade(Pf0);\n  detail::tvec4<T, P> n_z =\n      mix(detail::tvec4<T, P>(n000, n100, n010, n110),\n          detail::tvec4<T, P>(n001, n101, n011, n111), fade_xyz.z);\n  detail::tvec2<T, P> n_yz = mix(detail::tvec2<T, P>(n_z.x, n_z.y),\n                                 detail::tvec2<T, P>(n_z.z, n_z.w), fade_xyz.y);\n  T n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x);\n  return T(2.2) * n_xyz;\n}\n\n// Classic Perlin noise, periodic version\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T perlin(detail::tvec4<T, P> const& Position,\n                            detail::tvec4<T, P> const& rep) {\n  detail::tvec4<T, P> Pi0 =\n      mod(floor(Position), rep);                   // Integer part modulo rep\n  detail::tvec4<T, P> Pi1 = mod(Pi0 + T(1), rep);  // Integer part + 1 mod rep\n  detail::tvec4<T, P> Pf0 =\n      fract(Position);                   // Fractional part for interpolation\n  detail::tvec4<T, P> Pf1 = Pf0 - T(1);  // Fractional part - 1.0\n  detail::tvec4<T, P> ix = detail::tvec4<T, P>(Pi0.x, Pi1.x, Pi0.x, Pi1.x);\n  detail::tvec4<T, P> iy = detail::tvec4<T, P>(Pi0.y, Pi0.y, Pi1.y, Pi1.y);\n  detail::tvec4<T, P> iz0(Pi0.z);\n  detail::tvec4<T, P> iz1(Pi1.z);\n  detail::tvec4<T, P> iw0(Pi0.w);\n  detail::tvec4<T, P> iw1(Pi1.w);\n\n  detail::tvec4<T, P> ixy = detail::permute(detail::permute(ix) + iy);\n  detail::tvec4<T, P> ixy0 = detail::permute(ixy + iz0);\n  detail::tvec4<T, P> ixy1 = detail::permute(ixy + iz1);\n  detail::tvec4<T, P> ixy00 = detail::permute(ixy0 + iw0);\n  detail::tvec4<T, P> ixy01 = detail::permute(ixy0 + iw1);\n  detail::tvec4<T, P> ixy10 = detail::permute(ixy1 + iw0);\n  detail::tvec4<T, P> ixy11 = detail::permute(ixy1 + iw1);\n\n  detail::tvec4<T, P> gx00 = ixy00 / T(7);\n  detail::tvec4<T, P> gy00 = floor(gx00) / T(7);\n  detail::tvec4<T, P> gz00 = floor(gy00) / T(6);\n  gx00 = fract(gx00) - T(0.5);\n  gy00 = fract(gy00) - T(0.5);\n  gz00 = fract(gz00) - T(0.5);\n  detail::tvec4<T, P> gw00 =\n      detail::tvec4<T, P>(0.75) - abs(gx00) - abs(gy00) - abs(gz00);\n  detail::tvec4<T, P> sw00 = step(gw00, detail::tvec4<T, P>(0));\n  gx00 -= sw00 * (step(T(0), gx00) - T(0.5));\n  gy00 -= sw00 * (step(T(0), gy00) - T(0.5));\n\n  detail::tvec4<T, P> gx01 = ixy01 / T(7);\n  detail::tvec4<T, P> gy01 = floor(gx01) / T(7);\n  detail::tvec4<T, P> gz01 = floor(gy01) / T(6);\n  gx01 = fract(gx01) - T(0.5);\n  gy01 = fract(gy01) - T(0.5);\n  gz01 = fract(gz01) - T(0.5);\n  detail::tvec4<T, P> gw01 =\n      detail::tvec4<T, P>(0.75) - abs(gx01) - abs(gy01) - abs(gz01);\n  detail::tvec4<T, P> sw01 = step(gw01, detail::tvec4<T, P>(0.0));\n  gx01 -= sw01 * (step(T(0), gx01) - T(0.5));\n  gy01 -= sw01 * (step(T(0), gy01) - T(0.5));\n\n  detail::tvec4<T, P> gx10 = ixy10 / T(7);\n  detail::tvec4<T, P> gy10 = floor(gx10) / T(7);\n  detail::tvec4<T, P> gz10 = floor(gy10) / T(6);\n  gx10 = fract(gx10) - T(0.5);\n  gy10 = fract(gy10) - T(0.5);\n  gz10 = fract(gz10) - T(0.5);\n  detail::tvec4<T, P> gw10 =\n      detail::tvec4<T, P>(0.75) - abs(gx10) - abs(gy10) - abs(gz10);\n  detail::tvec4<T, P> sw10 = step(gw10, detail::tvec4<T, P>(0.0));\n  gx10 -= sw10 * (step(T(0), gx10) - T(0.5));\n  gy10 -= sw10 * (step(T(0), gy10) - T(0.5));\n\n  detail::tvec4<T, P> gx11 = ixy11 / T(7);\n  detail::tvec4<T, P> gy11 = floor(gx11) / T(7);\n  detail::tvec4<T, P> gz11 = floor(gy11) / T(6);\n  gx11 = fract(gx11) - T(0.5);\n  gy11 = fract(gy11) - T(0.5);\n  gz11 = fract(gz11) - T(0.5);\n  detail::tvec4<T, P> gw11 =\n      detail::tvec4<T, P>(0.75) - abs(gx11) - abs(gy11) - abs(gz11);\n  detail::tvec4<T, P> sw11 = step(gw11, detail::tvec4<T, P>(T(0)));\n  gx11 -= sw11 * (step(T(0), gx11) - T(0.5));\n  gy11 -= sw11 * (step(T(0), gy11) - T(0.5));\n\n  detail::tvec4<T, P> g0000(gx00.x, gy00.x, gz00.x, gw00.x);\n  detail::tvec4<T, P> g1000(gx00.y, gy00.y, gz00.y, gw00.y);\n  detail::tvec4<T, P> g0100(gx00.z, gy00.z, gz00.z, gw00.z);\n  detail::tvec4<T, P> g1100(gx00.w, gy00.w, gz00.w, gw00.w);\n  detail::tvec4<T, P> g0010(gx10.x, gy10.x, gz10.x, gw10.x);\n  detail::tvec4<T, P> g1010(gx10.y, gy10.y, gz10.y, gw10.y);\n  detail::tvec4<T, P> g0110(gx10.z, gy10.z, gz10.z, gw10.z);\n  detail::tvec4<T, P> g1110(gx10.w, gy10.w, gz10.w, gw10.w);\n  detail::tvec4<T, P> g0001(gx01.x, gy01.x, gz01.x, gw01.x);\n  detail::tvec4<T, P> g1001(gx01.y, gy01.y, gz01.y, gw01.y);\n  detail::tvec4<T, P> g0101(gx01.z, gy01.z, gz01.z, gw01.z);\n  detail::tvec4<T, P> g1101(gx01.w, gy01.w, gz01.w, gw01.w);\n  detail::tvec4<T, P> g0011(gx11.x, gy11.x, gz11.x, gw11.x);\n  detail::tvec4<T, P> g1011(gx11.y, gy11.y, gz11.y, gw11.y);\n  detail::tvec4<T, P> g0111(gx11.z, gy11.z, gz11.z, gw11.z);\n  detail::tvec4<T, P> g1111(gx11.w, gy11.w, gz11.w, gw11.w);\n\n  detail::tvec4<T, P> norm00 = detail::taylorInvSqrt(\n      detail::tvec4<T, P>(dot(g0000, g0000), dot(g0100, g0100),\n                          dot(g1000, g1000), dot(g1100, g1100)));\n  g0000 *= norm00.x;\n  g0100 *= norm00.y;\n  g1000 *= norm00.z;\n  g1100 *= norm00.w;\n\n  detail::tvec4<T, P> norm01 = detail::taylorInvSqrt(\n      detail::tvec4<T, P>(dot(g0001, g0001), dot(g0101, g0101),\n                          dot(g1001, g1001), dot(g1101, g1101)));\n  g0001 *= norm01.x;\n  g0101 *= norm01.y;\n  g1001 *= norm01.z;\n  g1101 *= norm01.w;\n\n  detail::tvec4<T, P> norm10 =\n      taylorInvSqrt(detail::tvec4<T, P>(dot(g0010, g0010), dot(g0110, g0110),\n                                        dot(g1010, g1010), dot(g1110, g1110)));\n  g0010 *= norm10.x;\n  g0110 *= norm10.y;\n  g1010 *= norm10.z;\n  g1110 *= norm10.w;\n\n  detail::tvec4<T, P> norm11 =\n      taylorInvSqrt(detail::tvec4<T, P>(dot(g0011, g0011), dot(g0111, g0111),\n                                        dot(g1011, g1011), dot(g1111, g1111)));\n  g0011 *= norm11.x;\n  g0111 *= norm11.y;\n  g1011 *= norm11.z;\n  g1111 *= norm11.w;\n\n  T n0000 = dot(g0000, Pf0);\n  T n1000 = dot(g1000, detail::tvec4<T, P>(Pf1.x, Pf0.y, Pf0.z, Pf0.w));\n  T n0100 = dot(g0100, detail::tvec4<T, P>(Pf0.x, Pf1.y, Pf0.z, Pf0.w));\n  T n1100 = dot(g1100, detail::tvec4<T, P>(Pf1.x, Pf1.y, Pf0.z, Pf0.w));\n  T n0010 = dot(g0010, detail::tvec4<T, P>(Pf0.x, Pf0.y, Pf1.z, Pf0.w));\n  T n1010 = dot(g1010, detail::tvec4<T, P>(Pf1.x, Pf0.y, Pf1.z, Pf0.w));\n  T n0110 = dot(g0110, detail::tvec4<T, P>(Pf0.x, Pf1.y, Pf1.z, Pf0.w));\n  T n1110 = dot(g1110, detail::tvec4<T, P>(Pf1.x, Pf1.y, Pf1.z, Pf0.w));\n  T n0001 = dot(g0001, detail::tvec4<T, P>(Pf0.x, Pf0.y, Pf0.z, Pf1.w));\n  T n1001 = dot(g1001, detail::tvec4<T, P>(Pf1.x, Pf0.y, Pf0.z, Pf1.w));\n  T n0101 = dot(g0101, detail::tvec4<T, P>(Pf0.x, Pf1.y, Pf0.z, Pf1.w));\n  T n1101 = dot(g1101, detail::tvec4<T, P>(Pf1.x, Pf1.y, Pf0.z, Pf1.w));\n  T n0011 = dot(g0011, detail::tvec4<T, P>(Pf0.x, Pf0.y, Pf1.z, Pf1.w));\n  T n1011 = dot(g1011, detail::tvec4<T, P>(Pf1.x, Pf0.y, Pf1.z, Pf1.w));\n  T n0111 = dot(g0111, detail::tvec4<T, P>(Pf0.x, Pf1.y, Pf1.z, Pf1.w));\n  T n1111 = dot(g1111, Pf1);\n\n  detail::tvec4<T, P> fade_xyzw = fade(Pf0);\n  detail::tvec4<T, P> n_0w =\n      mix(detail::tvec4<T, P>(n0000, n1000, n0100, n1100),\n          detail::tvec4<T, P>(n0001, n1001, n0101, n1101), fade_xyzw.w);\n  detail::tvec4<T, P> n_1w =\n      mix(detail::tvec4<T, P>(n0010, n1010, n0110, n1110),\n          detail::tvec4<T, P>(n0011, n1011, n0111, n1111), fade_xyzw.w);\n  detail::tvec4<T, P> n_zw = mix(n_0w, n_1w, fade_xyzw.z);\n  detail::tvec2<T, P> n_yzw =\n      mix(detail::tvec2<T, P>(n_zw.x, n_zw.y),\n          detail::tvec2<T, P>(n_zw.z, n_zw.w), fade_xyzw.y);\n  T n_xyzw = mix(n_yzw.x, n_yzw.y, fade_xyzw.x);\n  return T(2.2) * n_xyzw;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T simplex(glm::detail::tvec2<T, P> const& v) {\n  detail::tvec4<T, P> const C =\n      detail::tvec4<T, P>(T(0.211324865405187),   // (3.0 -  sqrt(3.0)) / 6.0\n                          T(0.366025403784439),   //  0.5 * (sqrt(3.0)  - 1.0)\n                          T(-0.577350269189626),  // -1.0 + 2.0 * C.x\n                          T(0.024390243902439));  //  1.0 / 41.0\n\n  // First corner\n  detail::tvec2<T, P> i = floor(v + dot(v, detail::tvec2<T, P>(C[1])));\n  detail::tvec2<T, P> x0 = v - i + dot(i, detail::tvec2<T, P>(C[0]));\n\n  // Other corners\n  // i1.x = step( x0.y, x0.x ); // x0.x > x0.y ? 1.0 : 0.0\n  // i1.y = 1.0 - i1.x;\n  detail::tvec2<T, P> i1 =\n      (x0.x > x0.y) ? detail::tvec2<T, P>(1, 0) : detail::tvec2<T, P>(0, 1);\n  // x0 = x0 - 0.0 + 0.0 * C.xx ;\n  // x1 = x0 - i1 + 1.0 * C.xx ;\n  // x2 = x0 - 1.0 + 2.0 * C.xx ;\n  detail::tvec4<T, P> x12 = detail::tvec4<T, P>(x0.x, x0.y, x0.x, x0.y) +\n                            detail::tvec4<T, P>(C.x, C.x, C.z, C.z);\n  x12 = detail::tvec4<T, P>(detail::tvec2<T, P>(x12) - i1, x12.z, x12.w);\n\n  // Permutations\n  i = mod(i,\n          detail::tvec2<T, P>(289));  // Avoid truncation effects in permutation\n  detail::tvec3<T, P> p = detail::permute(\n      detail::permute(i.y + detail::tvec3<T, P>(T(0), i1.y, T(1))) + i.x +\n      detail::tvec3<T, P>(T(0), i1.x, T(1)));\n\n  detail::tvec3<T, P> m =\n      max(detail::tvec3<T, P>(0.5) -\n              detail::tvec3<T, P>(dot(x0, x0),\n                                  dot(detail::tvec2<T, P>(x12.x, x12.y),\n                                      detail::tvec2<T, P>(x12.x, x12.y)),\n                                  dot(detail::tvec2<T, P>(x12.z, x12.w),\n                                      detail::tvec2<T, P>(x12.z, x12.w))),\n          detail::tvec3<T, P>(0));\n  m = m * m;\n  m = m * m;\n\n  // Gradients: 41 points uniformly over a line, mapped onto a diamond.\n  // The ring size 17*17 = 289 is close to a multiple of 41 (41*7 = 287)\n\n  detail::tvec3<T, P> x = static_cast<T>(2) * fract(p * C.w) - T(1);\n  detail::tvec3<T, P> h = abs(x) - T(0.5);\n  detail::tvec3<T, P> ox = floor(x + T(0.5));\n  detail::tvec3<T, P> a0 = x - ox;\n\n  // Normalise gradients implicitly by scaling m\n  // Inlined for speed: m *= taylorInvSqrt( a0*a0 + h*h );\n  m *= static_cast<T>(1.79284291400159) -\n       T(0.85373472095314) * (a0 * a0 + h * h);\n\n  // Compute final noise value at P\n  detail::tvec3<T, P> g;\n  g.x = a0.x * x0.x + h.x * x0.y;\n  // g.yz = a0.yz * x12.xz + h.yz * x12.yw;\n  g.y = a0.y * x12.x + h.y * x12.y;\n  g.z = a0.z * x12.z + h.z * x12.w;\n  return T(130) * dot(m, g);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T simplex(detail::tvec3<T, P> const& v) {\n  detail::tvec2<T, P> const C(1.0 / 6.0, 1.0 / 3.0);\n  detail::tvec4<T, P> const D(0.0, 0.5, 1.0, 2.0);\n\n  // First corner\n  detail::tvec3<T, P> i(floor(v + dot(v, detail::tvec3<T, P>(C.y))));\n  detail::tvec3<T, P> x0(v - i + dot(i, detail::tvec3<T, P>(C.x)));\n\n  // Other corners\n  detail::tvec3<T, P> g(step(detail::tvec3<T, P>(x0.y, x0.z, x0.x), x0));\n  detail::tvec3<T, P> l(T(1) - g);\n  detail::tvec3<T, P> i1(min(g, detail::tvec3<T, P>(l.z, l.x, l.y)));\n  detail::tvec3<T, P> i2(max(g, detail::tvec3<T, P>(l.z, l.x, l.y)));\n\n  //   x0 = x0 - 0.0 + 0.0 * C.xxx;\n  //   x1 = x0 - i1  + 1.0 * C.xxx;\n  //   x2 = x0 - i2  + 2.0 * C.xxx;\n  //   x3 = x0 - 1.0 + 3.0 * C.xxx;\n  detail::tvec3<T, P> x1(x0 - i1 + C.x);\n  detail::tvec3<T, P> x2(x0 - i2 + C.y);  // 2.0*C.x = 1/3 = C.y\n  detail::tvec3<T, P> x3(x0 - D.y);       // -1.0+3.0*C.x = -0.5 = -D.y\n\n  // Permutations\n  i = mod289(i);\n  detail::tvec4<T, P> p(detail::permute(\n      detail::permute(\n          detail::permute(i.z + detail::tvec4<T, P>(T(0), i1.z, i2.z, T(1))) +\n          i.y + detail::tvec4<T, P>(T(0), i1.y, i2.y, T(1))) +\n      i.x + detail::tvec4<T, P>(T(0), i1.x, i2.x, T(1))));\n\n  // Gradients: 7x7 points over a square, mapped onto an octahedron.\n  // The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)\n  T n_ = static_cast<T>(0.142857142857);  // 1.0/7.0\n  detail::tvec3<T, P> ns(n_ * detail::tvec3<T, P>(D.w, D.y, D.z) -\n                         detail::tvec3<T, P>(D.x, D.z, D.x));\n\n  detail::tvec4<T, P> j(p - T(49) * floor(p * ns.z * ns.z));  //  mod(p,7*7)\n\n  detail::tvec4<T, P> x_(floor(j * ns.z));\n  detail::tvec4<T, P> y_(floor(j - T(7) * x_));  // mod(j,N)\n\n  detail::tvec4<T, P> x(x_ * ns.x + ns.y);\n  detail::tvec4<T, P> y(y_ * ns.x + ns.y);\n  detail::tvec4<T, P> h(T(1) - abs(x) - abs(y));\n\n  detail::tvec4<T, P> b0(x.x, x.y, y.x, y.y);\n  detail::tvec4<T, P> b1(x.z, x.w, y.z, y.w);\n\n  // vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0;\n  // vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;\n  detail::tvec4<T, P> s0(floor(b0) * T(2) + T(1));\n  detail::tvec4<T, P> s1(floor(b1) * T(2) + T(1));\n  detail::tvec4<T, P> sh(-step(h, detail::tvec4<T, P>(0.0)));\n\n  detail::tvec4<T, P> a0 = detail::tvec4<T, P>(b0.x, b0.z, b0.y, b0.w) +\n                           detail::tvec4<T, P>(s0.x, s0.z, s0.y, s0.w) *\n                               detail::tvec4<T, P>(sh.x, sh.x, sh.y, sh.y);\n  detail::tvec4<T, P> a1 = detail::tvec4<T, P>(b1.x, b1.z, b1.y, b1.w) +\n                           detail::tvec4<T, P>(s1.x, s1.z, s1.y, s1.w) *\n                               detail::tvec4<T, P>(sh.z, sh.z, sh.w, sh.w);\n\n  detail::tvec3<T, P> p0(a0.x, a0.y, h.x);\n  detail::tvec3<T, P> p1(a0.z, a0.w, h.y);\n  detail::tvec3<T, P> p2(a1.x, a1.y, h.z);\n  detail::tvec3<T, P> p3(a1.z, a1.w, h.w);\n\n  // Normalise gradients\n  detail::tvec4<T, P> norm = detail::taylorInvSqrt(\n      detail::tvec4<T, P>(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)));\n  p0 *= norm.x;\n  p1 *= norm.y;\n  p2 *= norm.z;\n  p3 *= norm.w;\n\n  // Mix final noise value\n  detail::tvec4<T, P> m =\n      max(T(0.6) - detail::tvec4<T, P>(dot(x0, x0), dot(x1, x1), dot(x2, x2),\n                                       dot(x3, x3)),\n          detail::tvec4<T, P>(0));\n  m = m * m;\n  return T(42) * dot(m * m, detail::tvec4<T, P>(dot(p0, x0), dot(p1, x1),\n                                                dot(p2, x2), dot(p3, x3)));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T simplex(detail::tvec4<T, P> const& v) {\n  detail::tvec4<T, P> const C(0.138196601125011,    // (5 - sqrt(5))/20  G4\n                              0.276393202250021,    // 2 * G4\n                              0.414589803375032,    // 3 * G4\n                              -0.447213595499958);  // -1 + 4 * G4\n\n  // (sqrt(5) - 1)/4 = F4, used once below\n  T const F4 = static_cast<T>(0.309016994374947451);\n\n  // First corner\n  detail::tvec4<T, P> i = floor(v + dot(v, vec4(F4)));\n  detail::tvec4<T, P> x0 = v - i + dot(i, vec4(C.x));\n\n  // Other corners\n\n  // Rank sorting originally contributed by Bill Licea-Kane, AMD (formerly ATI)\n  detail::tvec4<T, P> i0;\n  detail::tvec3<T, P> isX =\n      step(detail::tvec3<T, P>(x0.y, x0.z, x0.w), detail::tvec3<T, P>(x0.x));\n  detail::tvec3<T, P> isYZ = step(detail::tvec3<T, P>(x0.z, x0.w, x0.w),\n                                  detail::tvec3<T, P>(x0.y, x0.y, x0.z));\n  //  i0.x = dot(isX, vec3(1.0));\n  // i0.x = isX.x + isX.y + isX.z;\n  // i0.yzw = static_cast<T>(1) - isX;\n  i0 = detail::tvec4<T, P>(isX.x + isX.y + isX.z, T(1) - isX);\n  //  i0.y += dot(isYZ.xy, vec2(1.0));\n  i0.y += isYZ.x + isYZ.y;\n  // i0.zw += 1.0 - detail::tvec2<T, P>(isYZ.x, isYZ.y);\n  i0.z += static_cast<T>(1) - isYZ.x;\n  i0.w += static_cast<T>(1) - isYZ.y;\n  i0.z += isYZ.z;\n  i0.w += static_cast<T>(1) - isYZ.z;\n\n  // i0 now contains the unique values 0,1,2,3 in each channel\n  detail::tvec4<T, P> i3 = clamp(i0, T(0), T(1));\n  detail::tvec4<T, P> i2 = clamp(i0 - T(1), T(0), T(1));\n  detail::tvec4<T, P> i1 = clamp(i0 - T(2), T(0), T(1));\n\n  //  x0 = x0 - 0.0 + 0.0 * C.xxxx\n  //  x1 = x0 - i1  + 0.0 * C.xxxx\n  //  x2 = x0 - i2  + 0.0 * C.xxxx\n  //  x3 = x0 - i3  + 0.0 * C.xxxx\n  //  x4 = x0 - 1.0 + 4.0 * C.xxxx\n  detail::tvec4<T, P> x1 = x0 - i1 + C.x;\n  detail::tvec4<T, P> x2 = x0 - i2 + C.y;\n  detail::tvec4<T, P> x3 = x0 - i3 + C.z;\n  detail::tvec4<T, P> x4 = x0 + C.w;\n\n  // Permutations\n  i = mod(i, detail::tvec4<T, P>(289));\n  T j0 = detail::permute(\n      detail::permute(detail::permute(detail::permute(i.w) + i.z) + i.y) + i.x);\n  detail::tvec4<T, P> j1 = detail::permute(\n      detail::permute(\n          detail::permute(detail::permute(i.w + detail::tvec4<T, P>(\n                                                    i1.w, i2.w, i3.w, T(1))) +\n                          i.z + detail::tvec4<T, P>(i1.z, i2.z, i3.z, T(1))) +\n          i.y + detail::tvec4<T, P>(i1.y, i2.y, i3.y, T(1))) +\n      i.x + detail::tvec4<T, P>(i1.x, i2.x, i3.x, T(1)));\n\n  // Gradients: 7x7x6 points over a cube, mapped onto a 4-cross polytope\n  // 7*7*6 = 294, which is close to the ring size 17*17 = 289.\n  detail::tvec4<T, P> ip =\n      detail::tvec4<T, P>(T(1) / T(294), T(1) / T(49), T(1) / T(7), T(0));\n\n  detail::tvec4<T, P> p0 = gtc::grad4(j0, ip);\n  detail::tvec4<T, P> p1 = gtc::grad4(j1.x, ip);\n  detail::tvec4<T, P> p2 = gtc::grad4(j1.y, ip);\n  detail::tvec4<T, P> p3 = gtc::grad4(j1.z, ip);\n  detail::tvec4<T, P> p4 = gtc::grad4(j1.w, ip);\n\n  // Normalise gradients\n  detail::tvec4<T, P> norm = detail::taylorInvSqrt(\n      detail::tvec4<T, P>(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)));\n  p0 *= norm.x;\n  p1 *= norm.y;\n  p2 *= norm.z;\n  p3 *= norm.w;\n  p4 *= detail::taylorInvSqrt(dot(p4, p4));\n\n  // Mix contributions from the five corners\n  detail::tvec3<T, P> m0 =\n      max(T(0.6) - detail::tvec3<T, P>(dot(x0, x0), dot(x1, x1), dot(x2, x2)),\n          detail::tvec3<T, P>(0));\n  detail::tvec2<T, P> m1 =\n      max(T(0.6) - detail::tvec2<T, P>(dot(x3, x3), dot(x4, x4)),\n          detail::tvec2<T, P>(0));\n  m0 = m0 * m0;\n  m1 = m1 * m1;\n  return T(49) * (dot(m0 * m0, detail::tvec3<T, P>(dot(p0, x0), dot(p1, x1),\n                                                   dot(p2, x2))) +\n                  dot(m1 * m1, detail::tvec2<T, P>(dot(p3, x3), dot(p4, x4))));\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtc/packing.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtc_packing\n/// @file glm/gtc/packing.hpp\n/// @date 2013-08-08 / 2013-08-08\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n///\n/// @defgroup gtc_packing GLM_GTC_packing\n/// @ingroup gtc\n///\n/// @brief This extension provides a set of function to convert vertors to\n/// packed formats.\n///\n/// <glm/gtc/packing.hpp> need to be included to use these features.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTC_packing\n#define GLM_GTC_packing\n\n// Dependency:\n#include \"type_precision.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTC_packing extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtc_packing\n/// @{\n\n/// First, converts the normalized floating-point value v into a 8-bit integer\n/// value. Then, the results are packed into the returned 8-bit unsigned\n/// integer.\n///\n/// The conversion for component c of v to fixed point is done as follows:\n/// packUnorm1x8:\tround(clamp(c, 0, +1) * 255.0)\n///\n/// @see gtc_packing\n/// @see uint16 packUnorm2x8(vec2 const & v)\n/// @see uint32 packUnorm4x8(vec4 const & v)\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm4x8.xml\">GLSL\n/// packUnorm4x8 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL uint8 packUnorm1x8(float const& v);\n\n/// Convert a single 8-bit integer to a normalized floating-point value.\n///\n/// The conversion for unpacked fixed-point value f to floating point is done as\n/// follows: unpackUnorm4x8: f / 255.0\n///\n/// @see gtc_packing\n/// @see vec2 unpackUnorm2x8(uint16 p)\n/// @see vec4 unpackUnorm4x8(uint32 p)\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm4x8.xml\">GLSL\n/// unpackUnorm4x8 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL float unpackUnorm1x8(uint8 const& p);\n\n/// First, converts each component of the normalized floating-point value v into\n/// 8-bit integer values. Then, the results are packed into the returned 16-bit\n/// unsigned integer.\n///\n/// The conversion for component c of v to fixed point is done as follows:\n/// packUnorm2x8:\tround(clamp(c, 0, +1) * 255.0)\n///\n/// The first component of the vector will be written to the least significant\n/// bits of the output; the last component will be written to the most\n/// significant bits.\n///\n/// @see gtc_packing\n/// @see uint8 packUnorm1x8(float const & v)\n/// @see uint32 packUnorm4x8(vec4 const & v)\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm4x8.xml\">GLSL\n/// packUnorm4x8 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL uint16 packUnorm2x8(vec2 const& v);\n\n/// First, unpacks a single 16-bit unsigned integer p into a pair of 8-bit\n/// unsigned integers. Then, each component is converted to a normalized\n/// floating-point value to generate the returned two-component vector.\n///\n/// The conversion for unpacked fixed-point value f to floating point is done as\n/// follows: unpackUnorm4x8: f / 255.0\n///\n/// The first component of the returned vector will be extracted from the least\n/// significant bits of the input; the last component will be extracted from the\n/// most significant bits.\n///\n/// @see gtc_packing\n/// @see float unpackUnorm1x8(uint8 v)\n/// @see vec4 unpackUnorm4x8(uint32 p)\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm4x8.xml\">GLSL\n/// unpackUnorm4x8 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL vec2 unpackUnorm2x8(uint16 const& p);\n\n/// First, converts the normalized floating-point value v into 8-bit integer\n/// value. Then, the results are packed into the returned 8-bit unsigned\n/// integer.\n///\n/// The conversion to fixed point is done as follows:\n/// packSnorm1x8:\tround(clamp(s, -1, +1) * 127.0)\n///\n/// @see gtc_packing\n/// @see uint16 packSnorm2x8(vec2 const & v)\n/// @see uint32 packSnorm4x8(vec4 const & v)\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm4x8.xml\">GLSL\n/// packSnorm4x8 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL uint8 packSnorm1x8(float const& s);\n\n/// First, unpacks a single 8-bit unsigned integer p into a single 8-bit signed\n/// integers. Then, the value is converted to a normalized floating-point value\n/// to generate the returned scalar.\n///\n/// The conversion for unpacked fixed-point value f to floating point is done as\n/// follows: unpackSnorm1x8: clamp(f / 127.0, -1, +1)\n///\n/// @see gtc_packing\n/// @see vec2 unpackSnorm2x8(uint16 p)\n/// @see vec4 unpackSnorm4x8(uint32 p)\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm4x8.xml\">GLSL\n/// unpackSnorm4x8 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL float unpackSnorm1x8(uint8 const& p);\n\n/// First, converts each component of the normalized floating-point value v into\n/// 8-bit integer values. Then, the results are packed into the returned 16-bit\n/// unsigned integer.\n///\n/// The conversion for component c of v to fixed point is done as follows:\n/// packSnorm2x8:\tround(clamp(c, -1, +1) * 127.0)\n///\n/// The first component of the vector will be written to the least significant\n/// bits of the output; the last component will be written to the most\n/// significant bits.\n///\n/// @see gtc_packing\n/// @see uint8 packSnorm1x8(float const & v)\n/// @see uint32 packSnorm4x8(vec4 const & v)\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm4x8.xml\">GLSL\n/// packSnorm4x8 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL uint16 packSnorm2x8(vec2 const& v);\n\n/// First, unpacks a single 16-bit unsigned integer p into a pair of 8-bit\n/// signed integers. Then, each component is converted to a normalized\n/// floating-point value to generate the returned two-component vector.\n///\n/// The conversion for unpacked fixed-point value f to floating point is done as\n/// follows: unpackSnorm2x8: clamp(f / 127.0, -1, +1)\n///\n/// The first component of the returned vector will be extracted from the least\n/// significant bits of the input; the last component will be extracted from the\n/// most significant bits.\n///\n/// @see gtc_packing\n/// @see float unpackSnorm1x8(uint8 p)\n/// @see vec4 unpackSnorm4x8(uint32 p)\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm4x8.xml\">GLSL\n/// unpackSnorm4x8 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL vec2 unpackSnorm2x8(uint16 const& p);\n\n/// First, converts the normalized floating-point value v into a 16-bit integer\n/// value. Then, the results are packed into the returned 16-bit unsigned\n/// integer.\n///\n/// The conversion for component c of v to fixed point is done as follows:\n/// packUnorm1x16:\tround(clamp(c, 0, +1) * 65535.0)\n///\n/// @see gtc_packing\n/// @see uint16 packSnorm1x16(float const & v)\n/// @see uint64 packSnorm4x16(vec4 const & v)\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm4x8.xml\">GLSL\n/// packUnorm4x8 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL uint16 packUnorm1x16(float const& v);\n\n/// First, unpacks a single 16-bit unsigned integer p into a of 16-bit unsigned\n/// integers. Then, the value is converted to a normalized floating-point value\n/// to generate the returned scalar.\n///\n/// The conversion for unpacked fixed-point value f to floating point is done as\n/// follows: unpackUnorm1x16: f / 65535.0\n///\n/// @see gtc_packing\n/// @see vec2 unpackUnorm2x16(uint32 p)\n/// @see vec4 unpackUnorm4x16(uint64 p)\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm2x16.xml\">GLSL\n/// unpackUnorm2x16 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL float unpackUnorm1x16(uint16 const& p);\n\n/// First, converts each component of the normalized floating-point value v into\n/// 16-bit integer values. Then, the results are packed into the returned 64-bit\n/// unsigned integer.\n///\n/// The conversion for component c of v to fixed point is done as follows:\n/// packUnorm4x16:\tround(clamp(c, 0, +1) * 65535.0)\n///\n/// The first component of the vector will be written to the least significant\n/// bits of the output; the last component will be written to the most\n/// significant bits.\n///\n/// @see gtc_packing\n/// @see uint16 packUnorm1x16(float const & v)\n/// @see uint32 packUnorm2x16(vec2 const & v)\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm4x8.xml\">GLSL\n/// packUnorm4x8 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL uint64 packUnorm4x16(vec4 const& v);\n\n/// First, unpacks a single 64-bit unsigned integer p into four 16-bit unsigned\n/// integers. Then, each component is converted to a normalized floating-point\n/// value to generate the returned four-component vector.\n///\n/// The conversion for unpacked fixed-point value f to floating point is done as\n/// follows: unpackUnormx4x16: f / 65535.0\n///\n/// The first component of the returned vector will be extracted from the least\n/// significant bits of the input; the last component will be extracted from the\n/// most significant bits.\n///\n/// @see gtc_packing\n/// @see float unpackUnorm1x16(uint16 p)\n/// @see vec2 unpackUnorm2x16(uint32 p)\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm2x16.xml\">GLSL\n/// unpackUnorm2x16 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL vec4 unpackUnorm4x16(uint64 const& p);\n\n/// First, converts the normalized floating-point value v into 16-bit integer\n/// value. Then, the results are packed into the returned 16-bit unsigned\n/// integer.\n///\n/// The conversion to fixed point is done as follows:\n/// packSnorm1x8:\tround(clamp(s, -1, +1) * 32767.0)\n///\n/// @see gtc_packing\n/// @see uint32 packSnorm2x16(vec2 const & v)\n/// @see uint64 packSnorm4x16(vec4 const & v)\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm4x8.xml\">GLSL\n/// packSnorm4x8 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL uint16 packSnorm1x16(float const& v);\n\n/// First, unpacks a single 16-bit unsigned integer p into a single 16-bit\n/// signed integers. Then, each component is converted to a normalized\n/// floating-point value to generate the returned scalar.\n///\n/// The conversion for unpacked fixed-point value f to floating point is done as\n/// follows: unpackSnorm1x16: clamp(f / 32767.0, -1, +1)\n///\n/// @see gtc_packing\n/// @see vec2 unpackSnorm2x16(uint32 p)\n/// @see vec4 unpackSnorm4x16(uint64 p)\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm1x16.xml\">GLSL\n/// unpackSnorm4x8 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL float unpackSnorm1x16(uint16 const& p);\n\n/// First, converts each component of the normalized floating-point value v into\n/// 16-bit integer values. Then, the results are packed into the returned 64-bit\n/// unsigned integer.\n///\n/// The conversion for component c of v to fixed point is done as follows:\n/// packSnorm2x8:\tround(clamp(c, -1, +1) * 32767.0)\n///\n/// The first component of the vector will be written to the least significant\n/// bits of the output; the last component will be written to the most\n/// significant bits.\n///\n/// @see gtc_packing\n/// @see uint16 packSnorm1x16(float const & v)\n/// @see uint32 packSnorm2x16(vec2 const & v)\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm4x8.xml\">GLSL\n/// packSnorm4x8 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL uint64 packSnorm4x16(vec4 const& v);\n\n/// First, unpacks a single 64-bit unsigned integer p into four 16-bit signed\n/// integers. Then, each component is converted to a normalized floating-point\n/// value to generate the returned four-component vector.\n///\n/// The conversion for unpacked fixed-point value f to floating point is done as\n/// follows: unpackSnorm4x16: clamp(f / 32767.0, -1, +1)\n///\n/// The first component of the returned vector will be extracted from the least\n/// significant bits of the input; the last component will be extracted from the\n/// most significant bits.\n///\n/// @see gtc_packing\n/// @see float unpackSnorm1x16(uint16 p)\n/// @see vec2 unpackSnorm2x16(uint32 p)\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm2x16.xml\">GLSL\n/// unpackSnorm4x8 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL vec4 unpackSnorm4x16(uint64 const& p);\n\n/// Returns an unsigned integer obtained by converting the components of a\n/// floating-point scalar to the 16-bit floating-point representation found in\n/// the OpenGL Specification, and then packing this 16-bit value into a 16-bit\n/// unsigned integer.\n///\n/// @see gtc_packing\n/// @see uint32 packHalf2x16(vec2 const & v)\n/// @see uint64 packHalf4x16(vec4 const & v)\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packHalf2x16.xml\">GLSL\n/// packHalf2x16 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL uint16 packHalf1x16(float const& v);\n\n/// Returns a floating-point scalar with components obtained by unpacking a\n/// 16-bit unsigned integer into a 16-bit value, interpreted as a 16-bit\n/// floating-point number according to the OpenGL Specification, and converting\n/// it to 32-bit floating-point values.\n///\n/// @see gtc_packing\n/// @see vec2 unpackHalf2x16(uint32 const & v)\n/// @see vec4 unpackHalf4x16(uint64 const & v)\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackHalf2x16.xml\">GLSL\n/// unpackHalf2x16 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL float unpackHalf1x16(uint16 const& v);\n\n/// Returns an unsigned integer obtained by converting the components of a\n/// four-component floating-point vector to the 16-bit floating-point\n/// representation found in the OpenGL Specification, and then packing these\n/// four 16-bit values into a 64-bit unsigned integer. The first vector\n/// component specifies the 16 least-significant bits of the result; the forth\n/// component specifies the 16 most-significant bits.\n///\n/// @see gtc_packing\n/// @see uint16 packHalf1x16(float const & v)\n/// @see uint32 packHalf2x16(vec2 const & v)\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/packHalf2x16.xml\">GLSL\n/// packHalf2x16 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL uint64 packHalf4x16(vec4 const& v);\n\n/// Returns a four-component floating-point vector with components obtained by\n/// unpacking a 64-bit unsigned integer into four 16-bit values, interpreting\n/// those values as 16-bit floating-point numbers according to the OpenGL\n/// Specification, and converting them to 32-bit floating-point values. The\n/// first component of the vector is obtained from the 16 least-significant bits\n/// of v; the forth component is obtained from the 16 most-significant bits of\n/// v.\n///\n/// @see gtc_packing\n/// @see float unpackHalf1x16(uint16 const & v)\n/// @see vec2 unpackHalf2x16(uint32 const & v)\n/// @see <a\n/// href=\"http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackHalf2x16.xml\">GLSL\n/// unpackHalf2x16 man page</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 8.4 Floating-Point Pack and Unpack Functions</a>\nGLM_FUNC_DECL vec4 unpackHalf4x16(uint64 const& p);\n\n/// Returns an unsigned integer obtained by converting the components of a\n/// four-component signed integer vector to the 10-10-10-2-bit signed integer\n/// representation found in the OpenGL Specification, and then packing these\n/// four values into a 32-bit unsigned integer. The first vector component\n/// specifies the 10 least-significant bits of the result; the forth component\n/// specifies the 2 most-significant bits.\n///\n/// @see gtc_packing\n/// @see uint32 packI3x10_1x2(uvec4 const & v)\n/// @see uint32 packSnorm3x10_1x2(vec4 const & v)\n/// @see uint32 packUnorm3x10_1x2(vec4 const & v)\n/// @see ivec4 unpackI3x10_1x2(uint32 const & p)\nGLM_FUNC_DECL uint32 packI3x10_1x2(ivec4 const& v);\n\n/// Unpacks a single 32-bit unsigned integer p into three 10-bit and one 2-bit\n/// signed integers.\n///\n/// The first component of the returned vector will be extracted from the least\n/// significant bits of the input; the last component will be extracted from the\n/// most significant bits.\n///\n/// @see gtc_packing\n/// @see uint32 packU3x10_1x2(uvec4 const & v)\n/// @see vec4 unpackSnorm3x10_1x2(uint32 const & p);\n/// @see uvec4 unpackI3x10_1x2(uint32 const & p);\nGLM_FUNC_DECL ivec4 unpackI3x10_1x2(uint32 const& p);\n\n/// Returns an unsigned integer obtained by converting the components of a\n/// four-component unsigned integer vector to the 10-10-10-2-bit unsigned\n/// integer representation found in the OpenGL Specification, and then packing\n/// these four values into a 32-bit unsigned integer. The first vector component\n/// specifies the 10 least-significant bits of the result; the forth component\n/// specifies the 2 most-significant bits.\n///\n/// @see gtc_packing\n/// @see uint32 packI3x10_1x2(ivec4 const & v)\n/// @see uint32 packSnorm3x10_1x2(vec4 const & v)\n/// @see uint32 packUnorm3x10_1x2(vec4 const & v)\n/// @see ivec4 unpackU3x10_1x2(uint32 const & p)\nGLM_FUNC_DECL uint32 packU3x10_1x2(uvec4 const& v);\n\n/// Unpacks a single 32-bit unsigned integer p into three 10-bit and one 2-bit\n/// unsigned integers.\n///\n/// The first component of the returned vector will be extracted from the least\n/// significant bits of the input; the last component will be extracted from the\n/// most significant bits.\n///\n/// @see gtc_packing\n/// @see uint32 packU3x10_1x2(uvec4 const & v)\n/// @see vec4 unpackSnorm3x10_1x2(uint32 const & p);\n/// @see uvec4 unpackI3x10_1x2(uint32 const & p);\nGLM_FUNC_DECL uvec4 unpackU3x10_1x2(uint32 const& p);\n\n/// First, converts the first three components of the normalized floating-point\n/// value v into 10-bit signed integer values. Then, converts the forth\n/// component of the normalized floating-point value v into 2-bit signed integer\n/// values. Then, the results are packed into the returned 32-bit unsigned\n/// integer.\n///\n/// The conversion for component c of v to fixed point is done as follows:\n/// packSnorm3x10_1x2(xyz):\tround(clamp(c, -1, +1) * 511.0)\n/// packSnorm3x10_1x2(w):\tround(clamp(c, -1, +1) * 1.0)\n///\n/// The first vector component specifies the 10 least-significant bits of the\n/// result; the forth component specifies the 2 most-significant bits.\n///\n/// @see gtc_packing\n/// @see vec4 unpackSnorm3x10_1x2(uint32 const & p)\n/// @see uint32 packUnorm3x10_1x2(vec4 const & v)\n/// @see uint32 packU3x10_1x2(uvec4 const & v)\n/// @see uint32 packI3x10_1x2(ivec4 const & v)\nGLM_FUNC_DECL uint32 packSnorm3x10_1x2(vec4 const& v);\n\n/// First, unpacks a single 32-bit unsigned integer p into four 16-bit signed\n/// integers. Then, each component is converted to a normalized floating-point\n/// value to generate the returned four-component vector.\n///\n/// The conversion for unpacked fixed-point value f to floating point is done as\n/// follows: unpackSnorm3x10_1x2(xyz): clamp(f / 511.0, -1, +1)\n/// unpackSnorm3x10_1x2(w): clamp(f / 511.0, -1, +1)\n///\n/// The first component of the returned vector will be extracted from the least\n/// significant bits of the input; the last component will be extracted from the\n/// most significant bits.\n///\n/// @see gtc_packing\n/// @see uint32 packSnorm3x10_1x2(vec4 const & v)\n/// @see vec4 unpackUnorm3x10_1x2(uint32 const & p))\n/// @see uvec4 unpackI3x10_1x2(uint32 const & p)\n/// @see uvec4 unpackU3x10_1x2(uint32 const & p)\nGLM_FUNC_DECL vec4 unpackSnorm3x10_1x2(uint32 const& p);\n\n/// First, converts the first three components of the normalized floating-point\n/// value v into 10-bit unsigned integer values. Then, converts the forth\n/// component of the normalized floating-point value v into 2-bit signed\n/// uninteger values. Then, the results are packed into the returned 32-bit\n/// unsigned integer.\n///\n/// The conversion for component c of v to fixed point is done as follows:\n/// packUnorm3x10_1x2(xyz):\tround(clamp(c, 0, +1) * 1023.0)\n/// packUnorm3x10_1x2(w):\tround(clamp(c, 0, +1) * 3.0)\n///\n/// The first vector component specifies the 10 least-significant bits of the\n/// result; the forth component specifies the 2 most-significant bits.\n///\n/// @see gtc_packing\n/// @see vec4 unpackUnorm3x10_1x2(uint32 const & p)\n/// @see uint32 packUnorm3x10_1x2(vec4 const & v)\n/// @see uint32 packU3x10_1x2(uvec4 const & v)\n/// @see uint32 packI3x10_1x2(ivec4 const & v)\nGLM_FUNC_DECL uint32 packUnorm3x10_1x2(vec4 const& v);\n\n/// First, unpacks a single 32-bit unsigned integer p into four 16-bit signed\n/// integers. Then, each component is converted to a normalized floating-point\n/// value to generate the returned four-component vector.\n///\n/// The conversion for unpacked fixed-point value f to floating point is done as\n/// follows: unpackSnorm3x10_1x2(xyz): clamp(f / 1023.0, 0, +1)\n/// unpackSnorm3x10_1x2(w): clamp(f / 3.0, 0, +1)\n///\n/// The first component of the returned vector will be extracted from the least\n/// significant bits of the input; the last component will be extracted from the\n/// most significant bits.\n///\n/// @see gtc_packing\n/// @see uint32 packSnorm3x10_1x2(vec4 const & v)\n/// @see vec4 unpackInorm3x10_1x2(uint32 const & p))\n/// @see uvec4 unpackI3x10_1x2(uint32 const & p)\n/// @see uvec4 unpackU3x10_1x2(uint32 const & p)\nGLM_FUNC_DECL vec4 unpackUnorm3x10_1x2(uint32 const& p);\n\n/// First, converts the first two components of the normalized floating-point\n/// value v into 11-bit signless floating-point values. Then, converts the third\n/// component of the normalized floating-point value v into a 10-bit signless\n/// floating-point value. Then, the results are packed into the returned 32-bit\n/// unsigned integer.\n///\n/// The first vector component specifies the 11 least-significant bits of the\n/// result; the last component specifies the 10 most-significant bits.\n///\n/// @see gtc_packing\n/// @see vec3 unpackF2x11_1x10(uint32 const & p)\nGLM_FUNC_DECL uint32 packF2x11_1x10(vec3 const& v);\n\n/// First, unpacks a single 32-bit unsigned integer p into two 11-bit signless\n/// floating-point values and one 10-bit signless floating-point value . Then,\n/// each component is converted to a normalized floating-point value to generate\n/// the returned three-component vector.\n///\n/// The first component of the returned vector will be extracted from the least\n/// significant bits of the input; the last component will be extracted from the\n/// most significant bits.\n///\n/// @see gtc_packing\n/// @see uint32 packF2x11_1x10(vec3 const & v)\nGLM_FUNC_DECL vec3 unpackF2x11_1x10(uint32 const& p);\n\n/// @}\n}  // namespace glm\n\n#include \"packing.inl\"\n\n#endif  // GLM_GTC_packing\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtc/packing.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtc_packing\n/// @file glm/gtc/packing.inl\n/// @date 2013-08-08 / 2013-08-08\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#include \"../common.hpp\"\n#include \"../detail/type_half.hpp\"\n#include \"../vec2.hpp\"\n#include \"../vec3.hpp\"\n#include \"../vec4.hpp\"\n\nnamespace glm {\nnamespace detail {\nGLM_FUNC_QUALIFIER glm::uint16 float2half(glm::uint32 const& f) {\n  // 10 bits    =>                         EE EEEFFFFF\n  // 11 bits    =>                        EEE EEFFFFFF\n  // Half bits  =>                   SEEEEEFF FFFFFFFF\n  // Float bits => SEEEEEEE EFFFFFFF FFFFFFFF FFFFFFFF\n\n  // 0x00007c00 => 00000000 00000000 01111100 00000000\n  // 0x000003ff => 00000000 00000000 00000011 11111111\n  // 0x38000000 => 00111000 00000000 00000000 00000000\n  // 0x7f800000 => 01111111 10000000 00000000 00000000\n  // 0x00008000 => 00000000 00000000 10000000 00000000\n  return ((f >> 16) & 0x8000) |                                // sign\n         ((((f & 0x7f800000) - 0x38000000) >> 13) & 0x7c00) |  // exponential\n         ((f >> 13) & 0x03ff);                                 // Mantissa\n}\n\nGLM_FUNC_QUALIFIER glm::uint32 float2packed11(glm::uint32 const& f) {\n  // 10 bits    =>                         EE EEEFFFFF\n  // 11 bits    =>                        EEE EEFFFFFF\n  // Half bits  =>                   SEEEEEFF FFFFFFFF\n  // Float bits => SEEEEEEE EFFFFFFF FFFFFFFF FFFFFFFF\n\n  // 0x000007c0 => 00000000 00000000 00000111 11000000\n  // 0x00007c00 => 00000000 00000000 01111100 00000000\n  // 0x000003ff => 00000000 00000000 00000011 11111111\n  // 0x38000000 => 00111000 00000000 00000000 00000000\n  // 0x7f800000 => 01111111 10000000 00000000 00000000\n  // 0x00008000 => 00000000 00000000 10000000 00000000\n  return ((((f & 0x7f800000) - 0x38000000) >> 17) & 0x07c0) |  // exponential\n         ((f >> 17) & 0x003f);                                 // Mantissa\n}\n\nGLM_FUNC_QUALIFIER glm::uint32 packed11ToFloat(glm::uint32 const& p) {\n  // 10 bits    =>                         EE EEEFFFFF\n  // 11 bits    =>                        EEE EEFFFFFF\n  // Half bits  =>                   SEEEEEFF FFFFFFFF\n  // Float bits => SEEEEEEE EFFFFFFF FFFFFFFF FFFFFFFF\n\n  // 0x000007c0 => 00000000 00000000 00000111 11000000\n  // 0x00007c00 => 00000000 00000000 01111100 00000000\n  // 0x000003ff => 00000000 00000000 00000011 11111111\n  // 0x38000000 => 00111000 00000000 00000000 00000000\n  // 0x7f800000 => 01111111 10000000 00000000 00000000\n  // 0x00008000 => 00000000 00000000 10000000 00000000\n  return ((((p & 0x07c0) << 17) + 0x38000000) & 0x7f800000) |  // exponential\n         ((p & 0x003f) << 17);                                 // Mantissa\n}\n\nGLM_FUNC_QUALIFIER glm::uint32 float2packed10(glm::uint32 const& f) {\n  // 10 bits    =>                         EE EEEFFFFF\n  // 11 bits    =>                        EEE EEFFFFFF\n  // Half bits  =>                   SEEEEEFF FFFFFFFF\n  // Float bits => SEEEEEEE EFFFFFFF FFFFFFFF FFFFFFFF\n\n  // 0x0000001F => 00000000 00000000 00000000 00011111\n  // 0x0000003F => 00000000 00000000 00000000 00111111\n  // 0x000003E0 => 00000000 00000000 00000011 11100000\n  // 0x000007C0 => 00000000 00000000 00000111 11000000\n  // 0x00007C00 => 00000000 00000000 01111100 00000000\n  // 0x000003FF => 00000000 00000000 00000011 11111111\n  // 0x38000000 => 00111000 00000000 00000000 00000000\n  // 0x7f800000 => 01111111 10000000 00000000 00000000\n  // 0x00008000 => 00000000 00000000 10000000 00000000\n  return ((((f & 0x7f800000) - 0x38000000) >> 18) & 0x03E0) |  // exponential\n         ((f >> 18) & 0x001f);                                 // Mantissa\n}\n\nGLM_FUNC_QUALIFIER glm::uint32 packed10ToFloat(glm::uint32 const& p) {\n  // 10 bits    =>                         EE EEEFFFFF\n  // 11 bits    =>                        EEE EEFFFFFF\n  // Half bits  =>                   SEEEEEFF FFFFFFFF\n  // Float bits => SEEEEEEE EFFFFFFF FFFFFFFF FFFFFFFF\n\n  // 0x0000001F => 00000000 00000000 00000000 00011111\n  // 0x0000003F => 00000000 00000000 00000000 00111111\n  // 0x000003E0 => 00000000 00000000 00000011 11100000\n  // 0x000007C0 => 00000000 00000000 00000111 11000000\n  // 0x00007C00 => 00000000 00000000 01111100 00000000\n  // 0x000003FF => 00000000 00000000 00000011 11111111\n  // 0x38000000 => 00111000 00000000 00000000 00000000\n  // 0x7f800000 => 01111111 10000000 00000000 00000000\n  // 0x00008000 => 00000000 00000000 10000000 00000000\n  return ((((p & 0x03E0) << 18) + 0x38000000) & 0x7f800000) |  // exponential\n         ((p & 0x001f) << 18);                                 // Mantissa\n}\n\nGLM_FUNC_QUALIFIER glm::uint half2float(glm::uint const& h) {\n  return ((h & 0x8000) << 16) | (((h & 0x7c00) + 0x1C000) << 13) |\n         ((h & 0x03FF) << 13);\n}\n\nGLM_FUNC_QUALIFIER glm::uint floatTo11bit(float x) {\n  if (x == 0.0f)\n    return 0;\n  else if (glm::isnan(x))\n    return ~0;\n  else if (glm::isinf(x))\n    return 0x1f << 6;\n\n  return float2packed11(reinterpret_cast<uint&>(x));\n}\n\nGLM_FUNC_QUALIFIER float packed11bitToFloat(glm::uint x) {\n  if (x == 0)\n    return 0.0f;\n  else if (x == ((1 << 11) - 1))\n    return ~0;  // NaN\n  else if (x == (0x1f << 6))\n    return ~0;  // Inf\n\n  uint result = packed11ToFloat(x);\n  return reinterpret_cast<float&>(result);\n}\n\nGLM_FUNC_QUALIFIER glm::uint floatTo10bit(float x) {\n  if (x == 0.0f)\n    return 0;\n  else if (glm::isnan(x))\n    return ~0;\n  else if (glm::isinf(x))\n    return 0x1f << 5;\n\n  return float2packed10(reinterpret_cast<uint&>(x));\n}\n\nGLM_FUNC_QUALIFIER float packed10bitToFloat(glm::uint x) {\n  if (x == 0)\n    return 0.0f;\n  else if (x == ((1 << 10) - 1))\n    return ~0;  // NaN\n  else if (x == (0x1f << 5))\n    return ~0;  // Inf\n\n  uint result = packed10ToFloat(x);\n  return reinterpret_cast<float&>(result);\n}\n\n//\tGLM_FUNC_QUALIFIER glm::uint f11_f11_f10(float x, float y, float z)\n//\t{\n//\t\treturn ((floatTo11bit(x) & ((1 << 11) - 1)) << 0) |\n//((floatTo11bit(y) & ((1 << 11) - 1)) << 11) | ((floatTo10bit(z) & ((1 << 10) -\n// 1)) << 22);\n//\t}\n\nunion u10u10u10u2 {\n  struct {\n    uint x : 10;\n    uint y : 10;\n    uint z : 10;\n    uint w : 2;\n  } data;\n  uint32 pack;\n};\n\nunion i10i10i10i2 {\n  struct {\n    int x : 10;\n    int y : 10;\n    int z : 10;\n    int w : 2;\n  } data;\n  uint32 pack;\n};\n\n}  // namespace detail\n\nGLM_FUNC_QUALIFIER uint8 packUnorm1x8(float const& v) {\n  return static_cast<uint8>(round(clamp(v, 0.0f, 1.0f) * 255.0f));\n}\n\nGLM_FUNC_QUALIFIER float unpackUnorm1x8(uint8 const& p) {\n  float Unpack(static_cast<float>(p));\n  return Unpack *\n         static_cast<float>(0.0039215686274509803921568627451);  // 1 / 255\n}\n\nGLM_FUNC_QUALIFIER uint16 packUnorm2x8(vec2 const& v) {\n  u8vec2 Topack(round(clamp(v, 0.0f, 1.0f) * 255.0f));\n  uint16* Packed = reinterpret_cast<uint16*>(&Topack);\n  return *Packed;\n}\n\nGLM_FUNC_QUALIFIER vec2 unpackUnorm2x8(uint16 const& p) {\n  u8vec2* Unpacked = reinterpret_cast<u8vec2*>(const_cast<uint16*>(&p));\n  return vec2(*Unpacked) * float(0.0039215686274509803921568627451);  // 1 / 255\n}\n\nGLM_FUNC_QUALIFIER uint8 packSnorm1x8(float const& v) {\n  int8 Topack(static_cast<int8>(round(clamp(v, -1.0f, 1.0f) * 127.0f)));\n  uint8* Packed = reinterpret_cast<uint8*>(&Topack);\n  return *Packed;\n}\n\nGLM_FUNC_QUALIFIER float unpackSnorm1x8(uint8 const& p) {\n  float Unpack(static_cast<float>(*const_cast<uint8*>(&p)));\n  return clamp(Unpack * 0.00787401574803149606299212598425f,  // 1.0f / 127.0f\n               -1.0f, 1.0f);\n}\n\nGLM_FUNC_QUALIFIER uint16 packSnorm2x8(vec2 const& v) {\n  i8vec2 Topack(round(clamp(v, -1.0f, 1.0f) * 127.0f));\n  uint16* Packed = reinterpret_cast<uint16*>(&Topack);\n  return *Packed;\n}\n\nGLM_FUNC_QUALIFIER vec2 unpackSnorm2x8(uint16 const& p) {\n  i8vec2* Unpack = reinterpret_cast<i8vec2*>(const_cast<uint16*>(&p));\n  return clamp(\n      vec2(*Unpack) * 0.00787401574803149606299212598425f,  // 1.0f / 127.0f\n      -1.0f, 1.0f);\n}\n\nGLM_FUNC_QUALIFIER uint16 packUnorm1x16(float const& s) {\n  return static_cast<uint16>(round(clamp(s, 0.0f, 1.0f) * 65535.0f));\n}\n\nGLM_FUNC_QUALIFIER float unpackUnorm1x16(uint16 const& p) {\n  float Unpack = static_cast<float>(*const_cast<uint16*>(&p));\n  return Unpack * 1.5259021896696421759365224689097e-5f;  // 1.0 / 65535.0\n}\n\nGLM_FUNC_QUALIFIER uint64 packUnorm4x16(vec4 const& v) {\n  u16vec4 Topack(round(clamp(v, 0.0f, 1.0f) * 65535.0f));\n  uint64* Packed = reinterpret_cast<uint64*>(&Topack);\n  return *Packed;\n}\n\nGLM_FUNC_QUALIFIER vec4 unpackUnorm4x16(uint64 const& p) {\n  u16vec4* Unpack = reinterpret_cast<u16vec4*>(const_cast<uint64*>(&p));\n  return vec4(*Unpack) *\n         1.5259021896696421759365224689097e-5f;  // 1.0 / 65535.0\n}\n\nGLM_FUNC_QUALIFIER uint16 packSnorm1x16(float const& v) {\n  int16 Topack = static_cast<int16>(round(clamp(v, -1.0f, 1.0f) * 32767.0f));\n  uint16* Packed = reinterpret_cast<uint16*>(&Topack);\n  return *Packed;\n}\n\nGLM_FUNC_QUALIFIER float unpackSnorm1x16(uint16 const& p) {\n  float Unpack = static_cast<float>(*const_cast<uint16*>(&p));\n  return clamp(\n      Unpack * 3.0518509475997192297128208258309e-5f,  // 1.0f / 32767.0f,\n      -1.0f, 1.0f);\n}\n\nGLM_FUNC_QUALIFIER uint64 packSnorm4x16(vec4 const& v) {\n  i16vec4 Topack =\n      static_cast<i16vec4>(round(clamp(v, -1.0f, 1.0f) * 32767.0f));\n  uint64* Packed = reinterpret_cast<uint64*>(&Topack);\n  return *Packed;\n}\n\nGLM_FUNC_QUALIFIER vec4 unpackSnorm4x16(uint64 const& p) {\n  i16vec4* Unpack(reinterpret_cast<i16vec4*>(const_cast<uint64*>(&p)));\n  return clamp(vec4(*Unpack) *\n                   3.0518509475997192297128208258309e-5f,  // 1.0f / 32767.0f,\n               -1.0f, 1.0f);\n}\n\nGLM_FUNC_QUALIFIER uint16 packHalf1x16(float const& v) {\n  int16 Topack = detail::toFloat16(v);\n  uint16* Packed = reinterpret_cast<uint16*>(&Topack);\n  return *Packed;\n}\n\nGLM_FUNC_QUALIFIER float unpackHalf1x16(uint16 const& v) {\n  int16* Unpack = reinterpret_cast<int16*>(const_cast<uint16*>(&v));\n  return detail::toFloat32(*Unpack);\n}\n\nGLM_FUNC_QUALIFIER uint64 packHalf4x16(glm::vec4 const& v) {\n  i16vec4 Unpack(detail::toFloat16(v.x), detail::toFloat16(v.y),\n                 detail::toFloat16(v.z), detail::toFloat16(v.w));\n\n  uint64* Packed = reinterpret_cast<uint64*>(&Unpack);\n  return *Packed;\n}\n\nGLM_FUNC_QUALIFIER glm::vec4 unpackHalf4x16(uint64 const& v) {\n  i16vec4* p = reinterpret_cast<i16vec4*>(const_cast<uint64*>(&v));\n  i16vec4 Unpack(*p);\n\n  return vec4(detail::toFloat32(Unpack.x), detail::toFloat32(Unpack.y),\n              detail::toFloat32(Unpack.z), detail::toFloat32(Unpack.w));\n}\n\nGLM_FUNC_QUALIFIER uint32 packI3x10_1x2(ivec4 const& v) {\n  detail::i10i10i10i2 Result;\n  Result.data.x = v.x;\n  Result.data.y = v.y;\n  Result.data.z = v.z;\n  Result.data.w = v.w;\n  return Result.pack;\n}\n\nGLM_FUNC_QUALIFIER ivec4 unpackI3x10_1x2(uint32 const& v) {\n  detail::i10i10i10i2 Unpack;\n  Unpack.pack = v;\n  return ivec4(Unpack.data.x, Unpack.data.y, Unpack.data.z, Unpack.data.w);\n}\n\nGLM_FUNC_QUALIFIER uint32 packU3x10_1x2(uvec4 const& v) {\n  detail::u10u10u10u2 Result;\n  Result.data.x = v.x;\n  Result.data.y = v.y;\n  Result.data.z = v.z;\n  Result.data.w = v.w;\n  return Result.pack;\n}\n\nGLM_FUNC_QUALIFIER uvec4 unpackU3x10_1x2(uint32 const& v) {\n  detail::u10u10u10u2 Unpack;\n  Unpack.pack = v;\n  return uvec4(Unpack.data.x, Unpack.data.y, Unpack.data.z, Unpack.data.w);\n}\n\nGLM_FUNC_QUALIFIER uint32 packSnorm3x10_1x2(vec4 const& v) {\n  detail::i10i10i10i2 Result;\n  Result.data.x = int(round(clamp(v.x, -1.0f, 1.0f) * 511.f));\n  Result.data.y = int(round(clamp(v.y, -1.0f, 1.0f) * 511.f));\n  Result.data.z = int(round(clamp(v.z, -1.0f, 1.0f) * 511.f));\n  Result.data.w = int(round(clamp(v.w, -1.0f, 1.0f) * 1.f));\n  return Result.pack;\n}\n\nGLM_FUNC_QUALIFIER vec4 unpackSnorm3x10_1x2(uint32 const& v) {\n  detail::i10i10i10i2 Unpack;\n  Unpack.pack = v;\n  vec4 Result;\n  Result.x = clamp(float(Unpack.data.x) / 511.f, -1.0f, 1.0f);\n  Result.y = clamp(float(Unpack.data.y) / 511.f, -1.0f, 1.0f);\n  Result.z = clamp(float(Unpack.data.z) / 511.f, -1.0f, 1.0f);\n  Result.w = clamp(float(Unpack.data.w) / 1.f, -1.0f, 1.0f);\n  return Result;\n}\n\nGLM_FUNC_QUALIFIER uint32 packUnorm3x10_1x2(vec4 const& v) {\n  detail::i10i10i10i2 Result;\n  Result.data.x = int(round(clamp(v.x, 0.0f, 1.0f) * 1023.f));\n  Result.data.y = int(round(clamp(v.y, 0.0f, 1.0f) * 1023.f));\n  Result.data.z = int(round(clamp(v.z, 0.0f, 1.0f) * 1023.f));\n  Result.data.w = int(round(clamp(v.w, 0.0f, 1.0f) * 3.f));\n  return Result.pack;\n}\n\nGLM_FUNC_QUALIFIER vec4 unpackUnorm3x10_1x2(uint32 const& v) {\n  detail::i10i10i10i2 Unpack;\n  Unpack.pack = v;\n  vec4 Result;\n  Result.x = float(Unpack.data.x) / 1023.f;\n  Result.y = float(Unpack.data.y) / 1023.f;\n  Result.z = float(Unpack.data.z) / 1023.f;\n  Result.w = float(Unpack.data.w) / 3.f;\n  return Result;\n}\n\nGLM_FUNC_QUALIFIER uint32 packF2x11_1x10(vec3 const& v) {\n  return ((detail::floatTo11bit(v.x) & ((1 << 11) - 1)) << 0) |\n         ((detail::floatTo11bit(v.y) & ((1 << 11) - 1)) << 11) |\n         ((detail::floatTo10bit(v.z) & ((1 << 10) - 1)) << 22);\n}\n\nGLM_FUNC_QUALIFIER vec3 unpackF2x11_1x10(uint32 const& v) {\n  return vec3(detail::packed11bitToFloat(v >> 0),\n              detail::packed11bitToFloat(v >> 11),\n              detail::packed10bitToFloat(v >> 22));\n}\n\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtc/quaternion.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtc_quaternion\n/// @file glm/gtc/quaternion.hpp\n/// @date 2009-05-21 / 2012-12-20\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtc_half_float (dependence)\n/// @see gtc_constants (dependence)\n///\n/// @defgroup gtc_quaternion GLM_GTC_quaternion\n/// @ingroup gtc\n///\n/// @brief Defines a templated quaternion type and several quaternion\n/// operations.\n///\n/// <glm/gtc/quaternion.hpp> need to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTC_quaternion\n#define GLM_GTC_quaternion\n\n// Dependency:\n#include \"../gtc/constants.hpp\"\n#include \"../mat3x3.hpp\"\n#include \"../mat4x4.hpp\"\n#include \"../vec3.hpp\"\n#include \"../vec4.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTC_quaternion extension included\")\n#endif\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nstruct tquat {\n  enum ctor { null };\n\n  typedef tvec4<bool, P> bool_type;\n\n public:\n  T x, y, z, w;\n\n  GLM_FUNC_DECL GLM_CONSTEXPR length_t length() const;\n\n  // Constructors\n  GLM_FUNC_DECL tquat();\n  template <typename U, precision Q>\n  GLM_FUNC_DECL explicit tquat(tquat<U, Q> const& q);\n  GLM_FUNC_DECL tquat(T const& s, tvec3<T, P> const& v);\n  GLM_FUNC_DECL tquat(T const& w, T const& x, T const& y, T const& z);\n\n  // Convertions\n\n  /// Create a quaternion from two normalized axis\n  ///\n  /// @param u A first normalized axis\n  /// @param v A second normalized axis\n  /// @see gtc_quaternion\n  /// @see\n  /// http://lolengine.net/blog/2013/09/18/beautiful-maths-quaternion-from-vectors\n  GLM_FUNC_DECL explicit tquat(detail::tvec3<T, P> const& u,\n                               detail::tvec3<T, P> const& v);\n  /// Build a quaternion from euler angles (pitch, yaw, roll), in radians.\n  GLM_FUNC_DECL explicit tquat(tvec3<T, P> const& eulerAngles);\n  GLM_FUNC_DECL explicit tquat(tmat3x3<T, P> const& m);\n  GLM_FUNC_DECL explicit tquat(tmat4x4<T, P> const& m);\n\n  // Accesses\n  GLM_FUNC_DECL T& operator[](length_t i);\n  GLM_FUNC_DECL T const& operator[](length_t i) const;\n\n  // Operators\n  GLM_FUNC_DECL tquat<T, P>& operator+=(tquat<T, P> const& q);\n  GLM_FUNC_DECL tquat<T, P>& operator*=(tquat<T, P> const& q);\n  GLM_FUNC_DECL tquat<T, P>& operator*=(T const& s);\n  GLM_FUNC_DECL tquat<T, P>& operator/=(T const& s);\n};\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tquat<T, P> operator-(detail::tquat<T, P> const& q);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tquat<T, P> operator+(detail::tquat<T, P> const& q,\n                                            detail::tquat<T, P> const& p);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tquat<T, P> operator*(detail::tquat<T, P> const& q,\n                                            detail::tquat<T, P> const& p);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec3<T, P> operator*(detail::tquat<T, P> const& q,\n                                            detail::tvec3<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec3<T, P> operator*(detail::tvec3<T, P> const& v,\n                                            detail::tquat<T, P> const& q);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec4<T, P> operator*(detail::tquat<T, P> const& q,\n                                            detail::tvec4<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec4<T, P> operator*(detail::tvec4<T, P> const& v,\n                                            detail::tquat<T, P> const& q);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tquat<T, P> operator*(detail::tquat<T, P> const& q,\n                                            T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tquat<T, P> operator*(T const& s,\n                                            detail::tquat<T, P> const& q);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tquat<T, P> operator/(detail::tquat<T, P> const& q,\n                                            T const& s);\n\n}  // namespace detail\n\n/// @addtogroup gtc_quaternion\n/// @{\n\n/// Returns the length of the quaternion.\n///\n/// @see gtc_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL T length(detail::tquat<T, P> const& q);\n\n/// Returns the normalized quaternion.\n///\n/// @see gtc_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tquat<T, P> normalize(detail::tquat<T, P> const& q);\n\n/// Returns dot product of q1 and q2, i.e., q1[0] * q2[0] + q1[1] * q2[1] + ...\n///\n/// @see gtc_quaternion\ntemplate <typename T, precision P,\n          template <typename, precision> class quatType>\nGLM_FUNC_DECL T dot(quatType<T, P> const& x, quatType<T, P> const& y);\n\n/// Spherical linear interpolation of two quaternions.\n/// The interpolation is oriented and the rotation is performed at constant\n/// speed. For short path spherical linear interpolation, use the slerp\n/// function.\n///\n/// @param x A quaternion\n/// @param y A quaternion\n/// @param a Interpolation factor. The interpolation is defined beyond the range\n/// [0, 1].\n/// @tparam T Value type used to build the quaternion. Supported: half, float or\n/// double.\n/// @see gtc_quaternion\n/// @see - slerp(detail::tquat<T, P> const & x, detail::tquat<T, P> const & y, T\n/// const & a)\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tquat<T, P> mix(detail::tquat<T, P> const& x,\n                                      detail::tquat<T, P> const& y, T const& a);\n\n/// Linear interpolation of two quaternions.\n/// The interpolation is oriented.\n///\n/// @param x A quaternion\n/// @param y A quaternion\n/// @param a Interpolation factor. The interpolation is defined in the range [0,\n/// 1].\n/// @tparam T Value type used to build the quaternion. Supported: half, float or\n/// double.\n/// @see gtc_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tquat<T, P> lerp(detail::tquat<T, P> const& x,\n                                       detail::tquat<T, P> const& y,\n                                       T const& a);\n\n/// Spherical linear interpolation of two quaternions.\n/// The interpolation always take the short path and the rotation is performed\n/// at constant speed.\n///\n/// @param x A quaternion\n/// @param y A quaternion\n/// @param a Interpolation factor. The interpolation is defined beyond the range\n/// [0, 1].\n/// @tparam T Value type used to build the quaternion. Supported: half, float or\n/// double.\n/// @see gtc_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tquat<T, P> slerp(detail::tquat<T, P> const& x,\n                                        detail::tquat<T, P> const& y,\n                                        T const& a);\n\n/// Returns the q conjugate.\n///\n/// @see gtc_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tquat<T, P> conjugate(detail::tquat<T, P> const& q);\n\n/// Returns the q inverse.\n///\n/// @see gtc_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tquat<T, P> inverse(detail::tquat<T, P> const& q);\n\n/// Rotates a quaternion from a vector of 3 components axis and an angle.\n///\n/// @param q Source orientation\n/// @param angle Angle expressed in radians if GLM_FORCE_RADIANS is define or\n/// degrees otherwise.\n/// @param axis Axis of the rotation\n///\n/// @see gtc_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tquat<T, P> rotate(detail::tquat<T, P> const& q,\n                                         T const& angle,\n                                         detail::tvec3<T, P> const& axis);\n\n/// Returns euler angles, yitch as x, yaw as y, roll as z.\n/// The result is expressed in radians if GLM_FORCE_RADIANS is defined or\n/// degrees otherwise.\n///\n/// @see gtc_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec3<T, P> eulerAngles(detail::tquat<T, P> const& x);\n\n/// Returns roll value of euler angles expressed in radians if GLM_FORCE_RADIANS\n/// is defined or degrees otherwise.\n///\n/// @see gtx_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL T roll(detail::tquat<T, P> const& x);\n\n/// Returns pitch value of euler angles expressed in radians if\n/// GLM_FORCE_RADIANS is defined or degrees otherwise.\n///\n/// @see gtx_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL T pitch(detail::tquat<T, P> const& x);\n\n/// Returns yaw value of euler angles expressed in radians if GLM_FORCE_RADIANS\n/// is defined or degrees otherwise.\n///\n/// @see gtx_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL T yaw(detail::tquat<T, P> const& x);\n\n/// Converts a quaternion to a 3 * 3 matrix.\n///\n/// @see gtc_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat3x3<T, P> mat3_cast(detail::tquat<T, P> const& x);\n\n/// Converts a quaternion to a 4 * 4 matrix.\n///\n/// @see gtc_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x4<T, P> mat4_cast(detail::tquat<T, P> const& x);\n\n/// Converts a 3 * 3 matrix to a quaternion.\n///\n/// @see gtc_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tquat<T, P> quat_cast(detail::tmat3x3<T, P> const& x);\n\n/// Converts a 4 * 4 matrix to a quaternion.\n///\n/// @see gtc_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tquat<T, P> quat_cast(detail::tmat4x4<T, P> const& x);\n\n/// Returns the quaternion rotation angle.\n///\n/// @see gtc_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL T angle(detail::tquat<T, P> const& x);\n\n/// Returns the q rotation axis.\n///\n/// @see gtc_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec3<T, P> axis(detail::tquat<T, P> const& x);\n\n/// Build a quaternion from an angle and a normalized axis.\n///\n/// @param angle Angle expressed in radians if GLM_FORCE_RADIANS is define or\n/// degrees otherwise.\n/// @param axis Axis of the quaternion, must be normalized.\n///\n/// @see gtc_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tquat<T, P> angleAxis(T const& angle,\n                                            detail::tvec3<T, P> const& axis);\n\n/// Returns the component-wise comparison result of x < y.\n///\n/// @tparam quatType Floating-point quaternion types.\n///\n/// @see gtc_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec4<bool, P> lessThan(detail::tquat<T, P> const& x,\n                                              detail::tquat<T, P> const& y);\n\n/// Returns the component-wise comparison of result x <= y.\n///\n/// @tparam quatType Floating-point quaternion types.\n///\n/// @see gtc_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec4<bool, P> lessThanEqual(\n    detail::tquat<T, P> const& x, detail::tquat<T, P> const& y);\n\n/// Returns the component-wise comparison of result x > y.\n///\n/// @tparam quatType Floating-point quaternion types.\n///\n/// @see gtc_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec4<bool, P> greaterThan(detail::tquat<T, P> const& x,\n                                                 detail::tquat<T, P> const& y);\n\n/// Returns the component-wise comparison of result x >= y.\n///\n/// @tparam quatType Floating-point quaternion types.\n///\n/// @see gtc_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec4<bool, P> greaterThanEqual(\n    detail::tquat<T, P> const& x, detail::tquat<T, P> const& y);\n\n/// Returns the component-wise comparison of result x == y.\n///\n/// @tparam quatType Floating-point quaternion types.\n///\n/// @see gtc_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec4<bool, P> equal(detail::tquat<T, P> const& x,\n                                           detail::tquat<T, P> const& y);\n\n/// Returns the component-wise comparison of result x != y.\n///\n/// @tparam quatType Floating-point quaternion types.\n///\n/// @see gtc_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec4<bool, P> notEqual(detail::tquat<T, P> const& x,\n                                              detail::tquat<T, P> const& y);\n\n/// @}\n}  // namespace glm\n\n#include \"quaternion.inl\"\n\n#endif  // GLM_GTC_quaternion\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtc/quaternion.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtc_quaternion\n/// @file glm/gtc/quaternion.inl\n/// @date 2009-05-21 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#include <limits>\n\n#include \"../exponential.hpp\"\n#include \"../geometric.hpp\"\n#include \"../trigonometric.hpp\"\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER GLM_CONSTEXPR length_t tquat<T, P>::length() const {\n  return 4;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tquat<T, P>::tquat() : x(0), y(0), z(0), w(1) {}\n\ntemplate <typename T, precision P>\ntemplate <typename U, precision Q>\nGLM_FUNC_QUALIFIER tquat<T, P>::tquat(tquat<U, Q> const& q)\n    : x(q.x), y(q.y), z(q.z), w(q.w) {}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tquat<T, P>::tquat(T const& s, tvec3<T, P> const& v)\n    : x(v.x), y(v.y), z(v.z), w(s) {}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tquat<T, P>::tquat(T const& w, T const& x, T const& y,\n                                      T const& z)\n    : x(x), y(y), z(z), w(w) {}\n\n//////////////////////////////////////////////////////////////\n// tquat conversions\n\n// template <typename valType>\n// GLM_FUNC_QUALIFIER tquat<valType>::tquat\n//(\n//\tvalType const & pitch,\n//\tvalType const & yaw,\n//\tvalType const & roll\n//)\n//{\n//\ttvec3<valType> eulerAngle(pitch * valType(0.5), yaw * valType(0.5), roll\n//* valType(0.5)); \ttvec3<valType> c = glm::cos(eulerAngle * valType(0.5));\n//\ttvec3<valType> s = glm::sin(eulerAngle * valType(0.5));\n//\n//\tthis->w = c.x * c.y * c.z + s.x * s.y * s.z;\n//\tthis->x = s.x * c.y * c.z - c.x * s.y * s.z;\n//\tthis->y = c.x * s.y * c.z + s.x * c.y * s.z;\n//\tthis->z = c.x * c.y * s.z - s.x * s.y * c.z;\n// }\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tquat<T, P>::tquat(detail::tvec3<T, P> const& u,\n                                      detail::tvec3<T, P> const& v) {\n  detail::tvec3<T, P> w = cross(u, v);\n  T Dot = detail::compute_dot<detail::tvec3, T, P>::call(u, v);\n  detail::tquat<T, P> q(T(1) + Dot, w.x, w.y, w.z);\n\n  *this = normalize(q);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tquat<T, P>::tquat(tvec3<T, P> const& eulerAngle) {\n  tvec3<T, P> c = glm::cos(eulerAngle * T(0.5));\n  tvec3<T, P> s = glm::sin(eulerAngle * T(0.5));\n\n  this->w = c.x * c.y * c.z + s.x * s.y * s.z;\n  this->x = s.x * c.y * c.z - c.x * s.y * s.z;\n  this->y = c.x * s.y * c.z + s.x * c.y * s.z;\n  this->z = c.x * c.y * s.z - s.x * s.y * c.z;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tquat<T, P>::tquat(tmat3x3<T, P> const& m) {\n  *this = quat_cast(m);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tquat<T, P>::tquat(tmat4x4<T, P> const& m) {\n  *this = quat_cast(m);\n}\n\n//////////////////////////////////////////////////////////////\n// tquat<T, P> accesses\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T& tquat<T, P>::operator[](length_t i) {\n  assert(i >= 0 && i < this->length());\n  return (&x)[i];\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T const& tquat<T, P>::operator[](length_t i) const {\n  assert(i >= 0 && i < this->length());\n  return (&x)[i];\n}\n}  // namespace detail\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tquat<T, P> conjugate(detail::tquat<T, P> const& q) {\n  return detail::tquat<T, P>(q.w, -q.x, -q.y, -q.z);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tquat<T, P> inverse(detail::tquat<T, P> const& q) {\n  return conjugate(q) / dot(q, q);\n}\n\nnamespace detail {\n//////////////////////////////////////////////////////////////\n// tquat<valType> operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tquat<T, P>& tquat<T, P>::operator+=(tquat<T, P> const& q) {\n  this->w += q.w;\n  this->x += q.x;\n  this->y += q.y;\n  this->z += q.z;\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tquat<T, P>& tquat<T, P>::operator*=(tquat<T, P> const& q) {\n  tquat<T, P> const p(*this);\n\n  this->w = p.w * q.w - p.x * q.x - p.y * q.y - p.z * q.z;\n  this->x = p.w * q.x + p.x * q.w + p.y * q.z - p.z * q.y;\n  this->y = p.w * q.y + p.y * q.w + p.z * q.x - p.x * q.z;\n  this->z = p.w * q.z + p.z * q.w + p.x * q.y - p.y * q.x;\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tquat<T, P>& tquat<T, P>::operator*=(T const& s) {\n  this->w *= s;\n  this->x *= s;\n  this->y *= s;\n  this->z *= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tquat<T, P>& tquat<T, P>::operator/=(T const& s) {\n  this->w /= s;\n  this->x /= s;\n  this->y /= s;\n  this->z /= s;\n  return *this;\n}\n\n//////////////////////////////////////////////////////////////\n// tquat<T, P> external functions\n\ntemplate <typename T, precision P>\nstruct compute_dot<tquat, T, P> {\n  static T call(tquat<T, P> const& x, tquat<T, P> const& y) {\n    tvec4<T, P> tmp(x.x * y.x, x.y * y.y, x.z * y.z, x.w * y.w);\n    return (tmp.x + tmp.y) + (tmp.z + tmp.w);\n  }\n};\n\n//////////////////////////////////////////////////////////////\n// tquat<T, P> external operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tquat<T, P> operator-(detail::tquat<T, P> const& q) {\n  return detail::tquat<T, P>(-q.w, -q.x, -q.y, -q.z);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tquat<T, P> operator+(detail::tquat<T, P> const& q,\n                                                 detail::tquat<T, P> const& p) {\n  return detail::tquat<T, P>(q) += p;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tquat<T, P> operator*(detail::tquat<T, P> const& q,\n                                                 detail::tquat<T, P> const& p) {\n  return detail::tquat<T, P>(q) *= p;\n}\n\n// Transformation\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> operator*(detail::tquat<T, P> const& q,\n                                                 detail::tvec3<T, P> const& v) {\n  T Two(2);\n\n  detail::tvec3<T, P> uv, uuv;\n  detail::tvec3<T, P> QuatVector(q.x, q.y, q.z);\n  uv = glm::cross(QuatVector, v);\n  uuv = glm::cross(QuatVector, uv);\n  uv *= (Two * q.w);\n  uuv *= Two;\n\n  return v + uv + uuv;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> operator*(detail::tvec3<T, P> const& v,\n                                                 detail::tquat<T, P> const& q) {\n  return glm::inverse(q) * v;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> operator*(detail::tquat<T, P> const& q,\n                                                 detail::tvec4<T, P> const& v) {\n  return detail::tvec4<T, P>(q * detail::tvec3<T, P>(v), v.w);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> operator*(detail::tvec4<T, P> const& v,\n                                                 detail::tquat<T, P> const& q) {\n  return glm::inverse(q) * v;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tquat<T, P> operator*(detail::tquat<T, P> const& q,\n                                                 T const& s) {\n  return detail::tquat<T, P>(q.w * s, q.x * s, q.y * s, q.z * s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tquat<T, P> operator*(T const& s,\n                                                 detail::tquat<T, P> const& q) {\n  return q * s;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tquat<T, P> operator/(detail::tquat<T, P> const& q,\n                                                 T const& s) {\n  return detail::tquat<T, P>(q.w / s, q.x / s, q.y / s, q.z / s);\n}\n\n//////////////////////////////////////\n// Boolean operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool operator==(detail::tquat<T, P> const& q1,\n                                   detail::tquat<T, P> const& q2) {\n  return (q1.x == q2.x) && (q1.y == q2.y) && (q1.z == q2.z) && (q1.w == q2.w);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool operator!=(detail::tquat<T, P> const& q1,\n                                   detail::tquat<T, P> const& q2) {\n  return (q1.x != q2.x) || (q1.y != q2.y) || (q1.z != q2.z) || (q1.w != q2.w);\n}\n\n}  // namespace detail\n\n////////////////////////////////////////////////////////\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T length(detail::tquat<T, P> const& q) {\n  return glm::sqrt(dot(q, q));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tquat<T, P> normalize(detail::tquat<T, P> const& q) {\n  T len = length(q);\n  if (len <= T(0))  // Problem\n    return detail::tquat<T, P>(1, 0, 0, 0);\n  T oneOverLen = T(1) / len;\n  return detail::tquat<T, P>(q.w * oneOverLen, q.x * oneOverLen,\n                             q.y * oneOverLen, q.z * oneOverLen);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tquat<T, P> cross(detail::tquat<T, P> const& q1,\n                                             detail::tquat<T, P> const& q2) {\n  return detail::tquat<T, P>(\n      q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z,\n      q1.w * q2.x + q1.x * q2.w + q1.y * q2.z - q1.z * q2.y,\n      q1.w * q2.y + q1.y * q2.w + q1.z * q2.x - q1.x * q2.z,\n      q1.w * q2.z + q1.z * q2.w + q1.x * q2.y - q1.y * q2.x);\n}\n/*\n        // (x * sin(1 - a) * angle / sin(angle)) + (y * sin(a) * angle /\n   sin(angle)) template <typename T, precision P> GLM_FUNC_QUALIFIER\n   detail::tquat<T, P> mix\n        (\n                detail::tquat<T, P> const & x,\n                detail::tquat<T, P> const & y,\n                T const & a\n        )\n        {\n                if(a <= T(0)) return x;\n                if(a >= T(1)) return y;\n\n                float fCos = dot(x, y);\n                detail::tquat<T, P> y2(y); //BUG!!! tquat<T, P> y2;\n                if(fCos < T(0))\n                {\n                        y2 = -y;\n                        fCos = -fCos;\n                }\n\n                //if(fCos > 1.0f) // problem\n                float k0, k1;\n                if(fCos > T(0.9999))\n                {\n                        k0 = T(1) - a;\n                        k1 = T(0) + a; //BUG!!! 1.0f + a;\n                }\n                else\n                {\n                        T fSin = sqrt(T(1) - fCos * fCos);\n                        T fAngle = atan(fSin, fCos);\n                        T fOneOverSin = static_cast<T>(1) / fSin;\n                        k0 = sin((T(1) - a) * fAngle) * fOneOverSin;\n                        k1 = sin((T(0) + a) * fAngle) * fOneOverSin;\n                }\n\n                return detail::tquat<T, P>(\n                        k0 * x.w + k1 * y2.w,\n                        k0 * x.x + k1 * y2.x,\n                        k0 * x.y + k1 * y2.y,\n                        k0 * x.z + k1 * y2.z);\n        }\n\n        template <typename T, precision P>\n        GLM_FUNC_QUALIFIER detail::tquat<T, P> mix2\n        (\n                detail::tquat<T, P> const & x,\n                detail::tquat<T, P> const & y,\n                T const & a\n        )\n        {\n                bool flip = false;\n                if(a <= static_cast<T>(0)) return x;\n                if(a >= static_cast<T>(1)) return y;\n\n                T cos_t = dot(x, y);\n                if(cos_t < T(0))\n                {\n                        cos_t = -cos_t;\n                        flip = true;\n                }\n\n                T alpha(0), beta(0);\n\n                if(T(1) - cos_t < 1e-7)\n                        beta = static_cast<T>(1) - alpha;\n                else\n                {\n                        T theta = acos(cos_t);\n                        T sin_t = sin(theta);\n                        beta = sin(theta * (T(1) - alpha)) / sin_t;\n                        alpha = sin(alpha * theta) / sin_t;\n                }\n\n                if(flip)\n                        alpha = -alpha;\n\n                return normalize(beta * x + alpha * y);\n        }\n*/\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tquat<T, P> mix(detail::tquat<T, P> const& x,\n                                           detail::tquat<T, P> const& y,\n                                           T const& a) {\n  T cosTheta = dot(x, y);\n\n  // Perform a linear interpolation when cosTheta is close to 1 to avoid side\n  // effect of sin(angle) becoming a zero denominator\n  if (cosTheta > T(1) - epsilon<T>()) {\n    // Linear interpolation\n    return detail::tquat<T, P>(mix(x.w, y.w, a), mix(x.x, y.x, a),\n                               mix(x.y, y.y, a), mix(x.z, y.z, a));\n  } else {\n    // Essential Mathematics, page 467\n    T angle = acos(cosTheta);\n    return (sin((T(1) - a) * angle) * x + sin(a * angle) * y) / sin(angle);\n  }\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tquat<T, P> lerp(detail::tquat<T, P> const& x,\n                                            detail::tquat<T, P> const& y,\n                                            T const& a) {\n  // Lerp is only defined in [0, 1]\n  assert(a >= static_cast<T>(0));\n  assert(a <= static_cast<T>(1));\n\n  return x * (T(1) - a) + (y * a);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tquat<T, P> slerp(detail::tquat<T, P> const& x,\n                                             detail::tquat<T, P> const& y,\n                                             T const& a) {\n  detail::tquat<T, P> z = y;\n\n  T cosTheta = dot(x, y);\n\n  // If cosTheta < 0, the interpolation will take the long way around the\n  // sphere. To fix this, one quat must be negated.\n  if (cosTheta < T(0)) {\n    z = -y;\n    cosTheta = -cosTheta;\n  }\n\n  // Perform a linear interpolation when cosTheta is close to 1 to avoid side\n  // effect of sin(angle) becoming a zero denominator\n  if (cosTheta > T(1) - epsilon<T>()) {\n    // Linear interpolation\n    return detail::tquat<T, P>(mix(x.w, y.w, a), mix(x.x, y.x, a),\n                               mix(x.y, y.y, a), mix(x.z, y.z, a));\n  } else {\n    // Essential Mathematics, page 467\n    T angle = acos(cosTheta);\n    return (sin((T(1) - a) * angle) * x + sin(a * angle) * z) / sin(angle);\n  }\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tquat<T, P> rotate(detail::tquat<T, P> const& q,\n                                              T const& angle,\n                                              detail::tvec3<T, P> const& v) {\n  detail::tvec3<T, P> Tmp = v;\n\n  // Axis of rotation must be normalised\n  T len = glm::length(Tmp);\n  if (abs(len - T(1)) > T(0.001)) {\n    T oneOverLen = static_cast<T>(1) / len;\n    Tmp.x *= oneOverLen;\n    Tmp.y *= oneOverLen;\n    Tmp.z *= oneOverLen;\n  }\n\n#ifdef GLM_FORCE_RADIANS\n  T const AngleRad(angle);\n#else\n#pragma message( \\\n        \"GLM: rotate function taking degrees as a parameter is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.\")\n  T const AngleRad = radians(angle);\n#endif\n  T const Sin = sin(AngleRad * T(0.5));\n\n  return q * detail::tquat<T, P>(cos(AngleRad * T(0.5)), Tmp.x * Sin,\n                                 Tmp.y * Sin, Tmp.z * Sin);\n  // return gtc::quaternion::cross(q, detail::tquat<T, P>(cos(AngleRad *\n  // T(0.5)), Tmp.x * fSin, Tmp.y * fSin, Tmp.z * fSin));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> eulerAngles(\n    detail::tquat<T, P> const& x) {\n  return detail::tvec3<T, P>(pitch(x), yaw(x), roll(x));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T roll(detail::tquat<T, P> const& q) {\n#ifdef GLM_FORCE_RADIANS\n  return T(atan(T(2) * (q.x * q.y + q.w * q.z),\n                q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z));\n#else\n#pragma message( \\\n        \"GLM: roll function returning degrees is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.\")\n  return glm::degrees(atan(T(2) * (q.x * q.y + q.w * q.z),\n                           q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z));\n#endif\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T pitch(detail::tquat<T, P> const& q) {\n#ifdef GLM_FORCE_RADIANS\n  return T(atan(T(2) * (q.y * q.z + q.w * q.x),\n                q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z));\n#else\n#pragma message( \\\n        \"GLM: pitch function returning degrees is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.\")\n  return glm::degrees(atan(T(2) * (q.y * q.z + q.w * q.x),\n                           q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z));\n#endif\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T yaw(detail::tquat<T, P> const& q) {\n#ifdef GLM_FORCE_RADIANS\n  return asin(T(-2) * (q.x * q.z - q.w * q.y));\n#else\n#pragma message( \\\n        \"GLM: yaw function returning degrees is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.\")\n  return glm::degrees(asin(T(-2) * (q.x * q.z - q.w * q.y)));\n#endif\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat3x3<T, P> mat3_cast(\n    detail::tquat<T, P> const& q) {\n  detail::tmat3x3<T, P> Result(T(1));\n  T qxx(q.x * q.x);\n  T qyy(q.y * q.y);\n  T qzz(q.z * q.z);\n  T qxz(q.x * q.z);\n  T qxy(q.x * q.y);\n  T qyz(q.y * q.z);\n  T qwx(q.w * q.x);\n  T qwy(q.w * q.y);\n  T qwz(q.w * q.z);\n\n  Result[0][0] = 1 - 2 * (qyy + qzz);\n  Result[0][1] = 2 * (qxy + qwz);\n  Result[0][2] = 2 * (qxz - qwy);\n\n  Result[1][0] = 2 * (qxy - qwz);\n  Result[1][1] = 1 - 2 * (qxx + qzz);\n  Result[1][2] = 2 * (qyz + qwx);\n\n  Result[2][0] = 2 * (qxz + qwy);\n  Result[2][1] = 2 * (qyz - qwx);\n  Result[2][2] = 1 - 2 * (qxx + qyy);\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> mat4_cast(\n    detail::tquat<T, P> const& q) {\n  return detail::tmat4x4<T, P>(mat3_cast(q));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tquat<T, P> quat_cast(\n    detail::tmat3x3<T, P> const& m) {\n  T fourXSquaredMinus1 = m[0][0] - m[1][1] - m[2][2];\n  T fourYSquaredMinus1 = m[1][1] - m[0][0] - m[2][2];\n  T fourZSquaredMinus1 = m[2][2] - m[0][0] - m[1][1];\n  T fourWSquaredMinus1 = m[0][0] + m[1][1] + m[2][2];\n\n  int biggestIndex = 0;\n  T fourBiggestSquaredMinus1 = fourWSquaredMinus1;\n  if (fourXSquaredMinus1 > fourBiggestSquaredMinus1) {\n    fourBiggestSquaredMinus1 = fourXSquaredMinus1;\n    biggestIndex = 1;\n  }\n  if (fourYSquaredMinus1 > fourBiggestSquaredMinus1) {\n    fourBiggestSquaredMinus1 = fourYSquaredMinus1;\n    biggestIndex = 2;\n  }\n  if (fourZSquaredMinus1 > fourBiggestSquaredMinus1) {\n    fourBiggestSquaredMinus1 = fourZSquaredMinus1;\n    biggestIndex = 3;\n  }\n\n  T biggestVal = sqrt(fourBiggestSquaredMinus1 + T(1)) * T(0.5);\n  T mult = static_cast<T>(0.25) / biggestVal;\n\n  detail::tquat<T, P> Result;\n  switch (biggestIndex) {\n    case 0:\n      Result.w = biggestVal;\n      Result.x = (m[1][2] - m[2][1]) * mult;\n      Result.y = (m[2][0] - m[0][2]) * mult;\n      Result.z = (m[0][1] - m[1][0]) * mult;\n      break;\n    case 1:\n      Result.w = (m[1][2] - m[2][1]) * mult;\n      Result.x = biggestVal;\n      Result.y = (m[0][1] + m[1][0]) * mult;\n      Result.z = (m[2][0] + m[0][2]) * mult;\n      break;\n    case 2:\n      Result.w = (m[2][0] - m[0][2]) * mult;\n      Result.x = (m[0][1] + m[1][0]) * mult;\n      Result.y = biggestVal;\n      Result.z = (m[1][2] + m[2][1]) * mult;\n      break;\n    case 3:\n      Result.w = (m[0][1] - m[1][0]) * mult;\n      Result.x = (m[2][0] + m[0][2]) * mult;\n      Result.y = (m[1][2] + m[2][1]) * mult;\n      Result.z = biggestVal;\n      break;\n\n    default:  // Silence a -Wswitch-default warning in GCC. Should never\n              // actually get here. Assert is just for sanity.\n      assert(false);\n      break;\n  }\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tquat<T, P> quat_cast(\n    detail::tmat4x4<T, P> const& m4) {\n  return quat_cast(detail::tmat3x3<T, P>(m4));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T angle(detail::tquat<T, P> const& x) {\n#ifdef GLM_FORCE_RADIANS\n  return acos(x.w) * T(2);\n#else\n#pragma message( \\\n        \"GLM: angle function returning degrees is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.\")\n  return glm::degrees(acos(x.w) * T(2));\n#endif\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> axis(detail::tquat<T, P> const& x) {\n  T tmp1 = static_cast<T>(1) - x.w * x.w;\n  if (tmp1 <= static_cast<T>(0)) return detail::tvec3<T, P>(0, 0, 1);\n  T tmp2 = static_cast<T>(1) / sqrt(tmp1);\n  return detail::tvec3<T, P>(x.x * tmp2, x.y * tmp2, x.z * tmp2);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tquat<T, P> angleAxis(T const& angle,\n                                                 detail::tvec3<T, P> const& v) {\n  detail::tquat<T, P> result;\n\n#ifdef GLM_FORCE_RADIANS\n  T const a(angle);\n#else\n#pragma message( \\\n        \"GLM: angleAxis function taking degrees as a parameter is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.\")\n  T const a(glm::radians(angle));\n#endif\n  T s = glm::sin(a * T(0.5));\n\n  result.w = glm::cos(a * T(0.5));\n  result.x = v.x * s;\n  result.y = v.y * s;\n  result.z = v.z * s;\n  return result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<bool, P> lessThan(\n    detail::tquat<T, P> const& x, detail::tquat<T, P> const& y) {\n  detail::tvec4<bool, P> Result;\n  for (length_t i = 0; i < x.length(); ++i) Result[i] = x[i] < y[i];\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<bool, P> lessThanEqual(\n    detail::tquat<T, P> const& x, detail::tquat<T, P> const& y) {\n  detail::tvec4<bool, P> Result;\n  for (length_t i = 0; i < x.length(); ++i) Result[i] = x[i] <= y[i];\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<bool, P> greaterThan(\n    detail::tquat<T, P> const& x, detail::tquat<T, P> const& y) {\n  detail::tvec4<bool, P> Result;\n  for (length_t i = 0; i < x.length(); ++i) Result[i] = x[i] > y[i];\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<bool, P> greaterThanEqual(\n    detail::tquat<T, P> const& x, detail::tquat<T, P> const& y) {\n  detail::tvec4<bool, P> Result;\n  for (length_t i = 0; i < x.length(); ++i) Result[i] = x[i] >= y[i];\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<bool, P> equal(detail::tquat<T, P> const& x,\n                                                detail::tquat<T, P> const& y) {\n  detail::tvec4<bool, P> Result;\n  for (length_t i = 0; i < x.length(); ++i) Result[i] = x[i] == y[i];\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<bool, P> notEqual(\n    detail::tquat<T, P> const& x, detail::tquat<T, P> const& y) {\n  detail::tvec4<bool, P> Result;\n  for (length_t i = 0; i < x.length(); ++i) Result[i] = x[i] != y[i];\n  return Result;\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtc/random.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtc_random\n/// @file glm/gtc/random.hpp\n/// @date 2011-09-18 / 2011-09-18\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtc_half_float (dependence)\n/// @see gtx_random (extended)\n///\n/// @defgroup gtc_random GLM_GTC_random\n/// @ingroup gtc\n///\n/// @brief Generate random number from various distribution methods.\n///\n/// <glm/gtc/random.hpp> need to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTC_random\n#define GLM_GTC_random\n\n// Dependency:\n#include \"../vec2.hpp\"\n#include \"../vec3.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTC_random extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtc_random\n/// @{\n\n/// Generate random numbers in the interval [Min, Max], according a linear\n/// distribution\n///\n/// @param Min\n/// @param Max\n/// @tparam genType Value type. Currently supported: half (not recommanded),\n/// float or double scalars and vectors.\n/// @see gtc_random\ntemplate <typename genType>\nGLM_FUNC_DECL genType linearRand(genType const& Min, genType const& Max);\n\n/// Generate random numbers in the interval [Min, Max], according a gaussian\n/// distribution\n///\n/// @param Mean\n/// @param Deviation\n/// @see gtc_random\ntemplate <typename genType>\nGLM_FUNC_DECL genType gaussRand(genType const& Mean, genType const& Deviation);\n\n/// Generate a random 2D vector which coordinates are regulary distributed on a\n/// circle of a given radius\n///\n/// @param Radius\n/// @see gtc_random\ntemplate <typename T>\nGLM_FUNC_DECL detail::tvec2<T, defaultp> circularRand(T const& Radius);\n\n/// Generate a random 3D vector which coordinates are regulary distributed on a\n/// sphere of a given radius\n///\n/// @param Radius\n/// @see gtc_random\ntemplate <typename T>\nGLM_FUNC_DECL detail::tvec3<T, defaultp> sphericalRand(T const& Radius);\n\n/// Generate a random 2D vector which coordinates are regulary distributed\n/// within the area of a disk of a given radius\n///\n/// @param Radius\n/// @see gtc_random\ntemplate <typename T>\nGLM_FUNC_DECL detail::tvec2<T, defaultp> diskRand(T const& Radius);\n\n/// Generate a random 3D vector which coordinates are regulary distributed\n/// within the volume of a ball of a given radius\n///\n/// @param Radius\n/// @see gtc_random\ntemplate <typename T>\nGLM_FUNC_DECL detail::tvec3<T, defaultp> ballRand(T const& Radius);\n\n/// @}\n}  // namespace glm\n\n#include \"random.inl\"\n\n#endif  // GLM_GTC_random\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtc/random.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtc_random\n/// @file glm/gtc/random.inl\n/// @date 2011-09-19 / 2012-04-07\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#include <cassert>\n#include <cstdlib>\n#include <ctime>\n\n#include \"../exponential.hpp\"\n#include \"../geometric.hpp\"\n\nnamespace glm {\nnamespace detail {\nstruct compute_linearRand {\n  template <typename T>\n  GLM_FUNC_QUALIFIER T operator()(T const& Min, T const& Max) const;\n  /*\n                  {\n                          GLM_STATIC_ASSERT(0, \"'linearRand' invalid template\n     parameter type. GLM_GTC_random only supports floating-point template\n     types.\"); return Min;\n                  }\n  */\n};\n\ntemplate <>\nGLM_FUNC_QUALIFIER float compute_linearRand::operator()<float>(\n    float const& Min, float const& Max) const {\n  return float(std::rand()) / float(RAND_MAX) * (Max - Min) + Min;\n}\n\ntemplate <>\nGLM_FUNC_QUALIFIER double compute_linearRand::operator()<double>(\n    double const& Min, double const& Max) const {\n  return double(std::rand()) / double(RAND_MAX) * (Max - Min) + Min;\n}\n\ntemplate <>\nGLM_FUNC_QUALIFIER long double compute_linearRand::operator()<long double>(\n    long double const& Min, long double const& Max) const {\n  return (long double)(std::rand()) / (long double)(RAND_MAX) * (Max - Min) +\n         Min;\n}\n}  // namespace detail\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType linearRand(genType const& Min, genType const& Max) {\n  return detail::compute_linearRand()(Min, Max);\n}\n\nVECTORIZE_VEC_VEC(linearRand)\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType gaussRand(genType const& Mean,\n                                     genType const& Deviation) {\n  genType w, x1, x2;\n\n  do {\n    x1 = linearRand(genType(-1), genType(1));\n    x2 = linearRand(genType(-1), genType(1));\n\n    w = x1 * x1 + x2 * x2;\n  } while (w > genType(1));\n\n  return x2 * Deviation * Deviation * sqrt((genType(-2) * log(w)) / w) + Mean;\n}\n\nVECTORIZE_VEC_VEC(gaussRand)\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tvec2<T, defaultp> diskRand(T const& Radius) {\n  detail::tvec2<T, defaultp> Result(T(0));\n  T LenRadius(T(0));\n\n  do {\n    Result = linearRand(detail::tvec2<T, defaultp>(-Radius),\n                        detail::tvec2<T, defaultp>(Radius));\n    LenRadius = length(Result);\n  } while (LenRadius > Radius);\n\n  return Result;\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tvec3<T, defaultp> ballRand(T const& Radius) {\n  detail::tvec3<T, defaultp> Result(T(0));\n  T LenRadius(T(0));\n\n  do {\n    Result = linearRand(detail::tvec3<T, defaultp>(-Radius),\n                        detail::tvec3<T, defaultp>(Radius));\n    LenRadius = length(Result);\n  } while (LenRadius > Radius);\n\n  return Result;\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tvec2<T, defaultp> circularRand(T const& Radius) {\n  T a = linearRand(T(0), T(6.283185307179586476925286766559f));\n  return detail::tvec2<T, defaultp>(cos(a), sin(a)) * Radius;\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tvec3<T, defaultp> sphericalRand(T const& Radius) {\n  T z = linearRand(T(-1), T(1));\n  T a = linearRand(T(0), T(6.283185307179586476925286766559f));\n\n  T r = sqrt(T(1) - z * z);\n\n  T x = r * cos(a);\n  T y = r * sin(a);\n\n  return detail::tvec3<T, defaultp>(x, y, z) * Radius;\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtc/reciprocal.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtc_reciprocal\n/// @file glm/gtc/reciprocal.hpp\n/// @date 2008-10-09 / 2012-01-25\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n///\n/// @defgroup gtc_reciprocal GLM_GTC_reciprocal\n/// @ingroup gtc\n///\n/// @brief Define secant, cosecant and cotangent functions.\n///\n/// <glm/gtc/reciprocal.hpp> need to be included to use these features.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTC_reciprocal\n#define GLM_GTC_reciprocal\n\n// Dependencies\n#include \"../detail/setup.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTC_reciprocal extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtc_reciprocal\n/// @{\n\n/// Secant function.\n/// hypotenuse / adjacent or 1 / cos(x)\n///\n/// @see gtc_reciprocal\ntemplate <typename genType>\nGLM_FUNC_DECL genType sec(genType const& angle);\n\n/// Cosecant function.\n/// hypotenuse / opposite or 1 / sin(x)\n///\n/// @see gtc_reciprocal\ntemplate <typename genType>\nGLM_FUNC_DECL genType csc(genType const& angle);\n\n/// Cotangent function.\n/// adjacent / opposite or 1 / tan(x)\n///\n/// @see gtc_reciprocal\ntemplate <typename genType>\nGLM_FUNC_DECL genType cot(genType const& angle);\n\n/// Inverse secant function.\n///\n/// @see gtc_reciprocal\ntemplate <typename genType>\nGLM_FUNC_DECL genType asec(genType const& x);\n\n/// Inverse cosecant function.\n///\n/// @see gtc_reciprocal\ntemplate <typename genType>\nGLM_FUNC_DECL genType acsc(genType const& x);\n\n/// Inverse cotangent function.\n///\n/// @see gtc_reciprocal\ntemplate <typename genType>\nGLM_FUNC_DECL genType acot(genType const& x);\n\n/// Secant hyperbolic function.\n///\n/// @see gtc_reciprocal\ntemplate <typename genType>\nGLM_FUNC_DECL genType sech(genType const& angle);\n\n/// Cosecant hyperbolic function.\n///\n/// @see gtc_reciprocal\ntemplate <typename genType>\nGLM_FUNC_DECL genType csch(genType const& angle);\n\n/// Cotangent hyperbolic function.\n///\n/// @see gtc_reciprocal\ntemplate <typename genType>\nGLM_FUNC_DECL genType coth(genType const& angle);\n\n/// Inverse secant hyperbolic function.\n///\n/// @see gtc_reciprocal\ntemplate <typename genType>\nGLM_FUNC_DECL genType asech(genType const& x);\n\n/// Inverse cosecant hyperbolic function.\n///\n/// @see gtc_reciprocal\ntemplate <typename genType>\nGLM_FUNC_DECL genType acsch(genType const& x);\n\n/// Inverse cotangent hyperbolic function.\n///\n/// @see gtc_reciprocal\ntemplate <typename genType>\nGLM_FUNC_DECL genType acoth(genType const& x);\n\n/// @}\n}  // namespace glm\n\n#include \"reciprocal.inl\"\n\n#endif  // GLM_GTC_reciprocal\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtc/reciprocal.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtc_reciprocal\n/// @file glm/gtc/reciprocal.inl\n/// @date 2008-10-09 / 2012-04-07\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#include <limits>\n\n#include \"../trigonometric.hpp\"\n\nnamespace glm {\n// sec\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType sec(genType const& angle) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'sec' only accept floating-point values\");\n\n  return genType(1) / glm::cos(angle);\n}\n\nVECTORIZE_VEC(sec)\n\n// csc\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType csc(genType const& angle) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'csc' only accept floating-point values\");\n\n  return genType(1) / glm::sin(angle);\n}\n\nVECTORIZE_VEC(csc)\n\n// cot\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType cot(genType const& angle) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'cot' only accept floating-point values\");\n\n  return genType(1) / glm::tan(angle);\n}\n\nVECTORIZE_VEC(cot)\n\n// asec\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType asec(genType const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'asec' only accept floating-point values\");\n\n  return acos(genType(1) / x);\n}\n\nVECTORIZE_VEC(asec)\n\n// acsc\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType acsc(genType const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'acsc' only accept floating-point values\");\n\n  return asin(genType(1) / x);\n}\n\nVECTORIZE_VEC(acsc)\n\n// acot\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType acot(genType const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'acot' only accept floating-point values\");\n\n  genType const pi_over_2 = genType(3.1415926535897932384626433832795 / 2.0);\n  return pi_over_2 - atan(x);\n}\n\nVECTORIZE_VEC(acot)\n\n// sech\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType sech(genType const& angle) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'sech' only accept floating-point values\");\n\n  return genType(1) / glm::cosh(angle);\n}\n\nVECTORIZE_VEC(sech)\n\n// csch\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType csch(genType const& angle) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'csch' only accept floating-point values\");\n\n  return genType(1) / glm::sinh(angle);\n}\n\nVECTORIZE_VEC(csch)\n\n// coth\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType coth(genType const& angle) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'coth' only accept floating-point values\");\n\n  return glm::cosh(angle) / glm::sinh(angle);\n}\n\nVECTORIZE_VEC(coth)\n\n// asech\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType asech(genType const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'asech' only accept floating-point values\");\n\n  return acosh(genType(1) / x);\n}\n\nVECTORIZE_VEC(asech)\n\n// acsch\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType acsch(genType const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'acsch' only accept floating-point values\");\n\n  return asinh(genType(1) / x);\n}\n\nVECTORIZE_VEC(acsch)\n\n// acoth\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType acoth(genType const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'acoth' only accept floating-point values\");\n\n  return atanh(genType(1) / x);\n}\n\nVECTORIZE_VEC(acoth)\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtc/type_precision.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtc_type_precision\n/// @file glm/gtc/type_precision.hpp\n/// @date 2009-06-04 / 2011-12-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtc_half_float (dependence)\n/// @see gtc_quaternion (dependence)\n///\n/// @defgroup gtc_type_precision GLM_GTC_type_precision\n/// @ingroup gtc\n///\n/// @brief Defines specific C++-based precision types.\n///\n/// @ref core_precision defines types based on GLSL's precision qualifiers. This\n/// extension defines types based on explicitly-sized C++ data types.\n///\n/// <glm/gtc/type_precision.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTC_type_precision\n#define GLM_GTC_type_precision\n\n// Dependency:\n#include \"../gtc/quaternion.hpp\"\n#include \"../mat2x2.hpp\"\n#include \"../mat2x3.hpp\"\n#include \"../mat2x4.hpp\"\n#include \"../mat3x2.hpp\"\n#include \"../mat3x3.hpp\"\n#include \"../mat3x4.hpp\"\n#include \"../mat4x2.hpp\"\n#include \"../mat4x3.hpp\"\n#include \"../mat4x4.hpp\"\n#include \"../vec2.hpp\"\n#include \"../vec3.hpp\"\n#include \"../vec4.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTC_type_precision extension included\")\n#endif\n\nnamespace glm {\n///////////////////////////\n// Signed int vector types\n\n/// @addtogroup gtc_type_precision\n/// @{\n\n/// Low precision 8 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int8 lowp_int8;\n\n/// Low precision 16 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int16 lowp_int16;\n\n/// Low precision 32 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int32 lowp_int32;\n\n/// Low precision 64 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int64 lowp_int64;\n\n/// Low precision 8 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int8 lowp_int8_t;\n\n/// Low precision 16 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int16 lowp_int16_t;\n\n/// Low precision 32 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int32 lowp_int32_t;\n\n/// Low precision 64 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int64 lowp_int64_t;\n\n/// Low precision 8 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int8 lowp_i8;\n\n/// Low precision 16 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int16 lowp_i16;\n\n/// Low precision 32 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int32 lowp_i32;\n\n/// Low precision 64 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int64 lowp_i64;\n\n/// Medium precision 8 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int8 mediump_int8;\n\n/// Medium precision 16 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int16 mediump_int16;\n\n/// Medium precision 32 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int32 mediump_int32;\n\n/// Medium precision 64 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int64 mediump_int64;\n\n/// Medium precision 8 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int8 mediump_int8_t;\n\n/// Medium precision 16 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int16 mediump_int16_t;\n\n/// Medium precision 32 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int32 mediump_int32_t;\n\n/// Medium precision 64 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int64 mediump_int64_t;\n\n/// Medium precision 8 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int8 mediump_i8;\n\n/// Medium precision 16 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int16 mediump_i16;\n\n/// Medium precision 32 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int32 mediump_i32;\n\n/// Medium precision 64 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int64 mediump_i64;\n\n/// High precision 8 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int8 highp_int8;\n\n/// High precision 16 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int16 highp_int16;\n\n/// High precision 32 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int32 highp_int32;\n\n/// High precision 64 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int64 highp_int64;\n\n/// High precision 8 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int8 highp_int8_t;\n\n/// High precision 16 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int16 highp_int16_t;\n\n/// 32 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int32 highp_int32_t;\n\n/// High precision 64 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int64 highp_int64_t;\n\n/// High precision 8 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int8 highp_i8;\n\n/// High precision 16 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int16 highp_i16;\n\n/// High precision 32 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int32 highp_i32;\n\n/// High precision 64 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int64 highp_i64;\n\n/// 8 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int8 int8;\n\n/// 16 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int16 int16;\n\n/// 32 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int32 int32;\n\n/// 64 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int64 int64;\n\n/// 8 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int8 int8_t;\n\n/// 16 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int16 int16_t;\n\n/// 32 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int32 int32_t;\n\n/// 64 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int64 int64_t;\n\n/// 8 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int8 i8;\n\n/// 16 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int16 i16;\n\n/// 32 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int32 i32;\n\n/// 64 bit signed integer type.\n/// @see gtc_type_precision\ntypedef detail::int64 i64;\n\n/// 8 bit signed integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<i8, defaultp> i8vec1;\n\n/// 8 bit signed integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<i8, defaultp> i8vec2;\n\n/// 8 bit signed integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<i8, defaultp> i8vec3;\n\n/// 8 bit signed integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<i8, defaultp> i8vec4;\n\n/// 16 bit signed integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<i16, defaultp> i16vec1;\n\n/// 16 bit signed integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<i16, defaultp> i16vec2;\n\n/// 16 bit signed integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<i16, defaultp> i16vec3;\n\n/// 16 bit signed integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<i16, defaultp> i16vec4;\n\n/// 32 bit signed integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<i32, defaultp> i32vec1;\n\n/// 32 bit signed integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<i32, defaultp> i32vec2;\n\n/// 32 bit signed integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<i32, defaultp> i32vec3;\n\n/// 32 bit signed integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<i32, defaultp> i32vec4;\n\n/// 64 bit signed integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<i64, defaultp> i64vec1;\n\n/// 64 bit signed integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<i64, defaultp> i64vec2;\n\n/// 64 bit signed integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<i64, defaultp> i64vec3;\n\n/// 64 bit signed integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<i64, defaultp> i64vec4;\n\n/////////////////////////////\n// Unsigned int vector types\n\n/// Low precision 8 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint8 lowp_uint8;\n\n/// Low precision 16 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint16 lowp_uint16;\n\n/// Low precision 32 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint32 lowp_uint32;\n\n/// Low precision 64 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint64 lowp_uint64;\n\n/// Low precision 8 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint8 lowp_uint8_t;\n\n/// Low precision 16 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint16 lowp_uint16_t;\n\n/// Low precision 32 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint32 lowp_uint32_t;\n\n/// Low precision 64 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint64 lowp_uint64_t;\n\n/// Low precision 8 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint8 lowp_u8;\n\n/// Low precision 16 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint16 lowp_u16;\n\n/// Low precision 32 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint32 lowp_u32;\n\n/// Low precision 64 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint64 lowp_u64;\n\n/// Medium precision 8 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint8 mediump_uint8;\n\n/// Medium precision 16 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint16 mediump_uint16;\n\n/// Medium precision 32 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint32 mediump_uint32;\n\n/// Medium precision 64 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint64 mediump_uint64;\n\n/// Medium precision 8 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint8 mediump_uint8_t;\n\n/// Medium precision 16 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint16 mediump_uint16_t;\n\n/// Medium precision 32 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint32 mediump_uint32_t;\n\n/// Medium precision 64 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint64 mediump_uint64_t;\n\n/// Medium precision 8 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint8 mediump_u8;\n\n/// Medium precision 16 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint16 mediump_u16;\n\n/// Medium precision 32 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint32 mediump_u32;\n\n/// Medium precision 64 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint64 mediump_u64;\n\n/// High precision 8 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint8 highp_uint8;\n\n/// High precision 16 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint16 highp_uint16;\n\n/// High precision 32 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint32 highp_uint32;\n\n/// High precision 64 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint64 highp_uint64;\n\n/// High precision 8 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint8 highp_uint8_t;\n\n/// High precision 16 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint16 highp_uint16_t;\n\n/// High precision 32 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint32 highp_uint32_t;\n\n/// High precision 64 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint64 highp_uint64_t;\n\n/// High precision 8 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint8 highp_u8;\n\n/// High precision 16 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint16 highp_u16;\n\n/// High precision 32 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint32 highp_u32;\n\n/// High precision 64 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint64 highp_u64;\n\n/// Default precision 8 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint8 uint8;\n\n/// Default precision 16 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint16 uint16;\n\n/// Default precision 32 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint32 uint32;\n\n/// Default precision 64 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint64 uint64;\n\n/// Default precision 8 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint8 uint8_t;\n\n/// Default precision 16 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint16 uint16_t;\n\n/// Default precision 32 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint32 uint32_t;\n\n/// Default precision 64 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint64 uint64_t;\n\n/// Default precision 8 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint8 u8;\n\n/// Default precision 16 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint16 u16;\n\n/// Default precision 32 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint32 u32;\n\n/// Default precision 64 bit unsigned integer type.\n/// @see gtc_type_precision\ntypedef detail::uint64 u64;\n\n/// Default precision 8 bit unsigned integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<u8, defaultp> u8vec1;\n\n/// Default precision 8 bit unsigned integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<u8, defaultp> u8vec2;\n\n/// Default precision 8 bit unsigned integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<u8, defaultp> u8vec3;\n\n/// Default precision 8 bit unsigned integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<u8, defaultp> u8vec4;\n\n/// Default precision 16 bit unsigned integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<u16, defaultp> u16vec1;\n\n/// Default precision 16 bit unsigned integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<u16, defaultp> u16vec2;\n\n/// Default precision 16 bit unsigned integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<u16, defaultp> u16vec3;\n\n/// Default precision 16 bit unsigned integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<u16, defaultp> u16vec4;\n\n/// Default precision 32 bit unsigned integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<u32, defaultp> u32vec1;\n\n/// Default precision 32 bit unsigned integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<u32, defaultp> u32vec2;\n\n/// Default precision 32 bit unsigned integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<u32, defaultp> u32vec3;\n\n/// Default precision 32 bit unsigned integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<u32, defaultp> u32vec4;\n\n/// Default precision 64 bit unsigned integer scalar type.\n/// @see gtc_type_precision\ntypedef detail::tvec1<u64, defaultp> u64vec1;\n\n/// Default precision 64 bit unsigned integer vector of 2 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec2<u64, defaultp> u64vec2;\n\n/// Default precision 64 bit unsigned integer vector of 3 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec3<u64, defaultp> u64vec3;\n\n/// Default precision 64 bit unsigned integer vector of 4 components type.\n/// @see gtc_type_precision\ntypedef detail::tvec4<u64, defaultp> u64vec4;\n\n//////////////////////\n// Float vector types\n\n/// 32 bit single-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef detail::float32 float32;\n\n/// 64 bit double-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef detail::float64 float64;\n\n/// 32 bit single-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef detail::float32 float32_t;\n\n/// 64 bit double-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef detail::float64 float64_t;\n\n/// 32 bit single-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef float32 f32;\n\n/// 64 bit double-precision floating-point scalar.\n/// @see gtc_type_precision\ntypedef float64 f64;\n\n/// Single-precision floating-point vector of 1 component.\n/// @see gtc_type_precision\ntypedef detail::tvec1<float, defaultp> fvec1;\n\n/// Single-precision floating-point vector of 2 components.\n/// @see gtc_type_precision\ntypedef detail::tvec2<float, defaultp> fvec2;\n\n/// Single-precision floating-point vector of 3 components.\n/// @see gtc_type_precision\ntypedef detail::tvec3<float, defaultp> fvec3;\n\n/// Single-precision floating-point vector of 4 components.\n/// @see gtc_type_precision\ntypedef detail::tvec4<float, defaultp> fvec4;\n\n/// Single-precision floating-point vector of 1 component.\n/// @see gtc_type_precision\ntypedef detail::tvec1<f32, defaultp> f32vec1;\n\n/// Single-precision floating-point vector of 2 components.\n/// @see gtc_type_precision\ntypedef detail::tvec2<f32, defaultp> f32vec2;\n\n/// Single-precision floating-point vector of 3 components.\n/// @see gtc_type_precision\ntypedef detail::tvec3<f32, defaultp> f32vec3;\n\n/// Single-precision floating-point vector of 4 components.\n/// @see gtc_type_precision\ntypedef detail::tvec4<f32, defaultp> f32vec4;\n\n/// Double-precision floating-point vector of 1 component.\n/// @see gtc_type_precision\ntypedef detail::tvec1<f64, defaultp> f64vec1;\n\n/// Double-precision floating-point vector of 2 components.\n/// @see gtc_type_precision\ntypedef detail::tvec2<f64, defaultp> f64vec2;\n\n/// Double-precision floating-point vector of 3 components.\n/// @see gtc_type_precision\ntypedef detail::tvec3<f64, defaultp> f64vec3;\n\n/// Double-precision floating-point vector of 4 components.\n/// @see gtc_type_precision\ntypedef detail::tvec4<f64, defaultp> f64vec4;\n\n//////////////////////\n// Float matrix types\n\n/// Single-precision floating-point 1x1 matrix.\n/// @see gtc_type_precision\n// typedef detail::tmat1x1<f32> fmat1;\n\n/// Single-precision floating-point 2x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x2<f32, defaultp> fmat2;\n\n/// Single-precision floating-point 3x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x3<f32, defaultp> fmat3;\n\n/// Single-precision floating-point 4x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x4<f32, defaultp> fmat4;\n\n/// Single-precision floating-point 1x1 matrix.\n/// @see gtc_type_precision\n// typedef f32 fmat1x1;\n\n/// Single-precision floating-point 2x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x2<f32, defaultp> fmat2x2;\n\n/// Single-precision floating-point 2x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x3<f32, defaultp> fmat2x3;\n\n/// Single-precision floating-point 2x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x4<f32, defaultp> fmat2x4;\n\n/// Single-precision floating-point 3x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x2<f32, defaultp> fmat3x2;\n\n/// Single-precision floating-point 3x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x3<f32, defaultp> fmat3x3;\n\n/// Single-precision floating-point 3x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x4<f32, defaultp> fmat3x4;\n\n/// Single-precision floating-point 4x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x2<f32, defaultp> fmat4x2;\n\n/// Single-precision floating-point 4x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x3<f32, defaultp> fmat4x3;\n\n/// Single-precision floating-point 4x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x4<f32, defaultp> fmat4x4;\n\n/// Single-precision floating-point 1x1 matrix.\n/// @see gtc_type_precision\n// typedef detail::tmat1x1<f32, defaultp> f32mat1;\n\n/// Single-precision floating-point 2x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x2<f32, defaultp> f32mat2;\n\n/// Single-precision floating-point 3x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x3<f32, defaultp> f32mat3;\n\n/// Single-precision floating-point 4x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x4<f32, defaultp> f32mat4;\n\n/// Single-precision floating-point 1x1 matrix.\n/// @see gtc_type_precision\n// typedef f32 f32mat1x1;\n\n/// Single-precision floating-point 2x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x2<f32, defaultp> f32mat2x2;\n\n/// Single-precision floating-point 2x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x3<f32, defaultp> f32mat2x3;\n\n/// Single-precision floating-point 2x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x4<f32, defaultp> f32mat2x4;\n\n/// Single-precision floating-point 3x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x2<f32, defaultp> f32mat3x2;\n\n/// Single-precision floating-point 3x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x3<f32, defaultp> f32mat3x3;\n\n/// Single-precision floating-point 3x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x4<f32, defaultp> f32mat3x4;\n\n/// Single-precision floating-point 4x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x2<f32, defaultp> f32mat4x2;\n\n/// Single-precision floating-point 4x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x3<f32, defaultp> f32mat4x3;\n\n/// Single-precision floating-point 4x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x4<f32, defaultp> f32mat4x4;\n\n/// Double-precision floating-point 1x1 matrix.\n/// @see gtc_type_precision\n// typedef detail::tmat1x1<f64, defaultp> f64mat1;\n\n/// Double-precision floating-point 2x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x2<f64, defaultp> f64mat2;\n\n/// Double-precision floating-point 3x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x3<f64, defaultp> f64mat3;\n\n/// Double-precision floating-point 4x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x4<f64, defaultp> f64mat4;\n\n/// Double-precision floating-point 1x1 matrix.\n/// @see gtc_type_precision\n// typedef f64 f64mat1x1;\n\n/// Double-precision floating-point 2x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x2<f64, defaultp> f64mat2x2;\n\n/// Double-precision floating-point 2x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x3<f64, defaultp> f64mat2x3;\n\n/// Double-precision floating-point 2x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat2x4<f64, defaultp> f64mat2x4;\n\n/// Double-precision floating-point 3x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x2<f64, defaultp> f64mat3x2;\n\n/// Double-precision floating-point 3x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x3<f64, defaultp> f64mat3x3;\n\n/// Double-precision floating-point 3x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat3x4<f64, defaultp> f64mat3x4;\n\n/// Double-precision floating-point 4x2 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x2<f64, defaultp> f64mat4x2;\n\n/// Double-precision floating-point 4x3 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x3<f64, defaultp> f64mat4x3;\n\n/// Double-precision floating-point 4x4 matrix.\n/// @see gtc_type_precision\ntypedef detail::tmat4x4<f64, defaultp> f64mat4x4;\n\n//////////////////////////\n// Quaternion types\n\n/// Single-precision floating-point quaternion.\n/// @see gtc_type_precision\ntypedef detail::tquat<f32, defaultp> f32quat;\n\n/// Double-precision floating-point quaternion.\n/// @see gtc_type_precision\ntypedef detail::tquat<f64, defaultp> f64quat;\n\n/// @}\n}  // namespace glm\n\n#include \"type_precision.inl\"\n\n#endif  // GLM_GTC_type_precision\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtc/type_precision.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtc_swizzle\n/// @file glm/gtc/swizzle.inl\n/// @date 2009-06-14 / 2011-06-15\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {}\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtc/type_ptr.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtc_type_ptr\n/// @file glm/gtc/type_ptr.hpp\n/// @date 2009-05-06 / 2011-06-05\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtc_half_float (dependence)\n/// @see gtc_quaternion (dependence)\n///\n/// @defgroup gtc_type_ptr GLM_GTC_type_ptr\n/// @ingroup gtc\n///\n/// @brief Handles the interaction between pointers and vector, matrix types.\n///\n/// This extension defines an overloaded function, glm::value_ptr, which\n/// takes any of the \\ref core_template \"core template types\". It returns\n/// a pointer to the memory layout of the object. Matrix types store their\n/// values in column-major order.\n///\n/// This is useful for uploading data to matrices or copying data to buffer\n/// objects.\n///\n/// Example:\n/// @code\n/// #include <glm/glm.hpp>\n/// #include <glm/gtc/type_ptr.hpp>\n///\n/// glm::vec3 aVector(3);\n/// glm::mat4 someMatrix(1.0);\n///\n/// glUniform3fv(uniformLoc, 1, glm::value_ptr(aVector));\n/// glUniformMatrix4fv(uniformMatrixLoc, 1, GL_FALSE,\n/// glm::value_ptr(someMatrix));\n/// @endcode\n///\n/// <glm/gtc/type_ptr.hpp> need to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTC_type_ptr\n#define GLM_GTC_type_ptr\n\n// Dependency:\n#include <cstring>\n\n#include \"../gtc/quaternion.hpp\"\n#include \"../mat2x2.hpp\"\n#include \"../mat2x3.hpp\"\n#include \"../mat2x4.hpp\"\n#include \"../mat3x2.hpp\"\n#include \"../mat3x3.hpp\"\n#include \"../mat3x4.hpp\"\n#include \"../mat4x2.hpp\"\n#include \"../mat4x3.hpp\"\n#include \"../mat4x4.hpp\"\n#include \"../vec2.hpp\"\n#include \"../vec3.hpp\"\n#include \"../vec4.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTC_type_ptr extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtc_type_ptr\n/// @{\n\n/// Return the constant address to the data of the input parameter.\n/// @see gtc_type_ptr\ntemplate <typename genType>\nGLM_FUNC_DECL typename genType::value_type const* value_ptr(genType const& vec);\n\n/// Build a vector from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_DECL detail::tvec2<T, defaultp> make_vec2(T const* const ptr);\n\n/// Build a vector from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_DECL detail::tvec3<T, defaultp> make_vec3(T const* const ptr);\n\n/// Build a vector from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_DECL detail::tvec4<T, defaultp> make_vec4(T const* const ptr);\n\n/// Build a matrix from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_DECL detail::tmat2x2<T, defaultp> make_mat2x2(T const* const ptr);\n\n/// Build a matrix from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_DECL detail::tmat2x3<T, defaultp> make_mat2x3(T const* const ptr);\n\n/// Build a matrix from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_DECL detail::tmat2x4<T, defaultp> make_mat2x4(T const* const ptr);\n\n/// Build a matrix from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_DECL detail::tmat3x2<T, defaultp> make_mat3x2(T const* const ptr);\n\n/// Build a matrix from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_DECL detail::tmat3x3<T, defaultp> make_mat3x3(T const* const ptr);\n\n/// Build a matrix from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_DECL detail::tmat3x4<T, defaultp> make_mat3x4(T const* const ptr);\n\n/// Build a matrix from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_DECL detail::tmat4x2<T, defaultp> make_mat4x2(T const* const ptr);\n\n/// Build a matrix from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_DECL detail::tmat4x3<T, defaultp> make_mat4x3(T const* const ptr);\n\n/// Build a matrix from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_DECL detail::tmat4x4<T, defaultp> make_mat4x4(T const* const ptr);\n\n/// Build a matrix from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_DECL detail::tmat2x2<T, defaultp> make_mat2(T const* const ptr);\n\n/// Build a matrix from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_DECL detail::tmat3x3<T, defaultp> make_mat3(T const* const ptr);\n\n/// Build a matrix from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_DECL detail::tmat4x4<T, defaultp> make_mat4(T const* const ptr);\n\n/// Build a quaternion from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_DECL detail::tquat<T, defaultp> make_quat(T const* const ptr);\n\n/// @}\n}  // namespace glm\n\n#include \"type_ptr.inl\"\n\n#endif  // GLM_GTC_type_ptr\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtc/type_ptr.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtc_type_ptr\n/// @file glm/gtc/type_ptr.inl\n/// @date 2011-06-15 / 2011-12-07\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#include <cstring>\n\nnamespace glm {\n/// @addtogroup gtc_type_ptr\n/// @{\n\n/// Return the constant address to the data of the vector input.\n/// @see gtc_type_ptr\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T const* value_ptr(detail::tvec2<T, P> const& vec) {\n  return &(vec.x);\n}\n\n//! Return the address to the data of the vector input.\n/// @see gtc_type_ptr\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T* value_ptr(detail::tvec2<T, P>& vec) {\n  return &(vec.x);\n}\n\n/// Return the constant address to the data of the vector input.\n/// @see gtc_type_ptr\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T const* value_ptr(detail::tvec3<T, P> const& vec) {\n  return &(vec.x);\n}\n\n//! Return the address to the data of the vector input.\n/// @see gtc_type_ptr\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T* value_ptr(detail::tvec3<T, P>& vec) {\n  return &(vec.x);\n}\n\n/// Return the constant address to the data of the vector input.\n/// @see gtc_type_ptr\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T const* value_ptr(detail::tvec4<T, P> const& vec) {\n  return &(vec.x);\n}\n\n//! Return the address to the data of the vector input.\n//! From GLM_GTC_type_ptr extension.\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T* value_ptr(detail::tvec4<T, P>& vec) {\n  return &(vec.x);\n}\n\n/// Return the constant address to the data of the matrix input.\n/// @see gtc_type_ptr\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T const* value_ptr(detail::tmat2x2<T, P> const& mat) {\n  return &(mat[0].x);\n}\n\n//! Return the address to the data of the matrix input.\n/// @see gtc_type_ptr\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T* value_ptr(detail::tmat2x2<T, P>& mat) {\n  return &(mat[0].x);\n}\n\n/// Return the constant address to the data of the matrix input.\n/// @see gtc_type_ptr\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T const* value_ptr(detail::tmat3x3<T, P> const& mat) {\n  return &(mat[0].x);\n}\n\n//! Return the address to the data of the matrix input.\n/// @see gtc_type_ptr\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T* value_ptr(detail::tmat3x3<T, P>& mat) {\n  return &(mat[0].x);\n}\n\n/// Return the constant address to the data of the matrix input.\n/// @see gtc_type_ptr\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T const* value_ptr(detail::tmat4x4<T, P> const& mat) {\n  return &(mat[0].x);\n}\n\n//! Return the address to the data of the matrix input.\n//! From GLM_GTC_type_ptr extension.\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T* value_ptr(detail::tmat4x4<T, P>& mat) {\n  return &(mat[0].x);\n}\n\n/// Return the constant address to the data of the matrix input.\n/// @see gtc_type_ptr\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T const* value_ptr(detail::tmat2x3<T, P> const& mat) {\n  return &(mat[0].x);\n}\n\n//! Return the address to the data of the matrix input.\n/// @see gtc_type_ptr\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T* value_ptr(detail::tmat2x3<T, P>& mat) {\n  return &(mat[0].x);\n}\n\n/// Return the constant address to the data of the matrix input.\n/// @see gtc_type_ptr\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T const* value_ptr(detail::tmat3x2<T, P> const& mat) {\n  return &(mat[0].x);\n}\n\n//! Return the address to the data of the matrix input.\n/// @see gtc_type_ptr\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T* value_ptr(detail::tmat3x2<T, P>& mat) {\n  return &(mat[0].x);\n}\n\n/// Return the constant address to the data of the matrix input.\n/// @see gtc_type_ptr\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T const* value_ptr(detail::tmat2x4<T, P> const& mat) {\n  return &(mat[0].x);\n}\n\n//! Return the address to the data of the matrix input.\n/// @see gtc_type_ptr\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T* value_ptr(detail::tmat2x4<T, P>& mat) {\n  return &(mat[0].x);\n}\n\n/// Return the constant address to the data of the matrix input.\n/// @see gtc_type_ptr\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T const* value_ptr(detail::tmat4x2<T, P> const& mat) {\n  return &(mat[0].x);\n}\n\n//! Return the address to the data of the matrix input.\n/// @see gtc_type_ptr\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T* value_ptr(detail::tmat4x2<T, P>& mat) {\n  return &(mat[0].x);\n}\n\n/// Return the constant address to the data of the matrix input.\n/// @see gtc_type_ptr\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T const* value_ptr(detail::tmat3x4<T, P> const& mat) {\n  return &(mat[0].x);\n}\n\n//! Return the address to the data of the matrix input.\n/// @see gtc_type_ptr\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T* value_ptr(detail::tmat3x4<T, P>& mat) {\n  return &(mat[0].x);\n}\n\n/// Return the constant address to the data of the matrix input.\n/// @see gtc_type_ptr\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T const* value_ptr(detail::tmat4x3<T, P> const& mat) {\n  return &(mat[0].x);\n}\n\n/// Return the address to the data of the matrix input.\n/// @see gtc_type_ptr\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T* value_ptr(detail::tmat4x3<T, P>& mat) {\n  return &(mat[0].x);\n}\n\n/// Return the constant address to the data of the input parameter.\n/// @see gtc_type_ptr\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T const* value_ptr(detail::tquat<T, P> const& q) {\n  return &(q[0]);\n}\n\n/// Return the address to the data of the quaternion input.\n/// @see gtc_type_ptr\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T* value_ptr(detail::tquat<T, P>& q) {\n  return &(q[0]);\n}\n\n/// Build a vector from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tvec2<T, defaultp> make_vec2(T const* const ptr) {\n  detail::tvec2<T, defaultp> Result;\n  memcpy(value_ptr(Result), ptr, sizeof(detail::tvec2<T, defaultp>));\n  return Result;\n}\n\n/// Build a vector from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tvec3<T, defaultp> make_vec3(T const* const ptr) {\n  detail::tvec3<T, defaultp> Result;\n  memcpy(value_ptr(Result), ptr, sizeof(detail::tvec3<T, defaultp>));\n  return Result;\n}\n\n/// Build a vector from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tvec4<T, defaultp> make_vec4(T const* const ptr) {\n  detail::tvec4<T, defaultp> Result;\n  memcpy(value_ptr(Result), ptr, sizeof(detail::tvec4<T, defaultp>));\n  return Result;\n}\n\n/// Build a matrix from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tmat2x2<T, defaultp> make_mat2x2(\n    T const* const ptr) {\n  detail::tmat2x2<T, defaultp> Result;\n  memcpy(value_ptr(Result), ptr, sizeof(detail::tmat2x2<T, defaultp>));\n  return Result;\n}\n\n/// Build a matrix from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tmat2x3<T, defaultp> make_mat2x3(\n    T const* const ptr) {\n  detail::tmat2x3<T, defaultp> Result;\n  memcpy(value_ptr(Result), ptr, sizeof(detail::tmat2x3<T, defaultp>));\n  return Result;\n}\n\n/// Build a matrix from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tmat2x4<T, defaultp> make_mat2x4(\n    T const* const ptr) {\n  detail::tmat2x4<T, defaultp> Result;\n  memcpy(value_ptr(Result), ptr, sizeof(detail::tmat2x4<T, defaultp>));\n  return Result;\n}\n\n/// Build a matrix from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tmat3x2<T, defaultp> make_mat3x2(\n    T const* const ptr) {\n  detail::tmat3x2<T, defaultp> Result;\n  memcpy(value_ptr(Result), ptr, sizeof(detail::tmat3x2<T, defaultp>));\n  return Result;\n}\n\n//! Build a matrix from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tmat3x3<T, defaultp> make_mat3x3(\n    T const* const ptr) {\n  detail::tmat3x3<T, defaultp> Result;\n  memcpy(value_ptr(Result), ptr, sizeof(detail::tmat3x3<T, defaultp>));\n  return Result;\n}\n\n//! Build a matrix from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tmat3x4<T, defaultp> make_mat3x4(\n    T const* const ptr) {\n  detail::tmat3x4<T, defaultp> Result;\n  memcpy(value_ptr(Result), ptr, sizeof(detail::tmat3x4<T, defaultp>));\n  return Result;\n}\n\n//! Build a matrix from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tmat4x2<T, defaultp> make_mat4x2(\n    T const* const ptr) {\n  detail::tmat4x2<T, defaultp> Result;\n  memcpy(value_ptr(Result), ptr, sizeof(detail::tmat4x2<T, defaultp>));\n  return Result;\n}\n\n//! Build a matrix from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tmat4x3<T, defaultp> make_mat4x3(\n    T const* const ptr) {\n  detail::tmat4x3<T, defaultp> Result;\n  memcpy(value_ptr(Result), ptr, sizeof(detail::tmat4x3<T, defaultp>));\n  return Result;\n}\n\n//! Build a matrix from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, defaultp> make_mat4x4(\n    T const* const ptr) {\n  detail::tmat4x4<T, defaultp> Result;\n  memcpy(value_ptr(Result), ptr, sizeof(detail::tmat4x4<T, defaultp>));\n  return Result;\n}\n\n//! Build a matrix from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tmat2x2<T, defaultp> make_mat2(T const* const ptr) {\n  return make_mat2x2(ptr);\n}\n\n//! Build a matrix from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tmat3x3<T, defaultp> make_mat3(T const* const ptr) {\n  return make_mat3x3(ptr);\n}\n\n//! Build a matrix from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, defaultp> make_mat4(T const* const ptr) {\n  return make_mat4x4(ptr);\n}\n\n//! Build a quaternion from a pointer.\n/// @see gtc_type_ptr\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tquat<T, defaultp> make_quat(T const* const ptr) {\n  detail::tquat<T, defaultp> Result;\n  memcpy(value_ptr(Result), ptr, sizeof(detail::tquat<T, defaultp>));\n  return Result;\n}\n\n/// @}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtc/ulp.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtc_ulp\n/// @file glm/gtc/ulp.hpp\n/// @date 2011-02-21 / 2011-12-12\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n///\n/// @defgroup gtc_ulp GLM_GTC_ulp\n/// @ingroup gtc\n///\n/// @brief Allow the measurement of the accuracy of a function against a\n/// reference implementation. This extension works on floating-point data and\n/// provide results in ULP. <glm/gtc/ulp.hpp> need to be included to use these\n/// features.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTC_ulp\n#define GLM_GTC_ulp\n\n// Dependencies\n#include \"../detail/precision.hpp\"\n#include \"../detail/setup.hpp\"\n#include \"../detail/type_int.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTC_ulp extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtc_ulp\n/// @{\n\n/// Return the next ULP value(s) after the input value(s).\n/// @see gtc_ulp\ntemplate <typename genType>\nGLM_FUNC_DECL genType next_float(genType const& x);\n\n/// Return the previous ULP value(s) before the input value(s).\n/// @see gtc_ulp\ntemplate <typename genType>\nGLM_FUNC_DECL genType prev_float(genType const& x);\n\n/// Return the value(s) ULP distance after the input value(s).\n/// @see gtc_ulp\ntemplate <typename genType>\nGLM_FUNC_DECL genType next_float(genType const& x, uint const& Distance);\n\n/// Return the value(s) ULP distance before the input value(s).\n/// @see gtc_ulp\ntemplate <typename genType>\nGLM_FUNC_DECL genType prev_float(genType const& x, uint const& Distance);\n\n/// Return the distance in the number of ULP between 2 scalars.\n/// @see gtc_ulp\ntemplate <typename T>\nGLM_FUNC_DECL uint float_distance(T const& x, T const& y);\n\n/// Return the distance in the number of ULP between 2 vectors.\n/// @see gtc_ulp\ntemplate <typename T, template <typename> class vecType>\nGLM_FUNC_DECL vecType<uint> float_distance(vecType<T> const& x,\n                                           vecType<T> const& y);\n\n/// @}\n}  // namespace glm\n\n#include \"ulp.inl\"\n\n#endif  // GLM_GTC_ulp\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtc/ulp.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtc_ulp\n/// @file glm/gtc/ulp.inl\n/// @date 2011-03-07 / 2012-04-07\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n/// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\n///\n/// Developed at SunPro, a Sun Microsystems, Inc. business.\n/// Permission to use, copy, modify, and distribute this\n/// software is freely granted, provided that this notice\n/// is preserved.\n///////////////////////////////////////////////////////////////////////////////////\n\n#include <cfloat>\n#include <cmath>\n#include <limits>\n\n#include \"../detail/type_int.hpp\"\n\n#if (GLM_COMPILER & GLM_COMPILER_VC)\n#pragma warning(push)\n#pragma warning(disable : 4127)\n#endif\n\ntypedef union {\n  float value;\n  /* FIXME: Assumes 32 bit int.  */\n  unsigned int word;\n} ieee_float_shape_type;\n\ntypedef union {\n  double value;\n  struct {\n    glm::detail::int32 lsw;\n    glm::detail::int32 msw;\n  } parts;\n} ieee_double_shape_type;\n\n#define GLM_EXTRACT_WORDS(ix0, ix1, d) \\\n  do {                                 \\\n    ieee_double_shape_type ew_u;       \\\n    ew_u.value = (d);                  \\\n    (ix0) = ew_u.parts.msw;            \\\n    (ix1) = ew_u.parts.lsw;            \\\n  } while (0)\n\n#define GLM_GET_FLOAT_WORD(i, d) \\\n  do {                           \\\n    ieee_float_shape_type gf_u;  \\\n    gf_u.value = (d);            \\\n    (i) = gf_u.word;             \\\n  } while (0)\n\n#define GLM_SET_FLOAT_WORD(d, i) \\\n  do {                           \\\n    ieee_float_shape_type sf_u;  \\\n    sf_u.word = (i);             \\\n    (d) = sf_u.value;            \\\n  } while (0)\n\n#define GLM_INSERT_WORDS(d, ix0, ix1) \\\n  do {                                \\\n    ieee_double_shape_type iw_u;      \\\n    iw_u.parts.msw = (ix0);           \\\n    iw_u.parts.lsw = (ix1);           \\\n    (d) = iw_u.value;                 \\\n  } while (0)\n\nnamespace glm {\nnamespace detail {\nGLM_FUNC_QUALIFIER float nextafterf(float x, float y) {\n  volatile float t;\n  glm::detail::int32 hx, hy, ix, iy;\n\n  GLM_GET_FLOAT_WORD(hx, x);\n  GLM_GET_FLOAT_WORD(hy, y);\n  ix = hx & 0x7fffffff;  // |x|\n  iy = hy & 0x7fffffff;  // |y|\n\n  if ((ix > 0x7f800000) ||  // x is nan\n      (iy > 0x7f800000))    // y is nan\n    return x + y;\n  if (x == y) return y;                            // x=y, return y\n  if (ix == 0) {                                   // x == 0\n    GLM_SET_FLOAT_WORD(x, (hy & 0x80000000) | 1);  // return +-minsubnormal\n    t = x * x;\n    if (t == x)\n      return t;\n    else\n      return x;  // raise underflow flag\n  }\n  if (hx >= 0) {    // x > 0\n    if (hx > hy) {  // x > y, x -= ulp\n      hx -= 1;\n    } else {  // x < y, x += ulp\n      hx += 1;\n    }\n  } else {                     // x < 0\n    if (hy >= 0 || hx > hy) {  // x < y, x -= ulp\n      hx -= 1;\n    } else {  // x > y, x += ulp\n      hx += 1;\n    }\n  }\n  hy = hx & 0x7f800000;\n  if (hy >= 0x7f800000) return x + x;  // overflow\n  if (hy < 0x00800000) {               // underflow\n    t = x * x;\n    if (t != x) {  // raise underflow flag\n      GLM_SET_FLOAT_WORD(y, hx);\n      return y;\n    }\n  }\n  GLM_SET_FLOAT_WORD(x, hx);\n  return x;\n}\n\nGLM_FUNC_QUALIFIER double nextafter(double x, double y) {\n  volatile double t;\n  glm::detail::int32 hx, hy, ix, iy;\n  glm::detail::uint32 lx, ly;\n\n  GLM_EXTRACT_WORDS(hx, lx, x);\n  GLM_EXTRACT_WORDS(hy, ly, y);\n  ix = hx & 0x7fffffff;  // |x|\n  iy = hy & 0x7fffffff;  // |y|\n\n  if (((ix >= 0x7ff00000) && ((ix - 0x7ff00000) | lx) != 0) ||  // x is nan\n      ((iy >= 0x7ff00000) && ((iy - 0x7ff00000) | ly) != 0))    // y is nan\n    return x + y;\n  if (x == y) return y;                       // x=y, return y\n  if ((ix | lx) == 0) {                       // x == 0\n    GLM_INSERT_WORDS(x, hy & 0x80000000, 1);  // return +-minsubnormal\n    t = x * x;\n    if (t == x)\n      return t;\n    else\n      return x;  // raise underflow flag\n  }\n  if (hx >= 0) {                                 // x > 0\n    if (hx > hy || ((hx == hy) && (lx > ly))) {  // x > y, x -= ulp\n      if (lx == 0) hx -= 1;\n      lx -= 1;\n    } else {  // x < y, x += ulp\n      lx += 1;\n      if (lx == 0) hx += 1;\n    }\n  } else {                                                  // x < 0\n    if (hy >= 0 || hx > hy || ((hx == hy) && (lx > ly))) {  // x < y, x -= ulp\n      if (lx == 0) hx -= 1;\n      lx -= 1;\n    } else {  // x > y, x += ulp\n      lx += 1;\n      if (lx == 0) hx += 1;\n    }\n  }\n  hy = hx & 0x7ff00000;\n  if (hy >= 0x7ff00000) return x + x;  // overflow\n  if (hy < 0x00100000) {               // underflow\n    t = x * x;\n    if (t != x) {  // raise underflow flag\n      GLM_INSERT_WORDS(y, hx, lx);\n      return y;\n    }\n  }\n  GLM_INSERT_WORDS(x, hx, lx);\n  return x;\n}\n}  // namespace detail\n}  // namespace glm\n\n#if (GLM_COMPILER & GLM_COMPILER_VC)\n#pragma warning(pop)\n#endif\n\nnamespace glm {\ntemplate <>\nGLM_FUNC_QUALIFIER float next_float(float const& x) {\n#if ((GLM_LANG & GLM_LANG_CXX11_FLAG))\n  return std::nextafter(x, std::numeric_limits<float>::max());\n#elif ((GLM_COMPILER & GLM_COMPILER_VC) ||     \\\n       ((GLM_COMPILER & GLM_COMPILER_INTEL) && \\\n        (GLM_PLATFORM & GLM_PLATFORM_WINDOWS)))\n  return detail::nextafterf(x, FLT_MAX);\n#else\n  return nextafterf(x, FLT_MAX);\n#endif\n}\n\ntemplate <>\nGLM_FUNC_QUALIFIER double next_float(double const& x) {\n#if ((GLM_LANG & GLM_LANG_CXX11_FLAG))\n  return std::nextafter(x, std::numeric_limits<double>::max());\n#elif ((GLM_COMPILER & GLM_COMPILER_VC) ||     \\\n       ((GLM_COMPILER & GLM_COMPILER_INTEL) && \\\n        (GLM_PLATFORM & GLM_PLATFORM_WINDOWS)))\n  return detail::nextafter(x, std::numeric_limits<double>::max());\n#else\n  return nextafter(x, DBL_MAX);\n#endif\n}\n\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER vecType<T, P> next_float(vecType<T, P> const& x) {\n  vecType<T, P> Result;\n  for (length_t i = 0; i < Result.length(); ++i) Result[i] = next_float(x[i]);\n  return Result;\n}\n\nGLM_FUNC_QUALIFIER float prev_float(float const& x) {\n#if ((GLM_LANG & GLM_LANG_CXX11_FLAG))\n  return std::nextafter(x, std::numeric_limits<float>::min());\n#elif ((GLM_COMPILER & GLM_COMPILER_VC) ||     \\\n       ((GLM_COMPILER & GLM_COMPILER_INTEL) && \\\n        (GLM_PLATFORM & GLM_PLATFORM_WINDOWS)))\n  return detail::nextafterf(x, FLT_MIN);\n#else\n  return nextafterf(x, FLT_MIN);\n#endif\n}\n\nGLM_FUNC_QUALIFIER double prev_float(double const& x) {\n#if ((GLM_LANG & GLM_LANG_CXX11_FLAG))\n  return std::nextafter(x, std::numeric_limits<double>::min());\n#elif ((GLM_COMPILER & GLM_COMPILER_VC) ||     \\\n       ((GLM_COMPILER & GLM_COMPILER_INTEL) && \\\n        (GLM_PLATFORM & GLM_PLATFORM_WINDOWS)))\n  return _nextafter(x, DBL_MIN);\n#else\n  return nextafter(x, DBL_MIN);\n#endif\n}\n\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER vecType<T, P> prev_float(vecType<T, P> const& x) {\n  vecType<T, P> Result;\n  for (length_t i = 0; i < Result.length(); ++i) Result[i] = prev_float(x[i]);\n  return Result;\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER T next_float(T const& x, uint const& ulps) {\n  T temp = x;\n  for (uint i = 0; i < ulps; ++i) temp = next_float(temp);\n  return temp;\n}\n\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER vecType<T, P> next_float(vecType<T, P> const& x,\n                                            vecType<uint, P> const& ulps) {\n  vecType<T, P> Result;\n  for (length_t i = 0; i < Result.length(); ++i)\n    Result[i] = next_float(x[i], ulps[i]);\n  return Result;\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER T prev_float(T const& x, uint const& ulps) {\n  T temp = x;\n  for (uint i = 0; i < ulps; ++i) temp = prev_float(temp);\n  return temp;\n}\n\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER vecType<T, P> prev_float(vecType<T, P> const& x,\n                                            vecType<uint, P> const& ulps) {\n  vecType<T, P> Result;\n  for (length_t i = 0; i < Result.length(); ++i)\n    Result[i] = prev_float(x[i], ulps[i]);\n  return Result;\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER uint float_distance(T const& x, T const& y) {\n  uint ulp = 0;\n\n  if (x < y) {\n    T temp = x;\n    while (temp != y)  // && ulp < std::numeric_limits<std::size_t>::max())\n    {\n      ++ulp;\n      temp = next_float(temp);\n    }\n  } else if (y < x) {\n    T temp = y;\n    while (temp != x)  // && ulp < std::numeric_limits<std::size_t>::max())\n    {\n      ++ulp;\n      temp = next_float(temp);\n    }\n  } else  // ==\n  {\n  }\n\n  return ulp;\n}\n\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER vecType<uint, P> float_distance(vecType<T, P> const& x,\n                                                   vecType<T, P> const& y) {\n  vecType<uint, P> Result;\n  for (length_t i = 0; i < Result.length(); ++i)\n    Result[i] = float_distance(x[i], y[i]);\n  return Result;\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/associated_min_max.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_associated_min_max\n/// @file glm/gtx/associated_min_max.hpp\n/// @date 2008-03-10 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtx_extented_min_max (dependence)\n///\n/// @defgroup gtx_associated_min_max GLM_GTX_associated_min_max\n/// @ingroup gtx\n///\n/// @brief Min and max functions that return associated values not the compared\n/// onces. <glm/gtx/associated_min_max.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_associated_min_max\n#define GLM_GTX_associated_min_max\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_associated_min_max extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_associated_min_max\n/// @{\n\n/// Min comparison between 2 variables\n/// @see gtx_associated_min_max\ntemplate <typename genTypeT, typename genTypeU>\nGLM_FUNC_DECL genTypeU associatedMin(const genTypeT& x, const genTypeU& a,\n                                     const genTypeT& y, const genTypeU& b);\n\n/// Min comparison between 3 variables\n/// @see gtx_associated_min_max\ntemplate <typename genTypeT, typename genTypeU>\nGLM_FUNC_DECL genTypeU associatedMin(const genTypeT& x, const genTypeU& a,\n                                     const genTypeT& y, const genTypeU& b,\n                                     const genTypeT& z, const genTypeU& c);\n\n/// Min comparison between 4 variables\n/// @see gtx_associated_min_max\ntemplate <typename genTypeT, typename genTypeU>\nGLM_FUNC_DECL genTypeU associatedMin(const genTypeT& x, const genTypeU& a,\n                                     const genTypeT& y, const genTypeU& b,\n                                     const genTypeT& z, const genTypeU& c,\n                                     const genTypeT& w, const genTypeU& d);\n\n/// Max comparison between 2 variables\n/// @see gtx_associated_min_max\ntemplate <typename genTypeT, typename genTypeU>\nGLM_FUNC_DECL genTypeU associatedMax(const genTypeT& x, const genTypeU& a,\n                                     const genTypeT& y, const genTypeU& b);\n\n/// Max comparison between 3 variables\n/// @see gtx_associated_min_max\ntemplate <typename genTypeT, typename genTypeU>\nGLM_FUNC_DECL genTypeU associatedMax(const genTypeT& x, const genTypeU& a,\n                                     const genTypeT& y, const genTypeU& b,\n                                     const genTypeT& z, const genTypeU& c);\n\n/// Max comparison between 4 variables\n/// @see gtx_associated_min_max\ntemplate <typename genTypeT, typename genTypeU>\nGLM_FUNC_DECL genTypeU associatedMax(const genTypeT& x, const genTypeU& a,\n                                     const genTypeT& y, const genTypeU& b,\n                                     const genTypeT& z, const genTypeU& c,\n                                     const genTypeT& w, const genTypeU& d);\n\n/// @}\n}  // namespace glm\n\n#include \"associated_min_max.inl\"\n\n#endif  // GLM_GTX_associated_min_max\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/associated_min_max.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2008-03-10\n// Updated : 2008-03-15\n// Licence : This source is under MIT License\n// File    : gtx_associated_min_max.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\n\n// Min comparison between 2 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER U associatedMin(T x, U a, T y, U b) {\n  return x < y ? a : b;\n}\n\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMin(\n    const detail::tvec2<T, P>& x, const detail::tvec2<U, P>& a,\n    const detail::tvec2<T, P>& y, const detail::tvec2<U, P>& b) {\n  detail::tvec2<U, P> Result;\n  // Result.x = x[0] < y[0] ? a[0] : b[0];\n  // Result.y = x[1] < y[1] ? a[1] : b[1];\n  for (typename detail::tvec2<U, P>::size_type i = 0; i < Result.length(); ++i)\n    Result[i] = x[i] < y[i] ? a[i] : b[i];\n  return Result;\n}\n\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMin(\n    const detail::tvec3<T, P>& x, const detail::tvec3<U, P>& a,\n    const detail::tvec3<T, P>& y, const detail::tvec3<U, P>& b) {\n  detail::tvec3<U, P> Result;\n  for (typename detail::tvec3<U, P>::size_type i = 0; i < Result.length(); ++i)\n    Result[i] = x[i] < y[i] ? a[i] : b[i];\n  return Result;\n}\n\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMin(\n    const detail::tvec4<T, P>& x, const detail::tvec4<U, P>& a,\n    const detail::tvec4<T, P>& y, const detail::tvec4<U, P>& b) {\n  detail::tvec4<U, P> Result;\n  for (typename detail::tvec4<U, P>::size_type i = 0; i < Result.length(); ++i)\n    Result[i] = x[i] < y[i] ? a[i] : b[i];\n  return Result;\n}\n\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMin(\n    T x, const detail::tvec2<U, P>& a, T y, const detail::tvec2<U, P>& b) {\n  detail::tvec2<U, P> Result;\n  for (typename detail::tvec2<U, P>::size_type i = 0; i < Result.length(); ++i)\n    Result[i] = x < y ? a[i] : b[i];\n  return Result;\n}\n\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMin(\n    T x, const detail::tvec3<U, P>& a, T y, const detail::tvec3<U, P>& b) {\n  detail::tvec3<U, P> Result;\n  for (typename detail::tvec3<U, P>::size_type i = 0; i < Result.length(); ++i)\n    Result[i] = x < y ? a[i] : b[i];\n  return Result;\n}\n\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMin(\n    T x, const detail::tvec4<U, P>& a, T y, const detail::tvec4<U, P>& b) {\n  detail::tvec4<U, P> Result;\n  for (typename detail::tvec4<U, P>::size_type i = 0; i < Result.length(); ++i)\n    Result[i] = x < y ? a[i] : b[i];\n  return Result;\n}\n\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMin(\n    detail::tvec2<T, P> const& x, U a, detail::tvec2<T, P> const& y, U b) {\n  detail::tvec2<U, P> Result;\n  for (typename detail::tvec2<U, P>::size_type i = 0; i < Result.length(); ++i)\n    Result[i] = x[i] < y[i] ? a : b;\n  return Result;\n}\n\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMin(\n    const detail::tvec3<T, P>& x, U a, const detail::tvec3<T, P>& y, U b) {\n  detail::tvec3<U, P> Result;\n  for (typename detail::tvec3<U, P>::size_type i = 0; i < Result.length(); ++i)\n    Result[i] = x[i] < y[i] ? a : b;\n  return Result;\n}\n\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMin(\n    const detail::tvec4<T, P>& x, U a, const detail::tvec4<T, P>& y, U b) {\n  detail::tvec4<U, P> Result;\n  for (typename detail::tvec4<U, P>::size_type i = 0; i < Result.length(); ++i)\n    Result[i] = x[i] < y[i] ? a : b;\n  return Result;\n}\n\n// Min comparison between 3 variables\ntemplate <typename T, typename U>\nGLM_FUNC_QUALIFIER U associatedMin(T x, U a, T y, U b, T z, U c) {\n  U Result = x < y ? (x < z ? a : c) : (y < z ? b : c);\n  return Result;\n}\n\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMin(\n    const detail::tvec2<T, P>& x, const detail::tvec2<U, P>& a,\n    const detail::tvec2<T, P>& y, const detail::tvec2<U, P>& b,\n    const detail::tvec2<T, P>& z, const detail::tvec2<U, P>& c) {\n  detail::tvec2<U, P> Result;\n  for (typename detail::tvec2<U, P>::size_type i = 0; i < Result.length(); ++i)\n    Result[i] =\n        x[i] < y[i] ? (x[i] < z[i] ? a[i] : c[i]) : (y[i] < z[i] ? b[i] : c[i]);\n  return Result;\n}\n\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMin(\n    const detail::tvec3<T, P>& x, const detail::tvec3<U, P>& a,\n    const detail::tvec3<T, P>& y, const detail::tvec3<U, P>& b,\n    const detail::tvec3<T, P>& z, const detail::tvec3<U, P>& c) {\n  detail::tvec3<U, P> Result;\n  for (typename detail::tvec3<U, P>::size_type i = 0; i < Result.length(); ++i)\n    Result[i] =\n        x[i] < y[i] ? (x[i] < z[i] ? a[i] : c[i]) : (y[i] < z[i] ? b[i] : c[i]);\n  return Result;\n}\n\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMin(\n    const detail::tvec4<T, P>& x, const detail::tvec4<U, P>& a,\n    const detail::tvec4<T, P>& y, const detail::tvec4<U, P>& b,\n    const detail::tvec4<T, P>& z, const detail::tvec4<U, P>& c) {\n  detail::tvec4<U, P> Result;\n  for (typename detail::tvec4<U, P>::size_type i = 0; i < Result.length(); ++i)\n    Result[i] =\n        x[i] < y[i] ? (x[i] < z[i] ? a[i] : c[i]) : (y[i] < z[i] ? b[i] : c[i]);\n  return Result;\n}\n\n// Min comparison between 4 variables\ntemplate <typename T, typename U>\nGLM_FUNC_QUALIFIER U associatedMin(T x, U a, T y, U b, T z, U c, T w, U d) {\n  T Test1 = min(x, y);\n  T Test2 = min(z, w);\n  ;\n  U Result1 = x < y ? a : b;\n  U Result2 = z < w ? c : d;\n  U Result = Test1 < Test2 ? Result1 : Result2;\n  return Result;\n}\n\n// Min comparison between 4 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMin(\n    const detail::tvec2<T, P>& x, const detail::tvec2<U, P>& a,\n    const detail::tvec2<T, P>& y, const detail::tvec2<U, P>& b,\n    const detail::tvec2<T, P>& z, const detail::tvec2<U, P>& c,\n    const detail::tvec2<T, P>& w, const detail::tvec2<U, P>& d) {\n  detail::tvec2<U, P> Result;\n  for (typename detail::tvec2<U, P>::size_type i = 0; i < Result.length();\n       ++i) {\n    T Test1 = min(x[i], y[i]);\n    T Test2 = min(z[i], w[i]);\n    U Result1 = x[i] < y[i] ? a[i] : b[i];\n    U Result2 = z[i] < w[i] ? c[i] : d[i];\n    Result[i] = Test1 < Test2 ? Result1 : Result2;\n  }\n  return Result;\n}\n\n// Min comparison between 4 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMin(\n    const detail::tvec3<T, P>& x, const detail::tvec3<U, P>& a,\n    const detail::tvec3<T, P>& y, const detail::tvec3<U, P>& b,\n    const detail::tvec3<T, P>& z, const detail::tvec3<U, P>& c,\n    const detail::tvec3<T, P>& w, const detail::tvec3<U, P>& d) {\n  detail::tvec3<U, P> Result;\n  for (typename detail::tvec3<U, P>::size_type i = 0; i < Result.length();\n       ++i) {\n    T Test1 = min(x[i], y[i]);\n    T Test2 = min(z[i], w[i]);\n    U Result1 = x[i] < y[i] ? a[i] : b[i];\n    U Result2 = z[i] < w[i] ? c[i] : d[i];\n    Result[i] = Test1 < Test2 ? Result1 : Result2;\n  }\n  return Result;\n}\n\n// Min comparison between 4 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMin(\n    const detail::tvec4<T, P>& x, const detail::tvec4<U, P>& a,\n    const detail::tvec4<T, P>& y, const detail::tvec4<U, P>& b,\n    const detail::tvec4<T, P>& z, const detail::tvec4<U, P>& c,\n    const detail::tvec4<T, P>& w, const detail::tvec4<U, P>& d) {\n  detail::tvec4<U, P> Result;\n  for (typename detail::tvec4<U, P>::size_type i = 0; i < Result.length();\n       ++i) {\n    T Test1 = min(x[i], y[i]);\n    T Test2 = min(z[i], w[i]);\n    U Result1 = x[i] < y[i] ? a[i] : b[i];\n    U Result2 = z[i] < w[i] ? c[i] : d[i];\n    Result[i] = Test1 < Test2 ? Result1 : Result2;\n  }\n  return Result;\n}\n\n// Min comparison between 4 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMin(\n    T x, const detail::tvec2<U, P>& a, T y, const detail::tvec2<U, P>& b, T z,\n    const detail::tvec2<U, P>& c, T w, const detail::tvec2<U, P>& d) {\n  T Test1 = min(x, y);\n  T Test2 = min(z, w);\n\n  detail::tvec2<U, P> Result;\n  for (typename detail::tvec2<U, P>::size_type i = 0; i < Result.length();\n       ++i) {\n    U Result1 = x < y ? a[i] : b[i];\n    U Result2 = z < w ? c[i] : d[i];\n    Result[i] = Test1 < Test2 ? Result1 : Result2;\n  }\n  return Result;\n}\n\n// Min comparison between 4 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMin(\n    T x, const detail::tvec3<U, P>& a, T y, const detail::tvec3<U, P>& b, T z,\n    const detail::tvec3<U, P>& c, T w, const detail::tvec3<U, P>& d) {\n  T Test1 = min(x, y);\n  T Test2 = min(z, w);\n\n  detail::tvec3<U, P> Result;\n  for (typename detail::tvec3<U, P>::size_type i = 0;\n       i < detail::tvec3<U, P>::value_size; ++i) {\n    U Result1 = x < y ? a[i] : b[i];\n    U Result2 = z < w ? c[i] : d[i];\n    Result[i] = Test1 < Test2 ? Result1 : Result2;\n  }\n  return Result;\n}\n\n// Min comparison between 4 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMin(\n    T x, const detail::tvec4<U, P>& a, T y, const detail::tvec4<U, P>& b, T z,\n    const detail::tvec4<U, P>& c, T w, const detail::tvec4<U, P>& d) {\n  T Test1 = min(x, y);\n  T Test2 = min(z, w);\n\n  detail::tvec4<U, P> Result;\n  for (typename detail::tvec4<U, P>::size_type i = 0;\n       i < detail::tvec4<U, P>::value_size; ++i) {\n    U Result1 = x < y ? a[i] : b[i];\n    U Result2 = z < w ? c[i] : d[i];\n    Result[i] = Test1 < Test2 ? Result1 : Result2;\n  }\n  return Result;\n}\n\n// Min comparison between 4 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMin(\n    const detail::tvec2<T, P>& x, U a, const detail::tvec2<T, P>& y, U b,\n    const detail::tvec2<T, P>& z, U c, const detail::tvec2<T, P>& w, U d) {\n  detail::tvec2<U, P> Result;\n  for (typename detail::tvec2<T, P>::size_type i = 0;\n       i < detail::tvec2<T, P>::value_size(); ++i) {\n    T Test1 = min(x[i], y[i]);\n    T Test2 = min(z[i], w[i]);\n    ;\n    U Result1 = x[i] < y[i] ? a : b;\n    U Result2 = z[i] < w[i] ? c : d;\n    Result[i] = Test1 < Test2 ? Result1 : Result2;\n  }\n  return Result;\n}\n\n// Min comparison between 4 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMin(\n    const detail::tvec3<T, P>& x, U a, const detail::tvec3<T, P>& y, U b,\n    const detail::tvec3<T, P>& z, U c, const detail::tvec3<T, P>& w, U d) {\n  detail::tvec3<U, P> Result;\n  for (typename detail::tvec3<T, P>::size_type i = 0;\n       i < detail::tvec3<T, P>::value_size(); ++i) {\n    T Test1 = min(x[i], y[i]);\n    T Test2 = min(z[i], w[i]);\n    ;\n    U Result1 = x[i] < y[i] ? a : b;\n    U Result2 = z[i] < w[i] ? c : d;\n    Result[i] = Test1 < Test2 ? Result1 : Result2;\n  }\n  return Result;\n}\n\n// Min comparison between 4 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMin(\n    const detail::tvec4<T, P>& x, U a, const detail::tvec4<T, P>& y, U b,\n    const detail::tvec4<T, P>& z, U c, const detail::tvec4<T, P>& w, U d) {\n  detail::tvec4<U, P> Result;\n  for (typename detail::tvec4<T, P>::size_type i = 0;\n       i < detail::tvec4<T, P>::value_size(); ++i) {\n    T Test1 = min(x[i], y[i]);\n    T Test2 = min(z[i], w[i]);\n    ;\n    U Result1 = x[i] < y[i] ? a : b;\n    U Result2 = z[i] < w[i] ? c : d;\n    Result[i] = Test1 < Test2 ? Result1 : Result2;\n  }\n  return Result;\n}\n\n// Max comparison between 2 variables\ntemplate <typename T, typename U>\nGLM_FUNC_QUALIFIER U associatedMax(T x, U a, T y, U b) {\n  return x > y ? a : b;\n}\n\n// Max comparison between 2 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMax(\n    const detail::tvec2<T, P>& x, const detail::tvec2<U, P>& a,\n    const detail::tvec2<T, P>& y, const detail::tvec2<U, P>& b) {\n  detail::tvec2<U, P> Result;\n  for (typename detail::tvec2<U, P>::size_type i = 0; i < Result.length(); ++i)\n    Result[i] = x[i] > y[i] ? a[i] : b[i];\n  return Result;\n}\n\n// Max comparison between 2 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMax(\n    const detail::tvec3<T, P>& x, const detail::tvec3<U, P>& a,\n    const detail::tvec3<T, P>& y, const detail::tvec3<U, P>& b) {\n  detail::tvec3<U, P> Result;\n  for (typename detail::tvec3<U, P>::size_type i = 0; i < Result.length(); ++i)\n    Result[i] = x[i] > y[i] ? a[i] : b[i];\n  return Result;\n}\n\n// Max comparison between 2 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMax(\n    const detail::tvec4<T, P>& x, const detail::tvec4<U, P>& a,\n    const detail::tvec4<T, P>& y, const detail::tvec4<U, P>& b) {\n  detail::tvec4<U, P> Result;\n  for (typename detail::tvec4<U, P>::size_type i = 0; i < Result.length(); ++i)\n    Result[i] = x[i] > y[i] ? a[i] : b[i];\n  return Result;\n}\n\n// Max comparison between 2 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMax(\n    T x, const detail::tvec2<U, P>& a, T y, const detail::tvec2<U, P>& b) {\n  detail::tvec2<U, P> Result;\n  for (typename detail::tvec2<U, P>::size_type i = 0; i < Result.length(); ++i)\n    Result[i] = x > y ? a[i] : b[i];\n  return Result;\n}\n\n// Max comparison between 2 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMax(\n    T x, const detail::tvec3<U, P>& a, T y, const detail::tvec3<U, P>& b) {\n  detail::tvec3<U, P> Result;\n  for (typename detail::tvec3<U, P>::size_type i = 0; i < Result.length(); ++i)\n    Result[i] = x > y ? a[i] : b[i];\n  return Result;\n}\n\n// Max comparison between 2 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMax(\n    T x, const detail::tvec4<U, P>& a, T y, const detail::tvec4<U, P>& b) {\n  detail::tvec4<U, P> Result;\n  for (typename detail::tvec4<U, P>::size_type i = 0; i < Result.length(); ++i)\n    Result[i] = x > y ? a[i] : b[i];\n  return Result;\n}\n\n// Max comparison between 2 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMax(\n    const detail::tvec2<T, P>& x, U a, const detail::tvec2<T, P>& y, U b) {\n  detail::tvec2<U, P> Result;\n  for (typename detail::tvec2<T, P>::size_type i = 0; i < Result.length(); ++i)\n    Result[i] = x[i] > y[i] ? a : b;\n  return Result;\n}\n\n// Max comparison between 2 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMax(\n    const detail::tvec3<T, P>& x, U a, const detail::tvec3<T, P>& y, U b) {\n  detail::tvec3<U, P> Result;\n  for (typename detail::tvec3<T, P>::size_type i = 0; i < Result.length(); ++i)\n    Result[i] = x[i] > y[i] ? a : b;\n  return Result;\n}\n\n// Max comparison between 2 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMax(\n    const detail::tvec4<T, P>& x, U a, const detail::tvec4<T, P>& y, U b) {\n  detail::tvec4<U, P> Result;\n  for (typename detail::tvec4<T, P>::size_type i = 0; i < Result.length(); ++i)\n    Result[i] = x[i] > y[i] ? a : b;\n  return Result;\n}\n\n// Max comparison between 3 variables\ntemplate <typename T, typename U>\nGLM_FUNC_QUALIFIER U associatedMax(T x, U a, T y, U b, T z, U c) {\n  U Result = x > y ? (x > z ? a : c) : (y > z ? b : c);\n  return Result;\n}\n\n// Max comparison between 3 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMax(\n    const detail::tvec2<T, P>& x, const detail::tvec2<U, P>& a,\n    const detail::tvec2<T, P>& y, const detail::tvec2<U, P>& b,\n    const detail::tvec2<T, P>& z, const detail::tvec2<U, P>& c) {\n  detail::tvec2<U, P> Result;\n  for (typename detail::tvec2<U, P>::size_type i = 0; i < Result.length(); ++i)\n    Result[i] =\n        x[i] > y[i] ? (x[i] > z[i] ? a[i] : c[i]) : (y[i] > z[i] ? b[i] : c[i]);\n  return Result;\n}\n\n// Max comparison between 3 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMax(\n    const detail::tvec3<T, P>& x, const detail::tvec3<U, P>& a,\n    const detail::tvec3<T, P>& y, const detail::tvec3<U, P>& b,\n    const detail::tvec3<T, P>& z, const detail::tvec3<U, P>& c) {\n  detail::tvec3<U, P> Result;\n  for (typename detail::tvec3<U, P>::size_type i = 0; i < Result.length(); ++i)\n    Result[i] =\n        x[i] > y[i] ? (x[i] > z[i] ? a[i] : c[i]) : (y[i] > z[i] ? b[i] : c[i]);\n  return Result;\n}\n\n// Max comparison between 3 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMax(\n    const detail::tvec4<T, P>& x, const detail::tvec4<U, P>& a,\n    const detail::tvec4<T, P>& y, const detail::tvec4<U, P>& b,\n    const detail::tvec4<T, P>& z, const detail::tvec4<U, P>& c) {\n  detail::tvec4<U, P> Result;\n  for (typename detail::tvec4<U, P>::size_type i = 0; i < Result.length(); ++i)\n    Result[i] =\n        x[i] > y[i] ? (x[i] > z[i] ? a[i] : c[i]) : (y[i] > z[i] ? b[i] : c[i]);\n  return Result;\n}\n\n// Max comparison between 3 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMax(\n    T x, const detail::tvec2<U, P>& a, T y, const detail::tvec2<U, P>& b, T z,\n    const detail::tvec2<U, P>& c) {\n  detail::tvec2<U, P> Result;\n  for (typename detail::tvec2<U, P>::size_type i = 0; i < Result.length(); ++i)\n    Result[i] = x > y ? (x > z ? a[i] : c[i]) : (y > z ? b[i] : c[i]);\n  return Result;\n}\n\n// Max comparison between 3 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMax(\n    T x, const detail::tvec3<U, P>& a, T y, const detail::tvec3<U, P>& b, T z,\n    const detail::tvec3<U, P>& c) {\n  detail::tvec3<U, P> Result;\n  for (typename detail::tvec3<U, P>::size_type i = 0; i < Result.length(); ++i)\n    Result[i] = x > y ? (x > z ? a[i] : c[i]) : (y > z ? b[i] : c[i]);\n  return Result;\n}\n\n// Max comparison between 3 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMax(\n    T x, const detail::tvec4<U, P>& a, T y, const detail::tvec4<U, P>& b, T z,\n    const detail::tvec4<U, P>& c) {\n  detail::tvec4<U, P> Result;\n  for (typename detail::tvec4<U, P>::size_type i = 0; i < Result.length(); ++i)\n    Result[i] = x > y ? (x > z ? a[i] : c[i]) : (y > z ? b[i] : c[i]);\n  return Result;\n}\n\n// Max comparison between 3 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMax(\n    const detail::tvec2<T, P>& x, U a, const detail::tvec2<T, P>& y, U b,\n    const detail::tvec2<T, P>& z, U c) {\n  detail::tvec2<U, P> Result;\n  for (typename detail::tvec2<T, P>::size_type i = 0; i < Result.length(); ++i)\n    Result[i] = x[i] > y[i] ? (x[i] > z[i] ? a : c) : (y[i] > z[i] ? b : c);\n  return Result;\n}\n\n// Max comparison between 3 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMax(\n    const detail::tvec3<T, P>& x, U a, const detail::tvec3<T, P>& y, U b,\n    const detail::tvec3<T, P>& z, U c) {\n  detail::tvec3<U, P> Result;\n  for (typename detail::tvec3<T, P>::size_type i = 0; i < Result.length(); ++i)\n    Result[i] = x[i] > y[i] ? (x[i] > z[i] ? a : c) : (y[i] > z[i] ? b : c);\n  return Result;\n}\n\n// Max comparison between 3 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMax(\n    const detail::tvec4<T, P>& x, U a, const detail::tvec4<T, P>& y, U b,\n    const detail::tvec4<T, P>& z, U c) {\n  detail::tvec4<U, P> Result;\n  for (typename detail::tvec4<T, P>::size_type i = 0; i < Result.length(); ++i)\n    Result[i] = x[i] > y[i] ? (x[i] > z[i] ? a : c) : (y[i] > z[i] ? b : c);\n  return Result;\n}\n\n// Max comparison between 4 variables\ntemplate <typename T, typename U>\nGLM_FUNC_QUALIFIER U associatedMax(T x, U a, T y, U b, T z, U c, T w, U d) {\n  T Test1 = max(x, y);\n  T Test2 = max(z, w);\n  ;\n  U Result1 = x > y ? a : b;\n  U Result2 = z > w ? c : d;\n  U Result = Test1 > Test2 ? Result1 : Result2;\n  return Result;\n}\n\n// Max comparison between 4 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMax(\n    const detail::tvec2<T, P>& x, const detail::tvec2<U, P>& a,\n    const detail::tvec2<T, P>& y, const detail::tvec2<U, P>& b,\n    const detail::tvec2<T, P>& z, const detail::tvec2<U, P>& c,\n    const detail::tvec2<T, P>& w, const detail::tvec2<U, P>& d) {\n  detail::tvec2<U, P> Result;\n  for (typename detail::tvec2<U, P>::size_type i = 0; i < Result.length();\n       ++i) {\n    T Test1 = max(x[i], y[i]);\n    T Test2 = max(z[i], w[i]);\n    U Result1 = x[i] > y[i] ? a[i] : b[i];\n    U Result2 = z[i] > w[i] ? c[i] : d[i];\n    Result[i] = Test1 > Test2 ? Result1 : Result2;\n  }\n  return Result;\n}\n\n// Max comparison between 4 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMax(\n    const detail::tvec3<T, P>& x, const detail::tvec3<U, P>& a,\n    const detail::tvec3<T, P>& y, const detail::tvec3<U, P>& b,\n    const detail::tvec3<T, P>& z, const detail::tvec3<U, P>& c,\n    const detail::tvec3<T, P>& w, const detail::tvec3<U, P>& d) {\n  detail::tvec3<U, P> Result;\n  for (typename detail::tvec3<U, P>::size_type i = 0; i < Result.length();\n       ++i) {\n    T Test1 = max(x[i], y[i]);\n    T Test2 = max(z[i], w[i]);\n    U Result1 = x[i] > y[i] ? a[i] : b[i];\n    U Result2 = z[i] > w[i] ? c[i] : d[i];\n    Result[i] = Test1 > Test2 ? Result1 : Result2;\n  }\n  return Result;\n}\n\n// Max comparison between 4 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMax(\n    const detail::tvec4<T, P>& x, const detail::tvec4<U, P>& a,\n    const detail::tvec4<T, P>& y, const detail::tvec4<U, P>& b,\n    const detail::tvec4<T, P>& z, const detail::tvec4<U, P>& c,\n    const detail::tvec4<T, P>& w, const detail::tvec4<U, P>& d) {\n  detail::tvec4<U, P> Result;\n  for (typename detail::tvec4<U, P>::size_type i = 0; i < Result.length();\n       ++i) {\n    T Test1 = max(x[i], y[i]);\n    T Test2 = max(z[i], w[i]);\n    U Result1 = x[i] > y[i] ? a[i] : b[i];\n    U Result2 = z[i] > w[i] ? c[i] : d[i];\n    Result[i] = Test1 > Test2 ? Result1 : Result2;\n  }\n  return Result;\n}\n\n// Max comparison between 4 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMax(\n    T x, const detail::tvec2<U, P>& a, T y, const detail::tvec2<U, P>& b, T z,\n    const detail::tvec2<U, P>& c, T w, const detail::tvec2<U, P>& d) {\n  T Test1 = max(x, y);\n  T Test2 = max(z, w);\n\n  detail::tvec2<U, P> Result;\n  for (typename detail::tvec2<U, P>::size_type i = 0; i < Result.length();\n       ++i) {\n    U Result1 = x > y ? a[i] : b[i];\n    U Result2 = z > w ? c[i] : d[i];\n    Result[i] = Test1 > Test2 ? Result1 : Result2;\n  }\n  return Result;\n}\n\n// Max comparison between 4 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMax(\n    T x, const detail::tvec3<U, P>& a, T y, const detail::tvec3<U, P>& b, T z,\n    const detail::tvec3<U, P>& c, T w, const detail::tvec3<U, P>& d) {\n  T Test1 = max(x, y);\n  T Test2 = max(z, w);\n\n  detail::tvec3<U, P> Result;\n  for (typename detail::tvec3<U, P>::size_type i = 0; i < Result.length();\n       ++i) {\n    U Result1 = x > y ? a[i] : b[i];\n    U Result2 = z > w ? c[i] : d[i];\n    Result[i] = Test1 > Test2 ? Result1 : Result2;\n  }\n  return Result;\n}\n\n// Max comparison between 4 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMax(\n    T x, const detail::tvec4<U, P>& a, T y, const detail::tvec4<U, P>& b, T z,\n    const detail::tvec4<U, P>& c, T w, const detail::tvec4<U, P>& d) {\n  T Test1 = max(x, y);\n  T Test2 = max(z, w);\n\n  detail::tvec4<U, P> Result;\n  for (typename detail::tvec4<U, P>::size_type i = 0; i < Result.length();\n       ++i) {\n    U Result1 = x > y ? a[i] : b[i];\n    U Result2 = z > w ? c[i] : d[i];\n    Result[i] = Test1 > Test2 ? Result1 : Result2;\n  }\n  return Result;\n}\n\n// Max comparison between 4 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMax(\n    const detail::tvec2<T, P>& x, U a, const detail::tvec2<T, P>& y, U b,\n    const detail::tvec2<T, P>& z, U c, const detail::tvec2<T, P>& w, U d) {\n  detail::tvec2<U, P> Result;\n  for (typename detail::tvec2<T, P>::size_type i = 0; i < Result.length();\n       ++i) {\n    T Test1 = max(x[i], y[i]);\n    T Test2 = max(z[i], w[i]);\n    ;\n    U Result1 = x[i] > y[i] ? a : b;\n    U Result2 = z[i] > w[i] ? c : d;\n    Result[i] = Test1 > Test2 ? Result1 : Result2;\n  }\n  return Result;\n}\n\n// Max comparison between 4 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMax(\n    const detail::tvec3<T, P>& x, U a, const detail::tvec3<T, P>& y, U b,\n    const detail::tvec3<T, P>& z, U c, const detail::tvec3<T, P>& w, U d) {\n  detail::tvec3<U, P> Result;\n  for (typename detail::tvec3<T, P>::size_type i = 0; i < Result.length();\n       ++i) {\n    T Test1 = max(x[i], y[i]);\n    T Test2 = max(z[i], w[i]);\n    ;\n    U Result1 = x[i] > y[i] ? a : b;\n    U Result2 = z[i] > w[i] ? c : d;\n    Result[i] = Test1 > Test2 ? Result1 : Result2;\n  }\n  return Result;\n}\n\n// Max comparison between 4 variables\ntemplate <typename T, typename U, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMax(\n    const detail::tvec4<T, P>& x, U a, const detail::tvec4<T, P>& y, U b,\n    const detail::tvec4<T, P>& z, U c, const detail::tvec4<T, P>& w, U d) {\n  detail::tvec4<U, P> Result;\n  for (typename detail::tvec4<T, P>::size_type i = 0; i < Result.length();\n       ++i) {\n    T Test1 = max(x[i], y[i]);\n    T Test2 = max(z[i], w[i]);\n    ;\n    U Result1 = x[i] > y[i] ? a : b;\n    U Result2 = z[i] > w[i] ? c : d;\n    Result[i] = Test1 > Test2 ? Result1 : Result2;\n  }\n  return Result;\n}\n\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/bit.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_bit\n/// @file glm/gtx/bit.hpp\n/// @date 2007-03-14 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtc_half_float (dependence)\n///\n/// @defgroup gtx_bit GLM_GTX_bit\n/// @ingroup gtx\n///\n/// @brief Allow to perform bit operations on integer values\n///\n/// <glm/gtx/bit.hpp> need to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_bit\n#define GLM_GTX_bit\n\n// Dependencies\n#include <cstddef>\n\n#include \"../detail/setup.hpp\"\n#include \"../detail/type_int.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_bit extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_bit\n/// @{\n\n/// Build a mask of 'count' bits\n/// @see gtx_bit\ntemplate <typename genIType>\nGLM_FUNC_DECL genIType mask(genIType const& count);\n\n//! Find the highest bit set to 1 in a integer variable and return its value.\n/// @see gtx_bit\ntemplate <typename genType>\nGLM_FUNC_DECL genType highestBitValue(genType const& value);\n\n//! Return true if the value is a power of two number.\n/// @see gtx_bit\ntemplate <typename genType>\nGLM_FUNC_DECL bool isPowerOfTwo(genType const& value);\n\n//! Return the power of two number which value is just higher the input value.\n/// @see gtx_bit\ntemplate <typename genType>\nGLM_FUNC_DECL genType powerOfTwoAbove(genType const& value);\n\n//! Return the power of two number which value is just lower the input value.\n/// @see gtx_bit\ntemplate <typename genType>\nGLM_FUNC_DECL genType powerOfTwoBelow(genType const& value);\n\n//! Return the power of two number which value is the closet to the input value.\n/// @see gtx_bit\ntemplate <typename genType>\nGLM_FUNC_DECL genType powerOfTwoNearest(genType const& value);\n\n//! Revert all bits of any integer based type.\n/// @see gtx_bit\ntemplate <typename genType>\nGLM_DEPRECATED GLM_FUNC_DECL genType bitRevert(genType const& value);\n\n//! Rotate all bits to the right.\n/// @see gtx_bit\ntemplate <typename genType>\nGLM_FUNC_DECL genType bitRotateRight(genType const& In, std::size_t Shift);\n\n//! Rotate all bits to the left.\n/// @see gtx_bit\ntemplate <typename genType>\nGLM_FUNC_DECL genType bitRotateLeft(genType const& In, std::size_t Shift);\n\n//! Set to 1 a range of bits.\n/// @see gtx_bit\ntemplate <typename genIUType>\nGLM_FUNC_DECL genIUType fillBitfieldWithOne(genIUType const& Value,\n                                            int const& FromBit,\n                                            int const& ToBit);\n\n//! Set to 0 a range of bits.\n/// @see gtx_bit\ntemplate <typename genIUType>\nGLM_FUNC_DECL genIUType fillBitfieldWithZero(genIUType const& Value,\n                                             int const& FromBit,\n                                             int const& ToBit);\n\n/// Interleaves the bits of x and y.\n/// The first bit is the first bit of x followed by the first bit of y.\n/// The other bits are interleaved following the previous sequence.\n///\n/// @see gtx_bit\nGLM_FUNC_DECL int16 bitfieldInterleave(int8 x, int8 y);\n\n/// Interleaves the bits of x and y.\n/// The first bit is the first bit of x followed by the first bit of y.\n/// The other bits are interleaved following the previous sequence.\n///\n/// @see gtx_bit\nGLM_FUNC_DECL uint16 bitfieldInterleave(uint8 x, uint8 y);\n\n/// Interleaves the bits of x and y.\n/// The first bit is the first bit of x followed by the first bit of y.\n/// The other bits are interleaved following the previous sequence.\n///\n/// @see gtx_bit\nGLM_FUNC_DECL int32 bitfieldInterleave(int16 x, int16 y);\n\n/// Interleaves the bits of x and y.\n/// The first bit is the first bit of x followed by the first bit of y.\n/// The other bits are interleaved following the previous sequence.\n///\n/// @see gtx_bit\nGLM_FUNC_DECL uint32 bitfieldInterleave(uint16 x, uint16 y);\n\n/// Interleaves the bits of x and y.\n/// The first bit is the first bit of x followed by the first bit of y.\n/// The other bits are interleaved following the previous sequence.\n///\n/// @see gtx_bit\nGLM_FUNC_DECL int64 bitfieldInterleave(int32 x, int32 y);\n\n/// Interleaves the bits of x and y.\n/// The first bit is the first bit of x followed by the first bit of y.\n/// The other bits are interleaved following the previous sequence.\n///\n/// @see gtx_bit\nGLM_FUNC_DECL uint64 bitfieldInterleave(uint32 x, uint32 y);\n\n/// Interleaves the bits of x, y and z.\n/// The first bit is the first bit of x followed by the first bit of y and the\n/// first bit of z. The other bits are interleaved following the previous\n/// sequence.\n///\n/// @see gtx_bit\nGLM_FUNC_DECL int32 bitfieldInterleave(int8 x, int8 y, int8 z);\n\n/// Interleaves the bits of x, y and z.\n/// The first bit is the first bit of x followed by the first bit of y and the\n/// first bit of z. The other bits are interleaved following the previous\n/// sequence.\n///\n/// @see gtx_bit\nGLM_FUNC_DECL uint32 bitfieldInterleave(uint8 x, uint8 y, uint8 z);\n\n/// Interleaves the bits of x, y and z.\n/// The first bit is the first bit of x followed by the first bit of y and the\n/// first bit of z. The other bits are interleaved following the previous\n/// sequence.\n///\n/// @see gtx_bit\nGLM_FUNC_DECL int64 bitfieldInterleave(int16 x, int16 y, int16 z);\n\n/// Interleaves the bits of x, y and z.\n/// The first bit is the first bit of x followed by the first bit of y and the\n/// first bit of z. The other bits are interleaved following the previous\n/// sequence.\n///\n/// @see gtx_bit\nGLM_FUNC_DECL uint64 bitfieldInterleave(uint16 x, uint16 y, uint16 z);\n\n/// Interleaves the bits of x, y and z.\n/// The first bit is the first bit of x followed by the first bit of y and the\n/// first bit of z. The other bits are interleaved following the previous\n/// sequence.\n///\n/// @see gtx_bit\nGLM_FUNC_DECL int64 bitfieldInterleave(int32 x, int32 y, int32 z);\n\n/// Interleaves the bits of x, y and z.\n/// The first bit is the first bit of x followed by the first bit of y and the\n/// first bit of z. The other bits are interleaved following the previous\n/// sequence.\n///\n/// @see gtx_bit\nGLM_FUNC_DECL uint64 bitfieldInterleave(uint32 x, uint32 y, uint32 z);\n\n/// Interleaves the bits of x, y, z and w.\n/// The first bit is the first bit of x followed by the first bit of y, the\n/// first bit of z and finally the first bit of w. The other bits are\n/// interleaved following the previous sequence.\n///\n/// @see gtx_bit\nGLM_FUNC_DECL int32 bitfieldInterleave(int8 x, int8 y, int8 z, int8 w);\n\n/// Interleaves the bits of x, y, z and w.\n/// The first bit is the first bit of x followed by the first bit of y, the\n/// first bit of z and finally the first bit of w. The other bits are\n/// interleaved following the previous sequence.\n///\n/// @see gtx_bit\nGLM_FUNC_DECL uint32 bitfieldInterleave(uint8 x, uint8 y, uint8 z, uint8 w);\n\n/// Interleaves the bits of x, y, z and w.\n/// The first bit is the first bit of x followed by the first bit of y, the\n/// first bit of z and finally the first bit of w. The other bits are\n/// interleaved following the previous sequence.\n///\n/// @see gtx_bit\nGLM_FUNC_DECL int64 bitfieldInterleave(int16 x, int16 y, int16 z, int16 w);\n\n/// Interleaves the bits of x, y, z and w.\n/// The first bit is the first bit of x followed by the first bit of y, the\n/// first bit of z and finally the first bit of w. The other bits are\n/// interleaved following the previous sequence.\n///\n/// @see gtx_bit\nGLM_FUNC_DECL uint64 bitfieldInterleave(uint16 x, uint16 y, uint16 z, uint16 w);\n\n/// @}\n}  // namespace glm\n\n#include \"bit.inl\"\n\n#endif  // GLM_GTX_bit\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/bit.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2007-03-14\n// Updated : 2013-12-25\n// Licence : This source is under MIT License\n// File    : glm/gtx/bit.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\n#include <limits>\n\n#include \"../detail/_vectorize.hpp\"\n\nnamespace glm {\ntemplate <typename genIType>\nGLM_FUNC_QUALIFIER genIType mask(genIType const& count) {\n  return ((genIType(1) << (count)) - genIType(1));\n}\n\nVECTORIZE_VEC(mask)\n\n// highestBitValue\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType highestBitValue(genType const& value) {\n  genType tmp = value;\n  genType result = genType(0);\n  while (tmp) {\n    result = (tmp & (~tmp + 1));  // grab lowest bit\n    tmp &= ~result;               // clear lowest bit\n  }\n  return result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<int, P> highestBitValue(\n    detail::tvec2<T, P> const& value) {\n  return detail::tvec2<int, P>(highestBitValue(value[0]),\n                               highestBitValue(value[1]));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<int, P> highestBitValue(\n    detail::tvec3<T, P> const& value) {\n  return detail::tvec3<int, P>(highestBitValue(value[0]),\n                               highestBitValue(value[1]),\n                               highestBitValue(value[2]));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<int, P> highestBitValue(\n    detail::tvec4<T, P> const& value) {\n  return detail::tvec4<int, P>(\n      highestBitValue(value[0]), highestBitValue(value[1]),\n      highestBitValue(value[2]), highestBitValue(value[3]));\n}\n\n// isPowerOfTwo\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER bool isPowerOfTwo(genType const& Value) {\n  // detail::If<std::numeric_limits<genType>::is_signed>::apply(abs, Value);\n  // return !(Value & (Value - 1));\n\n  // For old complier?\n  genType Result = Value;\n  if (std::numeric_limits<genType>::is_signed) Result = abs(Result);\n  return !(Result & (Result - 1));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<bool, P> isPowerOfTwo(\n    detail::tvec2<T, P> const& value) {\n  return detail::tvec2<bool, P>(isPowerOfTwo(value[0]), isPowerOfTwo(value[1]));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<bool, P> isPowerOfTwo(\n    detail::tvec3<T, P> const& value) {\n  return detail::tvec3<bool, P>(isPowerOfTwo(value[0]), isPowerOfTwo(value[1]),\n                                isPowerOfTwo(value[2]));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<bool, P> isPowerOfTwo(\n    detail::tvec4<T, P> const& value) {\n  return detail::tvec4<bool, P>(isPowerOfTwo(value[0]), isPowerOfTwo(value[1]),\n                                isPowerOfTwo(value[2]), isPowerOfTwo(value[3]));\n}\n\n// powerOfTwoAbove\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType powerOfTwoAbove(genType const& value) {\n  return isPowerOfTwo(value) ? value : highestBitValue(value) << 1;\n}\n\nVECTORIZE_VEC(powerOfTwoAbove)\n\n// powerOfTwoBelow\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType powerOfTwoBelow(genType const& value) {\n  return isPowerOfTwo(value) ? value : highestBitValue(value);\n}\n\nVECTORIZE_VEC(powerOfTwoBelow)\n\n// powerOfTwoNearest\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType powerOfTwoNearest(genType const& value) {\n  if (isPowerOfTwo(value)) return value;\n\n  genType prev = highestBitValue(value);\n  genType next = prev << 1;\n  return (next - value) < (value - prev) ? next : prev;\n}\n\nVECTORIZE_VEC(powerOfTwoNearest)\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType bitRevert(genType const& In) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_integer,\n                    \"'bitRevert' only accept integer values\");\n\n  genType Out = 0;\n  std::size_t BitSize = sizeof(genType) * 8;\n  for (std::size_t i = 0; i < BitSize; ++i)\n    if (In & (genType(1) << i)) Out |= genType(1) << (BitSize - 1 - i);\n  return Out;\n}\n\nVECTORIZE_VEC(bitRevert)\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType bitRotateRight(genType const& In,\n                                          std::size_t Shift) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_integer,\n                    \"'bitRotateRight' only accept integer values\");\n\n  std::size_t BitSize = sizeof(genType) * 8;\n  return (In << Shift) | (In >> (BitSize - Shift));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<T, P> bitRotateRight(\n    detail::tvec2<T, P> const& Value, std::size_t Shift) {\n  return detail::tvec2<T, P>(bitRotateRight(Value[0], Shift),\n                             bitRotateRight(Value[1], Shift));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> bitRotateRight(\n    detail::tvec3<T, P> const& Value, std::size_t Shift) {\n  return detail::tvec3<T, P>(bitRotateRight(Value[0], Shift),\n                             bitRotateRight(Value[1], Shift),\n                             bitRotateRight(Value[2], Shift));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> bitRotateRight(\n    detail::tvec4<T, P> const& Value, std::size_t Shift) {\n  return detail::tvec4<T, P>(\n      bitRotateRight(Value[0], Shift), bitRotateRight(Value[1], Shift),\n      bitRotateRight(Value[2], Shift), bitRotateRight(Value[3], Shift));\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType bitRotateLeft(genType const& In, std::size_t Shift) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_integer,\n                    \"'bitRotateLeft' only accept integer values\");\n\n  std::size_t BitSize = sizeof(genType) * 8;\n  return (In >> Shift) | (In << (BitSize - Shift));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<T, P> bitRotateLeft(\n    detail::tvec2<T, P> const& Value, std::size_t Shift) {\n  return detail::tvec2<T, P>(bitRotateLeft(Value[0], Shift),\n                             bitRotateLeft(Value[1], Shift));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> bitRotateLeft(\n    detail::tvec3<T, P> const& Value, std::size_t Shift) {\n  return detail::tvec3<T, P>(bitRotateLeft(Value[0], Shift),\n                             bitRotateLeft(Value[1], Shift),\n                             bitRotateLeft(Value[2], Shift));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> bitRotateLeft(\n    detail::tvec4<T, P> const& Value, std::size_t Shift) {\n  return detail::tvec4<T, P>(\n      bitRotateLeft(Value[0], Shift), bitRotateLeft(Value[1], Shift),\n      bitRotateLeft(Value[2], Shift), bitRotateLeft(Value[3], Shift));\n}\n\ntemplate <typename genIUType>\nGLM_FUNC_QUALIFIER genIUType fillBitfieldWithOne(genIUType const& Value,\n                                                 int const& FromBit,\n                                                 int const& ToBit) {\n  assert(FromBit <= ToBit);\n  assert(ToBit <= sizeof(genIUType) * std::size_t(8));\n\n  genIUType Result = Value;\n  for (std::size_t i = 0; i <= ToBit; ++i) Result |= (1 << i);\n  return Result;\n}\n\ntemplate <typename genIUType>\nGLM_FUNC_QUALIFIER genIUType fillBitfieldWithZero(genIUType const& Value,\n                                                  int const& FromBit,\n                                                  int const& ToBit) {\n  assert(FromBit <= ToBit);\n  assert(ToBit <= sizeof(genIUType) * std::size_t(8));\n\n  genIUType Result = Value;\n  for (std::size_t i = 0; i <= ToBit; ++i) Result &= ~(1 << i);\n  return Result;\n}\n\nnamespace detail {\ntemplate <typename PARAM, typename RET>\nGLM_FUNC_DECL RET bitfieldInterleave(PARAM x, PARAM y);\n\ntemplate <typename PARAM, typename RET>\nGLM_FUNC_DECL RET bitfieldInterleave(PARAM x, PARAM y, PARAM z);\n\ntemplate <typename PARAM, typename RET>\nGLM_FUNC_DECL RET bitfieldInterleave(PARAM x, PARAM y, PARAM z, PARAM w);\n\n/*\n                template <typename PARAM, typename RET>\n                inline RET bitfieldInterleave(PARAM x, PARAM y)\n                {\n                        RET Result = 0;\n                        for (int i = 0; i < sizeof(PARAM) * 8; i++)\n                                Result |= (x & 1U << i) << i | (y & 1U << i) <<\n   (i + 1); return Result;\n                }\n\n                template <typename PARAM, typename RET>\n                inline RET bitfieldInterleave(PARAM x, PARAM y, PARAM z)\n                {\n                        RET Result = 0;\n                        for (RET i = 0; i < sizeof(PARAM) * 8; i++)\n                        {\n                                Result |= ((RET(x) & (RET(1) << i)) << ((i << 1)\n   + 0)); Result |= ((RET(y) & (RET(1) << i)) << ((i << 1) + 1)); Result |=\n   ((RET(z) & (RET(1) << i)) << ((i << 1) + 2));\n                        }\n                        return Result;\n                }\n\n                template <typename PARAM, typename RET>\n                inline RET bitfieldInterleave(PARAM x, PARAM y, PARAM z, PARAM\n   w)\n                {\n                        RET Result = 0;\n                        for (int i = 0; i < sizeof(PARAM) * 8; i++)\n                        {\n                                Result |= ((((RET(x) >> i) & RET(1))) << RET((i\n   << 2) + 0)); Result |= ((((RET(y) >> i) & RET(1))) << RET((i << 2) + 1));\n                                Result |= ((((RET(z) >> i) & RET(1))) << RET((i\n   << 2) + 2)); Result |= ((((RET(w) >> i) & RET(1))) << RET((i << 2) + 3));\n                        }\n                        return Result;\n                }\n*/\ntemplate <>\nGLM_FUNC_QUALIFIER glm::uint16 bitfieldInterleave(glm::uint8 x, glm::uint8 y) {\n  glm::uint16 REG1(x);\n  glm::uint16 REG2(y);\n\n  REG1 = ((REG1 << 4) | REG1) & glm::uint16(0x0F0F);\n  REG2 = ((REG2 << 4) | REG2) & glm::uint16(0x0F0F);\n\n  REG1 = ((REG1 << 2) | REG1) & glm::uint16(0x3333);\n  REG2 = ((REG2 << 2) | REG2) & glm::uint16(0x3333);\n\n  REG1 = ((REG1 << 1) | REG1) & glm::uint16(0x5555);\n  REG2 = ((REG2 << 1) | REG2) & glm::uint16(0x5555);\n\n  return REG1 | (REG2 << 1);\n}\n\ntemplate <>\nGLM_FUNC_QUALIFIER glm::uint32 bitfieldInterleave(glm::uint16 x,\n                                                  glm::uint16 y) {\n  glm::uint32 REG1(x);\n  glm::uint32 REG2(y);\n\n  REG1 = ((REG1 << 8) | REG1) & glm::uint32(0x00FF00FF);\n  REG2 = ((REG2 << 8) | REG2) & glm::uint32(0x00FF00FF);\n\n  REG1 = ((REG1 << 4) | REG1) & glm::uint32(0x0F0F0F0F);\n  REG2 = ((REG2 << 4) | REG2) & glm::uint32(0x0F0F0F0F);\n\n  REG1 = ((REG1 << 2) | REG1) & glm::uint32(0x33333333);\n  REG2 = ((REG2 << 2) | REG2) & glm::uint32(0x33333333);\n\n  REG1 = ((REG1 << 1) | REG1) & glm::uint32(0x55555555);\n  REG2 = ((REG2 << 1) | REG2) & glm::uint32(0x55555555);\n\n  return REG1 | (REG2 << 1);\n}\n\ntemplate <>\nGLM_FUNC_QUALIFIER glm::uint64 bitfieldInterleave(glm::uint32 x,\n                                                  glm::uint32 y) {\n  glm::uint64 REG1(x);\n  glm::uint64 REG2(y);\n\n  REG1 = ((REG1 << 16) | REG1) & glm::uint64(0x0000FFFF0000FFFF);\n  REG2 = ((REG2 << 16) | REG2) & glm::uint64(0x0000FFFF0000FFFF);\n\n  REG1 = ((REG1 << 8) | REG1) & glm::uint64(0x00FF00FF00FF00FF);\n  REG2 = ((REG2 << 8) | REG2) & glm::uint64(0x00FF00FF00FF00FF);\n\n  REG1 = ((REG1 << 4) | REG1) & glm::uint64(0x0F0F0F0F0F0F0F0F);\n  REG2 = ((REG2 << 4) | REG2) & glm::uint64(0x0F0F0F0F0F0F0F0F);\n\n  REG1 = ((REG1 << 2) | REG1) & glm::uint64(0x3333333333333333);\n  REG2 = ((REG2 << 2) | REG2) & glm::uint64(0x3333333333333333);\n\n  REG1 = ((REG1 << 1) | REG1) & glm::uint64(0x5555555555555555);\n  REG2 = ((REG2 << 1) | REG2) & glm::uint64(0x5555555555555555);\n\n  return REG1 | (REG2 << 1);\n}\n\ntemplate <>\nGLM_FUNC_QUALIFIER glm::uint32 bitfieldInterleave(glm::uint8 x, glm::uint8 y,\n                                                  glm::uint8 z) {\n  glm::uint32 REG1(x);\n  glm::uint32 REG2(y);\n  glm::uint32 REG3(z);\n\n  REG1 = ((REG1 << 16) | REG1) & glm::uint32(0x00FF0000FF0000FF);\n  REG2 = ((REG2 << 16) | REG2) & glm::uint32(0x00FF0000FF0000FF);\n  REG3 = ((REG3 << 16) | REG3) & glm::uint32(0x00FF0000FF0000FF);\n\n  REG1 = ((REG1 << 8) | REG1) & glm::uint32(0xF00F00F00F00F00F);\n  REG2 = ((REG2 << 8) | REG2) & glm::uint32(0xF00F00F00F00F00F);\n  REG3 = ((REG3 << 8) | REG3) & glm::uint32(0xF00F00F00F00F00F);\n\n  REG1 = ((REG1 << 4) | REG1) & glm::uint32(0x30C30C30C30C30C3);\n  REG2 = ((REG2 << 4) | REG2) & glm::uint32(0x30C30C30C30C30C3);\n  REG3 = ((REG3 << 4) | REG3) & glm::uint32(0x30C30C30C30C30C3);\n\n  REG1 = ((REG1 << 2) | REG1) & glm::uint32(0x9249249249249249);\n  REG2 = ((REG2 << 2) | REG2) & glm::uint32(0x9249249249249249);\n  REG3 = ((REG3 << 2) | REG3) & glm::uint32(0x9249249249249249);\n\n  return REG1 | (REG2 << 1) | (REG3 << 2);\n}\n\ntemplate <>\nGLM_FUNC_QUALIFIER glm::uint64 bitfieldInterleave(glm::uint16 x, glm::uint16 y,\n                                                  glm::uint16 z) {\n  glm::uint64 REG1(x);\n  glm::uint64 REG2(y);\n  glm::uint64 REG3(z);\n\n  REG1 = ((REG1 << 32) | REG1) & glm::uint64(0xFFFF00000000FFFF);\n  REG2 = ((REG2 << 32) | REG2) & glm::uint64(0xFFFF00000000FFFF);\n  REG3 = ((REG3 << 32) | REG3) & glm::uint64(0xFFFF00000000FFFF);\n\n  REG1 = ((REG1 << 16) | REG1) & glm::uint64(0x00FF0000FF0000FF);\n  REG2 = ((REG2 << 16) | REG2) & glm::uint64(0x00FF0000FF0000FF);\n  REG3 = ((REG3 << 16) | REG3) & glm::uint64(0x00FF0000FF0000FF);\n\n  REG1 = ((REG1 << 8) | REG1) & glm::uint64(0xF00F00F00F00F00F);\n  REG2 = ((REG2 << 8) | REG2) & glm::uint64(0xF00F00F00F00F00F);\n  REG3 = ((REG3 << 8) | REG3) & glm::uint64(0xF00F00F00F00F00F);\n\n  REG1 = ((REG1 << 4) | REG1) & glm::uint64(0x30C30C30C30C30C3);\n  REG2 = ((REG2 << 4) | REG2) & glm::uint64(0x30C30C30C30C30C3);\n  REG3 = ((REG3 << 4) | REG3) & glm::uint64(0x30C30C30C30C30C3);\n\n  REG1 = ((REG1 << 2) | REG1) & glm::uint64(0x9249249249249249);\n  REG2 = ((REG2 << 2) | REG2) & glm::uint64(0x9249249249249249);\n  REG3 = ((REG3 << 2) | REG3) & glm::uint64(0x9249249249249249);\n\n  return REG1 | (REG2 << 1) | (REG3 << 2);\n}\n\ntemplate <>\nGLM_FUNC_QUALIFIER glm::uint64 bitfieldInterleave(glm::uint32 x, glm::uint32 y,\n                                                  glm::uint32 z) {\n  glm::uint64 REG1(x);\n  glm::uint64 REG2(y);\n  glm::uint64 REG3(z);\n\n  REG1 = ((REG1 << 32) | REG1) & glm::uint64(0xFFFF00000000FFFF);\n  REG2 = ((REG2 << 32) | REG2) & glm::uint64(0xFFFF00000000FFFF);\n  REG3 = ((REG3 << 32) | REG3) & glm::uint64(0xFFFF00000000FFFF);\n\n  REG1 = ((REG1 << 16) | REG1) & glm::uint64(0x00FF0000FF0000FF);\n  REG2 = ((REG2 << 16) | REG2) & glm::uint64(0x00FF0000FF0000FF);\n  REG3 = ((REG3 << 16) | REG3) & glm::uint64(0x00FF0000FF0000FF);\n\n  REG1 = ((REG1 << 8) | REG1) & glm::uint64(0xF00F00F00F00F00F);\n  REG2 = ((REG2 << 8) | REG2) & glm::uint64(0xF00F00F00F00F00F);\n  REG3 = ((REG3 << 8) | REG3) & glm::uint64(0xF00F00F00F00F00F);\n\n  REG1 = ((REG1 << 4) | REG1) & glm::uint64(0x30C30C30C30C30C3);\n  REG2 = ((REG2 << 4) | REG2) & glm::uint64(0x30C30C30C30C30C3);\n  REG3 = ((REG3 << 4) | REG3) & glm::uint64(0x30C30C30C30C30C3);\n\n  REG1 = ((REG1 << 2) | REG1) & glm::uint64(0x9249249249249249);\n  REG2 = ((REG2 << 2) | REG2) & glm::uint64(0x9249249249249249);\n  REG3 = ((REG3 << 2) | REG3) & glm::uint64(0x9249249249249249);\n\n  return REG1 | (REG2 << 1) | (REG3 << 2);\n}\n\ntemplate <>\nGLM_FUNC_QUALIFIER glm::uint32 bitfieldInterleave(glm::uint8 x, glm::uint8 y,\n                                                  glm::uint8 z, glm::uint8 w) {\n  glm::uint32 REG1(x);\n  glm::uint32 REG2(y);\n  glm::uint32 REG3(z);\n  glm::uint32 REG4(w);\n\n  REG1 = ((REG1 << 12) | REG1) & glm::uint32(0x000F000F000F000F);\n  REG2 = ((REG2 << 12) | REG2) & glm::uint32(0x000F000F000F000F);\n  REG3 = ((REG3 << 12) | REG3) & glm::uint32(0x000F000F000F000F);\n  REG4 = ((REG4 << 12) | REG4) & glm::uint32(0x000F000F000F000F);\n\n  REG1 = ((REG1 << 6) | REG1) & glm::uint32(0x0303030303030303);\n  REG2 = ((REG2 << 6) | REG2) & glm::uint32(0x0303030303030303);\n  REG3 = ((REG3 << 6) | REG3) & glm::uint32(0x0303030303030303);\n  REG4 = ((REG4 << 6) | REG4) & glm::uint32(0x0303030303030303);\n\n  REG1 = ((REG1 << 3) | REG1) & glm::uint32(0x1111111111111111);\n  REG2 = ((REG2 << 3) | REG2) & glm::uint32(0x1111111111111111);\n  REG3 = ((REG3 << 3) | REG3) & glm::uint32(0x1111111111111111);\n  REG4 = ((REG4 << 3) | REG4) & glm::uint32(0x1111111111111111);\n\n  return REG1 | (REG2 << 1) | (REG3 << 2) | (REG4 << 3);\n}\n\ntemplate <>\nGLM_FUNC_QUALIFIER glm::uint64 bitfieldInterleave(glm::uint16 x, glm::uint16 y,\n                                                  glm::uint16 z,\n                                                  glm::uint16 w) {\n  glm::uint64 REG1(x);\n  glm::uint64 REG2(y);\n  glm::uint64 REG3(z);\n  glm::uint64 REG4(w);\n\n  REG1 = ((REG1 << 24) | REG1) & glm::uint64(0x000000FF000000FF);\n  REG2 = ((REG2 << 24) | REG2) & glm::uint64(0x000000FF000000FF);\n  REG3 = ((REG3 << 24) | REG3) & glm::uint64(0x000000FF000000FF);\n  REG4 = ((REG4 << 24) | REG4) & glm::uint64(0x000000FF000000FF);\n\n  REG1 = ((REG1 << 12) | REG1) & glm::uint64(0x000F000F000F000F);\n  REG2 = ((REG2 << 12) | REG2) & glm::uint64(0x000F000F000F000F);\n  REG3 = ((REG3 << 12) | REG3) & glm::uint64(0x000F000F000F000F);\n  REG4 = ((REG4 << 12) | REG4) & glm::uint64(0x000F000F000F000F);\n\n  REG1 = ((REG1 << 6) | REG1) & glm::uint64(0x0303030303030303);\n  REG2 = ((REG2 << 6) | REG2) & glm::uint64(0x0303030303030303);\n  REG3 = ((REG3 << 6) | REG3) & glm::uint64(0x0303030303030303);\n  REG4 = ((REG4 << 6) | REG4) & glm::uint64(0x0303030303030303);\n\n  REG1 = ((REG1 << 3) | REG1) & glm::uint64(0x1111111111111111);\n  REG2 = ((REG2 << 3) | REG2) & glm::uint64(0x1111111111111111);\n  REG3 = ((REG3 << 3) | REG3) & glm::uint64(0x1111111111111111);\n  REG4 = ((REG4 << 3) | REG4) & glm::uint64(0x1111111111111111);\n\n  return REG1 | (REG2 << 1) | (REG3 << 2) | (REG4 << 3);\n}\n}  // namespace detail\n\nGLM_FUNC_QUALIFIER int16 bitfieldInterleave(int8 x, int8 y) {\n  union sign8 {\n    int8 i;\n    uint8 u;\n  } sign_x, sign_y;\n\n  union sign16 {\n    int16 i;\n    uint16 u;\n  } result;\n\n  sign_x.i = x;\n  sign_y.i = y;\n  result.u = bitfieldInterleave(sign_x.u, sign_y.u);\n\n  return result.i;\n}\n\nGLM_FUNC_QUALIFIER uint16 bitfieldInterleave(uint8 x, uint8 y) {\n  return detail::bitfieldInterleave<uint8, uint16>(x, y);\n}\n\nGLM_FUNC_QUALIFIER int32 bitfieldInterleave(int16 x, int16 y) {\n  union sign16 {\n    int16 i;\n    uint16 u;\n  } sign_x, sign_y;\n\n  union sign32 {\n    int32 i;\n    uint32 u;\n  } result;\n\n  sign_x.i = x;\n  sign_y.i = y;\n  result.u = bitfieldInterleave(sign_x.u, sign_y.u);\n\n  return result.i;\n}\n\nGLM_FUNC_QUALIFIER uint32 bitfieldInterleave(uint16 x, uint16 y) {\n  return detail::bitfieldInterleave<uint16, uint32>(x, y);\n}\n\nGLM_FUNC_QUALIFIER int64 bitfieldInterleave(int32 x, int32 y) {\n  union sign32 {\n    int32 i;\n    uint32 u;\n  } sign_x, sign_y;\n\n  union sign64 {\n    int64 i;\n    uint64 u;\n  } result;\n\n  sign_x.i = x;\n  sign_y.i = y;\n  result.u = bitfieldInterleave(sign_x.u, sign_y.u);\n\n  return result.i;\n}\n\nGLM_FUNC_QUALIFIER uint64 bitfieldInterleave(uint32 x, uint32 y) {\n  return detail::bitfieldInterleave<uint32, uint64>(x, y);\n}\n\nGLM_FUNC_QUALIFIER int32 bitfieldInterleave(int8 x, int8 y, int8 z) {\n  union sign8 {\n    int8 i;\n    uint8 u;\n  } sign_x, sign_y, sign_z;\n\n  union sign32 {\n    int32 i;\n    uint32 u;\n  } result;\n\n  sign_x.i = x;\n  sign_y.i = y;\n  sign_z.i = z;\n  result.u = bitfieldInterleave(sign_x.u, sign_y.u, sign_z.u);\n\n  return result.i;\n}\n\nGLM_FUNC_QUALIFIER uint32 bitfieldInterleave(uint8 x, uint8 y, uint8 z) {\n  return detail::bitfieldInterleave<uint8, uint32>(x, y, z);\n}\n\nGLM_FUNC_QUALIFIER int64 bitfieldInterleave(int16 x, int16 y, int16 z) {\n  union sign16 {\n    int16 i;\n    uint16 u;\n  } sign_x, sign_y, sign_z;\n\n  union sign64 {\n    int64 i;\n    uint64 u;\n  } result;\n\n  sign_x.i = x;\n  sign_y.i = y;\n  sign_z.i = z;\n  result.u = bitfieldInterleave(sign_x.u, sign_y.u, sign_z.u);\n\n  return result.i;\n}\n\nGLM_FUNC_QUALIFIER uint64 bitfieldInterleave(uint16 x, uint16 y, uint16 z) {\n  return detail::bitfieldInterleave<uint32, uint64>(x, y, z);\n}\n\nGLM_FUNC_QUALIFIER int64 bitfieldInterleave(int32 x, int32 y, int32 z) {\n  union sign16 {\n    int32 i;\n    uint32 u;\n  } sign_x, sign_y, sign_z;\n\n  union sign64 {\n    int64 i;\n    uint64 u;\n  } result;\n\n  sign_x.i = x;\n  sign_y.i = y;\n  sign_z.i = z;\n  result.u = bitfieldInterleave(sign_x.u, sign_y.u, sign_z.u);\n\n  return result.i;\n}\n\nGLM_FUNC_QUALIFIER uint64 bitfieldInterleave(uint32 x, uint32 y, uint32 z) {\n  return detail::bitfieldInterleave<uint32, uint64>(x, y, z);\n}\n\nGLM_FUNC_QUALIFIER int32 bitfieldInterleave(int8 x, int8 y, int8 z, int8 w) {\n  union sign8 {\n    int8 i;\n    uint8 u;\n  } sign_x, sign_y, sign_z, sign_w;\n\n  union sign32 {\n    int32 i;\n    uint32 u;\n  } result;\n\n  sign_x.i = x;\n  sign_y.i = y;\n  sign_z.i = z;\n  sign_w.i = w;\n  result.u = bitfieldInterleave(sign_x.u, sign_y.u, sign_z.u, sign_w.u);\n\n  return result.i;\n}\n\nGLM_FUNC_QUALIFIER uint32 bitfieldInterleave(uint8 x, uint8 y, uint8 z,\n                                             uint8 w) {\n  return detail::bitfieldInterleave<uint8, uint32>(x, y, z, w);\n}\n\nGLM_FUNC_QUALIFIER int64 bitfieldInterleave(int16 x, int16 y, int16 z,\n                                            int16 w) {\n  union sign16 {\n    int16 i;\n    uint16 u;\n  } sign_x, sign_y, sign_z, sign_w;\n\n  union sign64 {\n    int64 i;\n    uint64 u;\n  } result;\n\n  sign_x.i = x;\n  sign_y.i = y;\n  sign_z.i = z;\n  sign_w.i = w;\n  result.u = bitfieldInterleave(sign_x.u, sign_y.u, sign_z.u, sign_w.u);\n\n  return result.i;\n}\n\nGLM_FUNC_QUALIFIER uint64 bitfieldInterleave(uint16 x, uint16 y, uint16 z,\n                                             uint16 w) {\n  return detail::bitfieldInterleave<uint16, uint64>(x, y, z, w);\n}\n\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/closest_point.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_bit\n/// @file glm/gtx/bit.hpp\n/// @date 2005-12-30 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_closest_point GLM_GTX_closest_point\n/// @ingroup gtx\n///\n/// @brief Find the point on a straight line which is the closet of a point.\n///\n/// <glm/gtx/closest_point.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_closest_point\n#define GLM_GTX_closest_point\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_closest_point extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_closest_point\n/// @{\n\n/// Find the point on a straight line which is the closet of a point.\n/// @see gtx_closest_point\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec3<T, P> closestPointOnLine(\n    detail::tvec3<T, P> const& point, detail::tvec3<T, P> const& a,\n    detail::tvec3<T, P> const& b);\n\n/// @}\n}  // namespace glm\n\n#include \"closest_point.inl\"\n\n#endif  // GLM_GTX_closest_point\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/closest_point.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2005-12-30\n// Updated : 2008-10-05\n// Licence : This source is under MIT License\n// File    : glm/gtx/closest_point.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_gtx_closest_point\n#define glm_gtx_closest_point\n\nnamespace glm {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> closestPointOnLine(\n    detail::tvec3<T, P> const& point, detail::tvec3<T, P> const& a,\n    detail::tvec3<T, P> const& b) {\n  T LineLength = distance(a, b);\n  detail::tvec3<T, P> Vector = point - a;\n  detail::tvec3<T, P> LineDirection = (b - a) / LineLength;\n\n  // Project Vector to LineDirection to get the distance of point from a\n  T Distance = dot(Vector, LineDirection);\n\n  if (Distance <= T(0)) return a;\n  if (Distance >= LineLength) return b;\n  return a + LineDirection * Distance;\n}\n}  // namespace glm\n\n#endif  // glm_gtx_closest_point\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/color_space.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_color_space\n/// @file glm/gtx/color_space.hpp\n/// @date 2005-12-21 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_color_space GLM_GTX_color_space\n/// @ingroup gtx\n///\n/// @brief Related to RGB to HSV conversions and operations.\n///\n/// <glm/gtx/color_space.hpp> need to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_color_space\n#define GLM_GTX_color_space\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_color_space extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_color_space\n/// @{\n\n/// Converts a color from HSV color space to its color in RGB color space.\n/// @see gtx_color_space\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec3<T, P> rgbColor(detail::tvec3<T, P> const& hsvValue);\n\n/// Converts a color from RGB color space to its color in HSV color space.\n/// @see gtx_color_space\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec3<T, P> hsvColor(detail::tvec3<T, P> const& rgbValue);\n\n/// Build a saturation matrix.\n/// @see gtx_color_space\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x4<T, P> saturation(T const s);\n\n/// Modify the saturation of a color.\n/// @see gtx_color_space\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec3<T, P> saturation(T const s,\n                                             detail::tvec3<T, P> const& color);\n\n/// Modify the saturation of a color.\n/// @see gtx_color_space\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec4<T, P> saturation(T const s,\n                                             detail::tvec4<T, P> const& color);\n\n/// Compute color luminosity associating ratios (0.33, 0.59, 0.11) to RGB\n/// canals.\n/// @see gtx_color_space\ntemplate <typename T, precision P>\nGLM_FUNC_DECL T luminosity(detail::tvec3<T, P> const& color);\n\n/// @}\n}  // namespace glm\n\n#include \"color_space.inl\"\n\n#endif  // GLM_GTX_color_space\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/color_space.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2005-12-21\n// Updated : 2007-02-22\n// Licence : This source is under MIT License\n// File    : glm/gtx/color_space.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> rgbColor(\n    const detail::tvec3<T, P>& hsvColor) {\n  detail::tvec3<T, P> hsv = hsvColor;\n  detail::tvec3<T, P> rgbColor;\n\n  if (hsv.y == static_cast<T>(0))\n    // achromatic (grey)\n    rgbColor = detail::tvec3<T, P>(hsv.z);\n  else {\n    T sector = floor(hsv.x / T(60));\n    T frac = (hsv.x / T(60)) - sector;\n    // factorial part of h\n    T o = hsv.z * (T(1) - hsv.y);\n    T p = hsv.z * (T(1) - hsv.y * frac);\n    T q = hsv.z * (T(1) - hsv.y * (T(1) - frac));\n\n    switch (int(sector)) {\n      default:\n      case 0:\n        rgbColor.r = hsv.z;\n        rgbColor.g = q;\n        rgbColor.b = o;\n        break;\n      case 1:\n        rgbColor.r = p;\n        rgbColor.g = hsv.z;\n        rgbColor.b = o;\n        break;\n      case 2:\n        rgbColor.r = o;\n        rgbColor.g = hsv.z;\n        rgbColor.b = q;\n        break;\n      case 3:\n        rgbColor.r = o;\n        rgbColor.g = p;\n        rgbColor.b = hsv.z;\n        break;\n      case 4:\n        rgbColor.r = q;\n        rgbColor.g = o;\n        rgbColor.b = hsv.z;\n        break;\n      case 5:\n        rgbColor.r = hsv.z;\n        rgbColor.g = o;\n        rgbColor.b = p;\n        break;\n    }\n  }\n\n  return rgbColor;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> hsvColor(\n    const detail::tvec3<T, P>& rgbColor) {\n  detail::tvec3<T, P> hsv = rgbColor;\n  float Min = min(min(rgbColor.r, rgbColor.g), rgbColor.b);\n  float Max = max(max(rgbColor.r, rgbColor.g), rgbColor.b);\n  float Delta = Max - Min;\n\n  hsv.z = Max;\n\n  if (Max != static_cast<T>(0)) {\n    hsv.y = Delta / hsv.z;\n    T h = static_cast<T>(0);\n\n    if (rgbColor.r == Max)\n      // between yellow & magenta\n      h = static_cast<T>(0) + T(60) * (rgbColor.g - rgbColor.b) / Delta;\n    else if (rgbColor.g == Max)\n      // between cyan & yellow\n      h = static_cast<T>(120) + T(60) * (rgbColor.b - rgbColor.r) / Delta;\n    else\n      // between magenta & cyan\n      h = static_cast<T>(240) + T(60) * (rgbColor.r - rgbColor.g) / Delta;\n\n    if (h < T(0))\n      hsv.x = h + T(360);\n    else\n      hsv.x = h;\n  } else {\n    // If r = g = b = 0 then s = 0, h is undefined\n    hsv.y = static_cast<T>(0);\n    hsv.x = static_cast<T>(0);\n  }\n\n  return hsv;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> saturation(const T s) {\n  detail::tvec3<T, P> rgbw =\n      detail::tvec3<T, P>(T(0.2126), T(0.7152), T(0.0722));\n\n  T col0 = (T(1) - s) * rgbw.r;\n  T col1 = (T(1) - s) * rgbw.g;\n  T col2 = (T(1) - s) * rgbw.b;\n\n  detail::tmat4x4<T, P> result(T(1));\n  result[0][0] = col0 + s;\n  result[0][1] = col0;\n  result[0][2] = col0;\n  result[1][0] = col1;\n  result[1][1] = col1 + s;\n  result[1][2] = col1;\n  result[2][0] = col2;\n  result[2][1] = col2;\n  result[2][2] = col2 + s;\n  return result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> saturation(\n    const T s, const detail::tvec3<T, P>& color) {\n  return detail::tvec3<T, P>(saturation(s) * detail::tvec4<T, P>(color, T(0)));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> saturation(\n    const T s, const detail::tvec4<T, P>& color) {\n  return saturation(s) * color;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T luminosity(const detail::tvec3<T, P>& color) {\n  const detail::tvec3<T, P> tmp = detail::tvec3<T, P>(0.33, 0.59, 0.11);\n  return dot(color, tmp);\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/color_space_YCoCg.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_color_space_YCoCg\n/// @file glm/gtx/color_space_YCoCg.hpp\n/// @date 2008-10-28 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_color_space_YCoCg GLM_GTX_color_space_YCoCg\n/// @ingroup gtx\n///\n/// @brief RGB to YCoCg conversions and operations\n///\n/// <glm/gtx/color_space_YCoCg.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef glm_gtx_color_space_YCoCg\n#define glm_gtx_color_space_YCoCg\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_color_space_YCoCg extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_color_space_YCoCg\n/// @{\n\n/// Convert a color from RGB color space to YCoCg color space.\n/// @see gtx_color_space_YCoCg\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec3<T, P> rgb2YCoCg(\n    detail::tvec3<T, P> const& rgbColor);\n\n/// Convert a color from YCoCg color space to RGB color space.\n/// @see gtx_color_space_YCoCg\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec3<T, P> YCoCg2rgb(\n    detail::tvec3<T, P> const& YCoCgColor);\n\n/// Convert a color from RGB color space to YCoCgR color space.\n/// @see \"YCoCg-R: A Color Space with RGB Reversibility and Low Dynamic Range\"\n/// @see gtx_color_space_YCoCg\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec3<T, P> rgb2YCoCgR(\n    detail::tvec3<T, P> const& rgbColor);\n\n/// Convert a color from YCoCgR color space to RGB color space.\n/// @see \"YCoCg-R: A Color Space with RGB Reversibility and Low Dynamic Range\"\n/// @see gtx_color_space_YCoCg\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec3<T, P> YCoCgR2rgb(\n    detail::tvec3<T, P> const& YCoCgColor);\n\n/// @}\n}  // namespace glm\n\n#include \"color_space_YCoCg.inl\"\n\n#endif  // glm_gtx_color_space_YCoCg\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/color_space_YCoCg.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2008-10-28\n// Updated : 2008-10-28\n// Licence : This source is under MIT License\n// File    : glm/gtx/color_space_YCoCg.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> rgb2YCoCg(\n    detail::tvec3<T, P> const& rgbColor) {\n  detail::tvec3<T, P> result;\n  result.x /*Y */ = rgbColor.r / T(4) + rgbColor.g / T(2) + rgbColor.b / T(4);\n  result.y /*Co*/ = rgbColor.r / T(2) + rgbColor.g * T(0) - rgbColor.b / T(2);\n  result.z /*Cg*/ = -rgbColor.r / T(4) + rgbColor.g / T(2) - rgbColor.b / T(4);\n  return result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> rgb2YCoCgR(\n    detail::tvec3<T, P> const& rgbColor) {\n  detail::tvec3<T, P> result;\n  result.x /*Y */ = rgbColor.g / T(2) + (rgbColor.r + rgbColor.b) / T(4);\n  result.y /*Co*/ = rgbColor.r - rgbColor.b;\n  result.z /*Cg*/ = rgbColor.g - (rgbColor.r + rgbColor.b) / T(2);\n  return result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> YCoCg2rgb(\n    detail::tvec3<T, P> const& YCoCgColor) {\n  detail::tvec3<T, P> result;\n  result.r = YCoCgColor.x + YCoCgColor.y - YCoCgColor.z;\n  result.g = YCoCgColor.x + YCoCgColor.z;\n  result.b = YCoCgColor.x - YCoCgColor.y - YCoCgColor.z;\n  return result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> YCoCgR2rgb(\n    detail::tvec3<T, P> const& YCoCgRColor) {\n  detail::tvec3<T, P> result;\n  T tmp = YCoCgRColor.x - (YCoCgRColor.z / T(2));\n  result.g = YCoCgRColor.z + tmp;\n  result.b = tmp - (YCoCgRColor.y / T(2));\n  result.r = result.b + YCoCgRColor.y;\n  return result;\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/compatibility.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_compatibility\n/// @file glm/gtx/compatibility.hpp\n/// @date 2007-01-24 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtc_half_float (dependence)\n///\n/// @defgroup gtx_compatibility GLM_GTX_compatibility\n/// @ingroup gtx\n///\n/// @brief Provide functions to increase the compatibility with Cg and HLSL\n/// languages\n///\n/// <glm/gtx/compatibility.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_compatibility\n#define GLM_GTX_compatibility\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtc/quaternion.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_compatibility extension included\")\n#endif\n\n#if (GLM_COMPILER & GLM_COMPILER_VC)\n#include <cfloat>\n#elif (GLM_COMPILER & GLM_COMPILER_GCC)\n#include <cmath>\n#if (GLM_PLATFORM & GLM_PLATFORM_ANDROID)\n#undef isfinite\n#endif\n#endif  // GLM_COMPILER\n\nnamespace glm {\n/// @addtogroup gtx_compatibility\n/// @{\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER T lerp(T x, T y, T a) {\n  return mix(x, y, a);\n}  //!< \\brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y\n   //!< using the floating-point value a. The value for a is not restricted to\n   //!< the range [0, 1]. (From GLM_GTX_compatibility)\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<T, P> lerp(const detail::tvec2<T, P>& x,\n                                            const detail::tvec2<T, P>& y, T a) {\n  return mix(x, y, a);\n}  //!< \\brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y\n   //!< using the floating-point value a. The value for a is not restricted to\n   //!< the range [0, 1]. (From GLM_GTX_compatibility)\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> lerp(const detail::tvec3<T, P>& x,\n                                            const detail::tvec3<T, P>& y, T a) {\n  return mix(x, y, a);\n}  //!< \\brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y\n   //!< using the floating-point value a. The value for a is not restricted to\n   //!< the range [0, 1]. (From GLM_GTX_compatibility)\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> lerp(const detail::tvec4<T, P>& x,\n                                            const detail::tvec4<T, P>& y, T a) {\n  return mix(x, y, a);\n}  //!< \\brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y\n   //!< using the floating-point value a. The value for a is not restricted to\n   //!< the range [0, 1]. (From GLM_GTX_compatibility)\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<T, P> lerp(const detail::tvec2<T, P>& x,\n                                            const detail::tvec2<T, P>& y,\n                                            const detail::tvec2<T, P>& a) {\n  return mix(x, y, a);\n}  //!< \\brief Returns the component-wise result of x * (1.0 - a) + y * a, i.e.,\n   //!< the linear blend of x and y using vector a. The value for a is not\n   //!< restricted to the range [0, 1]. (From GLM_GTX_compatibility)\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> lerp(const detail::tvec3<T, P>& x,\n                                            const detail::tvec3<T, P>& y,\n                                            const detail::tvec3<T, P>& a) {\n  return mix(x, y, a);\n}  //!< \\brief Returns the component-wise result of x * (1.0 - a) + y * a, i.e.,\n   //!< the linear blend of x and y using vector a. The value for a is not\n   //!< restricted to the range [0, 1]. (From GLM_GTX_compatibility)\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> lerp(const detail::tvec4<T, P>& x,\n                                            const detail::tvec4<T, P>& y,\n                                            const detail::tvec4<T, P>& a) {\n  return mix(x, y, a);\n}  //!< \\brief Returns the component-wise result of x * (1.0 - a) + y * a, i.e.,\n   //!< the linear blend of x and y using vector a. The value for a is not\n   //!< restricted to the range [0, 1]. (From GLM_GTX_compatibility)\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T slerp(detail::tquat<T, P> const& x,\n                           detail::tquat<T, P> const& y, T const& a) {\n  return mix(x, y, a);\n}  //!< \\brief Returns the slurp interpolation between two quaternions.\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T saturate(T x) {\n  return clamp(x, T(0), T(1));\n}  //!< \\brief Returns clamp(x, 0, 1) for each component in x. (From\n   //!< GLM_GTX_compatibility)\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<T, P> saturate(const detail::tvec2<T, P>& x) {\n  return clamp(x, T(0), T(1));\n}  //!< \\brief Returns clamp(x, 0, 1) for each component in x. (From\n   //!< GLM_GTX_compatibility)\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> saturate(const detail::tvec3<T, P>& x) {\n  return clamp(x, T(0), T(1));\n}  //!< \\brief Returns clamp(x, 0, 1) for each component in x. (From\n   //!< GLM_GTX_compatibility)\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> saturate(const detail::tvec4<T, P>& x) {\n  return clamp(x, T(0), T(1));\n}  //!< \\brief Returns clamp(x, 0, 1) for each component in x. (From\n   //!< GLM_GTX_compatibility)\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T atan2(T x, T y) {\n  return atan(x, y);\n}  //!< \\brief Arc tangent. Returns an angle whose tangent is y/x. The signs of\n   //!< x and y are used to determine what quadrant the angle is in. The range\n   //!< of values returned by this function is [-PI, PI]. Results are undefined\n   //!< if x and y are both 0. (From GLM_GTX_compatibility)\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<T, P> atan2(const detail::tvec2<T, P>& x,\n                                             const detail::tvec2<T, P>& y) {\n  return atan(x, y);\n}  //!< \\brief Arc tangent. Returns an angle whose tangent is y/x. The signs of\n   //!< x and y are used to determine what quadrant the angle is in. The range\n   //!< of values returned by this function is [-PI, PI]. Results are undefined\n   //!< if x and y are both 0. (From GLM_GTX_compatibility)\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> atan2(const detail::tvec3<T, P>& x,\n                                             const detail::tvec3<T, P>& y) {\n  return atan(x, y);\n}  //!< \\brief Arc tangent. Returns an angle whose tangent is y/x. The signs of\n   //!< x and y are used to determine what quadrant the angle is in. The range\n   //!< of values returned by this function is [-PI, PI]. Results are undefined\n   //!< if x and y are both 0. (From GLM_GTX_compatibility)\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> atan2(const detail::tvec4<T, P>& x,\n                                             const detail::tvec4<T, P>& y) {\n  return atan(x, y);\n}  //!< \\brief Arc tangent. Returns an angle whose tangent is y/x. The signs of\n   //!< x and y are used to determine what quadrant the angle is in. The range\n   //!< of values returned by this function is [-PI, PI]. Results are undefined\n   //!< if x and y are both 0. (From GLM_GTX_compatibility)\n\ntemplate <typename genType>\nGLM_FUNC_DECL bool isfinite(\n    genType const&\n        x);  //!< \\brief Test whether or not a scalar or each vector component\n             //!< is a finite value. (From GLM_GTX_compatibility)\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec2<bool, P> isfinite(\n    const detail::tvec2<T, P>&\n        x);  //!< \\brief Test whether or not a scalar or each vector component\n             //!< is a finite value. (From GLM_GTX_compatibility)\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec3<bool, P> isfinite(\n    const detail::tvec3<T, P>&\n        x);  //!< \\brief Test whether or not a scalar or each vector component\n             //!< is a finite value. (From GLM_GTX_compatibility)\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec4<bool, P> isfinite(\n    const detail::tvec4<T, P>&\n        x);  //!< \\brief Test whether or not a scalar or each vector component\n             //!< is a finite value. (From GLM_GTX_compatibility)\n\ntypedef bool bool1;  //!< \\brief boolean type with 1 component. (From\n                     //!< GLM_GTX_compatibility extension)\ntypedef detail::tvec2<bool, highp>\n    bool2;  //!< \\brief boolean type with 2 components. (From\n            //!< GLM_GTX_compatibility extension)\ntypedef detail::tvec3<bool, highp>\n    bool3;  //!< \\brief boolean type with 3 components. (From\n            //!< GLM_GTX_compatibility extension)\ntypedef detail::tvec4<bool, highp>\n    bool4;  //!< \\brief boolean type with 4 components. (From\n            //!< GLM_GTX_compatibility extension)\n\ntypedef bool bool1x1;  //!< \\brief boolean matrix with 1 x 1 component. (From\n                       //!< GLM_GTX_compatibility extension)\ntypedef detail::tmat2x2<bool, highp>\n    bool2x2;  //!< \\brief boolean matrix with 2 x 2 components. (From\n              //!< GLM_GTX_compatibility extension)\ntypedef detail::tmat2x3<bool, highp>\n    bool2x3;  //!< \\brief boolean matrix with 2 x 3 components. (From\n              //!< GLM_GTX_compatibility extension)\ntypedef detail::tmat2x4<bool, highp>\n    bool2x4;  //!< \\brief boolean matrix with 2 x 4 components. (From\n              //!< GLM_GTX_compatibility extension)\ntypedef detail::tmat3x2<bool, highp>\n    bool3x2;  //!< \\brief boolean matrix with 3 x 2 components. (From\n              //!< GLM_GTX_compatibility extension)\ntypedef detail::tmat3x3<bool, highp>\n    bool3x3;  //!< \\brief boolean matrix with 3 x 3 components. (From\n              //!< GLM_GTX_compatibility extension)\ntypedef detail::tmat3x4<bool, highp>\n    bool3x4;  //!< \\brief boolean matrix with 3 x 4 components. (From\n              //!< GLM_GTX_compatibility extension)\ntypedef detail::tmat4x2<bool, highp>\n    bool4x2;  //!< \\brief boolean matrix with 4 x 2 components. (From\n              //!< GLM_GTX_compatibility extension)\ntypedef detail::tmat4x3<bool, highp>\n    bool4x3;  //!< \\brief boolean matrix with 4 x 3 components. (From\n              //!< GLM_GTX_compatibility extension)\ntypedef detail::tmat4x4<bool, highp>\n    bool4x4;  //!< \\brief boolean matrix with 4 x 4 components. (From\n              //!< GLM_GTX_compatibility extension)\n\ntypedef int int1;  //!< \\brief integer vector with 1 component. (From\n                   //!< GLM_GTX_compatibility extension)\ntypedef detail::tvec2<int, highp>\n    int2;  //!< \\brief integer vector with 2 components. (From\n           //!< GLM_GTX_compatibility extension)\ntypedef detail::tvec3<int, highp>\n    int3;  //!< \\brief integer vector with 3 components. (From\n           //!< GLM_GTX_compatibility extension)\ntypedef detail::tvec4<int, highp>\n    int4;  //!< \\brief integer vector with 4 components. (From\n           //!< GLM_GTX_compatibility extension)\n\ntypedef int int1x1;  //!< \\brief integer matrix with 1 component. (From\n                     //!< GLM_GTX_compatibility extension)\ntypedef detail::tmat2x2<int, highp>\n    int2x2;  //!< \\brief integer matrix with 2 x 2 components. (From\n             //!< GLM_GTX_compatibility extension)\ntypedef detail::tmat2x3<int, highp>\n    int2x3;  //!< \\brief integer matrix with 2 x 3 components. (From\n             //!< GLM_GTX_compatibility extension)\ntypedef detail::tmat2x4<int, highp>\n    int2x4;  //!< \\brief integer matrix with 2 x 4 components. (From\n             //!< GLM_GTX_compatibility extension)\ntypedef detail::tmat3x2<int, highp>\n    int3x2;  //!< \\brief integer matrix with 3 x 2 components. (From\n             //!< GLM_GTX_compatibility extension)\ntypedef detail::tmat3x3<int, highp>\n    int3x3;  //!< \\brief integer matrix with 3 x 3 components. (From\n             //!< GLM_GTX_compatibility extension)\ntypedef detail::tmat3x4<int, highp>\n    int3x4;  //!< \\brief integer matrix with 3 x 4 components. (From\n             //!< GLM_GTX_compatibility extension)\ntypedef detail::tmat4x2<int, highp>\n    int4x2;  //!< \\brief integer matrix with 4 x 2 components. (From\n             //!< GLM_GTX_compatibility extension)\ntypedef detail::tmat4x3<int, highp>\n    int4x3;  //!< \\brief integer matrix with 4 x 3 components. (From\n             //!< GLM_GTX_compatibility extension)\ntypedef detail::tmat4x4<int, highp>\n    int4x4;  //!< \\brief integer matrix with 4 x 4 components. (From\n             //!< GLM_GTX_compatibility extension)\n\ntypedef float float1;  //!< \\brief single-precision floating-point vector with 1\n                       //!< component. (From GLM_GTX_compatibility extension)\ntypedef detail::tvec2<float, highp>\n    float2;  //!< \\brief single-precision floating-point vector with 2\n             //!< components. (From GLM_GTX_compatibility extension)\ntypedef detail::tvec3<float, highp>\n    float3;  //!< \\brief single-precision floating-point vector with 3\n             //!< components. (From GLM_GTX_compatibility extension)\ntypedef detail::tvec4<float, highp>\n    float4;  //!< \\brief single-precision floating-point vector with 4\n             //!< components. (From GLM_GTX_compatibility extension)\n\ntypedef float\n    float1x1;  //!< \\brief single-precision floating-point matrix with 1\n               //!< component. (From GLM_GTX_compatibility extension)\ntypedef detail::tmat2x2<float, highp>\n    float2x2;  //!< \\brief single-precision floating-point matrix with 2 x 2\n               //!< components. (From GLM_GTX_compatibility extension)\ntypedef detail::tmat2x3<float, highp>\n    float2x3;  //!< \\brief single-precision floating-point matrix with 2 x 3\n               //!< components. (From GLM_GTX_compatibility extension)\ntypedef detail::tmat2x4<float, highp>\n    float2x4;  //!< \\brief single-precision floating-point matrix with 2 x 4\n               //!< components. (From GLM_GTX_compatibility extension)\ntypedef detail::tmat3x2<float, highp>\n    float3x2;  //!< \\brief single-precision floating-point matrix with 3 x 2\n               //!< components. (From GLM_GTX_compatibility extension)\ntypedef detail::tmat3x3<float, highp>\n    float3x3;  //!< \\brief single-precision floating-point matrix with 3 x 3\n               //!< components. (From GLM_GTX_compatibility extension)\ntypedef detail::tmat3x4<float, highp>\n    float3x4;  //!< \\brief single-precision floating-point matrix with 3 x 4\n               //!< components. (From GLM_GTX_compatibility extension)\ntypedef detail::tmat4x2<float, highp>\n    float4x2;  //!< \\brief single-precision floating-point matrix with 4 x 2\n               //!< components. (From GLM_GTX_compatibility extension)\ntypedef detail::tmat4x3<float, highp>\n    float4x3;  //!< \\brief single-precision floating-point matrix with 4 x 3\n               //!< components. (From GLM_GTX_compatibility extension)\ntypedef detail::tmat4x4<float, highp>\n    float4x4;  //!< \\brief single-precision floating-point matrix with 4 x 4\n               //!< components. (From GLM_GTX_compatibility extension)\n\ntypedef double\n    double1;  //!< \\brief double-precision floating-point vector with 1\n              //!< component. (From GLM_GTX_compatibility extension)\ntypedef detail::tvec2<double, highp>\n    double2;  //!< \\brief double-precision floating-point vector with 2\n              //!< components. (From GLM_GTX_compatibility extension)\ntypedef detail::tvec3<double, highp>\n    double3;  //!< \\brief double-precision floating-point vector with 3\n              //!< components. (From GLM_GTX_compatibility extension)\ntypedef detail::tvec4<double, highp>\n    double4;  //!< \\brief double-precision floating-point vector with 4\n              //!< components. (From GLM_GTX_compatibility extension)\n\ntypedef double\n    double1x1;  //!< \\brief double-precision floating-point matrix with 1\n                //!< component. (From GLM_GTX_compatibility extension)\ntypedef detail::tmat2x2<double, highp>\n    double2x2;  //!< \\brief double-precision floating-point matrix with 2 x 2\n                //!< components. (From GLM_GTX_compatibility extension)\ntypedef detail::tmat2x3<double, highp>\n    double2x3;  //!< \\brief double-precision floating-point matrix with 2 x 3\n                //!< components. (From GLM_GTX_compatibility extension)\ntypedef detail::tmat2x4<double, highp>\n    double2x4;  //!< \\brief double-precision floating-point matrix with 2 x 4\n                //!< components. (From GLM_GTX_compatibility extension)\ntypedef detail::tmat3x2<double, highp>\n    double3x2;  //!< \\brief double-precision floating-point matrix with 3 x 2\n                //!< components. (From GLM_GTX_compatibility extension)\ntypedef detail::tmat3x3<double, highp>\n    double3x3;  //!< \\brief double-precision floating-point matrix with 3 x 3\n                //!< components. (From GLM_GTX_compatibility extension)\ntypedef detail::tmat3x4<double, highp>\n    double3x4;  //!< \\brief double-precision floating-point matrix with 3 x 4\n                //!< components. (From GLM_GTX_compatibility extension)\ntypedef detail::tmat4x2<double, highp>\n    double4x2;  //!< \\brief double-precision floating-point matrix with 4 x 2\n                //!< components. (From GLM_GTX_compatibility extension)\ntypedef detail::tmat4x3<double, highp>\n    double4x3;  //!< \\brief double-precision floating-point matrix with 4 x 3\n                //!< components. (From GLM_GTX_compatibility extension)\ntypedef detail::tmat4x4<double, highp>\n    double4x4;  //!< \\brief double-precision floating-point matrix with 4 x 4\n                //!< components. (From GLM_GTX_compatibility extension)\n\n/// @}\n}  // namespace glm\n\n#include \"compatibility.inl\"\n\n#endif  // GLM_GTX_compatibility\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/compatibility.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2007-03-16\n// Updated : 2008-10-24\n// Licence : This source is under MIT License\n// File    : glm/gtx/compatibility.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\n// isfinite\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER bool isfinite(genType const& x) {\n#if (GLM_LANG & GLM_LANG_CXX11_FLAG)\n  return std::isfinite(x) != 0;\n#elif (GLM_COMPILER & GLM_COMPILER_VC)\n  return _finite(x);\n#elif (GLM_COMPILER & GLM_COMPILER_GCC && GLM_PLATFORM & GLM_PLATFORM_ANDROID)\n  return _isfinite(x) != 0;\n#else\n  return isfinite(x) != 0;\n#endif\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<bool, P> isfinite(\n    detail::tvec2<T, P> const& x) {\n  return detail::tvec2<bool, P>(isfinite(x.x), isfinite(x.y));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<bool, P> isfinite(\n    detail::tvec3<T, P> const& x) {\n  return detail::tvec3<bool, P>(isfinite(x.x), isfinite(x.y), isfinite(x.z));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<bool, P> isfinite(\n    detail::tvec4<T, P> const& x) {\n  return detail::tvec4<bool, P>(isfinite(x.x), isfinite(x.y), isfinite(x.z),\n                                isfinite(x.w));\n}\n\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/component_wise.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_component_wise\n/// @file glm/gtx/component_wise.hpp\n/// @date 2007-05-21 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_component_wise GLM_GTX_component_wise\n/// @ingroup gtx\n///\n/// @brief Operations between components of a type\n///\n/// <glm/gtx/component_wise.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_component_wise\n#define GLM_GTX_component_wise\n\n// Dependencies\n#include \"../detail/setup.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_component_wise extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_component_wise\n/// @{\n\n/// Add all vector components together.\n/// @see gtx_component_wise\ntemplate <typename genType>\nGLM_FUNC_DECL typename genType::value_type compAdd(genType const& v);\n\n/// Multiply all vector components together.\n/// @see gtx_component_wise\ntemplate <typename genType>\nGLM_FUNC_DECL typename genType::value_type compMul(genType const& v);\n\n/// Find the minimum value between single vector components.\n/// @see gtx_component_wise\ntemplate <typename genType>\nGLM_FUNC_DECL typename genType::value_type compMin(genType const& v);\n\n/// Find the maximum value between single vector components.\n/// @see gtx_component_wise\ntemplate <typename genType>\nGLM_FUNC_DECL typename genType::value_type compMax(genType const& v);\n\n/// @}\n}  // namespace glm\n\n#include \"component_wise.inl\"\n\n#endif  // GLM_GTX_component_wise\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/component_wise.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2007-05-21\n// Updated : 2010-02-12\n// Licence : This source is under MIT License\n// File    : gtx_component_wise.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER T compAdd(vecType<T, P> const& v) {\n  T result(0);\n  for (length_t i = 0; i < v.length(); ++i) result += v[i];\n  return result;\n}\n\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER T compMul(vecType<T, P> const& v) {\n  T result(1);\n  for (length_t i = 0; i < v.length(); ++i) result *= v[i];\n  return result;\n}\n\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER T compMin(vecType<T, P> const& v) {\n  T result(v[0]);\n  for (length_t i = 1; i < v.length(); ++i) result = min(result, v[i]);\n  return result;\n}\n\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER T compMax(vecType<T, P> const& v) {\n  T result(v[0]);\n  for (length_t i = 1; i < v.length(); ++i) result = max(result, v[i]);\n  return result;\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/constants.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_constants\n#define GLM_GTX_constants\n\n#include \"../gtc/constants.hpp\"\n\n#if (defined(GLM_MESSAGES))\n#pragma message( \\\n        \"GLM: GLM_GTX_constants extension is deprecated, include GLM_GTC_constants (glm/gtc/constants.hpp) instead\")\n#endif\n\n#endif  // GLM_GTX_constants\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/dual_quaternion.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_dual_quaternion\n/// @file glm/gtx/dual_quaternion.hpp\n/// @date 2013-02-10 / 2013-02-20\n/// @author Maksim Vorobiev (msomeone@gmail.com)\n///\n/// @see core (dependence)\n/// @see gtc_half_float (dependence)\n/// @see gtc_constants (dependence)\n/// @see gtc_quaternion (dependence)\n///\n/// @defgroup gtc_dual_quaternion GLM_GTX_dual_quaternion\n/// @ingroup gtc\n///\n/// @brief Defines a templated dual-quaternion type and several dual-quaternion\n/// operations.\n///\n/// <glm/gtx/dual_quaternion.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_dual_quaternion\n#define GLM_GTX_dual_quaternion\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtc/constants.hpp\"\n#include \"../gtc/quaternion.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_dual_quaternion extension included\")\n#endif\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nstruct tdualquat {\n  enum ctor { null };\n\n  typedef glm::detail::tquat<T, P> part_type;\n\n public:\n  glm::detail::tquat<T, P> real, dual;\n\n  GLM_FUNC_DECL GLM_CONSTEXPR int length() const;\n\n  // Constructors\n  GLM_FUNC_DECL tdualquat();\n  GLM_FUNC_DECL explicit tdualquat(tquat<T, P> const& real);\n  GLM_FUNC_DECL tdualquat(tquat<T, P> const& real, tquat<T, P> const& dual);\n  GLM_FUNC_DECL tdualquat(tquat<T, P> const& orientation,\n                          tvec3<T, P> const& translation);\n\n  //////////////////////////////////////////////////////////////\n  // tdualquat conversions\n  GLM_FUNC_DECL explicit tdualquat(tmat2x4<T, P> const& holder_mat);\n  GLM_FUNC_DECL explicit tdualquat(tmat3x4<T, P> const& aug_mat);\n\n  // Accesses\n  GLM_FUNC_DECL part_type& operator[](int i);\n  GLM_FUNC_DECL part_type const& operator[](int i) const;\n\n  // Operators\n  GLM_FUNC_DECL tdualquat<T, P>& operator*=(T const& s);\n  GLM_FUNC_DECL tdualquat<T, P>& operator/=(T const& s);\n};\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tquat<T, P> operator-(detail::tquat<T, P> const& q);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tdualquat<T, P> operator+(\n    detail::tdualquat<T, P> const& q, detail::tdualquat<T, P> const& p);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tdualquat<T, P> operator*(\n    detail::tdualquat<T, P> const& q, detail::tdualquat<T, P> const& p);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec3<T, P> operator*(detail::tquat<T, P> const& q,\n                                            detail::tvec3<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec3<T, P> operator*(detail::tvec3<T, P> const& v,\n                                            detail::tquat<T, P> const& q);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec4<T, P> operator*(detail::tquat<T, P> const& q,\n                                            detail::tvec4<T, P> const& v);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec4<T, P> operator*(detail::tvec4<T, P> const& v,\n                                            detail::tquat<T, P> const& q);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tdualquat<T, P> operator*(\n    detail::tdualquat<T, P> const& q, T const& s);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tdualquat<T, P> operator*(\n    T const& s, detail::tdualquat<T, P> const& q);\n\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tdualquat<T, P> operator/(\n    detail::tdualquat<T, P> const& q, T const& s);\n}  // namespace detail\n\n/// @addtogroup gtc_dual_quaternion\n/// @{\n\n/// Returns the normalized quaternion.\n///\n/// @see gtc_dual_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tdualquat<T, P> normalize(\n    detail::tdualquat<T, P> const& q);\n\n/// Returns the linear interpolation of two dual quaternion.\n///\n/// @see gtc_dual_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tdualquat<T, P> lerp(detail::tdualquat<T, P> const& x,\n                                           detail::tdualquat<T, P> const& y,\n                                           T const& a);\n\n/// Returns the q inverse.\n///\n/// @see gtc_dual_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tdualquat<T, P> inverse(detail::tdualquat<T, P> const& q);\n\n/*\n/// Extracts a rotation part from dual-quaternion to a 3 * 3 matrix.\n/// TODO\n///\n/// @see gtc_dual_quaternion\ntemplate <typename T, precision P>\ndetail::tmat3x3<T, P> mat3_cast(\n        detail::tdualquat<T, P> const & x);\n*/\n\n/// Converts a quaternion to a 2 * 4 matrix.\n///\n/// @see gtc_dual_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat2x4<T, P> mat2x4_cast(\n    detail::tdualquat<T, P> const& x);\n\n/// Converts a quaternion to a 3 * 4 matrix.\n///\n/// @see gtc_dual_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat3x4<T, P> mat3x4_cast(\n    detail::tdualquat<T, P> const& x);\n\n/// Converts a 2 * 4 matrix (matrix which holds real and dual parts) to a\n/// quaternion.\n///\n/// @see gtc_dual_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tdualquat<T, P> dualquat_cast(\n    detail::tmat2x4<T, P> const& x);\n\n/// Converts a 3 * 4 matrix (augmented matrix rotation + translation) to a\n/// quaternion.\n///\n/// @see gtc_dual_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tdualquat<T, P> dualquat_cast(\n    detail::tmat3x4<T, P> const& x);\n\n/// Dual-quaternion of low single-precision floating-point numbers.\n///\n/// @see gtc_dual_quaternion\ntypedef detail::tdualquat<float, lowp> lowp_dualquat;\n\n/// Dual-quaternion of medium single-precision floating-point numbers.\n///\n/// @see gtc_dual_quaternion\ntypedef detail::tdualquat<float, mediump> mediump_dualquat;\n\n/// Dual-quaternion of high single-precision floating-point numbers.\n///\n/// @see gtc_dual_quaternion\ntypedef detail::tdualquat<float, highp> highp_dualquat;\n\n/// Dual-quaternion of low single-precision floating-point numbers.\n///\n/// @see gtc_dual_quaternion\ntypedef detail::tdualquat<float, lowp> lowp_fdualquat;\n\n/// Dual-quaternion of medium single-precision floating-point numbers.\n///\n/// @see gtc_dual_quaternion\ntypedef detail::tdualquat<float, mediump> mediump_fdualquat;\n\n/// Dual-quaternion of high single-precision floating-point numbers.\n///\n/// @see gtc_dual_quaternion\ntypedef detail::tdualquat<float, highp> highp_fdualquat;\n\n/// Dual-quaternion of low double-precision floating-point numbers.\n///\n/// @see gtc_dual_quaternion\ntypedef detail::tdualquat<double, lowp> lowp_ddualquat;\n\n/// Dual-quaternion of medium double-precision floating-point numbers.\n///\n/// @see gtc_dual_quaternion\ntypedef detail::tdualquat<double, mediump> mediump_ddualquat;\n\n/// Dual-quaternion of high double-precision floating-point numbers.\n///\n/// @see gtc_dual_quaternion\ntypedef detail::tdualquat<double, highp> highp_ddualquat;\n\n#if (!defined(GLM_PRECISION_HIGHP_FLOAT) &&   \\\n     !defined(GLM_PRECISION_MEDIUMP_FLOAT) && \\\n     !defined(GLM_PRECISION_LOWP_FLOAT))\n/// Dual-quaternion of floating-point numbers.\n///\n/// @see gtc_dual_quaternion\ntypedef highp_fdualquat dualquat;\n\n/// Dual-quaternion of single-precision floating-point numbers.\n///\n/// @see gtc_dual_quaternion\ntypedef highp_fdualquat fdualquat;\n#elif (defined(GLM_PRECISION_HIGHP_FLOAT) &&    \\\n       !defined(GLM_PRECISION_MEDIUMP_FLOAT) && \\\n       !defined(GLM_PRECISION_LOWP_FLOAT))\ntypedef highp_fdualquat dualquat;\ntypedef highp_fdualquat fdualquat;\n#elif (!defined(GLM_PRECISION_HIGHP_FLOAT) &&  \\\n       defined(GLM_PRECISION_MEDIUMP_FLOAT) && \\\n       !defined(GLM_PRECISION_LOWP_FLOAT))\ntypedef mediump_fdualquat dualquat;\ntypedef mediump_fdualquat fdualquat;\n#elif (!defined(GLM_PRECISION_HIGHP_FLOAT) &&   \\\n       !defined(GLM_PRECISION_MEDIUMP_FLOAT) && \\\n       defined(GLM_PRECISION_LOWP_FLOAT))\ntypedef lowp_fdualquat dualquat;\ntypedef lowp_fdualquat fdualquat;\n#else\n#error \\\n    \"GLM error: multiple default precision requested for single-precision floating-point types\"\n#endif\n\n#if (!defined(GLM_PRECISION_HIGHP_DOUBLE) &&   \\\n     !defined(GLM_PRECISION_MEDIUMP_DOUBLE) && \\\n     !defined(GLM_PRECISION_LOWP_DOUBLE))\n/// Dual-quaternion of default double-precision floating-point numbers.\n///\n/// @see gtc_dual_quaternion\ntypedef highp_ddualquat ddualquat;\n#elif (defined(GLM_PRECISION_HIGHP_DOUBLE) &&    \\\n       !defined(GLM_PRECISION_MEDIUMP_DOUBLE) && \\\n       !defined(GLM_PRECISION_LOWP_DOUBLE))\ntypedef highp_ddualquat ddualquat;\n#elif (!defined(GLM_PRECISION_HIGHP_DOUBLE) &&  \\\n       defined(GLM_PRECISION_MEDIUMP_DOUBLE) && \\\n       !defined(GLM_PRECISION_LOWP_DOUBLE))\ntypedef mediump_ddualquat ddualquat;\n#elif (!defined(GLM_PRECISION_HIGHP_DOUBLE) &&   \\\n       !defined(GLM_PRECISION_MEDIUMP_DOUBLE) && \\\n       defined(GLM_PRECISION_LOWP_DOUBLE))\ntypedef lowp_ddualquat ddualquat;\n#else\n#error \\\n    \"GLM error: Multiple default precision requested for double-precision floating-point types\"\n#endif\n\n/// @}\n}  // namespace glm\n\n#include \"dual_quaternion.inl\"\n\n#endif  // GLM_GTX_dual_quaternion\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/dual_quaternion.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_dual_quaternion\n/// @file glm/gtx/dual_quaternion.inl\n/// @date 2013-02-10 / 2013-02-13\n/// @author Maksim Vorobiev (msomeone@gmail.com)\n///////////////////////////////////////////////////////////////////////////////////\n\n#include <limits>\n\n#include \"../geometric.hpp\"\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER GLM_CONSTEXPR int tdualquat<T, P>::length() const {\n  return 8;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tdualquat<T, P>::tdualquat()\n    : real(tquat<T, P>()), dual(tquat<T, P>(T(0), T(0), T(0), T(0))) {}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tdualquat<T, P>::tdualquat(tquat<T, P> const& r)\n    : real(r), dual(tquat<T, P>(T(0), T(0), T(0), T(0))) {}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tdualquat<T, P>::tdualquat(tquat<T, P> const& r,\n                                              tquat<T, P> const& d)\n    : real(r), dual(d) {}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tdualquat<T, P>::tdualquat(tquat<T, P> const& q,\n                                              tvec3<T, P> const& p)\n    : real(q),\n      dual(T(-0.5) * (p.x * q.x + p.y * q.y + p.z * q.z),\n           T(+0.5) * (p.x * q.w + p.y * q.z - p.z * q.y),\n           T(+0.5) * (-p.x * q.z + p.y * q.w + p.z * q.x),\n           T(+0.5) * (p.x * q.y - p.y * q.x + p.z * q.w)) {}\n\n//////////////////////////////////////////////////////////////\n// tdualquat conversions\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tdualquat<T, P>::tdualquat(tmat2x4<T, P> const& m) {\n  *this = dualquat_cast(m);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tdualquat<T, P>::tdualquat(tmat3x4<T, P> const& m) {\n  *this = dualquat_cast(m);\n}\n\n//////////////////////////////////////////////////////////////\n// tdualquat<T, P> accesses\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tdualquat<T, P>::part_type&\ntdualquat<T, P>::operator[](int i) {\n  assert(i >= 0 && i < this->length());\n  return (&real)[i];\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER typename tdualquat<T, P>::part_type const&\ntdualquat<T, P>::operator[](int i) const {\n  assert(i >= 0 && i < this->length());\n  return (&real)[i];\n}\n\n//////////////////////////////////////////////////////////////\n// tdualquat<valType> operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tdualquat<T, P>& tdualquat<T, P>::operator*=(T const& s) {\n  this->real *= s;\n  this->dual *= s;\n  return *this;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER tdualquat<T, P>& tdualquat<T, P>::operator/=(T const& s) {\n  this->real /= s;\n  this->dual /= s;\n  return *this;\n}\n\n//////////////////////////////////////////////////////////////\n// tquat<valType> external operators\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tdualquat<T, P> operator-(\n    detail::tdualquat<T, P> const& q) {\n  return detail::tdualquat<T, P>(-q.real, -q.dual);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tdualquat<T, P> operator+(\n    detail::tdualquat<T, P> const& q, detail::tdualquat<T, P> const& p) {\n  return detail::tdualquat<T, P>(q.real + p.real, q.dual + p.dual);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tdualquat<T, P> operator*(\n    detail::tdualquat<T, P> const& p, detail::tdualquat<T, P> const& o) {\n  return detail::tdualquat<T, P>(p.real * o.real,\n                                 p.real * o.dual + p.dual * o.real);\n}\n\n// Transformation\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> operator*(\n    detail::tdualquat<T, P> const& q, detail::tvec3<T, P> const& v) {\n  detail::tvec3<T, P> const real_v3(q.real.x, q.real.y, q.real.z);\n  detail::tvec3<T, P> const dual_v3(q.dual.x, q.dual.y, q.dual.z);\n  return (cross(real_v3, cross(real_v3, v) + v * q.real.w + dual_v3) +\n          dual_v3 * q.real.w - real_v3 * q.dual.w) *\n             T(2) +\n         v;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> operator*(\n    detail::tvec3<T, P> const& v, detail::tdualquat<T, P> const& q) {\n  return glm::inverse(q) * v;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> operator*(\n    detail::tdualquat<T, P> const& q, detail::tvec4<T, P> const& v) {\n  return detail::tvec4<T, P>(q * detail::tvec3<T, P>(v), v.w);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> operator*(\n    detail::tvec4<T, P> const& v, detail::tdualquat<T, P> const& q) {\n  return glm::inverse(q) * v;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tdualquat<T, P> operator*(\n    detail::tdualquat<T, P> const& q, T const& s) {\n  return detail::tdualquat<T, P>(q.real * s, q.dual * s);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tdualquat<T, P> operator*(\n    T const& s, detail::tdualquat<T, P> const& q) {\n  return q * s;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tdualquat<T, P> operator/(\n    detail::tdualquat<T, P> const& q, T const& s) {\n  return detail::tdualquat<T, P>(q.real / s, q.dual / s);\n}\n\n//////////////////////////////////////\n// Boolean operators\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool operator==(detail::tdualquat<T, P> const& q1,\n                                   detail::tdualquat<T, P> const& q2) {\n  return (q1.real == q2.real) && (q1.dual == q2.dual);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool operator!=(detail::tdualquat<T, P> const& q1,\n                                   detail::tdualquat<T, P> const& q2) {\n  return (q1.real != q2.dual) || (q1.real != q2.dual);\n}\n}  // namespace detail\n\n////////////////////////////////////////////////////////\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tdualquat<T, P> normalize(\n    detail::tdualquat<T, P> const& q) {\n  return q / length(q.real);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tdualquat<T, P> lerp(\n    detail::tdualquat<T, P> const& x, detail::tdualquat<T, P> const& y,\n    T const& a) {\n  // Dual Quaternion Linear blend aka DLB:\n  // Lerp is only defined in [0, 1]\n  assert(a >= static_cast<T>(0));\n  assert(a <= static_cast<T>(1));\n  T const k = dot(x.real, y.real) < static_cast<T>(0) ? -a : a;\n  T const one(1);\n  return detail::tdualquat<T, P>(x * (one - a) + y * k);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tdualquat<T, P> inverse(\n    detail::tdualquat<T, P> const& q) {\n  const glm::detail::tquat<T, P> real = conjugate(q.real);\n  const glm::detail::tquat<T, P> dual = conjugate(q.dual);\n  return detail::tdualquat<T, P>(real,\n                                 dual + (real * (-2.0f * dot(real, dual))));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat2x4<T, P> mat2x4_cast(\n    detail::tdualquat<T, P> const& x) {\n  return detail::tmat2x4<T, P>(x[0].x, x[0].y, x[0].z, x[0].w, x[1].x, x[1].y,\n                               x[1].z, x[1].w);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat3x4<T, P> mat3x4_cast(\n    detail::tdualquat<T, P> const& x) {\n  detail::tquat<T, P> r = x.real / length2(x.real);\n\n  detail::tquat<T, P> const rr(r.w * x.real.w, r.x * x.real.x, r.y * x.real.y,\n                               r.z * x.real.z);\n  r *= static_cast<T>(2);\n\n  T const xy = r.x * x.real.y;\n  T const xz = r.x * x.real.z;\n  T const yz = r.y * x.real.z;\n  T const wx = r.w * x.real.x;\n  T const wy = r.w * x.real.y;\n  T const wz = r.w * x.real.z;\n\n  detail::tvec4<T, P> const a(\n      rr.w + rr.x - rr.y - rr.z, xy - wz, xz + wy,\n      -(x.dual.w * r.x - x.dual.x * r.w + x.dual.y * r.z - x.dual.z * r.y));\n\n  detail::tvec4<T, P> const b(\n      xy + wz, rr.w + rr.y - rr.x - rr.z, yz - wx,\n      -(x.dual.w * r.y - x.dual.x * r.z - x.dual.y * r.w + x.dual.z * r.x));\n\n  detail::tvec4<T, P> const c(\n      xz - wy, yz + wx, rr.w + rr.z - rr.x - rr.y,\n      -(x.dual.w * r.z + x.dual.x * r.y - x.dual.y * r.x - x.dual.z * r.w));\n\n  return detail::tmat3x4<T, P>(a, b, c);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tdualquat<T, P> dualquat_cast(\n    detail::tmat2x4<T, P> const& x) {\n  return detail::tdualquat<T, P>(\n      detail::tquat<T, P>(x[0].w, x[0].x, x[0].y, x[0].z),\n      detail::tquat<T, P>(x[1].w, x[1].x, x[1].y, x[1].z));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tdualquat<T, P> dualquat_cast(\n    detail::tmat3x4<T, P> const& x) {\n  detail::tquat<T, P> real;\n\n  T const trace = x[0].x + x[1].y + x[2].z;\n  if (trace > T(0)) {\n    T const r = sqrt(T(1) + trace);\n    T const invr = static_cast<T>(0.5) / r;\n    real.w = static_cast<T>(0.5) * r;\n    real.x = (x[2].y - x[1].z) * invr;\n    real.y = (x[0].z - x[2].x) * invr;\n    real.z = (x[1].x - x[0].y) * invr;\n  } else if (x[0].x > x[1].y && x[0].x > x[2].z) {\n    T const r = sqrt(T(1) + x[0].x - x[1].y - x[2].z);\n    T const invr = static_cast<T>(0.5) / r;\n    real.x = static_cast<T>(0.5) * r;\n    real.y = (x[1].x + x[0].y) * invr;\n    real.z = (x[0].z + x[2].x) * invr;\n    real.w = (x[2].y - x[1].z) * invr;\n  } else if (x[1].y > x[2].z) {\n    T const r = sqrt(T(1) + x[1].y - x[0].x - x[2].z);\n    T const invr = static_cast<T>(0.5) / r;\n    real.x = (x[1].x + x[0].y) * invr;\n    real.y = static_cast<T>(0.5) * r;\n    real.z = (x[2].y + x[1].z) * invr;\n    real.w = (x[0].z - x[2].x) * invr;\n  } else {\n    T const r = sqrt(T(1) + x[2].z - x[0].x - x[1].y);\n    T const invr = static_cast<T>(0.5) / r;\n    real.x = (x[0].z + x[2].x) * invr;\n    real.y = (x[2].y + x[1].z) * invr;\n    real.z = static_cast<T>(0.5) * r;\n    real.w = (x[1].x - x[0].y) * invr;\n  }\n\n  detail::tquat<T, P> dual;\n  dual.x = T(0.5) * (x[0].w * real.w + x[1].w * real.z - x[2].w * real.y);\n  dual.y = T(0.5) * (-x[0].w * real.z + x[1].w * real.w + x[2].w * real.x);\n  dual.z = T(0.5) * (x[0].w * real.y - x[1].w * real.x + x[2].w * real.w);\n  dual.w = -T(0.5) * (x[0].w * real.x + x[1].w * real.y + x[2].w * real.z);\n  return detail::tdualquat<T, P>(real, dual);\n}\n\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/epsilon.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///////////////////////////////////////////////////////////////////////////////////\n\n#if (defined(GLM_MESSAGES))\n#pragma message( \\\n        \"GLM: GLM_GTX_epsilon extension is deprecated, include GLM_GTC_epsilon (glm/gtc/epsilon) instead\")\n#endif\n\n// Promoted:\n#include \"../gtc/epsilon.hpp\"\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/euler_angles.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_euler_angles\n/// @file glm/gtx/euler_angles.hpp\n/// @date 2005-12-21 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtc_half_float (dependence)\n///\n/// @defgroup gtx_euler_angles GLM_GTX_euler_angles\n/// @ingroup gtx\n///\n/// @brief Build matrices from Euler angles.\n///\n/// <glm/gtx/euler_angles.hpp> need to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_euler_angles\n#define GLM_GTX_euler_angles\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_euler_angles extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_euler_angles\n/// @{\n\n/// Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle X.\n/// @see gtx_euler_angles\ntemplate <typename T>\nGLM_FUNC_DECL detail::tmat4x4<T, defaultp> eulerAngleX(T const& angleX);\n\n/// Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle Y.\n/// @see gtx_euler_angles\ntemplate <typename T>\nGLM_FUNC_DECL detail::tmat4x4<T, defaultp> eulerAngleY(T const& angleY);\n\n/// Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle Z.\n/// @see gtx_euler_angles\ntemplate <typename T>\nGLM_FUNC_DECL detail::tmat4x4<T, defaultp> eulerAngleZ(T const& angleZ);\n\n/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Y).\n/// @see gtx_euler_angles\ntemplate <typename T>\nGLM_FUNC_DECL detail::tmat4x4<T, defaultp> eulerAngleXY(T const& angleX,\n                                                        T const& angleY);\n\n/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X).\n/// @see gtx_euler_angles\ntemplate <typename T>\nGLM_FUNC_DECL detail::tmat4x4<T, defaultp> eulerAngleYX(T const& angleY,\n                                                        T const& angleX);\n\n/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Z).\n/// @see gtx_euler_angles\ntemplate <typename T>\nGLM_FUNC_DECL detail::tmat4x4<T, defaultp> eulerAngleXZ(T const& angleX,\n                                                        T const& angleZ);\n\n/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * X).\n/// @see gtx_euler_angles\ntemplate <typename T>\nGLM_FUNC_DECL detail::tmat4x4<T, defaultp> eulerAngleZX(T const& angle,\n                                                        T const& angleX);\n\n/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * Z).\n/// @see gtx_euler_angles\ntemplate <typename T>\nGLM_FUNC_DECL detail::tmat4x4<T, defaultp> eulerAngleYZ(T const& angleY,\n                                                        T const& angleZ);\n\n/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * Y).\n/// @see gtx_euler_angles\ntemplate <typename T>\nGLM_FUNC_DECL detail::tmat4x4<T, defaultp> eulerAngleZY(T const& angleZ,\n                                                        T const& angleY);\n\n/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X *\n/// Z).\n/// @see gtx_euler_angles\ntemplate <typename T>\nGLM_FUNC_DECL detail::tmat4x4<T, defaultp> eulerAngleYXZ(T const& yaw,\n                                                         T const& pitch,\n                                                         T const& roll);\n\n/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X *\n/// Z).\n/// @see gtx_euler_angles\ntemplate <typename T>\nGLM_FUNC_DECL detail::tmat4x4<T, defaultp> yawPitchRoll(T const& yaw,\n                                                        T const& pitch,\n                                                        T const& roll);\n\n/// Creates a 2D 2 * 2 rotation matrix from an euler angle.\n/// @see gtx_euler_angles\ntemplate <typename T>\nGLM_FUNC_DECL detail::tmat2x2<T, defaultp> orientate2(T const& angle);\n\n/// Creates a 2D 4 * 4 homogeneous rotation matrix from an euler angle.\n/// @see gtx_euler_angles\ntemplate <typename T>\nGLM_FUNC_DECL detail::tmat3x3<T, defaultp> orientate3(T const& angle);\n\n/// Creates a 3D 3 * 3 rotation matrix from euler angles (Y * X * Z).\n/// @see gtx_euler_angles\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat3x3<T, P> orientate3(\n    detail::tvec3<T, P> const& angles);\n\n/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X *\n/// Z).\n/// @see gtx_euler_angles\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x4<T, P> orientate4(\n    detail::tvec3<T, P> const& angles);\n\n/// @}\n}  // namespace glm\n\n#include \"euler_angles.inl\"\n\n#endif  // GLM_GTX_euler_angles\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/euler_angles.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2005-12-21\n// Updated : 2007-08-14\n// Licence : This source is under MIT License\n// File    : glm/gtx/euler_angles.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, defaultp> eulerAngleX(T const& angleX) {\n  T cosX = glm::cos(angleX);\n  T sinX = glm::sin(angleX);\n\n  return detail::tmat4x4<T, defaultp>(T(1), T(0), T(0), T(0), T(0), cosX, sinX,\n                                      T(0), T(0), -sinX, cosX, T(0), T(0), T(0),\n                                      T(0), T(1));\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, defaultp> eulerAngleY(T const& angleY) {\n  T cosY = glm::cos(angleY);\n  T sinY = glm::sin(angleY);\n\n  return detail::tmat4x4<T, defaultp>(cosY, T(0), -sinY, T(0), T(0), T(1), T(0),\n                                      T(0), sinY, T(0), cosY, T(0), T(0), T(0),\n                                      T(0), T(1));\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, defaultp> eulerAngleZ(T const& angleZ) {\n  T cosZ = glm::cos(angleZ);\n  T sinZ = glm::sin(angleZ);\n\n  return detail::tmat4x4<T, defaultp>(cosZ, sinZ, T(0), T(0), -sinZ, cosZ, T(0),\n                                      T(0), T(0), T(0), T(1), T(0), T(0), T(0),\n                                      T(0), T(1));\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, defaultp> eulerAngleXY(T const& angleX,\n                                                             T const& angleY) {\n  T cosX = glm::cos(angleX);\n  T sinX = glm::sin(angleX);\n  T cosY = glm::cos(angleY);\n  T sinY = glm::sin(angleY);\n\n  return detail::tmat4x4<T, defaultp>(\n      cosY, -sinX * -sinY, cosX * -sinY, T(0), T(0), cosX, sinX, T(0), sinY,\n      -sinX * cosY, cosX * cosY, T(0), T(0), T(0), T(0), T(1));\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, defaultp> eulerAngleYX(T const& angleY,\n                                                             T const& angleX) {\n  T cosX = glm::cos(angleX);\n  T sinX = glm::sin(angleX);\n  T cosY = glm::cos(angleY);\n  T sinY = glm::sin(angleY);\n\n  return detail::tmat4x4<T, defaultp>(\n      cosY, 0, -sinY, T(0), sinY * sinX, cosX, cosY * sinX, T(0), sinY * cosX,\n      -sinX, cosY * cosX, T(0), T(0), T(0), T(0), T(1));\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, defaultp> eulerAngleXZ(T const& angleX,\n                                                             T const& angleZ) {\n  return eulerAngleX(angleX) * eulerAngleZ(angleZ);\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, defaultp> eulerAngleZX(T const& angleZ,\n                                                             T const& angleX) {\n  return eulerAngleZ(angleZ) * eulerAngleX(angleX);\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, defaultp> eulerAngleYZ(T const& angleY,\n                                                             T const& angleZ) {\n  return eulerAngleY(angleY) * eulerAngleZ(angleZ);\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, defaultp> eulerAngleZY(T const& angleZ,\n                                                             T const& angleY) {\n  return eulerAngleZ(angleZ) * eulerAngleY(angleY);\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, defaultp> eulerAngleYXZ(T const& yaw,\n                                                              T const& pitch,\n                                                              T const& roll) {\n  T tmp_ch = glm::cos(yaw);\n  T tmp_sh = glm::sin(yaw);\n  T tmp_cp = glm::cos(pitch);\n  T tmp_sp = glm::sin(pitch);\n  T tmp_cb = glm::cos(roll);\n  T tmp_sb = glm::sin(roll);\n\n  detail::tmat4x4<T, defaultp> Result;\n  Result[0][0] = tmp_ch * tmp_cb + tmp_sh * tmp_sp * tmp_sb;\n  Result[0][1] = tmp_sb * tmp_cp;\n  Result[0][2] = -tmp_sh * tmp_cb + tmp_ch * tmp_sp * tmp_sb;\n  Result[0][3] = static_cast<T>(0);\n  Result[1][0] = -tmp_ch * tmp_sb + tmp_sh * tmp_sp * tmp_cb;\n  Result[1][1] = tmp_cb * tmp_cp;\n  Result[1][2] = tmp_sb * tmp_sh + tmp_ch * tmp_sp * tmp_cb;\n  Result[1][3] = static_cast<T>(0);\n  Result[2][0] = tmp_sh * tmp_cp;\n  Result[2][1] = -tmp_sp;\n  Result[2][2] = tmp_ch * tmp_cp;\n  Result[2][3] = static_cast<T>(0);\n  Result[3][0] = static_cast<T>(0);\n  Result[3][1] = static_cast<T>(0);\n  Result[3][2] = static_cast<T>(0);\n  Result[3][3] = static_cast<T>(1);\n  return Result;\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, defaultp> yawPitchRoll(T const& yaw,\n                                                             T const& pitch,\n                                                             T const& roll) {\n  T tmp_ch = glm::cos(yaw);\n  T tmp_sh = glm::sin(yaw);\n  T tmp_cp = glm::cos(pitch);\n  T tmp_sp = glm::sin(pitch);\n  T tmp_cb = glm::cos(roll);\n  T tmp_sb = glm::sin(roll);\n\n  detail::tmat4x4<T, defaultp> Result;\n  Result[0][0] = tmp_ch * tmp_cb + tmp_sh * tmp_sp * tmp_sb;\n  Result[0][1] = tmp_sb * tmp_cp;\n  Result[0][2] = -tmp_sh * tmp_cb + tmp_ch * tmp_sp * tmp_sb;\n  Result[0][3] = static_cast<T>(0);\n  Result[1][0] = -tmp_ch * tmp_sb + tmp_sh * tmp_sp * tmp_cb;\n  Result[1][1] = tmp_cb * tmp_cp;\n  Result[1][2] = tmp_sb * tmp_sh + tmp_ch * tmp_sp * tmp_cb;\n  Result[1][3] = static_cast<T>(0);\n  Result[2][0] = tmp_sh * tmp_cp;\n  Result[2][1] = -tmp_sp;\n  Result[2][2] = tmp_ch * tmp_cp;\n  Result[2][3] = static_cast<T>(0);\n  Result[3][0] = static_cast<T>(0);\n  Result[3][1] = static_cast<T>(0);\n  Result[3][2] = static_cast<T>(0);\n  Result[3][3] = static_cast<T>(1);\n  return Result;\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tmat2x2<T, defaultp> orientate2(T const& angle) {\n  T c = glm::cos(angle);\n  T s = glm::sin(angle);\n\n  detail::tmat2x2<T, defaultp> Result;\n  Result[0][0] = c;\n  Result[0][1] = s;\n  Result[1][0] = -s;\n  Result[1][1] = c;\n  return Result;\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::tmat3x3<T, defaultp> orientate3(T const& angle) {\n  T c = glm::cos(angle);\n  T s = glm::sin(angle);\n\n  detail::tmat3x3<T, defaultp> Result;\n  Result[0][0] = c;\n  Result[0][1] = s;\n  Result[0][2] = 0.0f;\n  Result[1][0] = -s;\n  Result[1][1] = c;\n  Result[1][2] = 0.0f;\n  Result[2][0] = 0.0f;\n  Result[2][1] = 0.0f;\n  Result[2][2] = 1.0f;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat3x3<T, P> orientate3(\n    detail::tvec3<T, P> const& angles) {\n  return detail::tmat3x3<T, P>(yawPitchRoll(angles.x, angles.y, angles.z));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> orientate4(\n    detail::tvec3<T, P> const& angles) {\n  return yawPitchRoll(angles.z, angles.x, angles.y);\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/extend.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_extend\n/// @file glm/gtx/extend.hpp\n/// @date 2006-01-07 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_extend GLM_GTX_extend\n/// @ingroup gtx\n///\n/// @brief Extend a position from a source to a position at a defined length.\n///\n/// <glm/gtx/extend.hpp> need to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_extend\n#define GLM_GTX_extend\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_extend extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_extend\n/// @{\n\n/// Extends of Length the Origin position using the (Source - Origin) direction.\n/// @see gtx_extend\ntemplate <typename genType>\nGLM_FUNC_DECL genType extend(genType const& Origin, genType const& Source,\n                             typename genType::value_type const Length);\n\n/// @}\n}  // namespace glm\n\n#include \"extend.inl\"\n\n#endif  // GLM_GTX_extend\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/extend.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2006-01-07\n// Updated : 2008-10-05\n// Licence : This source is under MIT License\n// File    : glm/gtx/extend.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType extend(genType const& Origin, genType const& Source,\n                                  genType const& Distance) {\n  return Origin + (Source - Origin) * Distance;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<T, P> extend(detail::tvec2<T, P> const& Origin,\n                                              detail::tvec2<T, P> const& Source,\n                                              T const& Distance) {\n  return Origin + (Source - Origin) * Distance;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> extend(detail::tvec3<T, P> const& Origin,\n                                              detail::tvec3<T, P> const& Source,\n                                              T const& Distance) {\n  return Origin + (Source - Origin) * Distance;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> extend(detail::tvec4<T, P> const& Origin,\n                                              detail::tvec4<T, P> const& Source,\n                                              T const& Distance) {\n  return Origin + (Source - Origin) * Distance;\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/extented_min_max.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_extented_min_max\n/// @file glm/gtx/extented_min_max.hpp\n/// @date 2007-03-14 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtx_half_float (dependence)\n///\n/// @defgroup gtx_extented_min_max GLM_GTX_extented_min_max\n/// @ingroup gtx\n///\n/// Min and max functions for 3 to 4 parameters.\n///\n/// <glm/gtx/extented_min_max.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_extented_min_max\n#define GLM_GTX_extented_min_max\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_extented_min_max extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_extented_min_max\n/// @{\n\n/// Return the minimum component-wise values of 3 inputs\n/// @see gtx_extented_min_max\ntemplate <typename T>\nGLM_FUNC_DECL T min(T const& x, T const& y, T const& z);\n\n/// Return the minimum component-wise values of 3 inputs\n/// @see gtx_extented_min_max\ntemplate <typename T, template <typename> class C>\nGLM_FUNC_DECL C<T> min(C<T> const& x, typename C<T>::T const& y,\n                       typename C<T>::T const& z);\n\n/// Return the minimum component-wise values of 3 inputs\n/// @see gtx_extented_min_max\ntemplate <typename T, template <typename> class C>\nGLM_FUNC_DECL C<T> min(C<T> const& x, C<T> const& y, C<T> const& z);\n\n/// Return the minimum component-wise values of 4 inputs\n/// @see gtx_extented_min_max\ntemplate <typename T>\nGLM_FUNC_DECL T min(T const& x, T const& y, T const& z, T const& w);\n\n/// Return the minimum component-wise values of 4 inputs\n/// @see gtx_extented_min_max\ntemplate <typename T, template <typename> class C>\nGLM_FUNC_DECL C<T> min(C<T> const& x, typename C<T>::T const& y,\n                       typename C<T>::T const& z, typename C<T>::T const& w);\n\n/// Return the minimum component-wise values of 4 inputs\n/// @see gtx_extented_min_max\ntemplate <typename T, template <typename> class C>\nGLM_FUNC_DECL C<T> min(C<T> const& x, C<T> const& y, C<T> const& z,\n                       C<T> const& w);\n\n/// Return the maximum component-wise values of 3 inputs\n/// @see gtx_extented_min_max\ntemplate <typename T>\nGLM_FUNC_DECL T max(T const& x, T const& y, T const& z);\n\n/// Return the maximum component-wise values of 3 inputs\n/// @see gtx_extented_min_max\ntemplate <typename T, template <typename> class C>\nGLM_FUNC_DECL C<T> max(C<T> const& x, typename C<T>::T const& y,\n                       typename C<T>::T const& z);\n\n/// Return the maximum component-wise values of 3 inputs\n/// @see gtx_extented_min_max\ntemplate <typename T, template <typename> class C>\nGLM_FUNC_DECL C<T> max(C<T> const& x, C<T> const& y, C<T> const& z);\n\n/// Return the maximum component-wise values of 4 inputs\n/// @see gtx_extented_min_max\ntemplate <typename T>\nGLM_FUNC_DECL T max(T const& x, T const& y, T const& z, T const& w);\n\n/// Return the maximum component-wise values of 4 inputs\n/// @see gtx_extented_min_max\ntemplate <typename T, template <typename> class C>\nGLM_FUNC_DECL C<T> max(C<T> const& x, typename C<T>::T const& y,\n                       typename C<T>::T const& z, typename C<T>::T const& w);\n\n/// Return the maximum component-wise values of 4 inputs\n/// @see gtx_extented_min_max\ntemplate <typename T, template <typename> class C>\nGLM_FUNC_DECL C<T> max(C<T> const& x, C<T> const& y, C<T> const& z,\n                       C<T> const& w);\n\n/// @}\n}  // namespace glm\n\n#include \"extented_min_max.inl\"\n\n#endif  // GLM_GTX_extented_min_max\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/extented_min_max.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2007-03-14\n// Updated : 2010-02-19\n// Licence : This source is under MIT License\n// File    : gtx_extented_min_max.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\ntemplate <typename T>\nGLM_FUNC_QUALIFIER T min(T const& x, T const& y, T const& z) {\n  return glm::min(glm::min(x, y), z);\n}\n\ntemplate <typename T, template <typename> class C>\nGLM_FUNC_QUALIFIER C<T> min(C<T> const& x, typename C<T>::T const& y,\n                            typename C<T>::T const& z) {\n  return glm::min(glm::min(x, y), z);\n}\n\ntemplate <typename T, template <typename> class C>\nGLM_FUNC_QUALIFIER C<T> min(C<T> const& x, C<T> const& y, C<T> const& z) {\n  return glm::min(glm::min(x, y), z);\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER T min(T const& x, T const& y, T const& z, T const& w) {\n  return glm::min(glm::min(x, y), glm::min(z, w));\n}\n\ntemplate <typename T, template <typename> class C>\nGLM_FUNC_QUALIFIER C<T> min(C<T> const& x, typename C<T>::T const& y,\n                            typename C<T>::T const& z,\n                            typename C<T>::T const& w) {\n  return glm::min(glm::min(x, y), glm::min(z, w));\n}\n\ntemplate <typename T, template <typename> class C>\nGLM_FUNC_QUALIFIER C<T> min(C<T> const& x, C<T> const& y, C<T> const& z,\n                            C<T> const& w) {\n  return glm::min(glm::min(x, y), glm::min(z, w));\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER T max(T const& x, T const& y, T const& z) {\n  return glm::max(glm::max(x, y), z);\n}\n\ntemplate <typename T, template <typename> class C>\nGLM_FUNC_QUALIFIER C<T> max(C<T> const& x, typename C<T>::T const& y,\n                            typename C<T>::T const& z) {\n  return glm::max(glm::max(x, y), z);\n}\n\ntemplate <typename T, template <typename> class C>\nGLM_FUNC_QUALIFIER C<T> max(C<T> const& x, C<T> const& y, C<T> const& z) {\n  return glm::max(glm::max(x, y), z);\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER T max(T const& x, T const& y, T const& z, T const& w) {\n  return glm::max(glm::max(x, y), glm::max(z, w));\n}\n\ntemplate <typename T, template <typename> class C>\nGLM_FUNC_QUALIFIER C<T> max(C<T> const& x, typename C<T>::T const& y,\n                            typename C<T>::T const& z,\n                            typename C<T>::T const& w) {\n  return glm::max(glm::max(x, y), glm::max(z, w));\n}\n\ntemplate <typename T, template <typename> class C>\nGLM_FUNC_QUALIFIER C<T> max(C<T> const& x, C<T> const& y, C<T> const& z,\n                            C<T> const& w) {\n  return glm::max(glm::max(x, y), glm::max(z, w));\n}\n\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/fast_exponential.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_fast_exponential\n/// @file glm/gtx/fast_exponential.hpp\n/// @date 2006-01-09 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtx_half_float (dependence)\n///\n/// @defgroup gtx_fast_exponential GLM_GTX_fast_exponential\n/// @ingroup gtx\n///\n/// @brief Fast but less accurate implementations of exponential based\n/// functions.\n///\n/// <glm/gtx/fast_exponential.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_fast_exponential\n#define GLM_GTX_fast_exponential\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_fast_exponential extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_fast_exponential\n/// @{\n\n/// Faster than the common pow function but less accurate.\n/// @see gtx_fast_exponential\ntemplate <typename genType>\nGLM_FUNC_DECL genType fastPow(genType const& x, genType const& y);\n\n/// Faster than the common pow function but less accurate.\n/// @see gtx_fast_exponential\ntemplate <typename genTypeT, typename genTypeU>\nGLM_FUNC_DECL genTypeT fastPow(genTypeT const& x, genTypeU const& y);\n\n/// Faster than the common exp function but less accurate.\n/// @see gtx_fast_exponential\ntemplate <typename T>\nGLM_FUNC_DECL T fastExp(const T& x);\n\n/// Faster than the common log function but less accurate.\n/// @see gtx_fast_exponential\ntemplate <typename T>\nGLM_FUNC_DECL T fastLog(const T& x);\n\n/// Faster than the common exp2 function but less accurate.\n/// @see gtx_fast_exponential\ntemplate <typename T>\nGLM_FUNC_DECL T fastExp2(const T& x);\n\n/// Faster than the common log2 function but less accurate.\n/// @see gtx_fast_exponential\ntemplate <typename T>\nGLM_FUNC_DECL T fastLog2(const T& x);\n\n/// Faster than the common ln function but less accurate.\n/// @see gtx_fast_exponential\ntemplate <typename T>\nGLM_FUNC_DECL T fastLn(const T& x);\n\n/// @}\n}  // namespace glm\n\n#include \"fast_exponential.inl\"\n\n#endif  // GLM_GTX_fast_exponential\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/fast_exponential.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2006-01-09\n// Updated : 2006-01-09\n// Licence : This source is under MIT License\n// File    : glm/gtx/fast_exponential.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\n// fastPow:\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType fastPow(genType const& x, genType const& y) {\n  return exp(y * log(x));\n}\n\nVECTORIZE_VEC_VEC(fastPow)\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER T fastPow(const T x, int y) {\n  T f = static_cast<T>(1);\n  for (int i = 0; i < y; ++i) f *= x;\n  return f;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<T, P> fastPow(const detail::tvec2<T, P>& x,\n                                               const detail::tvec2<int, P>& y) {\n  return detail::tvec2<T, P>(fastPow(x.x, y.x), fastPow(x.y, y.y));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> fastPow(const detail::tvec3<T, P>& x,\n                                               const detail::tvec3<int, P>& y) {\n  return detail::tvec3<T, P>(fastPow(x.x, y.x), fastPow(x.y, y.y),\n                             fastPow(x.z, y.z));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> fastPow(const detail::tvec4<T, P>& x,\n                                               const detail::tvec4<int, P>& y) {\n  return detail::tvec4<T, P>(fastPow(x.x, y.x), fastPow(x.y, y.y),\n                             fastPow(x.z, y.z), fastPow(x.w, y.w));\n}\n\n// fastExp\n// Note: This function provides accurate results only for value between -1 and\n// 1, else avoid it.\ntemplate <typename T>\nGLM_FUNC_QUALIFIER T fastExp(const T x) {\n  // This has a better looking and same performance in release mode than the\n  // following code. However, in debug mode it's slower. return 1.0f + x * (1.0f\n  // + x * 0.5f * (1.0f + x * 0.3333333333f * (1.0f + x * 0.25 * (1.0f + x *\n  // 0.2f))));\n  T x2 = x * x;\n  T x3 = x2 * x;\n  T x4 = x3 * x;\n  T x5 = x4 * x;\n  return T(1) + x + (x2 * T(0.5)) + (x3 * T(0.1666666667)) +\n         (x4 * T(0.041666667)) + (x5 * T(0.008333333333));\n}\n/*  // Try to handle all values of float... but often shower than std::exp,\nglm::floor and the loop kill the performance GLM_FUNC_QUALIFIER float\nfastExp(float x)\n{\n        const float e = 2.718281828f;\n        const float IntegerPart = floor(x);\n        const float FloatPart = x - IntegerPart;\n        float z = 1.f;\n\n        for(int i = 0; i < int(IntegerPart); ++i)\n                z *= e;\n\n        const float x2 = FloatPart * FloatPart;\n        const float x3 = x2 * FloatPart;\n        const float x4 = x3 * FloatPart;\n        const float x5 = x4 * FloatPart;\n        return z * (1.0f + FloatPart + (x2 * 0.5f) + (x3 * 0.1666666667f) + (x4\n* 0.041666667f) + (x5 * 0.008333333333f));\n}\n\n// Increase accuracy on number bigger that 1 and smaller than -1 but it's not\nenough for high and negative numbers GLM_FUNC_QUALIFIER float fastExp(float x)\n{\n        // This has a better looking and same performance in release mode than\nthe following code. However, in debug mode it's slower.\n        // return 1.0f + x * (1.0f + x * 0.5f * (1.0f + x * 0.3333333333f *\n(1.0f + x * 0.25 * (1.0f + x * 0.2f)))); float x2 = x * x; float x3 = x2 * x;\n        float x4 = x3 * x;\n        float x5 = x4 * x;\n        float x6 = x5 * x;\n        float x7 = x6 * x;\n        float x8 = x7 * x;\n        return 1.0f + x + (x2 * 0.5f) + (x3 * 0.1666666667f) + (x4 *\n0.041666667f) + (x5 * 0.008333333333f)+ (x6 * 0.00138888888888f) + (x7 *\n0.000198412698f) + (x8 * 0.0000248015873f);;\n}\n*/\n\nVECTORIZE_VEC(fastExp)\n\n// fastLog\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType fastLog(genType const& x) {\n  return std::log(x);\n}\n\n/* Slower than the VC7.1 function...\nGLM_FUNC_QUALIFIER float fastLog(float x)\n{\n        float y1 = (x - 1.0f) / (x + 1.0f);\n        float y2 = y1 * y1;\n        return 2.0f * y1 * (1.0f + y2 * (0.3333333333f + y2 * (0.2f + y2 *\n0.1428571429f)));\n}\n*/\n\nVECTORIZE_VEC(fastLog)\n\n// fastExp2, ln2 = 0.69314718055994530941723212145818f\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType fastExp2(genType const& x) {\n  return fastExp(0.69314718055994530941723212145818f * x);\n}\n\nVECTORIZE_VEC(fastExp2)\n\n// fastLog2, ln2 = 0.69314718055994530941723212145818f\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType fastLog2(genType const& x) {\n  return fastLog(x) / 0.69314718055994530941723212145818f;\n}\n\nVECTORIZE_VEC(fastLog2)\n\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/fast_square_root.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_fast_square_root\n/// @file glm/gtx/fast_square_root.hpp\n/// @date 2006-01-04 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_fast_square_root GLM_GTX_fast_square_root\n/// @ingroup gtx\n///\n/// @brief Fast but less accurate implementations of square root based\n/// functions.\n/// - Sqrt optimisation based on Newton's method,\n/// www.gamedev.net/community/forums/topic.asp?topic id=139956\n///\n/// <glm/gtx/fast_square_root.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_fast_square_root\n#define GLM_GTX_fast_square_root\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_fast_square_root extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_fast_square_root\n/// @{\n\n//! Faster than the common sqrt function but less accurate.\n//! From GLM_GTX_fast_square_root extension.\ntemplate <typename genType>\nGLM_FUNC_DECL genType fastSqrt(genType const& x);\n\n//! Faster than the common inversesqrt function but less accurate.\n//! From GLM_GTX_fast_square_root extension.\ntemplate <typename genType>\nGLM_FUNC_DECL genType fastInverseSqrt(genType const& x);\n\n//! Faster than the common inversesqrt function but less accurate.\n//! From GLM_GTX_fast_square_root extension.\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_DECL vecType<T, P> fastInverseSqrt(vecType<T, P> const& x);\n\n//! Faster than the common length function but less accurate.\n//! From GLM_GTX_fast_square_root extension.\ntemplate <typename genType>\nGLM_FUNC_DECL typename genType::value_type fastLength(genType const& x);\n\n//! Faster than the common distance function but less accurate.\n//! From GLM_GTX_fast_square_root extension.\ntemplate <typename genType>\nGLM_FUNC_DECL typename genType::value_type fastDistance(genType const& x,\n                                                        genType const& y);\n\n//! Faster than the common normalize function but less accurate.\n//! From GLM_GTX_fast_square_root extension.\ntemplate <typename genType>\nGLM_FUNC_DECL genType fastNormalize(genType const& x);\n\n/// @}\n}  // namespace glm\n\n#include \"fast_square_root.inl\"\n\n#endif  // GLM_GTX_fast_square_root\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/fast_square_root.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2006-01-04\n// Updated : 2011-10-14\n// Licence : This source is under MIT License\n// File    : glm/gtx/fast_square_root.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\n// fastSqrt\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType fastSqrt(genType const& x) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'fastSqrt' only accept floating-point input\");\n\n  return genType(1) / fastInverseSqrt(x);\n}\n\nVECTORIZE_VEC(fastSqrt)\n\n// fastInversesqrt\ntemplate <>\nGLM_FUNC_QUALIFIER float fastInverseSqrt<float>(float const& x) {\n#ifdef __CUDACC__  // Wordaround for a CUDA compiler bug up to CUDA6\n  detail::tvec1<T, P> tmp(\n      detail::compute_inversesqrt<detail::tvec1, float, lowp>::call(\n          detail::tvec1<float, lowp>(x)));\n  return tmp.x;\n#else\n  return detail::compute_inversesqrt<detail::tvec1, float, lowp>::call(\n             detail::tvec1<float, lowp>(x))\n      .x;\n#endif\n}\n\ntemplate <>\nGLM_FUNC_QUALIFIER double fastInverseSqrt<double>(double const& x) {\n#ifdef __CUDACC__  // Wordaround for a CUDA compiler bug up to CUDA6\n  detail::tvec1<T, P> tmp(\n      detail::compute_inversesqrt<detail::tvec1, double, lowp>::call(\n          detail::tvec1<double, lowp>(x)));\n  return tmp.x;\n#else\n  return detail::compute_inversesqrt<detail::tvec1, double, lowp>::call(\n             detail::tvec1<double, lowp>(x))\n      .x;\n#endif\n}\n\ntemplate <template <class, precision> class vecType, typename T, precision P>\nGLM_FUNC_QUALIFIER vecType<T, P> fastInverseSqrt(vecType<T, P> const& x) {\n  return detail::compute_inversesqrt<vecType, T, P>::call(x);\n}\n\nVECTORIZE_VEC(fastInverseSqrt)\n\n// fastLength\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType fastLength(genType const& x) {\n  return abs(x);\n}\n\ntemplate <typename valType, precision P>\nGLM_FUNC_QUALIFIER valType fastLength(detail::tvec2<valType, P> const& x) {\n  valType sqr = x.x * x.x + x.y * x.y;\n  return fastSqrt(sqr);\n}\n\ntemplate <typename valType, precision P>\nGLM_FUNC_QUALIFIER valType fastLength(detail::tvec3<valType, P> const& x) {\n  valType sqr = x.x * x.x + x.y * x.y + x.z * x.z;\n  return fastSqrt(sqr);\n}\n\ntemplate <typename valType, precision P>\nGLM_FUNC_QUALIFIER valType fastLength(detail::tvec4<valType, P> const& x) {\n  valType sqr = x.x * x.x + x.y * x.y + x.z * x.z + x.w * x.w;\n  return fastSqrt(sqr);\n}\n\n// fastDistance\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType fastDistance(genType const& x, genType const& y) {\n  return fastLength(y - x);\n}\n\n// fastNormalize\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType fastNormalize(genType const& x) {\n  return x > genType(0) ? genType(1) : -genType(1);\n}\n\ntemplate <typename valType, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<valType, P> fastNormalize(\n    detail::tvec2<valType, P> const& x) {\n  valType sqr = x.x * x.x + x.y * x.y;\n  return x * fastInverseSqrt(sqr);\n}\n\ntemplate <typename valType, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<valType, P> fastNormalize(\n    detail::tvec3<valType, P> const& x) {\n  valType sqr = x.x * x.x + x.y * x.y + x.z * x.z;\n  return x * fastInverseSqrt(sqr);\n}\n\ntemplate <typename valType, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<valType, P> fastNormalize(\n    detail::tvec4<valType, P> const& x) {\n  valType sqr = x.x * x.x + x.y * x.y + x.z * x.z + x.w * x.w;\n  return x * fastInverseSqrt(sqr);\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/fast_trigonometry.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_fast_trigonometry\n/// @file glm/gtx/fast_trigonometry.hpp\n/// @date 2006-01-08 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_fast_trigonometry GLM_GTX_fast_trigonometry\n/// @ingroup gtx\n///\n/// @brief Fast but less accurate implementations of trigonometric functions.\n///\n/// <glm/gtx/fast_trigonometry.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_fast_trigonometry\n#define GLM_GTX_fast_trigonometry\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_fast_trigonometry extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_fast_trigonometry\n/// @{\n\n//! Faster than the common sin function but less accurate.\n//! Defined between -2pi and 2pi.\n//! From GLM_GTX_fast_trigonometry extension.\ntemplate <typename T>\nGLM_FUNC_DECL T fastSin(const T& angle);\n\n//! Faster than the common cos function but less accurate.\n//! Defined between -2pi and 2pi.\n//! From GLM_GTX_fast_trigonometry extension.\ntemplate <typename T>\nGLM_FUNC_DECL T fastCos(const T& angle);\n\n//! Faster than the common tan function but less accurate.\n//! Defined between -2pi and 2pi.\n//! From GLM_GTX_fast_trigonometry extension.\ntemplate <typename T>\nGLM_FUNC_DECL T fastTan(const T& angle);\n\n//! Faster than the common asin function but less accurate.\n//! Defined between -2pi and 2pi.\n//! From GLM_GTX_fast_trigonometry extension.\ntemplate <typename T>\nGLM_FUNC_DECL T fastAsin(const T& angle);\n\n//! Faster than the common acos function but less accurate.\n//! Defined between -2pi and 2pi.\n//! From GLM_GTX_fast_trigonometry extension.\ntemplate <typename T>\nGLM_FUNC_DECL T fastAcos(const T& angle);\n\n//! Faster than the common atan function but less accurate.\n//! Defined between -2pi and 2pi.\n//! From GLM_GTX_fast_trigonometry extension.\ntemplate <typename T>\nGLM_FUNC_DECL T fastAtan(const T& y, const T& x);\n\n//! Faster than the common atan function but less accurate.\n//! Defined between -2pi and 2pi.\n//! From GLM_GTX_fast_trigonometry extension.\ntemplate <typename T>\nGLM_FUNC_DECL T fastAtan(const T& angle);\n\n/// @}\n}  // namespace glm\n\n#include \"fast_trigonometry.inl\"\n\n#endif  // GLM_GTX_fast_trigonometry\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/fast_trigonometry.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2006-01-08\n// Updated : 2011-10-14\n// Licence : This source is under MIT License\n// File    : glm/gtx/fast_trigonometry.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\n// sin\ntemplate <typename T>\nGLM_FUNC_QUALIFIER T fastSin(T const& x) {\n  return x - ((x * x * x) / T(6)) + ((x * x * x * x * x) / T(120)) -\n         ((x * x * x * x * x * x * x) / T(5040));\n}\n\nVECTORIZE_VEC(fastSin)\n\n// cos\ntemplate <typename T>\nGLM_FUNC_QUALIFIER T fastCos(T const& x) {\n  return T(1) - (x * x * T(0.5)) + (x * x * x * x * T(0.041666666666)) -\n         (x * x * x * x * x * x * T(0.00138888888888));\n}\n\nVECTORIZE_VEC(fastCos)\n\n// tan\ntemplate <typename T>\nGLM_FUNC_QUALIFIER T fastTan(T const& x) {\n  return x + (x * x * x * T(0.3333333333)) +\n         (x * x * x * x * x * T(0.1333333333333)) +\n         (x * x * x * x * x * x * x * T(0.0539682539));\n}\n\nVECTORIZE_VEC(fastTan)\n\n// asin\ntemplate <typename T>\nGLM_FUNC_QUALIFIER T fastAsin(T const& x) {\n  return x + (x * x * x * T(0.166666667)) + (x * x * x * x * x * T(0.075)) +\n         (x * x * x * x * x * x * x * T(0.0446428571)) +\n         (x * x * x * x * x * x * x * x * x *\n          T(0.0303819444));  // + (x * x * x * x * x * x * x * x * x * x * x *\n                             // T(0.022372159));\n}\n\nVECTORIZE_VEC(fastAsin)\n\n// acos\ntemplate <typename T>\nGLM_FUNC_QUALIFIER T fastAcos(T const& x) {\n  return T(1.5707963267948966192313216916398) - fastAsin(x);  //(PI / 2)\n}\n\nVECTORIZE_VEC(fastAcos)\n\n// atan\ntemplate <typename T>\nGLM_FUNC_QUALIFIER T fastAtan(T const& y, T const& x) {\n  T sgn = sign(y) * sign(x);\n  return abs(fastAtan(y / x)) * sgn;\n}\n\nVECTORIZE_VEC_VEC(fastAtan)\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER T fastAtan(T const& x) {\n  return x - (x * x * x * T(0.333333333333)) + (x * x * x * x * x * T(0.2)) -\n         (x * x * x * x * x * x * x * T(0.1428571429)) +\n         (x * x * x * x * x * x * x * x * x * T(0.111111111111)) -\n         (x * x * x * x * x * x * x * x * x * x * x * T(0.0909090909));\n}\n\nVECTORIZE_VEC(fastAtan)\n\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/gradient_paint.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_gradient_paint\n/// @file glm/gtx/gradient_paint.hpp\n/// @date 2009-03-06 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtx_optimum_pow (dependence)\n///\n/// @defgroup gtx_gradient_paint GLM_GTX_gradient_paint\n/// @ingroup gtx\n///\n/// @brief Functions that return the color of procedural gradient for specific\n/// coordinates. <glm/gtx/gradient_paint.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_gradient_paint\n#define GLM_GTX_gradient_paint\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtx/optimum_pow.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_gradient_paint extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_gradient_paint\n/// @{\n\n/// Return a color from a radial gradient.\n/// @see - gtx_gradient_paint\ntemplate <typename T, precision P>\nGLM_FUNC_DECL T radialGradient(detail::tvec2<T, P> const& Center,\n                               T const& Radius,\n                               detail::tvec2<T, P> const& Focal,\n                               detail::tvec2<T, P> const& Position);\n\n/// Return a color from a linear gradient.\n/// @see - gtx_gradient_paint\ntemplate <typename T, precision P>\nGLM_FUNC_DECL T linearGradient(detail::tvec2<T, P> const& Point0,\n                               detail::tvec2<T, P> const& Point1,\n                               detail::tvec2<T, P> const& Position);\n\n/// @}\n}  // namespace glm\n\n#include \"gradient_paint.inl\"\n\n#endif  // GLM_GTX_gradient_paint\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/gradient_paint.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2009-03-06\n// Updated : 2013-04-09\n// Licence : This source is under MIT License\n// File    : glm/gtx/gradient_paint.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T radialGradient(detail::tvec2<T, P> const& Center,\n                                    T const& Radius,\n                                    detail::tvec2<T, P> const& Focal,\n                                    detail::tvec2<T, P> const& Position) {\n  detail::tvec2<T, P> F = Focal - Center;\n  detail::tvec2<T, P> D = Position - Focal;\n  T Radius2 = pow2(Radius);\n  T Fx2 = pow2(F.x);\n  T Fy2 = pow2(F.y);\n\n  T Numerator =\n      (D.x * F.x + D.y * F.y) +\n      sqrt(Radius2 * (pow2(D.x) + pow2(D.y)) - pow2(D.x * F.y - D.y * F.x));\n  T Denominator = Radius2 - (Fx2 + Fy2);\n  return Numerator / Denominator;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T linearGradient(detail::tvec2<T, P> const& Point0,\n                                    detail::tvec2<T, P> const& Point1,\n                                    detail::tvec2<T, P> const& Position) {\n  detail::tvec2<T, P> Dist = Point1 - Point0;\n  return (Dist.x * (Position.x - Point0.x) + Dist.y * (Position.y - Point0.y)) /\n         glm::dot(Dist, Dist);\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/handed_coordinate_space.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_handed_coordinate_space\n/// @file glm/gtx/handed_coordinate_space.hpp\n/// @date 2005-12-21 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_handed_coordinate_space GLM_GTX_handed_coordinate_space\n/// @ingroup gtx\n///\n/// @brief To know if a set of three basis vectors defines a right or\n/// left-handed coordinate system.\n///\n/// <glm/gtx/handed_coordinate_system.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_handed_coordinate_space\n#define GLM_GTX_handed_coordinate_space\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_handed_coordinate_space extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_handed_coordinate_space\n/// @{\n\n//! Return if a trihedron right handed or not.\n//! From GLM_GTX_handed_coordinate_space extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL bool rightHanded(detail::tvec3<T, P> const& tangent,\n                               detail::tvec3<T, P> const& binormal,\n                               detail::tvec3<T, P> const& normal);\n\n//! Return if a trihedron left handed or not.\n//! From GLM_GTX_handed_coordinate_space extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL bool leftHanded(detail::tvec3<T, P> const& tangent,\n                              detail::tvec3<T, P> const& binormal,\n                              detail::tvec3<T, P> const& normal);\n\n/// @}\n}  // namespace glm\n\n#include \"handed_coordinate_space.inl\"\n\n#endif  // GLM_GTX_handed_coordinate_space\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/handed_coordinate_space.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2005-12-21\n// Updated : 2009-02-19\n// Licence : This source is under MIT License\n// File    : glm/gtx/handed_coordinate_space.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool rightHanded(detail::tvec3<T, P> const& tangent,\n                                    detail::tvec3<T, P> const& binormal,\n                                    detail::tvec3<T, P> const& normal) {\n  return dot(cross(normal, tangent), binormal) > T(0);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool leftHanded(detail::tvec3<T, P> const& tangent,\n                                   detail::tvec3<T, P> const& binormal,\n                                   detail::tvec3<T, P> const& normal) {\n  return dot(cross(normal, tangent), binormal) < T(0);\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/inertia.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_inertia\n/// @file glm/gtx/inertia.hpp\n/// @date 2006-04-21 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtx_extented_min_max (dependence)\n///\n/// @defgroup gtx_inertia GLM_GTX_inertia\n/// @ingroup gtx\n///\n/// @brief Create inertia matrices\n///\n/// <glm/gtx/inertia.hpp> need to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_inertia\n#define GLM_GTX_inertia\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_inertia extension included\")\n#endif\n\nnamespace glm {\n/*\n/// @addtogroup gtx_inertia\n/// @{\n\n//! Build an inertia matrix for a box.\n//! From GLM_GTX_inertia extension.\ntemplate <typename T, precision P>\ndetail::tmat3x3<T, P> boxInertia3(\n        T const & Mass,\n        detail::tvec3<T, P> const & Scale);\n\n//! Build an inertia matrix for a box.\n//! From GLM_GTX_inertia extension.\ntemplate <typename T, precision P>\ndetail::tmat4x4<T, P> boxInertia4(\n        T const & Mass,\n        detail::tvec3<T, P> const & Scale);\n\n//! Build an inertia matrix for a disk.\n//! From GLM_GTX_inertia extension.\ntemplate <typename T, precision P>\ndetail::tmat3x3<T, P> diskInertia3(\n        T const & Mass,\n        T const & Radius);\n\n//! Build an inertia matrix for a disk.\n//! From GLM_GTX_inertia extension.\ntemplate <typename T, precision P>\ndetail::tmat4x4<T, P> diskInertia4(\n        T const & Mass,\n        T const & Radius);\n\n//! Build an inertia matrix for a ball.\n//! From GLM_GTX_inertia extension.\ntemplate <typename T, precision P>\ndetail::tmat3x3<T, P> ballInertia3(\n        T const & Mass,\n        T const & Radius);\n\n//! Build an inertia matrix for a ball.\n//! From GLM_GTX_inertia extension.\ntemplate <typename T, precision P>\ndetail::tmat4x4<T, P> ballInertia4(\n        T const & Mass,\n        T const & Radius);\n\n//! Build an inertia matrix for a sphere.\n//! From GLM_GTX_inertia extension.\ntemplate <typename T, precision P>\ndetail::tmat3x3<T, P> sphereInertia3(\n        T const & Mass,\n        T const & Radius);\n\n//! Build an inertia matrix for a sphere.\n//! From GLM_GTX_inertia extension.\ntemplate <typename T, precision P>\ndetail::tmat4x4<T, P> sphereInertia4(\n        T const & Mass,\n        T const & Radius);\n*/\n/// @}\n}  // namespace glm\n\n#include \"inertia.inl\"\n\n#endif  // GLM_GTX_inertia\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/inertia.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2006-04-21\n// Updated : 2006-12-06\n// Licence : This source is under MIT License\n// File    : glm/gtx/inertia.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\n/*\n        template <typename T>\n        GLM_FUNC_QUALIFIER detail::tmat3x3<T, P> boxInertia3\n        (\n                T const & Mass,\n                detail::tvec3<T, P> const & Scale\n        )\n        {\n                detail::tmat3x3<T, P> Result(T(1));\n                Result[0][0] = (Scale.y * Scale.y + Scale.z * Scale.z) * Mass /\n   T(12); Result[1][1] = (Scale.x * Scale.x + Scale.z * Scale.z) * Mass / T(12);\n                Result[2][2] = (Scale.x * Scale.x + Scale.y * Scale.y) * Mass /\n   T(12); return Result;\n        }\n\n        template <typename T>\n        GLM_FUNC_QUALIFIER detail::tmat4x4<T, P> boxInertia4\n        (\n                T const & Mass,\n                detail::tvec3<T, P> const & Scale\n        )\n        {\n                detail::tmat4x4<T, P> Result(T(1));\n                Result[0][0] = (Scale.y * Scale.y + Scale.z * Scale.z) * Mass /\n   T(12); Result[1][1] = (Scale.x * Scale.x + Scale.z * Scale.z) * Mass / T(12);\n                Result[2][2] = (Scale.x * Scale.x + Scale.y * Scale.y) * Mass /\n   T(12); return Result;\n        }\n\n        template <typename T>\n        GLM_FUNC_QUALIFIER detail::tmat3x3<T, P> diskInertia3\n        (\n                T const & Mass,\n                T const & Radius\n        )\n        {\n                T a = Mass * Radius * Radius / T(2);\n                detail::tmat3x3<T, P> Result(a);\n                Result[2][2] *= static_cast<T>(2);\n                return Result;\n        }\n\n        template <typename T>\n        GLM_FUNC_QUALIFIER detail::tmat4x4<T, P> diskInertia4\n        (\n                T const & Mass,\n                T const & Radius\n        )\n        {\n                T a = Mass * Radius * Radius / T(2);\n                detail::tmat4x4<T, P> Result(a);\n                Result[2][2] *= static_cast<T>(2);\n                Result[3][3] = static_cast<T>(1);\n                return Result;\n        }\n\n        template <typename T>\n        GLM_FUNC_QUALIFIER detail::tmat3x3<T, P> ballInertia3\n        (\n                T const & Mass,\n                T const & Radius\n        )\n        {\n                T a = static_cast<T>(2) * Mass * Radius * Radius / T(5);\n                return detail::tmat3x3<T, P>(a);\n        }\n\n        template <typename T>\n        GLM_FUNC_QUALIFIER detail::tmat4x4<T, P> ballInertia4\n        (\n                T const & Mass,\n                T const & Radius\n        )\n        {\n                T a = static_cast<T>(2) * Mass * Radius * Radius / T(5);\n                detail::tmat4x4<T, P> Result(a);\n                Result[3][3] = static_cast<T>(1);\n                return Result;\n        }\n\n        template <typename T>\n        GLM_FUNC_QUALIFIER detail::tmat3x3<T, P> sphereInertia3\n        (\n                T const & Mass,\n                T const & Radius\n        )\n        {\n                T a = static_cast<T>(2) * Mass * Radius * Radius / T(3);\n                return detail::tmat3x3<T, P>(a);\n        }\n\n        template <typename T>\n        GLM_FUNC_QUALIFIER detail::tmat4x4<T, P> sphereInertia4\n        (\n                T const & Mass,\n                T const & Radius\n        )\n        {\n                T a = static_cast<T>(2) * Mass * Radius * Radius / T(3);\n                detail::tmat4x4<T, P> Result(a);\n                Result[3][3] = static_cast<T>(1);\n                return Result;\n        }\n */\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/int_10_10_10_2.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_int_10_10_10_2\n#define GLM_GTX_int_10_10_10_2\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtx/raw_data.hpp\"\n\n#if (defined(GLM_MESSAGES))\n#pragma message( \\\n        \"GLM: GLM_GTX_int_10_10_10_2 extension is deprecated, include GLM_GTC_packing (glm/gtc/packing.hpp) instead\")\n#endif\n\nnamespace glm {\n//! Deprecated, use packUnorm3x10_1x2 instead.\nGLM_DEPRECATED GLM_FUNC_DECL dword uint10_10_10_2_cast(glm::vec4 const& v);\n\n}  // namespace glm\n\n#include \"int_10_10_10_2.inl\"\n\n#endif  // GLM_GTX_int_10_10_10_2\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/int_10_10_10_2.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\nGLM_FUNC_QUALIFIER dword uint10_10_10_2_cast(glm::vec4 const& v) {\n  return dword(uint(v.x * 2047.f) << 0 | uint(v.y * 2047.f) << 10 |\n               uint(v.z * 2047.f) << 20 | uint(v.w * 3.f) << 30);\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/integer.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_integer\n/// @file glm/gtx/integer.hpp\n/// @date 2005-12-24 / 2011-10-13\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_integer GLM_GTX_integer\n/// @ingroup gtx\n///\n/// @brief Add support for integer for core functions\n///\n/// <glm/gtx/integer.hpp> need to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_integer\n#define GLM_GTX_integer\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_integer extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_integer\n/// @{\n\n//! Returns x raised to the y power.\n//! From GLM_GTX_integer extension.\nGLM_FUNC_DECL int pow(int x, int y);\n\n//! Returns the positive square root of x.\n//! From GLM_GTX_integer extension.\nGLM_FUNC_DECL int sqrt(int x);\n\n//! Returns the log2 of x. Can be reliably using to compute mipmap count from\n//! the texture size. From GLM_GTX_integer extension.\ntemplate <typename genIUType>\nGLM_FUNC_DECL genIUType log2(genIUType x);\n\n//! Returns the floor log2 of x.\n//! From GLM_GTX_integer extension.\nGLM_FUNC_DECL unsigned int floor_log2(unsigned int x);\n\n//! Modulus. Returns x - y * floor(x / y) for each component in x using the\n//! floating point value y. From GLM_GTX_integer extension.\nGLM_FUNC_DECL int mod(int x, int y);\n\n//! Return the factorial value of a number (!12 max, integer only)\n//! From GLM_GTX_integer extension.\ntemplate <typename genType>\nGLM_FUNC_DECL genType factorial(genType const& x);\n\n//! 32bit signed integer.\n//! From GLM_GTX_integer extension.\ntypedef signed int sint;\n\n//! Returns x raised to the y power.\n//! From GLM_GTX_integer extension.\nGLM_FUNC_DECL uint pow(uint x, uint y);\n\n//! Returns the positive square root of x.\n//! From GLM_GTX_integer extension.\nGLM_FUNC_DECL uint sqrt(uint x);\n\n//! Modulus. Returns x - y * floor(x / y) for each component in x using the\n//! floating point value y. From GLM_GTX_integer extension.\nGLM_FUNC_DECL uint mod(uint x, uint y);\n\n//! Returns the number of leading zeros.\n//! From GLM_GTX_integer extension.\nGLM_FUNC_DECL uint nlz(uint x);\n\n/// @}\n}  // namespace glm\n\n#include \"integer.inl\"\n\n#endif  // GLM_GTX_integer\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/integer.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2005-12-24\n// Updated : 2011-10-13\n// Licence : This source is under MIT License\n// File    : glm/gtx/integer.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\n// pow\nGLM_FUNC_QUALIFIER int pow(int x, int y) {\n  if (y == 0) return 1;\n  int result = x;\n  for (int i = 1; i < y; ++i) result *= x;\n  return result;\n}\n\n// sqrt: From Christopher J. Musial, An integer square root, Graphics Gems,\n// 1990, page 387\nGLM_FUNC_QUALIFIER int sqrt(int x) {\n  if (x <= 1) return x;\n\n  int NextTrial = x >> 1;\n  int CurrentAnswer;\n\n  do {\n    CurrentAnswer = NextTrial;\n    NextTrial = (NextTrial + x / NextTrial) >> 1;\n  } while (NextTrial < CurrentAnswer);\n\n  return CurrentAnswer;\n}\n\n// Henry Gordon Dietz: http://aggregate.org/MAGIC/\nnamespace detail {\nGLM_FUNC_QUALIFIER unsigned int ones32(unsigned int x) {\n  /* 32-bit recursive reduction using SWAR...\n  but first step is mapping 2-bit values\n  into sum of 2 1-bit values in sneaky way\n  */\n  x -= ((x >> 1) & 0x55555555);\n  x = (((x >> 2) & 0x33333333) + (x & 0x33333333));\n  x = (((x >> 4) + x) & 0x0f0f0f0f);\n  x += (x >> 8);\n  x += (x >> 16);\n  return (x & 0x0000003f);\n}\n\ntemplate <>\nstruct compute_log2<false> {\n  template <typename T>\n  GLM_FUNC_QUALIFIER T operator()(T const& Value) const {\n#if (GLM_COMPILER & (GLM_COMPILER_VC | GLM_COMPILER_GCC))\n    return Value <= static_cast<T>(1) ? T(0) : T(32) - nlz(Value - T(1));\n#else\n    return T(32) - nlz(Value - T(1));\n#endif\n  }\n};\n}  // namespace detail\n\n// Henry Gordon Dietz: http://aggregate.org/MAGIC/\n/*\n        GLM_FUNC_QUALIFIER unsigned int floor_log2(unsigned int x)\n        {\n                x |= (x >> 1);\n                x |= (x >> 2);\n                x |= (x >> 4);\n                x |= (x >> 8);\n                x |= (x >> 16);\n\n                return _detail::ones32(x) >> 1;\n        }\n*/\n// mod\nGLM_FUNC_QUALIFIER int mod(int x, int y) { return x - y * (x / y); }\n\n// factorial (!12 max, integer only)\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType factorial(genType const& x) {\n  genType Temp = x;\n  genType Result;\n  for (Result = 1; Temp > 1; --Temp) Result *= Temp;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<T, P> factorial(detail::tvec2<T, P> const& x) {\n  return detail::tvec2<T, P>(factorial(x.x), factorial(x.y));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> factorial(detail::tvec3<T, P> const& x) {\n  return detail::tvec3<T, P>(factorial(x.x), factorial(x.y), factorial(x.z));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> factorial(detail::tvec4<T, P> const& x) {\n  return detail::tvec4<T, P>(factorial(x.x), factorial(x.y), factorial(x.z),\n                             factorial(x.w));\n}\n\nGLM_FUNC_QUALIFIER uint pow(uint x, uint y) {\n  uint result = x;\n  for (uint i = 1; i < y; ++i) result *= x;\n  return result;\n}\n\nGLM_FUNC_QUALIFIER uint sqrt(uint x) {\n  if (x <= 1) return x;\n\n  uint NextTrial = x >> 1;\n  uint CurrentAnswer;\n\n  do {\n    CurrentAnswer = NextTrial;\n    NextTrial = (NextTrial + x / NextTrial) >> 1;\n  } while (NextTrial < CurrentAnswer);\n\n  return CurrentAnswer;\n}\n\nGLM_FUNC_QUALIFIER uint mod(uint x, uint y) { return x - y * (x / y); }\n\n#if (GLM_COMPILER & (GLM_COMPILER_VC | GLM_COMPILER_GCC))\n\nGLM_FUNC_QUALIFIER unsigned int nlz(unsigned int x) { return 31u - findMSB(x); }\n\n#else\n\n// Hackers Delight: http://www.hackersdelight.org/HDcode/nlz.c.txt\nGLM_FUNC_QUALIFIER unsigned int nlz(unsigned int x) {\n  int y, m, n;\n\n  y = -int(x >> 16);   // If left half of x is 0,\n  m = (y >> 16) & 16;  // set n = 16.  If left half\n  n = 16 - m;          // is nonzero, set n = 0 and\n  x = x >> m;          // shift x right 16.\n                       // Now x is of the form 0000xxxx.\n  y = x - 0x100;       // If positions 8-15 are 0,\n  m = (y >> 16) & 8;   // add 8 to n and shift x left 8.\n  n = n + m;\n  x = x << m;\n\n  y = x - 0x1000;     // If positions 12-15 are 0,\n  m = (y >> 16) & 4;  // add 4 to n and shift x left 4.\n  n = n + m;\n  x = x << m;\n\n  y = x - 0x4000;     // If positions 14-15 are 0,\n  m = (y >> 16) & 2;  // add 2 to n and shift x left 2.\n  n = n + m;\n  x = x << m;\n\n  y = x >> 14;        // Set y = 0, 1, 2, or 3.\n  m = y & ~(y >> 1);  // Set m = 0, 1, 2, or 2 resp.\n  return unsigned(n + 2 - m);\n}\n\n#endif  //(GLM_COMPILER)\n\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/intersect.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_intersect\n/// @file glm/gtx/intersect.hpp\n/// @date 2007-04-03 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtx_closest_point (dependence)\n///\n/// @defgroup gtx_intersect GLM_GTX_intersect\n/// @ingroup gtx\n///\n/// @brief Add intersection functions\n///\n/// <glm/gtx/intersect.hpp> need to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_intersect\n#define GLM_GTX_intersect\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtx/closest_point.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_closest_point extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_intersect\n/// @{\n\n//! Compute the intersection of a ray and a triangle.\n//! Ray direction and plane normal must be unit length.\n//! From GLM_GTX_intersect extension.\ntemplate <typename genType>\nGLM_FUNC_DECL bool intersectRayPlane(\n    genType const& orig, genType const& dir, genType const& planeOrig,\n    genType const& planeNormal,\n    typename genType::value_type& intersectionDistance);\n\n//! Compute the intersection of a ray and a triangle.\n//! From GLM_GTX_intersect extension.\ntemplate <typename genType>\nGLM_FUNC_DECL bool intersectRayTriangle(genType const& orig, genType const& dir,\n                                        genType const& vert0,\n                                        genType const& vert1,\n                                        genType const& vert2,\n                                        genType& baryPosition);\n\n//! Compute the intersection of a line and a triangle.\n//! From GLM_GTX_intersect extension.\ntemplate <typename genType>\nGLM_FUNC_DECL bool intersectLineTriangle(\n    genType const& orig, genType const& dir, genType const& vert0,\n    genType const& vert1, genType const& vert2, genType& position);\n\n//! Compute the intersection distance of a ray and a sphere.\n//! The ray direction vector is unit length.\n//! From GLM_GTX_intersect extension.\ntemplate <typename genType>\nGLM_FUNC_DECL bool intersectRaySphere(\n    genType const& rayStarting, genType const& rayNormalizedDirection,\n    genType const& sphereCenter,\n    typename genType::value_type const sphereRadiusSquered,\n    typename genType::value_type& intersectionDistance);\n\n//! Compute the intersection of a ray and a sphere.\n//! From GLM_GTX_intersect extension.\ntemplate <typename genType>\nGLM_FUNC_DECL bool intersectRaySphere(\n    genType const& rayStarting, genType const& rayNormalizedDirection,\n    genType const& sphereCenter,\n    const typename genType::value_type sphereRadius,\n    genType& intersectionPosition, genType& intersectionNormal);\n\n//! Compute the intersection of a line and a sphere.\n//! From GLM_GTX_intersect extension\ntemplate <typename genType>\nGLM_FUNC_DECL bool intersectLineSphere(\n    genType const& point0, genType const& point1, genType const& sphereCenter,\n    typename genType::value_type sphereRadius, genType& intersectionPosition1,\n    genType& intersectionNormal1, genType& intersectionPosition2 = genType(),\n    genType& intersectionNormal2 = genType());\n\n/// @}\n}  // namespace glm\n\n#include \"intersect.inl\"\n\n#endif  // GLM_GTX_intersect\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/intersect.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2007-04-03\n// Updated : 2009-01-20\n// Licence : This source is under MIT licence\n// File    : glm/gtx/intersect.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\n#include <cfloat>\n#include <limits>\n\n#include \"../geometric.hpp\"\n\nnamespace glm {\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER bool intersectRayPlane(\n    genType const& orig, genType const& dir, genType const& planeOrig,\n    genType const& planeNormal,\n    typename genType::value_type& intersectionDistance) {\n  typename genType::value_type d = glm::dot(dir, planeNormal);\n  typename genType::value_type Epsilon =\n      std::numeric_limits<typename genType::value_type>::epsilon();\n\n  if (d < Epsilon) {\n    intersectionDistance = glm::dot(planeOrig - orig, planeNormal) / d;\n    return true;\n  }\n\n  return false;\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER bool intersectRayTriangle(\n    genType const& orig, genType const& dir, genType const& v0,\n    genType const& v1, genType const& v2, genType& baryPosition) {\n  genType e1 = v1 - v0;\n  genType e2 = v2 - v0;\n\n  genType p = glm::cross(dir, e2);\n\n  typename genType::value_type a = glm::dot(e1, p);\n\n  typename genType::value_type Epsilon =\n      std::numeric_limits<typename genType::value_type>::epsilon();\n  if (a < Epsilon) return false;\n\n  typename genType::value_type f = typename genType::value_type(1.0f) / a;\n\n  genType s = orig - v0;\n  baryPosition.x = f * glm::dot(s, p);\n  if (baryPosition.x < typename genType::value_type(0.0f)) return false;\n  if (baryPosition.x > typename genType::value_type(1.0f)) return false;\n\n  genType q = glm::cross(s, e1);\n  baryPosition.y = f * glm::dot(dir, q);\n  if (baryPosition.y < typename genType::value_type(0.0f)) return false;\n  if (baryPosition.y + baryPosition.x > typename genType::value_type(1.0f))\n    return false;\n\n  baryPosition.z = f * glm::dot(e2, q);\n\n  return baryPosition.z >= typename genType::value_type(0.0f);\n}\n\n// template <typename genType>\n// GLM_FUNC_QUALIFIER bool intersectRayTriangle\n//(\n//\tgenType const & orig, genType const & dir,\n//\tgenType const & vert0, genType const & vert1, genType const & vert2,\n//\tgenType & position\n//)\n//{\n//\ttypename genType::value_type Epsilon = std::numeric_limits<typename\n// genType::value_type>::epsilon();\n//\n//\tgenType edge1 = vert1 - vert0;\n//\tgenType edge2 = vert2 - vert0;\n//\n//\tgenType pvec = cross(dir, edge2);\n//\n//\tfloat det = dot(edge1, pvec);\n//\tif(det < Epsilon)\n//\t\treturn false;\n//\n//\tgenType tvec = orig - vert0;\n//\n//\tposition.y = dot(tvec, pvec);\n//\tif (position.y < typename genType::value_type(0) || position.y > det)\n//\t\treturn typename genType::value_type(0);\n//\n//\tgenType qvec = cross(tvec, edge1);\n//\n//\tposition.z = dot(dir, qvec);\n//\tif (position.z < typename genType::value_type(0) || position.y +\n// position.z > det) \t\treturn typename genType::value_type(0);\n//\n//\tposition.x = dot(edge2, qvec);\n//\tposition *= typename genType::value_type(1) / det;\n//\n//\treturn typename genType::value_type(1);\n// }\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER bool intersectLineTriangle(\n    genType const& orig, genType const& dir, genType const& vert0,\n    genType const& vert1, genType const& vert2, genType& position) {\n  typename genType::value_type Epsilon =\n      std::numeric_limits<typename genType::value_type>::epsilon();\n\n  genType edge1 = vert1 - vert0;\n  genType edge2 = vert2 - vert0;\n\n  genType pvec = cross(dir, edge2);\n\n  float det = dot(edge1, pvec);\n\n  if (det > -Epsilon && det < Epsilon) return false;\n  float inv_det = typename genType::value_type(1) / det;\n\n  genType tvec = orig - vert0;\n\n  position.y = dot(tvec, pvec) * inv_det;\n  if (position.y < typename genType::value_type(0) ||\n      position.y > typename genType::value_type(1))\n    return false;\n\n  genType qvec = cross(tvec, edge1);\n\n  position.z = dot(dir, qvec) * inv_det;\n  if (position.z < typename genType::value_type(0) ||\n      position.y + position.z > typename genType::value_type(1))\n    return false;\n\n  position.x = dot(edge2, qvec) * inv_det;\n\n  return true;\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER bool intersectRaySphere(\n    genType const& rayStarting, genType const& rayNormalizedDirection,\n    genType const& sphereCenter,\n    const typename genType::value_type sphereRadiusSquered,\n    typename genType::value_type& intersectionDistance) {\n  typename genType::value_type Epsilon =\n      std::numeric_limits<typename genType::value_type>::epsilon();\n  genType diff = sphereCenter - rayStarting;\n  typename genType::value_type t0 = dot(diff, rayNormalizedDirection);\n  typename genType::value_type dSquared = dot(diff, diff) - t0 * t0;\n  if (dSquared > sphereRadiusSquered) {\n    return false;\n  }\n  typename genType::value_type t1 = sqrt(sphereRadiusSquered - dSquared);\n  intersectionDistance = t0 > t1 + Epsilon ? t0 - t1 : t0 + t1;\n  return intersectionDistance > Epsilon;\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER bool intersectRaySphere(\n    genType const& rayStarting, genType const& rayNormalizedDirection,\n    genType const& sphereCenter,\n    const typename genType::value_type sphereRadius,\n    genType& intersectionPosition, genType& intersectionNormal) {\n  typename genType::value_type distance;\n  if (intersectRaySphere(rayStarting, rayNormalizedDirection, sphereCenter,\n                         sphereRadius * sphereRadius, distance)) {\n    intersectionPosition = rayStarting + rayNormalizedDirection * distance;\n    intersectionNormal = (intersectionPosition - sphereCenter) / sphereRadius;\n    return true;\n  }\n  return false;\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER bool intersectLineSphere(\n    genType const& point0, genType const& point1, genType const& sphereCenter,\n    typename genType::value_type sphereRadius, genType& intersectionPoint1,\n    genType& intersectionNormal1, genType& intersectionPoint2,\n    genType& intersectionNormal2) {\n  typename genType::value_type Epsilon =\n      std::numeric_limits<typename genType::value_type>::epsilon();\n  genType dir = normalize(point1 - point0);\n  genType diff = sphereCenter - point0;\n  typename genType::value_type t0 = dot(diff, dir);\n  typename genType::value_type dSquared = dot(diff, diff) - t0 * t0;\n  if (dSquared > sphereRadius * sphereRadius) {\n    return false;\n  }\n  typename genType::value_type t1 =\n      sqrt(sphereRadius * sphereRadius - dSquared);\n  if (t0 < t1 + Epsilon) t1 = -t1;\n  intersectionPoint1 = point0 + dir * (t0 - t1);\n  intersectionNormal1 = (intersectionPoint1 - sphereCenter) / sphereRadius;\n  intersectionPoint2 = point0 + dir * (t0 + t1);\n  intersectionNormal2 = (intersectionPoint2 - sphereCenter) / sphereRadius;\n  return true;\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/io.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_io\n/// @file glm/gtx/io.hpp\n/// @date 2013-11-22\n/// @author Jan P Springer (regnirpsj@gmail.com)\n///\n/// @see core (dependence)\n/// @see gtx_quaternion (dependence)\n///\n/// @defgroup gtx_io GLM_GTX_io\n/// @ingroup gtx\n///\n/// @brief std::[w]ostream support for glm types\n///\n/// <glm/gtx/io.hpp> needs to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_io\n#define GLM_GTX_io\n\n// Dependency:\n#include \"../detail/setup.hpp\"\n#include \"../gtc/quaternion.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_io extension included\")\n#endif\n\n#include <iosfwd>   // std::basic_ostream<> (fwd)\n#include <utility>  // std::pair<>\n\nnamespace glm {\n/// @addtogroup gtx_io\n/// @{\n\nnamespace io {\n\nclass precision_guard {\n public:\n  GLM_FUNC_DECL explicit precision_guard();\n  GLM_FUNC_DECL ~precision_guard();\n\n private:\n  unsigned precision_;\n  unsigned value_width_;\n};\n\nclass format_guard {\n public:\n  enum order_t {\n    column_major,\n    row_major,\n  };\n\n  GLM_FUNC_DECL explicit format_guard();\n  GLM_FUNC_DECL ~format_guard();\n\n private:\n  order_t order_;\n  char cr_;\n};\n\n// decimal places (dflt: 3)\nGLM_FUNC_DECL unsigned& precision();\n\n// sign + value + '.' + decimals (dflt: 1 + 4 + 1 + precision())\nGLM_FUNC_DECL unsigned& value_width();\n\n// matrix output order (dflt: row_major)\nGLM_FUNC_DECL format_guard::order_t& order();\n\n// carriage/return char (dflt: '\\n')\nGLM_FUNC_DECL char& cr();\n\n// matrix output order -> column_major\nGLM_FUNC_DECL std::ios_base& column_major(std::ios_base&);\n\n// matrix output order -> row_major\nGLM_FUNC_DECL std::ios_base& row_major(std::ios_base&);\n\n// carriage/return char -> '\\n'\nGLM_FUNC_DECL std::ios_base& formatted(std::ios_base&);\n\n// carriage/return char -> ' '\nGLM_FUNC_DECL std::ios_base& unformatted(std::ios_base&);\n\n}  // namespace io\n\nnamespace detail {\ntemplate <typename CTy, typename CTr, typename T, precision P>\nGLM_FUNC_DECL std::basic_ostream<CTy, CTr>& operator<<(\n    std::basic_ostream<CTy, CTr>&, tquat<T, P> const&);\ntemplate <typename CTy, typename CTr, typename T, precision P>\nGLM_FUNC_DECL std::basic_ostream<CTy, CTr>& operator<<(\n    std::basic_ostream<CTy, CTr>&, tvec2<T, P> const&);\ntemplate <typename CTy, typename CTr, typename T, precision P>\nGLM_FUNC_DECL std::basic_ostream<CTy, CTr>& operator<<(\n    std::basic_ostream<CTy, CTr>&, tvec3<T, P> const&);\ntemplate <typename CTy, typename CTr, typename T, precision P>\nGLM_FUNC_DECL std::basic_ostream<CTy, CTr>& operator<<(\n    std::basic_ostream<CTy, CTr>&, tvec4<T, P> const&);\ntemplate <typename CTy, typename CTr, typename T, precision P>\nGLM_FUNC_DECL std::basic_ostream<CTy, CTr>& operator<<(\n    std::basic_ostream<CTy, CTr>&, tmat2x2<T, P> const&);\ntemplate <typename CTy, typename CTr, typename T, precision P>\nGLM_FUNC_DECL std::basic_ostream<CTy, CTr>& operator<<(\n    std::basic_ostream<CTy, CTr>&, tmat2x3<T, P> const&);\ntemplate <typename CTy, typename CTr, typename T, precision P>\nGLM_FUNC_DECL std::basic_ostream<CTy, CTr>& operator<<(\n    std::basic_ostream<CTy, CTr>&, tmat2x4<T, P> const&);\ntemplate <typename CTy, typename CTr, typename T, precision P>\nGLM_FUNC_DECL std::basic_ostream<CTy, CTr>& operator<<(\n    std::basic_ostream<CTy, CTr>&, tmat3x2<T, P> const&);\ntemplate <typename CTy, typename CTr, typename T, precision P>\nGLM_FUNC_DECL std::basic_ostream<CTy, CTr>& operator<<(\n    std::basic_ostream<CTy, CTr>&, tmat3x3<T, P> const&);\ntemplate <typename CTy, typename CTr, typename T, precision P>\nGLM_FUNC_DECL std::basic_ostream<CTy, CTr>& operator<<(\n    std::basic_ostream<CTy, CTr>&, tmat3x4<T, P> const&);\ntemplate <typename CTy, typename CTr, typename T, precision P>\nGLM_FUNC_DECL std::basic_ostream<CTy, CTr>& operator<<(\n    std::basic_ostream<CTy, CTr>&, tmat4x2<T, P> const&);\ntemplate <typename CTy, typename CTr, typename T, precision P>\nGLM_FUNC_DECL std::basic_ostream<CTy, CTr>& operator<<(\n    std::basic_ostream<CTy, CTr>&, tmat4x3<T, P> const&);\ntemplate <typename CTy, typename CTr, typename T, precision P>\nGLM_FUNC_DECL std::basic_ostream<CTy, CTr>& operator<<(\n    std::basic_ostream<CTy, CTr>&, tmat4x4<T, P> const&);\n\n/// @}\n}  // namespace detail\n}  // namespace glm\n\n#include \"io.inl\"\n\n#endif  // GLM_GTX_io\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/io.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2013-11-22\n// Updated : 2013-11-22\n// Licence : This source is under MIT License\n// File    : glm/gtx/inl.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\n#include \"../matrix.hpp\"\n// #include <boost/io/ios_state.hpp> // boost::io::ios_all_saver\n#include <iomanip>  // std::setfill<>, std::fixed, std::setprecision, std::right,\n                    // std::setw\n#include <ostream>  // std::basic_ostream<>\n\nnamespace glm {\nnamespace io {\n\n/* explicit */ GLM_FUNC_QUALIFIER\nprecision_guard::precision_guard()\n    : precision_(precision()), value_width_(value_width()) {}\n\nGLM_FUNC_QUALIFIER\nprecision_guard::~precision_guard() {\n  value_width() = value_width_;\n  precision() = precision_;\n}\n\n/* explicit */ GLM_FUNC_QUALIFIER\nformat_guard::format_guard() : order_(order()), cr_(cr()) {}\n\nGLM_FUNC_QUALIFIER\nformat_guard::~format_guard() {\n  cr() = cr_;\n  order() = order_;\n}\n\nGLM_FUNC_QUALIFIER unsigned& precision() {\n  static unsigned p(3);\n\n  return p;\n}\n\nGLM_FUNC_QUALIFIER unsigned& value_width() {\n  static unsigned p(9);\n\n  return p;\n}\n\nGLM_FUNC_QUALIFIER format_guard::order_t& order() {\n  static format_guard::order_t p(format_guard::row_major);\n\n  return p;\n}\n\nGLM_FUNC_QUALIFIER char& cr() {\n  static char p('\\n');\n  return p;\n}\n\nGLM_FUNC_QUALIFIER std::ios_base& column_major(std::ios_base& os) {\n  order() = format_guard::column_major;\n\n  return os;\n}\n\nGLM_FUNC_QUALIFIER std::ios_base& row_major(std::ios_base& os) {\n  order() = format_guard::row_major;\n\n  return os;\n}\n\nGLM_FUNC_QUALIFIER std::ios_base& formatted(std::ios_base& os) {\n  cr() = '\\n';\n\n  return os;\n}\n\nGLM_FUNC_QUALIFIER std::ios_base& unformatted(std::ios_base& os) {\n  cr() = ' ';\n\n  return os;\n}\n\n}  // namespace io\nnamespace detail {\n// functions, inlined (inline)\n\ntemplate <typename CTy, typename CTr, typename T, precision P>\nGLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& operator<<(\n    std::basic_ostream<CTy, CTr>& os, tquat<T, P> const& a) {\n  typename std::basic_ostream<CTy, CTr>::sentry const cerberus(os);\n\n  if (cerberus) {\n    // boost::io::ios_all_saver const ias(os);\n\n    os << std::fixed << std::setprecision(io::precision()) << '[' << std::right\n       << std::setfill<CTy>(' ') << std::setw(io::value_width()) << a.w << ','\n       << std::right << std::setfill<CTy>(' ') << std::setw(io::value_width())\n       << a.x << ',' << std::right << std::setfill<CTy>(' ')\n       << std::setw(io::value_width()) << a.y << ',' << std::right\n       << std::setfill<CTy>(' ') << std::setw(io::value_width()) << a.z << ']';\n  }\n\n  return os;\n}\n\ntemplate <typename CTy, typename CTr, typename T, precision P>\nGLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& operator<<(\n    std::basic_ostream<CTy, CTr>& os, tvec2<T, P> const& a) {\n  typename std::basic_ostream<CTy, CTr>::sentry const cerberus(os);\n\n  if (cerberus) {\n    // boost::io::ios_all_saver const ias(os);\n\n    os << std::fixed << std::setprecision(io::precision()) << '[' << std::right\n       << std::setfill<CTy>(' ') << std::setw(io::value_width()) << a.x << ','\n       << std::right << std::setfill<CTy>(' ') << std::setw(io::value_width())\n       << a.y << ']';\n  }\n\n  return os;\n}\n\ntemplate <typename CTy, typename CTr, typename T, precision P>\nGLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& operator<<(\n    std::basic_ostream<CTy, CTr>& os, tvec3<T, P> const& a) {\n  typename std::basic_ostream<CTy, CTr>::sentry const cerberus(os);\n\n  if (cerberus) {\n    // boost::io::ios_all_saver const ias(os);\n\n    os << std::fixed << std::setprecision(io::precision()) << '[' << std::right\n       << std::setfill<CTy>(' ') << std::setw(io::value_width()) << a.x << ','\n       << std::right << std::setfill<CTy>(' ') << std::setw(io::value_width())\n       << a.y << ',' << std::right << std::setfill<CTy>(' ')\n       << std::setw(io::value_width()) << a.z << ']';\n  }\n\n  return os;\n}\n\ntemplate <typename CTy, typename CTr, typename T, precision P>\nGLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& operator<<(\n    std::basic_ostream<CTy, CTr>& os, tvec4<T, P> const& a) {\n  typename std::basic_ostream<CTy, CTr>::sentry const cerberus(os);\n\n  if (cerberus) {\n    // boost::io::ios_all_saver const ias(os);\n\n    os << std::fixed << std::setprecision(io::precision()) << '[' << std::right\n       << std::setfill<CTy>(' ') << std::setw(io::value_width()) << a.x << ','\n       << std::right << std::setfill<CTy>(' ') << std::setw(io::value_width())\n       << a.y << ',' << std::right << std::setfill<CTy>(' ')\n       << std::setw(io::value_width()) << a.z << ',' << std::right\n       << std::setfill<CTy>(' ') << std::setw(io::value_width()) << a.w << ']';\n  }\n\n  return os;\n}\n\ntemplate <typename CTy, typename CTr, typename T, precision P>\nGLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& operator<<(\n    std::basic_ostream<CTy, CTr>& os, tmat2x2<T, P> const& m) {\n  typename std::basic_ostream<CTy, CTr>::sentry const cerberus(os);\n\n  if (cerberus) {\n    os << io::cr() << '[' << m[0] << io::cr() << ' ' << m[1] << ']';\n  }\n\n  return os;\n}\n\ntemplate <typename CTy, typename CTr, typename T, precision P>\nGLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& operator<<(\n    std::basic_ostream<CTy, CTr>& os, tmat2x3<T, P> const& m) {\n  typename std::basic_ostream<CTy, CTr>::sentry const cerberus(os);\n\n  if (cerberus) {\n    os << io::cr() << '[' << m[0] << io::cr() << ' ' << m[1] << ']';\n  }\n\n  return os;\n}\n\ntemplate <typename CTy, typename CTr, typename T, precision P>\nGLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& operator<<(\n    std::basic_ostream<CTy, CTr>& os, tmat2x4<T, P> const& m) {\n  typename std::basic_ostream<CTy, CTr>::sentry const cerberus(os);\n\n  if (cerberus) {\n    os << io::cr() << '[' << m[0] << io::cr() << ' ' << m[1] << ']';\n  }\n\n  return os;\n}\n\ntemplate <typename CTy, typename CTr, typename T, precision P>\nGLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& operator<<(\n    std::basic_ostream<CTy, CTr>& os, tmat3x2<T, P> const& m) {\n  typename std::basic_ostream<CTy, CTr>::sentry const cerberus(os);\n\n  if (cerberus) {\n    os << io::cr() << '[' << m[0] << io::cr() << ' ' << m[1] << io::cr() << ' '\n       << m[2] << ']';\n  }\n\n  return os;\n}\n\ntemplate <typename CTy, typename CTr, typename T, precision P>\nGLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& operator<<(\n    std::basic_ostream<CTy, CTr>& os, tmat3x3<T, P> const& m) {\n  typename std::basic_ostream<CTy, CTr>::sentry const cerberus(os);\n\n  if (cerberus) {\n    os << io::cr() << '[' << m[0] << io::cr() << ' ' << m[1] << io::cr() << ' '\n       << m[2] << ']';\n  }\n\n  return os;\n}\n\ntemplate <typename CTy, typename CTr, typename T, precision P>\nGLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& operator<<(\n    std::basic_ostream<CTy, CTr>& os, tmat3x4<T, P> const& m) {\n  typename std::basic_ostream<CTy, CTr>::sentry const cerberus(os);\n\n  if (cerberus) {\n    os << io::cr() << '[' << m[0] << io::cr() << ' ' << m[1] << io::cr() << ' '\n       << m[2] << ']';\n  }\n\n  return os;\n}\n\ntemplate <typename CTy, typename CTr, typename T, precision P>\nGLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& operator<<(\n    std::basic_ostream<CTy, CTr>& os, tmat4x2<T, P> const& m) {\n  typename std::basic_ostream<CTy, CTr>::sentry const cerberus(os);\n\n  if (cerberus) {\n    os << io::cr() << '[' << m[0] << io::cr() << ' ' << m[1] << io::cr() << ' '\n       << m[2] << io::cr() << ' ' << m[3] << ']';\n  }\n\n  return os;\n}\n\ntemplate <typename CTy, typename CTr, typename T, precision P>\nGLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& operator<<(\n    std::basic_ostream<CTy, CTr>& os, tmat4x3<T, P> const& m) {\n  typename std::basic_ostream<CTy, CTr>::sentry const cerberus(os);\n\n  if (cerberus) {\n    os << io::cr() << '[' << m[0] << io::cr() << ' ' << m[1] << io::cr() << ' '\n       << m[2] << io::cr() << ' ' << m[3] << ']';\n  }\n\n  return os;\n}\n\ntemplate <typename CTy, typename CTr, typename T, precision P>\nGLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& operator<<(\n    std::basic_ostream<CTy, CTr>& os, tmat4x4<T, P> const& m) {\n  typename std::basic_ostream<CTy, CTr>::sentry const cerberus(os);\n\n  if (cerberus) {\n    os << io::cr() << '[' << m[0] << io::cr() << ' ' << m[1] << io::cr() << ' '\n       << m[2] << io::cr() << ' ' << m[3] << ']';\n  }\n\n  return os;\n}\n\n}  // namespace detail\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/log_base.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_log_base\n/// @file glm/gtx/log_base.hpp\n/// @date 2008-10-24 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_log_base GLM_GTX_log_base\n/// @ingroup gtx\n///\n/// @brief Logarithm for any base. base can be a vector or a scalar.\n///\n/// <glm/gtx/log_base.hpp> need to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_log_base\n#define GLM_GTX_log_base\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_log_base extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_log_base\n/// @{\n\n//! Logarithm for any base.\n//! From GLM_GTX_log_base.\ntemplate <typename genType>\nGLM_FUNC_DECL genType log(genType const& x, genType const& base);\n\n/// @}\n}  // namespace glm\n\n#include \"log_base.inl\"\n\n#endif  // GLM_GTX_log_base\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/log_base.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2008-10-24\n// Updated : 2008-10-24\n// Licence : This source is under MIT License\n// File    : glm/gtx/log_base.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType log(genType const& x, genType const& base) {\n  assert(x != genType(0));\n\n  return glm::log(x) / glm::log(base);\n}\n\nVECTORIZE_VEC_SCA(log)\nVECTORIZE_VEC_VEC(log)\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/matrix_cross_product.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_matrix_cross_product\n/// @file glm/gtx/matrix_cross_product.hpp\n/// @date 2005-12-21 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtx_extented_min_max (dependence)\n///\n/// @defgroup gtx_matrix_cross_product GLM_GTX_matrix_cross_product\n/// @ingroup gtx\n///\n/// @brief Build cross product matrices\n///\n/// <glm/gtx/matrix_cross_product.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_matrix_cross_product\n#define GLM_GTX_matrix_cross_product\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_matrix_cross_product extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_matrix_cross_product\n/// @{\n\n//! Build a cross product matrix.\n//! From GLM_GTX_matrix_cross_product extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat3x3<T, P> matrixCross3(detail::tvec3<T, P> const& x);\n\n//! Build a cross product matrix.\n//! From GLM_GTX_matrix_cross_product extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x4<T, P> matrixCross4(detail::tvec3<T, P> const& x);\n\n/// @}\n}  // namespace glm\n\n#include \"matrix_cross_product.inl\"\n\n#endif  // GLM_GTX_matrix_cross_product\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/matrix_cross_product.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2005-12-21\n// Updated : 2005-12-21\n// Licence : This source is under MIT License\n// File    : glm/gtx/matrix_cross_product.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat3x3<T, P> matrixCross3(\n    detail::tvec3<T, P> const& x) {\n  detail::tmat3x3<T, P> Result(T(0));\n  Result[0][1] = x.z;\n  Result[1][0] = -x.z;\n  Result[0][2] = -x.y;\n  Result[2][0] = x.y;\n  Result[1][2] = x.x;\n  Result[2][1] = -x.x;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> matrixCross4(\n    detail::tvec3<T, P> const& x) {\n  detail::tmat4x4<T, P> Result(T(0));\n  Result[0][1] = x.z;\n  Result[1][0] = -x.z;\n  Result[0][2] = -x.y;\n  Result[2][0] = x.y;\n  Result[1][2] = x.x;\n  Result[2][1] = -x.x;\n  return Result;\n}\n\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/matrix_interpolation.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_matrix_interpolation\n/// @file glm/gtx/matrix_interpolation.hpp\n/// @date 2011-03-05 / 2011-06-07\n/// @author Ghenadii Ursachi (the.asteroth@gmail.com)\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_matrix_interpolation GLM_GTX_matrix_interpolation\n/// @ingroup gtx\n///\n/// @brief Allows to directly interpolate two exiciting matrices.\n///\n/// <glm/gtx/matrix_interpolation.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_matrix_interpolation\n#define GLM_GTX_matrix_interpolation\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_matrix_interpolation extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_matrix_interpolation\n/// @{\n\n/// Get the axis and angle of the rotation from a matrix.\n/// From GLM_GTX_matrix_interpolation extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL void axisAngle(detail::tmat4x4<T, P> const& mat,\n                             detail::tvec3<T, P>& axis, T& angle);\n\n/// Build a matrix from axis and angle.\n/// From GLM_GTX_matrix_interpolation extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x4<T, P> axisAngleMatrix(\n    detail::tvec3<T, P> const& axis, T const angle);\n\n/// Extracts the rotation part of a matrix.\n/// From GLM_GTX_matrix_interpolation extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x4<T, P> extractMatrixRotation(\n    detail::tmat4x4<T, P> const& mat);\n\n/// Build a interpolation of 4 * 4 matrixes.\n/// From GLM_GTX_matrix_interpolation extension.\n/// Warning! works only with rotation and/or translation matrixes, scale will\n/// generate unexpected results.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x4<T, P> interpolate(detail::tmat4x4<T, P> const& m1,\n                                                detail::tmat4x4<T, P> const& m2,\n                                                T const delta);\n\n/// @}\n}  // namespace glm\n\n#include \"matrix_interpolation.inl\"\n\n#endif  // GLM_GTX_matrix_interpolation\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/matrix_interpolation.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2011-03-05\n// Updated : 2011-03-05\n// Licence : This source is under MIT License\n// File    : glm/gtx/matrix_interpolation.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER void axisAngle(detail::tmat4x4<T, P> const& mat,\n                                  detail::tvec3<T, P>& axis, T& angle) {\n  T epsilon = (T)0.01;\n  T epsilon2 = (T)0.1;\n\n  if ((abs(mat[1][0] - mat[0][1]) < epsilon) &&\n      (abs(mat[2][0] - mat[0][2]) < epsilon) &&\n      (abs(mat[2][1] - mat[1][2]) < epsilon)) {\n    if ((abs(mat[1][0] + mat[0][1]) < epsilon2) &&\n        (abs(mat[2][0] + mat[0][2]) < epsilon2) &&\n        (abs(mat[2][1] + mat[1][2]) < epsilon2) &&\n        (abs(mat[0][0] + mat[1][1] + mat[2][2] - (T)3.0) < epsilon2)) {\n      angle = (T)0.0;\n      axis.x = (T)1.0;\n      axis.y = (T)0.0;\n      axis.z = (T)0.0;\n      return;\n    }\n    angle = static_cast<T>(3.1415926535897932384626433832795);\n    T xx = (mat[0][0] + (T)1.0) / (T)2.0;\n    T yy = (mat[1][1] + (T)1.0) / (T)2.0;\n    T zz = (mat[2][2] + (T)1.0) / (T)2.0;\n    T xy = (mat[1][0] + mat[0][1]) / (T)4.0;\n    T xz = (mat[2][0] + mat[0][2]) / (T)4.0;\n    T yz = (mat[2][1] + mat[1][2]) / (T)4.0;\n    if ((xx > yy) && (xx > zz)) {\n      if (xx < epsilon) {\n        axis.x = (T)0.0;\n        axis.y = (T)0.7071;\n        axis.z = (T)0.7071;\n      } else {\n        axis.x = sqrt(xx);\n        axis.y = xy / axis.x;\n        axis.z = xz / axis.x;\n      }\n    } else if (yy > zz) {\n      if (yy < epsilon) {\n        axis.x = (T)0.7071;\n        axis.y = (T)0.0;\n        axis.z = (T)0.7071;\n      } else {\n        axis.y = sqrt(yy);\n        axis.x = xy / axis.y;\n        axis.z = yz / axis.y;\n      }\n    } else {\n      if (zz < epsilon) {\n        axis.x = (T)0.7071;\n        axis.y = (T)0.7071;\n        axis.z = (T)0.0;\n      } else {\n        axis.z = sqrt(zz);\n        axis.x = xz / axis.z;\n        axis.y = yz / axis.z;\n      }\n    }\n    return;\n  }\n  T s = sqrt((mat[2][1] - mat[1][2]) * (mat[2][1] - mat[1][2]) +\n             (mat[2][0] - mat[0][2]) * (mat[2][0] - mat[0][2]) +\n             (mat[1][0] - mat[0][1]) * (mat[1][0] - mat[0][1]));\n  if (glm::abs(s) < T(0.001)) s = (T)1.0;\n  angle = acos((mat[0][0] + mat[1][1] + mat[2][2] - (T)1.0) / (T)2.0);\n  axis.x = (mat[1][2] - mat[2][1]) / s;\n  axis.y = (mat[2][0] - mat[0][2]) / s;\n  axis.z = (mat[0][1] - mat[1][0]) / s;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> axisAngleMatrix(\n    detail::tvec3<T, P> const& axis, T const angle) {\n  T c = cos(angle);\n  T s = sin(angle);\n  T t = static_cast<T>(1) - c;\n  detail::tvec3<T, P> n = normalize(axis);\n\n  return detail::tmat4x4<T, P>(\n      t * n.x * n.x + c, t * n.x * n.y + n.z * s, t * n.x * n.z - n.y * s, T(0),\n      t * n.x * n.y - n.z * s, t * n.y * n.y + c, t * n.y * n.z + n.x * s, T(0),\n      t * n.x * n.z + n.y * s, t * n.y * n.z - n.x * s, t * n.z * n.z + c, T(0),\n      T(0), T(0), T(0), T(1));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> extractMatrixRotation(\n    detail::tmat4x4<T, P> const& mat) {\n  return detail::tmat4x4<T, P>(mat[0][0], mat[0][1], mat[0][2], 0.0, mat[1][0],\n                               mat[1][1], mat[1][2], 0.0, mat[2][0], mat[2][1],\n                               mat[2][2], 0.0, 0.0, 0.0, 0.0, 1.0);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> interpolate(\n    detail::tmat4x4<T, P> const& m1, detail::tmat4x4<T, P> const& m2,\n    T const delta) {\n  detail::tmat4x4<T, P> m1rot = extractMatrixRotation(m1);\n  detail::tmat4x4<T, P> dltRotation = m2 * transpose(m1rot);\n  detail::tvec3<T, P> dltAxis;\n  T dltAngle;\n  axisAngle(dltRotation, dltAxis, dltAngle);\n  detail::tmat4x4<T, P> out =\n      axisAngleMatrix(dltAxis, dltAngle * delta) * m1rot;\n  out[3][0] = m1[3][0] + delta * (m2[3][0] - m1[3][0]);\n  out[3][1] = m1[3][1] + delta * (m2[3][1] - m1[3][1]);\n  out[3][2] = m1[3][2] + delta * (m2[3][2] - m1[3][2]);\n  return out;\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/matrix_major_storage.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_matrix_major_storage\n/// @file glm/gtx/matrix_major_storage.hpp\n/// @date 2006-04-19 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtx_extented_min_max (dependence)\n///\n/// @defgroup gtx_matrix_major_storage GLM_GTX_matrix_major_storage\n/// @ingroup gtx\n///\n/// @brief Build matrices with specific matrix order, row or column\n///\n/// <glm/gtx/matrix_major_storage.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_matrix_major_storage\n#define GLM_GTX_matrix_major_storage\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_matrix_major_storage extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_matrix_major_storage\n/// @{\n\n//! Build a row major matrix from row vectors.\n//! From GLM_GTX_matrix_major_storage extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat2x2<T, P> rowMajor2(detail::tvec2<T, P> const& v1,\n                                              detail::tvec2<T, P> const& v2);\n\n//! Build a row major matrix from other matrix.\n//! From GLM_GTX_matrix_major_storage extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat2x2<T, P> rowMajor2(detail::tmat2x2<T, P> const& m);\n\n//! Build a row major matrix from row vectors.\n//! From GLM_GTX_matrix_major_storage extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat3x3<T, P> rowMajor3(detail::tvec3<T, P> const& v1,\n                                              detail::tvec3<T, P> const& v2,\n                                              detail::tvec3<T, P> const& v3);\n\n//! Build a row major matrix from other matrix.\n//! From GLM_GTX_matrix_major_storage extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat3x3<T, P> rowMajor3(detail::tmat3x3<T, P> const& m);\n\n//! Build a row major matrix from row vectors.\n//! From GLM_GTX_matrix_major_storage extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x4<T, P> rowMajor4(detail::tvec4<T, P> const& v1,\n                                              detail::tvec4<T, P> const& v2,\n                                              detail::tvec4<T, P> const& v3,\n                                              detail::tvec4<T, P> const& v4);\n\n//! Build a row major matrix from other matrix.\n//! From GLM_GTX_matrix_major_storage extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x4<T, P> rowMajor4(detail::tmat4x4<T, P> const& m);\n\n//! Build a column major matrix from column vectors.\n//! From GLM_GTX_matrix_major_storage extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat2x2<T, P> colMajor2(detail::tvec2<T, P> const& v1,\n                                              detail::tvec2<T, P> const& v2);\n\n//! Build a column major matrix from other matrix.\n//! From GLM_GTX_matrix_major_storage extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat2x2<T, P> colMajor2(detail::tmat2x2<T, P> const& m);\n\n//! Build a column major matrix from column vectors.\n//! From GLM_GTX_matrix_major_storage extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat3x3<T, P> colMajor3(detail::tvec3<T, P> const& v1,\n                                              detail::tvec3<T, P> const& v2,\n                                              detail::tvec3<T, P> const& v3);\n\n//! Build a column major matrix from other matrix.\n//! From GLM_GTX_matrix_major_storage extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat3x3<T, P> colMajor3(detail::tmat3x3<T, P> const& m);\n\n//! Build a column major matrix from column vectors.\n//! From GLM_GTX_matrix_major_storage extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x4<T, P> colMajor4(detail::tvec4<T, P> const& v1,\n                                              detail::tvec4<T, P> const& v2,\n                                              detail::tvec4<T, P> const& v3,\n                                              detail::tvec4<T, P> const& v4);\n\n//! Build a column major matrix from other matrix.\n//! From GLM_GTX_matrix_major_storage extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x4<T, P> colMajor4(detail::tmat4x4<T, P> const& m);\n\n/// @}\n}  // namespace glm\n\n#include \"matrix_major_storage.inl\"\n\n#endif  // GLM_GTX_matrix_major_storage\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/matrix_major_storage.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2006-04-19\n// Updated : 2009-02-19\n// Licence : This source is under MIT License\n// File    : glm/gtx/matrix_major_storage.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat2x2<T, P> rowMajor2(\n    detail::tvec2<T, P> const& v1, detail::tvec2<T, P> const& v2) {\n  detail::tmat2x2<T, P> Result;\n  Result[0][0] = v1.x;\n  Result[1][0] = v1.y;\n  Result[0][1] = v2.x;\n  Result[1][1] = v2.y;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat2x2<T, P> rowMajor2(\n    const detail::tmat2x2<T, P>& m) {\n  detail::tmat2x2<T, P> Result;\n  Result[0][0] = m[0][0];\n  Result[0][1] = m[1][0];\n  Result[1][0] = m[0][1];\n  Result[1][1] = m[1][1];\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat3x3<T, P> rowMajor3(\n    const detail::tvec3<T, P>& v1, const detail::tvec3<T, P>& v2,\n    const detail::tvec3<T, P>& v3) {\n  detail::tmat3x3<T, P> Result;\n  Result[0][0] = v1.x;\n  Result[1][0] = v1.y;\n  Result[2][0] = v1.z;\n  Result[0][1] = v2.x;\n  Result[1][1] = v2.y;\n  Result[2][1] = v2.z;\n  Result[0][2] = v3.x;\n  Result[1][2] = v3.y;\n  Result[2][2] = v3.z;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat3x3<T, P> rowMajor3(\n    const detail::tmat3x3<T, P>& m) {\n  detail::tmat3x3<T, P> Result;\n  Result[0][0] = m[0][0];\n  Result[0][1] = m[1][0];\n  Result[0][2] = m[2][0];\n  Result[1][0] = m[0][1];\n  Result[1][1] = m[1][1];\n  Result[1][2] = m[2][1];\n  Result[2][0] = m[0][2];\n  Result[2][1] = m[1][2];\n  Result[2][2] = m[2][2];\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> rowMajor4(\n    const detail::tvec4<T, P>& v1, const detail::tvec4<T, P>& v2,\n    const detail::tvec4<T, P>& v3, const detail::tvec4<T, P>& v4) {\n  detail::tmat4x4<T, P> Result;\n  Result[0][0] = v1.x;\n  Result[1][0] = v1.y;\n  Result[2][0] = v1.z;\n  Result[3][0] = v1.w;\n  Result[0][1] = v2.x;\n  Result[1][1] = v2.y;\n  Result[2][1] = v2.z;\n  Result[3][1] = v2.w;\n  Result[0][2] = v3.x;\n  Result[1][2] = v3.y;\n  Result[2][2] = v3.z;\n  Result[3][2] = v3.w;\n  Result[0][3] = v4.x;\n  Result[1][3] = v4.y;\n  Result[2][3] = v4.z;\n  Result[3][3] = v4.w;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> rowMajor4(\n    const detail::tmat4x4<T, P>& m) {\n  detail::tmat4x4<T, P> Result;\n  Result[0][0] = m[0][0];\n  Result[0][1] = m[1][0];\n  Result[0][2] = m[2][0];\n  Result[0][3] = m[3][0];\n  Result[1][0] = m[0][1];\n  Result[1][1] = m[1][1];\n  Result[1][2] = m[2][1];\n  Result[1][3] = m[3][1];\n  Result[2][0] = m[0][2];\n  Result[2][1] = m[1][2];\n  Result[2][2] = m[2][2];\n  Result[2][3] = m[3][2];\n  Result[3][0] = m[0][3];\n  Result[3][1] = m[1][3];\n  Result[3][2] = m[2][3];\n  Result[3][3] = m[3][3];\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat2x2<T, P> colMajor2(\n    const detail::tvec2<T, P>& v1, const detail::tvec2<T, P>& v2) {\n  return detail::tmat2x2<T, P>(v1, v2);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat2x2<T, P> colMajor2(\n    const detail::tmat2x2<T, P>& m) {\n  return detail::tmat2x2<T, P>(m);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat3x3<T, P> colMajor3(\n    const detail::tvec3<T, P>& v1, const detail::tvec3<T, P>& v2,\n    const detail::tvec3<T, P>& v3) {\n  return detail::tmat3x3<T, P>(v1, v2, v3);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat3x3<T, P> colMajor3(\n    const detail::tmat3x3<T, P>& m) {\n  return detail::tmat3x3<T, P>(m);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> colMajor4(\n    const detail::tvec4<T, P>& v1, const detail::tvec4<T, P>& v2,\n    const detail::tvec4<T, P>& v3, const detail::tvec4<T, P>& v4) {\n  return detail::tmat4x4<T, P>(v1, v2, v3, v4);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> colMajor4(\n    const detail::tmat4x4<T, P>& m) {\n  return detail::tmat4x4<T, P>(m);\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/matrix_operation.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_matrix_operation\n/// @file glm/gtx/matrix_operation.hpp\n/// @date 2009-08-29 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_matrix_operation GLM_GTX_matrix_operation\n/// @ingroup gtx\n///\n/// @brief Build diagonal matrices from vectors.\n///\n/// <glm/gtx/matrix_operation.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_matrix_operation\n#define GLM_GTX_matrix_operation\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_matrix_operation extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_matrix_operation\n/// @{\n\n//! Build a diagonal matrix.\n//! From GLM_GTX_matrix_operation extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat2x2<T, P> diagonal2x2(detail::tvec2<T, P> const& v);\n\n//! Build a diagonal matrix.\n//! From GLM_GTX_matrix_operation extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat2x3<T, P> diagonal2x3(detail::tvec2<T, P> const& v);\n\n//! Build a diagonal matrix.\n//! From GLM_GTX_matrix_operation extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat2x4<T, P> diagonal2x4(detail::tvec2<T, P> const& v);\n\n//! Build a diagonal matrix.\n//! From GLM_GTX_matrix_operation extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat3x2<T, P> diagonal3x2(detail::tvec2<T, P> const& v);\n\n//! Build a diagonal matrix.\n//! From GLM_GTX_matrix_operation extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat3x3<T, P> diagonal3x3(detail::tvec3<T, P> const& v);\n\n//! Build a diagonal matrix.\n//! From GLM_GTX_matrix_operation extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat3x4<T, P> diagonal3x4(detail::tvec3<T, P> const& v);\n\n//! Build a diagonal matrix.\n//! From GLM_GTX_matrix_operation extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x2<T, P> diagonal4x2(detail::tvec2<T, P> const& v);\n\n//! Build a diagonal matrix.\n//! From GLM_GTX_matrix_operation extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x3<T, P> diagonal4x3(detail::tvec3<T, P> const& v);\n\n//! Build a diagonal matrix.\n//! From GLM_GTX_matrix_operation extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x4<T, P> diagonal4x4(detail::tvec4<T, P> const& v);\n\n/// @}\n}  // namespace glm\n\n#include \"matrix_operation.inl\"\n\n#endif  // GLM_GTX_matrix_operation\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/matrix_operation.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2009-08-29\n// Updated : 2009-08-29\n// Licence : This source is under MIT License\n// File    : glm/gtx/matrix_operation.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat2x2<T, P> diagonal2x2(\n    detail::tvec2<T, P> const& v) {\n  detail::tmat2x2<T, P> Result(static_cast<T>(1));\n  Result[0][0] = v[0];\n  Result[1][1] = v[1];\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat2x3<T, P> diagonal2x3(\n    detail::tvec2<T, P> const& v) {\n  detail::tmat2x3<T, P> Result(static_cast<T>(1));\n  Result[0][0] = v[0];\n  Result[1][1] = v[1];\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat2x4<T, P> diagonal2x4(\n    detail::tvec2<T, P> const& v) {\n  detail::tmat2x4<T, P> Result(static_cast<T>(1));\n  Result[0][0] = v[0];\n  Result[1][1] = v[1];\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat3x2<T, P> diagonal3x2(\n    detail::tvec2<T, P> const& v) {\n  detail::tmat3x2<T, P> Result(static_cast<T>(1));\n  Result[0][0] = v[0];\n  Result[1][1] = v[1];\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat3x3<T, P> diagonal3x3(\n    detail::tvec3<T, P> const& v) {\n  detail::tmat3x3<T, P> Result(static_cast<T>(1));\n  Result[0][0] = v[0];\n  Result[1][1] = v[1];\n  Result[2][2] = v[2];\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat3x4<T, P> diagonal3x4(\n    detail::tvec3<T, P> const& v) {\n  detail::tmat3x4<T, P> Result(static_cast<T>(1));\n  Result[0][0] = v[0];\n  Result[1][1] = v[1];\n  Result[2][2] = v[2];\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> diagonal4x4(\n    detail::tvec4<T, P> const& v) {\n  detail::tmat4x4<T, P> Result(static_cast<T>(1));\n  Result[0][0] = v[0];\n  Result[1][1] = v[1];\n  Result[2][2] = v[2];\n  Result[3][3] = v[3];\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x3<T, P> diagonal4x3(\n    detail::tvec3<T, P> const& v) {\n  detail::tmat4x3<T, P> Result(static_cast<T>(1));\n  Result[0][0] = v[0];\n  Result[1][1] = v[1];\n  Result[2][2] = v[2];\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x2<T, P> diagonal4x2(\n    detail::tvec2<T, P> const& v) {\n  detail::tmat4x2<T, P> Result(static_cast<T>(1));\n  Result[0][0] = v[0];\n  Result[1][1] = v[1];\n  return Result;\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/matrix_query.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_matrix_query\n/// @file glm/gtx/matrix_query.hpp\n/// @date 2007-03-05 / 2011-08-28\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtx_vector_query (dependence)\n///\n/// @defgroup gtx_matrix_query GLM_GTX_matrix_query\n/// @ingroup gtx\n///\n/// @brief Query to evaluate matrix properties\n///\n/// <glm/gtx/matrix_query.hpp> need to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_matrix_query\n#define GLM_GTX_matrix_query\n\n// Dependency:\n#include <limits>\n\n#include \"../glm.hpp\"\n#include \"../gtx/vector_query.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_matrix_query extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_matrix_query\n/// @{\n\n/// Return whether a matrix a null matrix.\n/// From GLM_GTX_matrix_query extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL bool isNull(detail::tmat2x2<T, P> const& m, T const& epsilon);\n\n/// Return whether a matrix a null matrix.\n/// From GLM_GTX_matrix_query extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL bool isNull(detail::tmat3x3<T, P> const& m, T const& epsilon);\n\n/// Return whether a matrix is a null matrix.\n/// From GLM_GTX_matrix_query extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL bool isNull(detail::tmat4x4<T, P> const& m, T const& epsilon);\n\n/// Return whether a matrix is an identity matrix.\n/// From GLM_GTX_matrix_query extension.\ntemplate <typename T, precision P, template <typename, precision> class matType>\nGLM_FUNC_DECL bool isIdentity(matType<T, P> const& m, T const& epsilon);\n\n/// Return whether a matrix is a normalized matrix.\n/// From GLM_GTX_matrix_query extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL bool isNormalized(detail::tmat2x2<T, P> const& m,\n                                T const& epsilon);\n\n/// Return whether a matrix is a normalized matrix.\n/// From GLM_GTX_matrix_query extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL bool isNormalized(detail::tmat3x3<T, P> const& m,\n                                T const& epsilon);\n\n/// Return whether a matrix is a normalized matrix.\n/// From GLM_GTX_matrix_query extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL bool isNormalized(detail::tmat4x4<T, P> const& m,\n                                T const& epsilon);\n\n/// Return whether a matrix is an orthonormalized matrix.\n/// From GLM_GTX_matrix_query extension.\ntemplate <typename T, precision P, template <typename, precision> class matType>\nGLM_FUNC_DECL bool isOrthogonal(matType<T, P> const& m, T const& epsilon);\n\n/// @}\n}  // namespace glm\n\n#include \"matrix_query.inl\"\n\n#endif  // GLM_GTX_matrix_query\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/matrix_query.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2007-03-05\n// Updated : 2007-03-05\n// Licence : This source is under MIT License\n// File    : glm/gtx/matrix_query.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Dependency:\n// - GLM core\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool isNull(detail::tmat2x2<T, P> const& m,\n                               T const& epsilon) {\n  bool result = true;\n  for (length_t i = 0; result && i < 2; ++i) result = isNull(m[i], epsilon);\n  return result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool isNull(detail::tmat3x3<T, P> const& m,\n                               T const& epsilon) {\n  bool result = true;\n  for (length_t i = 0; result && i < 3; ++i) result = isNull(m[i], epsilon);\n  return result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool isNull(detail::tmat4x4<T, P> const& m,\n                               T const& epsilon) {\n  bool result = true;\n  for (length_t i = 0; result && i < 4; ++i) result = isNull(m[i], epsilon);\n  return result;\n}\n\ntemplate <typename T, precision P, template <typename, precision> class matType>\nGLM_FUNC_QUALIFIER bool isIdentity(matType<T, P> const& m, T const& epsilon) {\n  bool result = true;\n  for (length_t i(0); result && i < m[0].length(); ++i) {\n    for (length_t j(0); result && j < i; ++j) result = abs(m[i][j]) <= epsilon;\n    if (result) result = abs(m[i][i] - 1) <= epsilon;\n    for (length_t j(i + 1); result && j < m.length(); ++j)\n      result = abs(m[i][j]) <= epsilon;\n  }\n  return result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool isNormalized(detail::tmat2x2<T, P> const& m,\n                                     T const& epsilon) {\n  bool result(true);\n  for (length_t i(0); result && i < m.length(); ++i)\n    result = isNormalized(m[i], epsilon);\n  for (length_t i(0); result && i < m.length(); ++i) {\n    typename detail::tmat2x2<T, P>::col_type v;\n    for (length_t j(0); j < m.length(); ++j) v[j] = m[j][i];\n    result = isNormalized(v, epsilon);\n  }\n  return result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool isNormalized(detail::tmat3x3<T, P> const& m,\n                                     T const& epsilon) {\n  bool result(true);\n  for (length_t i(0); result && i < m.length(); ++i)\n    result = isNormalized(m[i], epsilon);\n  for (length_t i(0); result && i < m.length(); ++i) {\n    typename detail::tmat3x3<T, P>::col_type v;\n    for (length_t j(0); j < m.length(); ++j) v[j] = m[j][i];\n    result = isNormalized(v, epsilon);\n  }\n  return result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER bool isNormalized(detail::tmat4x4<T, P> const& m,\n                                     T const& epsilon) {\n  bool result(true);\n  for (length_t i(0); result && i < m.length(); ++i)\n    result = isNormalized(m[i], epsilon);\n  for (length_t i(0); result && i < m.length(); ++i) {\n    typename detail::tmat4x4<T, P>::col_type v;\n    for (length_t j(0); j < m.length(); ++j) v[j] = m[j][i];\n    result = isNormalized(v, epsilon);\n  }\n  return result;\n}\n\ntemplate <typename T, precision P, template <typename, precision> class matType>\nGLM_FUNC_QUALIFIER bool isOrthogonal(matType<T, P> const& m, T const& epsilon) {\n  bool result(true);\n  for (length_t i(0); result && i < m.length() - 1; ++i)\n    for (length_t j(i + 1); result && j < m.length(); ++j)\n      result = areOrthogonal(m[i], m[j], epsilon);\n\n  if (result) {\n    matType<T, P> tmp = transpose(m);\n    for (length_t i(0); result && i < m.length() - 1; ++i)\n      for (length_t j(i + 1); result && j < m.length(); ++j)\n        result = areOrthogonal(tmp[i], tmp[j], epsilon);\n  }\n  return result;\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/matrix_transform_2d.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_matrix_transform_2d\n/// @file glm/gtx/matrix_transform_2d.hpp\n/// @date 2014-02-20\n/// @author Miguel Ángel Pérez Martínez\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_matrix_transform_2d GLM_GTX_matrix_transform_2d\n/// @ingroup gtx\n///\n/// @brief Defines functions that generate common 2d transformation matrices.\n///\n/// <glm/gtx/matrix_transform_2d.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_matrix_transform_2d\n#define GLM_GTX_matrix_transform_2d\n\n// Dependency:\n#include \"../mat3x3.hpp\"\n#include \"../vec2.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_matrix_transform_2d extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_matrix_transform_2d\n/// @{\n\n/// Builds a translation 3 * 3 matrix created from a vector of 2 components.\n///\n/// @param m Input matrix multiplied by this translation matrix.\n/// @param v Coordinates of a translation vector.\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat3x3<T, P> translate(\n    detail::tmat3x3<T, P> const& m, detail::tvec2<T, P> const& v);\n\n/// Builds a rotation 3 * 3 matrix created from an angle.\n///\n/// @param m Input matrix multiplied by this translation matrix.\n/// @param angle Rotation angle expressed in radians if GLM_FORCE_RADIANS is\n/// defined or degrees otherwise.\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat3x3<T, P> rotate(detail::tmat3x3<T, P> const& m,\n                                                T const& angle);\n\n/// Builds a scale 3 * 3 matrix created from a vector of 2 components.\n///\n/// @param m Input matrix multiplied by this translation matrix.\n/// @param v Coordinates of a scale vector.\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat3x3<T, P> scale(detail::tmat3x3<T, P> const& m,\n                                               detail::tvec2<T, P> const& v);\n\n/// Builds an horizontal (parallel to the x axis) shear 3 * 3 matrix.\n///\n/// @param m Input matrix multiplied by this translation matrix.\n/// @param y Shear factor.\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat3x3<T, P> shearX(detail::tmat3x3<T, P> const& m,\n                                                T const& y);\n\n/// Builds a vertical (parallel to the y axis) shear 3 * 3 matrix.\n///\n/// @param m Input matrix multiplied by this translation matrix.\n/// @param x Shear factor.\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat3x3<T, P> shearY(detail::tmat3x3<T, P> const& m,\n                                                T const& x);\n\n/// @}\n}  // namespace glm\n\n#include \"matrix_transform_2d.inl\"\n\n#endif  // GLM_GTX_matrix_transform_2d\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/matrix_transform_2d.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_matrix_transform_2d\n/// @file glm/gtc/matrix_transform_2d.inl\n/// @date 2014-02-20\n/// @author Miguel Ángel Pérez Martínez\n///////////////////////////////////////////////////////////////////////////////////\n\n#include \"../trigonometric.hpp\"\n\nnamespace glm {\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat3x3<T, P> translate(\n    detail::tmat3x3<T, P> const& m, detail::tvec2<T, P> const& v) {\n  detail::tmat3x3<T, P> Result(m);\n  Result[2] = m[0] * v[0] + m[1] * v[1] + m[2];\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat3x3<T, P> rotate(detail::tmat3x3<T, P> const& m,\n                                                T const& angle) {\n#ifdef GLM_FORCE_RADIANS\n  T a = angle;\n#else\n  T a = radians(angle);\n#endif\n  T c = cos(a);\n  T s = sin(a);\n\n  detail::tmat3x3<T, P> Result(detail::tmat3x3<T, P>::_null);\n  Result[0] = m[0] * c + m[1] * s;\n  Result[1] = m[0] * -s + m[1] * c;\n  Result[2] = m[2];\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat3x3<T, P> scale(detail::tmat3x3<T, P> const& m,\n                                               detail::tvec2<T, P> const& v) {\n  detail::tmat3x3<T, P> Result(detail::tmat3x3<T, P>::_null);\n  Result[0] = m[0] * v[0];\n  Result[1] = m[1] * v[1];\n  Result[2] = m[2];\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat3x3<T, P> shearX(detail::tmat3x3<T, P> const& m,\n                                                T const& y) {\n  detail::tmat3x3<T, P> Result();\n  Result[0][1] = y;\n  return m * Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat3x3<T, P> shearY(detail::tmat3x3<T, P> const& m,\n                                                T const& x) {\n  detail::tmat3x3<T, P> Result();\n  Result[1][0] = x;\n  return m * Result;\n}\n\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/mixed_product.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_mixed_product\n/// @file glm/gtx/mixed_product.hpp\n/// @date 2007-04-03 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_mixed_product GLM_GTX_mixed_producte\n/// @ingroup gtx\n///\n/// @brief Mixed product of 3 vectors.\n///\n/// <glm/gtx/mixed_product.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_mixed_product\n#define GLM_GTX_mixed_product\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_mixed_product extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_mixed_product\n/// @{\n\n/// @brief Mixed product of 3 vectors (from GLM_GTX_mixed_product extension)\ntemplate <typename T, precision P>\nGLM_FUNC_DECL T mixedProduct(detail::tvec3<T, P> const& v1,\n                             detail::tvec3<T, P> const& v2,\n                             detail::tvec3<T, P> const& v3);\n\n/// @}\n}  // namespace glm\n\n#include \"mixed_product.inl\"\n\n#endif  // GLM_GTX_mixed_product\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/mixed_product.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2007-04-03\n// Updated : 2008-09-17\n// Licence : This source is under MIT License\n// File    : glm/gtx/mixed_product.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T mixedProduct(detail::tvec3<T, P> const& v1,\n                                  detail::tvec3<T, P> const& v2,\n                                  detail::tvec3<T, P> const& v3) {\n  return dot(cross(v1, v2), v3);\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/multiple.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_multiple\n/// @file glm/gtx/multiple.hpp\n/// @date 2009-10-26 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtx_extented_min_max (dependence)\n///\n/// @defgroup gtx_multiple GLM_GTX_multiple\n/// @ingroup gtx\n///\n/// @brief Find the closest number of a number multiple of other number.\n///\n/// <glm/gtx/multiple.hpp> need to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_multiple\n#define GLM_GTX_multiple\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_multiple extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_multiple\n/// @{\n\n/// Higher multiple number of Source.\n///\n/// @tparam genType Floating-point or integer scalar or vector types.\n/// @param Source\n/// @param Multiple Must be a null or positive value\n///\n/// @see gtx_multiple\ntemplate <typename genType>\nGLM_FUNC_DECL genType higherMultiple(genType const& Source,\n                                     genType const& Multiple);\n\n/// Lower multiple number of Source.\n///\n/// @tparam genType Floating-point or integer scalar or vector types.\n/// @param Source\n/// @param Multiple Must be a null or positive value\n///\n/// @see gtx_multiple\ntemplate <typename genType>\nGLM_FUNC_DECL genType lowerMultiple(genType const& Source,\n                                    genType const& Multiple);\n\n/// @}\n}  // namespace glm\n\n#include \"multiple.inl\"\n\n#endif  // GLM_GTX_multiple\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/multiple.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2009-10-26\n// Updated : 2011-06-07\n// Licence : This source is under MIT License\n// File    : glm/gtx/multiple.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Dependency:\n// - GLM core\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\nnamespace detail {\ntemplate <bool Signed>\nstruct higherMultiple {\n  template <typename genType>\n  GLM_FUNC_QUALIFIER genType operator()(genType const& Source,\n                                        genType const& Multiple) {\n    if (Source > genType(0)) {\n      genType Tmp = Source - genType(1);\n      return Tmp + (Multiple - (Tmp % Multiple));\n    } else\n      return Source + (-Source % Multiple);\n  }\n};\n\ntemplate <>\nstruct higherMultiple<false> {\n  template <typename genType>\n  GLM_FUNC_QUALIFIER genType operator()(genType const& Source,\n                                        genType const& Multiple) {\n    genType Tmp = Source - genType(1);\n    return Tmp + (Multiple - (Tmp % Multiple));\n  }\n};\n}  // namespace detail\n\n//////////////////////\n// higherMultiple\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType higherMultiple(genType const& Source,\n                                          genType const& Multiple) {\n  detail::higherMultiple<std::numeric_limits<genType>::is_signed> Compute;\n  return Compute(Source, Multiple);\n}\n\ntemplate <>\nGLM_FUNC_QUALIFIER float higherMultiple(float const& Source,\n                                        float const& Multiple) {\n  if (Source > float(0)) {\n    float Tmp = Source - float(1);\n    return Tmp + (Multiple - std::fmod(Tmp, Multiple));\n  } else\n    return Source + std::fmod(-Source, Multiple);\n}\n\ntemplate <>\nGLM_FUNC_QUALIFIER double higherMultiple(double const& Source,\n                                         double const& Multiple) {\n  if (Source > double(0)) {\n    double Tmp = Source - double(1);\n    return Tmp + (Multiple - std::fmod(Tmp, Multiple));\n  } else\n    return Source + std::fmod(-Source, Multiple);\n}\n\nVECTORIZE_VEC_VEC(higherMultiple)\n\n//////////////////////\n// lowerMultiple\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType lowerMultiple(genType const& Source,\n                                         genType const& Multiple) {\n  if (Source >= genType(0))\n    return Source - Source % Multiple;\n  else {\n    genType Tmp = Source + genType(1);\n    return Tmp - Tmp % Multiple - Multiple;\n  }\n}\n\ntemplate <>\nGLM_FUNC_QUALIFIER float lowerMultiple(float const& Source,\n                                       float const& Multiple) {\n  if (Source >= float(0))\n    return Source - std::fmod(Source, Multiple);\n  else {\n    float Tmp = Source + float(1);\n    return Tmp - std::fmod(Tmp, Multiple) - Multiple;\n  }\n}\n\ntemplate <>\nGLM_FUNC_QUALIFIER double lowerMultiple(double const& Source,\n                                        double const& Multiple) {\n  if (Source >= double(0))\n    return Source - std::fmod(Source, Multiple);\n  else {\n    double Tmp = Source + double(1);\n    return Tmp - std::fmod(Tmp, Multiple) - Multiple;\n  }\n}\n\nVECTORIZE_VEC_VEC(lowerMultiple)\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/noise.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///////////////////////////////////////////////////////////////////////////////////\n\n#if (defined(GLM_MESSAGES))\n#pragma message( \\\n        \"GLM: GLM_GTX_random extension is deprecated, include GLM_GTC_random (glm/gtc/noise.hpp) instead\")\n#endif\n\n// Promoted:\n#include \"../gtc/noise.hpp\"\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/norm.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_norm\n/// @file glm/gtx/norm.hpp\n/// @date 2005-12-21 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtx_quaternion (dependence)\n///\n/// @defgroup gtx_norm GLM_GTX_norm\n/// @ingroup gtx\n///\n/// @brief Various ways to compute vector norms.\n///\n/// <glm/gtx/norm.hpp> need to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_norm\n#define GLM_GTX_norm\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtx/quaternion.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_norm extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_norm\n/// @{\n\n//! Returns the squared length of x.\n//! From GLM_GTX_norm extension.\ntemplate <typename T>\nGLM_FUNC_DECL T length2(T const& x);\n\n//! Returns the squared length of x.\n//! From GLM_GTX_norm extension.\ntemplate <typename genType>\nGLM_FUNC_DECL typename genType::value_type length2(genType const& x);\n\n//! Returns the squared distance between p0 and p1, i.e., length(p0 - p1).\n//! From GLM_GTX_norm extension.\ntemplate <typename T>\nGLM_FUNC_DECL T distance2(T const& p0, T const& p1);\n\n//! Returns the squared distance between p0 and p1, i.e., length(p0 - p1).\n//! From GLM_GTX_norm extension.\ntemplate <typename genType>\nGLM_FUNC_DECL typename genType::value_type distance2(genType const& p0,\n                                                     genType const& p1);\n\n//! Returns the L1 norm between x and y.\n//! From GLM_GTX_norm extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL T l1Norm(detail::tvec3<T, P> const& x,\n                       detail::tvec3<T, P> const& y);\n\n//! Returns the L1 norm of v.\n//! From GLM_GTX_norm extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL T l1Norm(detail::tvec3<T, P> const& v);\n\n//! Returns the L2 norm between x and y.\n//! From GLM_GTX_norm extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL T l2Norm(detail::tvec3<T, P> const& x,\n                       detail::tvec3<T, P> const& y);\n\n//! Returns the L2 norm of v.\n//! From GLM_GTX_norm extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL T l2Norm(detail::tvec3<T, P> const& x);\n\n//! Returns the L norm between x and y.\n//! From GLM_GTX_norm extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL T lxNorm(detail::tvec3<T, P> const& x,\n                       detail::tvec3<T, P> const& y, unsigned int Depth);\n\n//! Returns the L norm of v.\n//! From GLM_GTX_norm extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL T lxNorm(detail::tvec3<T, P> const& x, unsigned int Depth);\n\n/// @}\n}  // namespace glm\n\n#include \"norm.inl\"\n\n#endif  // GLM_GTX_norm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/norm.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2005-12-21\n// Updated : 2008-07-24\n// Licence : This source is under MIT License\n// File    : glm/gtx/norm.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\ntemplate <typename T>\nGLM_FUNC_QUALIFIER T length2(T const& x) {\n  return x * x;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T length2(detail::tvec2<T, P> const& x) {\n  return dot(x, x);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T length2(detail::tvec3<T, P> const& x) {\n  return dot(x, x);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T length2(detail::tvec4<T, P> const& x) {\n  return dot(x, x);\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER T distance2(T const& p0, T const& p1) {\n  return length2(p1 - p0);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T distance2(detail::tvec2<T, P> const& p0,\n                               detail::tvec2<T, P> const& p1) {\n  return length2(p1 - p0);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T distance2(detail::tvec3<T, P> const& p0,\n                               detail::tvec3<T, P> const& p1) {\n  return length2(p1 - p0);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T distance2(detail::tvec4<T, P> const& p0,\n                               detail::tvec4<T, P> const& p1) {\n  return length2(p1 - p0);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T l1Norm(detail::tvec3<T, P> const& a,\n                            detail::tvec3<T, P> const& b) {\n  return abs(b.x - a.x) + abs(b.y - a.y) + abs(b.z - a.z);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T l1Norm(detail::tvec3<T, P> const& v) {\n  return abs(v.x) + abs(v.y) + abs(v.z);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T l2Norm(detail::tvec3<T, P> const& a,\n                            detail::tvec3<T, P> const& b) {\n  return length(b - a);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T l2Norm(detail::tvec3<T, P> const& v) {\n  return length(v);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T lxNorm(detail::tvec3<T, P> const& x,\n                            detail::tvec3<T, P> const& y, unsigned int Depth) {\n  return pow(pow(y.x - x.x, T(Depth)) + pow(y.y - x.y, T(Depth)) +\n                 pow(y.z - x.z, T(Depth)),\n             T(1) / T(Depth));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T lxNorm(detail::tvec3<T, P> const& v, unsigned int Depth) {\n  return pow(pow(v.x, T(Depth)) + pow(v.y, T(Depth)) + pow(v.z, T(Depth)),\n             T(1) / T(Depth));\n}\n\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/normal.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_normal\n/// @file glm/gtx/normal.hpp\n/// @date 2005-12-21 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtx_extented_min_max (dependence)\n///\n/// @defgroup gtx_normal GLM_GTX_normal\n/// @ingroup gtx\n///\n/// @brief Compute the normal of a triangle.\n///\n/// <glm/gtx/normal.hpp> need to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_normal\n#define GLM_GTX_normal\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_normal extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_normal\n/// @{\n\n//! Computes triangle normal from triangle points.\n//! From GLM_GTX_normal extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec3<T, P> triangleNormal(detail::tvec3<T, P> const& p1,\n                                                 detail::tvec3<T, P> const& p2,\n                                                 detail::tvec3<T, P> const& p3);\n\n/// @}\n}  // namespace glm\n\n#include \"normal.inl\"\n\n#endif  // GLM_GTX_normal\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/normal.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2005-12-21\n// Updated : 2011-06-07\n// Licence : This source is under MIT License\n// File    : glm/gtx/normal.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> triangleNormal(\n    detail::tvec3<T, P> const& p1, detail::tvec3<T, P> const& p2,\n    detail::tvec3<T, P> const& p3) {\n  return normalize(cross(p1 - p2, p1 - p3));\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/normalize_dot.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_normalize_dot\n/// @file glm/gtx/normalize_dot.hpp\n/// @date 2007-09-28 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtx_fast_square_root (dependence)\n///\n/// @defgroup gtx_normalize_dot GLM_GTX_normalize_dot\n/// @ingroup gtx\n///\n/// @brief Dot product of vectors that need to be normalize with a single square\n/// root.\n///\n/// <glm/gtx/normalized_dot.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_normalize_dot\n#define GLM_GTX_normalize_dot\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtx/fast_square_root.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_normalize_dot extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_normalize_dot\n/// @{\n\n//! Normalize parameters and returns the dot product of x and y.\n//! It's faster that dot(normalize(x), normalize(y)).\n//! From GLM_GTX_normalize_dot extension.\ntemplate <typename genType>\nGLM_FUNC_DECL typename genType::value_type normalizeDot(genType const& x,\n                                                        genType const& y);\n\n//! Normalize parameters and returns the dot product of x and y.\n//! Faster that dot(fastNormalize(x), fastNormalize(y)).\n//! From GLM_GTX_normalize_dot extension.\ntemplate <typename genType>\nGLM_FUNC_DECL typename genType::value_type fastNormalizeDot(genType const& x,\n                                                            genType const& y);\n\n/// @}\n}  // namespace glm\n\n#include \"normalize_dot.inl\"\n\n#endif  // GLM_GTX_normalize_dot\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/normalize_dot.inl",
    "content": "//////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n//////////////////////////////////////////////////////////////////////////////////\n// Created : 2007-09-28\n// Updated : 2008-10-07\n// Licence : This source is under MIT License\n// File    : glm/gtx/normalize_dot.inl\n//////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType normalizeDot(genType const& x, genType const& y) {\n  return glm::dot(x, y) * glm::inversesqrt(glm::dot(x, x) * glm::dot(y, y));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T normalizeDot(detail::tvec2<T, P> const& x,\n                                  detail::tvec2<T, P> const& y) {\n  return glm::dot(x, y) * glm::inversesqrt(glm::dot(x, x) * glm::dot(y, y));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T normalizeDot(detail::tvec3<T, P> const& x,\n                                  detail::tvec3<T, P> const& y) {\n  return glm::dot(x, y) * glm::inversesqrt(glm::dot(x, x) * glm::dot(y, y));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T normalizeDot(detail::tvec4<T, P> const& x,\n                                  detail::tvec4<T, P> const& y) {\n  return glm::dot(x, y) * glm::inversesqrt(glm::dot(x, x) * glm::dot(y, y));\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType fastNormalizeDot(genType const& x,\n                                            genType const& y) {\n  return glm::dot(x, y) * fastInverseSqrt(glm::dot(x, x) * glm::dot(y, y));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T fastNormalizeDot(detail::tvec2<T, P> const& x,\n                                      detail::tvec2<T, P> const& y) {\n  return glm::dot(x, y) * fastInverseSqrt(glm::dot(x, x) * glm::dot(y, y));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T fastNormalizeDot(detail::tvec3<T, P> const& x,\n                                      detail::tvec3<T, P> const& y) {\n  return glm::dot(x, y) * fastInverseSqrt(glm::dot(x, x) * glm::dot(y, y));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T fastNormalizeDot(detail::tvec4<T, P> const& x,\n                                      detail::tvec4<T, P> const& y) {\n  return glm::dot(x, y) * fastInverseSqrt(glm::dot(x, x) * glm::dot(y, y));\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/number_precision.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_number_precision\n/// @file glm/gtx/number_precision.hpp\n/// @date 2007-05-10 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtc_type_precision (dependence)\n/// @see gtc_quaternion (dependence)\n///\n/// @defgroup gtx_number_precision GLM_GTX_number_precision\n/// @ingroup gtx\n///\n/// @brief Defined size types.\n///\n/// <glm/gtx/number_precision.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_number_precision\n#define GLM_GTX_number_precision\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtc/type_precision.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_number_precision extension included\")\n#endif\n\nnamespace glm {\nnamespace gtx {\n/////////////////////////////\n// Unsigned int vector types\n\n/// @addtogroup gtx_number_precision\n/// @{\n\ntypedef u8 u8vec1;    //!< \\brief 8bit unsigned integer scalar. (from\n                      //!< GLM_GTX_number_precision extension)\ntypedef u16 u16vec1;  //!< \\brief 16bit unsigned integer scalar. (from\n                      //!< GLM_GTX_number_precision extension)\ntypedef u32 u32vec1;  //!< \\brief 32bit unsigned integer scalar. (from\n                      //!< GLM_GTX_number_precision extension)\ntypedef u64 u64vec1;  //!< \\brief 64bit unsigned integer scalar. (from\n                      //!< GLM_GTX_number_precision extension)\n\n//////////////////////\n// Float vector types\n\ntypedef f32 f32vec1;  //!< \\brief Single-precision floating-point scalar. (from\n                      //!< GLM_GTX_number_precision extension)\ntypedef f64 f64vec1;  //!< \\brief Single-precision floating-point scalar. (from\n                      //!< GLM_GTX_number_precision extension)\n\n//////////////////////\n// Float matrix types\n\ntypedef f32 f32mat1;  //!< \\brief Single-precision floating-point scalar. (from\n                      //!< GLM_GTX_number_precision extension)\ntypedef f32 f32mat1x1;  //!< \\brief Single-precision floating-point scalar.\n                        //!< (from GLM_GTX_number_precision extension)\ntypedef f64 f64mat1;  //!< \\brief Double-precision floating-point scalar. (from\n                      //!< GLM_GTX_number_precision extension)\ntypedef f64 f64mat1x1;  //!< \\brief Double-precision floating-point scalar.\n                        //!< (from GLM_GTX_number_precision extension)\n\n/// @}\n}  // namespace gtx\n}  // namespace glm\n\n#include \"number_precision.inl\"\n\n#endif  // GLM_GTX_number_precision\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/number_precision.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2007-05-10\n// Updated : 2007-05-10\n// Licence : This source is under MIT License\n// File    : glm/gtx/number_precision.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {}\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/optimum_pow.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_optimum_pow\n/// @file glm/gtx/optimum_pow.hpp\n/// @date 2005-12-21 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_optimum_pow GLM_GTX_optimum_pow\n/// @ingroup gtx\n///\n/// @brief Integer exponentiation of power functions.\n///\n/// <glm/gtx/optimum_pow.hpp> need to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_optimum_pow\n#define GLM_GTX_optimum_pow\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_optimum_pow extension included\")\n#endif\n\nnamespace glm {\nnamespace gtx {\n/// @addtogroup gtx_optimum_pow\n/// @{\n\n//! Returns x raised to the power of 2.\n//! From GLM_GTX_optimum_pow extension.\ntemplate <typename genType>\nGLM_FUNC_DECL genType pow2(const genType& x);\n\n//! Returns x raised to the power of 3.\n//! From GLM_GTX_optimum_pow extension.\ntemplate <typename genType>\nGLM_FUNC_DECL genType pow3(const genType& x);\n\n//! Returns x raised to the power of 4.\n//! From GLM_GTX_optimum_pow extension.\ntemplate <typename genType>\nGLM_FUNC_DECL genType pow4(const genType& x);\n\n//! Checks if the parameter is a power of 2 number.\n//! From GLM_GTX_optimum_pow extension.\nGLM_FUNC_DECL bool powOfTwo(int num);\n\n//! Checks to determine if the parameter component are power of 2 numbers.\n//! From GLM_GTX_optimum_pow extension.\ntemplate <precision P>\nGLM_FUNC_DECL detail::tvec2<bool, P> powOfTwo(detail::tvec2<int, P> const& x);\n\n//! Checks to determine if the parameter component are power of 2 numbers.\n//! From GLM_GTX_optimum_pow extension.\ntemplate <precision P>\nGLM_FUNC_DECL detail::tvec3<bool, P> powOfTwo(detail::tvec3<int, P> const& x);\n\n//! Checks to determine if the parameter component are power of 2 numbers.\n//! From GLM_GTX_optimum_pow extension.\ntemplate <precision P>\nGLM_FUNC_DECL detail::tvec4<bool, P> powOfTwo(detail::tvec4<int, P> const& x);\n\n/// @}\n}  // namespace gtx\n}  // namespace glm\n\n#include \"optimum_pow.inl\"\n\n#endif  // GLM_GTX_optimum_pow\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/optimum_pow.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2005-12-21\n// Updated : 2005-12-27\n// Licence : This source is under MIT License\n// File    : glm/gtx/optimum_pow.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType pow2(genType const& x) {\n  return x * x;\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType pow3(genType const& x) {\n  return x * x * x;\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType pow4(genType const& x) {\n  return (x * x) * (x * x);\n}\n\nGLM_FUNC_QUALIFIER bool powOfTwo(int x) { return !(x & (x - 1)); }\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<bool, P> powOfTwo(\n    detail::tvec2<int, P> const& x) {\n  return detail::tvec2<bool, P>(powOfTwo(x.x), powOfTwo(x.y));\n}\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<bool, P> powOfTwo(\n    detail::tvec3<int, P> const& x) {\n  return detail::tvec3<bool, P>(powOfTwo(x.x), powOfTwo(x.y), powOfTwo(x.z));\n}\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<bool, P> powOfTwo(\n    detail::tvec4<int, P> const& x) {\n  return detail::tvec4<bool, P>(powOfTwo(x.x), powOfTwo(x.y), powOfTwo(x.z),\n                                powOfTwo(x.w));\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/orthonormalize.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_orthonormalize\n/// @file glm/gtx/orthonormalize.hpp\n/// @date 2005-12-21 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtx_extented_min_max (dependence)\n///\n/// @defgroup gtx_orthonormalize GLM_GTX_orthonormalize\n/// @ingroup gtx\n///\n/// @brief Orthonormalize matrices.\n///\n/// <glm/gtx/orthonormalize.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_orthonormalize\n#define GLM_GTX_orthonormalize\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_orthonormalize extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_orthonormalize\n/// @{\n\n//! Returns the orthonormalized matrix of m.\n//! From GLM_GTX_orthonormalize extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat3x3<T, P> orthonormalize(\n    const detail::tmat3x3<T, P>& m);\n\n//! Orthonormalizes x according y.\n//! From GLM_GTX_orthonormalize extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec3<T, P> orthonormalize(const detail::tvec3<T, P>& x,\n                                                 const detail::tvec3<T, P>& y);\n\n/// @}\n}  // namespace glm\n\n#include \"orthonormalize.inl\"\n\n#endif  // GLM_GTX_orthonormalize\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/orthonormalize.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2005-12-21\n// Updated : 2005-12-21\n// Licence : This source is under MIT License\n// File    : glm/gtx/orthonormalize.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat3x3<T, P> orthonormalize(\n    const detail::tmat3x3<T, P>& m) {\n  detail::tmat3x3<T, P> r = m;\n\n  r[0] = normalize(r[0]);\n\n  float d0 = dot(r[0], r[1]);\n  r[1] -= r[0] * d0;\n  r[1] = normalize(r[1]);\n\n  float d1 = dot(r[1], r[2]);\n  d0 = dot(r[0], r[2]);\n  r[2] -= r[0] * d0 + r[1] * d1;\n  r[2] = normalize(r[2]);\n\n  return r;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> orthonormalize(\n    const detail::tvec3<T, P>& x, const detail::tvec3<T, P>& y) {\n  return normalize(x - y * dot(y, x));\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/perpendicular.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_perpendicular\n/// @file glm/gtx/perpendicular.hpp\n/// @date 2005-12-21 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtx_projection (dependence)\n///\n/// @defgroup gtx_perpendicular GLM_GTX_perpendicular\n/// @ingroup gtx\n///\n/// @brief Perpendicular of a vector from other one\n///\n/// <glm/gtx/perpendicular.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_perpendicular\n#define GLM_GTX_perpendicular\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtx/projection.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_perpendicular extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_perpendicular\n/// @{\n\n//! Projects x a perpendicular axis of Normal.\n//! From GLM_GTX_perpendicular extension.\ntemplate <typename vecType>\nGLM_FUNC_DECL vecType perp(vecType const& x, vecType const& Normal);\n\n/// @}\n}  // namespace glm\n\n#include \"perpendicular.inl\"\n\n#endif  // GLM_GTX_perpendicular\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/perpendicular.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2005-12-21\n// Updated : 2009-03-06\n// Licence : This source is under MIT License\n// File    : glm/gtx/perpendicular.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\ntemplate <typename vecType>\nGLM_FUNC_QUALIFIER vecType perp(vecType const& x, vecType const& Normal) {\n  return x - proj(x, Normal);\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/polar_coordinates.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_polar_coordinates\n/// @file glm/gtx/polar_coordinates.hpp\n/// @date 2007-03-06 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_polar_coordinates GLM_GTX_polar_coordinates\n/// @ingroup gtx\n///\n/// @brief Conversion from Euclidean space to polar space and revert.\n///\n/// <glm/gtx/polar_coordinates.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_polar_coordinates\n#define GLM_GTX_polar_coordinates\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_polar_coordinates extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_polar_coordinates\n/// @{\n\n/// Convert Euclidean to Polar coordinates, x is the xz distance, y, the\n/// latitude and z the longitude.\n///\n/// @see gtx_polar_coordinates\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec3<T, P> polar(detail::tvec3<T, P> const& euclidean);\n\n/// Convert Polar to Euclidean coordinates.\n///\n/// @see gtx_polar_coordinates\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec3<T, P> euclidean(detail::tvec2<T, P> const& polar);\n\n/// @}\n}  // namespace glm\n\n#include \"polar_coordinates.inl\"\n\n#endif  // GLM_GTX_polar_coordinates\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/polar_coordinates.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2007-03-06\n// Updated : 2009-05-01\n// Licence : This source is under MIT License\n// File    : glm/gtx/polar_coordinates.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> polar(\n    detail::tvec3<T, P> const& euclidean) {\n  T const Length(length(euclidean));\n  detail::tvec3<T, P> const tmp(euclidean / Length);\n  T const xz_dist(sqrt(tmp.x * tmp.x + tmp.z * tmp.z));\n\n#ifdef GLM_FORCE_RADIANS\n  return detail::tvec3<T, P>(atan(xz_dist, tmp.y),  // latitude\n                             atan(tmp.x, tmp.z),    // longitude\n                             xz_dist);              // xz distance\n#else\n#pragma message( \\\n        \"GLM: polar function returning degrees is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.\")\n  return detail::tvec3<T, P>(degrees(atan(xz_dist, tmp.y)),  // latitude\n                             degrees(atan(tmp.x, tmp.z)),    // longitude\n                             xz_dist);                       // xz distance\n#endif\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> euclidean(\n    detail::tvec2<T, P> const& polar) {\n#ifdef GLM_FORCE_RADIANS\n  T const latitude(polar.x);\n  T const longitude(polar.y);\n#else\n#pragma message( \\\n        \"GLM: euclidean function taking degrees as parameters is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.\")\n  T const latitude(radians(polar.x));\n  T const longitude(radians(polar.y));\n#endif\n\n  return detail::tvec3<T, P>(cos(latitude) * sin(longitude), sin(latitude),\n                             cos(latitude) * cos(longitude));\n}\n\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/projection.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_projection\n/// @file glm/gtx/projection.hpp\n/// @date 2005-12-21 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_projection GLM_GTX_projection\n/// @ingroup gtx\n///\n/// @brief Projection of a vector to other one\n///\n/// <glm/gtx/projection.hpp> need to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_projection\n#define GLM_GTX_projection\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_projection extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_projection\n/// @{\n\n//! Projects x on Normal.\n//! From GLM_GTX_projection extension.\ntemplate <typename vecType>\nGLM_FUNC_DECL vecType proj(vecType const& x, vecType const& Normal);\n\n/// @}\n}  // namespace glm\n\n#include \"projection.inl\"\n\n#endif  // GLM_GTX_projection\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/projection.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2005-12-21\n// Updated : 2009-03-06\n// Licence : This source is under MIT License\n// File    : glm/gtx/projection.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\ntemplate <typename vecType>\nGLM_FUNC_QUALIFIER vecType proj(vecType const& x, vecType const& Normal) {\n  return glm::dot(x, Normal) / glm::dot(Normal, Normal) * Normal;\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/quaternion.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_quaternion\n/// @file glm/gtx/quaternion.hpp\n/// @date 2005-12-21 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtx_extented_min_max (dependence)\n///\n/// @defgroup gtx_quaternion GLM_GTX_quaternion\n/// @ingroup gtx\n///\n/// @brief Extented quaternion types and functions\n///\n/// <glm/gtx/quaternion.hpp> need to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_quaternion\n#define GLM_GTX_quaternion\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtc/constants.hpp\"\n#include \"../gtc/quaternion.hpp\"\n#include \"../gtx/norm.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_quaternion extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_quaternion\n/// @{\n\n//! Compute a cross product between a quaternion and a vector.\n///\n/// @see gtx_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec3<T, P> cross(detail::tquat<T, P> const& q,\n                                        detail::tvec3<T, P> const& v);\n\n//! Compute a cross product between a vector and a quaternion.\n///\n/// @see gtx_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec3<T, P> cross(detail::tvec3<T, P> const& v,\n                                        detail::tquat<T, P> const& q);\n\n//! Compute a point on a path according squad equation.\n//! q1 and q2 are control points; s1 and s2 are intermediate control points.\n///\n/// @see gtx_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tquat<T, P> squad(detail::tquat<T, P> const& q1,\n                                        detail::tquat<T, P> const& q2,\n                                        detail::tquat<T, P> const& s1,\n                                        detail::tquat<T, P> const& s2,\n                                        T const& h);\n\n//! Returns an intermediate control point for squad interpolation.\n///\n/// @see gtx_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tquat<T, P> intermediate(detail::tquat<T, P> const& prev,\n                                               detail::tquat<T, P> const& curr,\n                                               detail::tquat<T, P> const& next);\n\n//! Returns a exp of a quaternion.\n///\n/// @see gtx_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tquat<T, P> exp(detail::tquat<T, P> const& q);\n\n//! Returns a log of a quaternion.\n///\n/// @see gtx_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tquat<T, P> log(detail::tquat<T, P> const& q);\n\n/// Returns x raised to the y power.\n///\n/// @see gtx_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tquat<T, P> pow(detail::tquat<T, P> const& x, T const& y);\n\n//! Returns quarternion square root.\n///\n/// @see gtx_quaternion\n// template<typename T, precision P>\n// detail::tquat<T, P> sqrt(\n//\tdetail::tquat<T, P> const & q);\n\n//! Rotates a 3 components vector by a quaternion.\n///\n/// @see gtx_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec3<T, P> rotate(detail::tquat<T, P> const& q,\n                                         detail::tvec3<T, P> const& v);\n\n/// Rotates a 4 components vector by a quaternion.\n///\n/// @see gtx_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec4<T, P> rotate(detail::tquat<T, P> const& q,\n                                         detail::tvec4<T, P> const& v);\n\n/// Extract the real component of a quaternion.\n///\n/// @see gtx_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL T extractRealComponent(detail::tquat<T, P> const& q);\n\n/// Converts a quaternion to a 3 * 3 matrix.\n///\n/// @see gtx_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat3x3<T, P> toMat3(detail::tquat<T, P> const& x) {\n  return mat3_cast(x);\n}\n\n/// Converts a quaternion to a 4 * 4 matrix.\n///\n/// @see gtx_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x4<T, P> toMat4(detail::tquat<T, P> const& x) {\n  return mat4_cast(x);\n}\n\n/// Converts a 3 * 3 matrix to a quaternion.\n///\n/// @see gtx_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tquat<T, P> toQuat(detail::tmat3x3<T, P> const& x) {\n  return quat_cast(x);\n}\n\n/// Converts a 4 * 4 matrix to a quaternion.\n///\n/// @see gtx_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tquat<T, P> toQuat(detail::tmat4x4<T, P> const& x) {\n  return quat_cast(x);\n}\n\n/// Quaternion interpolation using the rotation short path.\n///\n/// @see gtx_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tquat<T, P> shortMix(detail::tquat<T, P> const& x,\n                                           detail::tquat<T, P> const& y,\n                                           T const& a);\n\n/// Quaternion normalized linear interpolation.\n///\n/// @see gtx_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tquat<T, P> fastMix(detail::tquat<T, P> const& x,\n                                          detail::tquat<T, P> const& y,\n                                          T const& a);\n\n/// Compute the rotation between two vectors.\n/// param orig vector, needs to be normalized\n/// param dest vector, needs to be normalized\n///\n/// @see gtx_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tquat<T, P> rotation(detail::tvec3<T, P> const& orig,\n                                           detail::tvec3<T, P> const& dest);\n\n/// Returns the squared length of x.\n///\n/// @see gtx_quaternion\ntemplate <typename T, precision P>\nGLM_FUNC_DECL T length2(detail::tquat<T, P> const& q);\n\n/// @}\n}  // namespace glm\n\n#include \"quaternion.inl\"\n\n#endif  // GLM_GTX_quaternion\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/quaternion.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2005-12-21\n// Updated : 2008-11-27\n// Licence : This source is under MIT License\n// File    : glm/gtx/quaternion.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\n#include <limits>\n\nnamespace glm {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> cross(detail::tvec3<T, P> const& v,\n                                             detail::tquat<T, P> const& q) {\n  return inverse(q) * v;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> cross(detail::tquat<T, P> const& q,\n                                             detail::tvec3<T, P> const& v) {\n  return q * v;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tquat<T, P> squad(detail::tquat<T, P> const& q1,\n                                             detail::tquat<T, P> const& q2,\n                                             detail::tquat<T, P> const& s1,\n                                             detail::tquat<T, P> const& s2,\n                                             T const& h) {\n  return mix(mix(q1, q2, h), mix(s1, s2, h), T(2) * (T(1) - h) * h);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tquat<T, P> intermediate(\n    detail::tquat<T, P> const& prev, detail::tquat<T, P> const& curr,\n    detail::tquat<T, P> const& next) {\n  detail::tquat<T, P> invQuat = inverse(curr);\n  return exp((log(next + invQuat) + log(prev + invQuat)) / T(-4)) * curr;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tquat<T, P> exp(detail::tquat<T, P> const& q) {\n  detail::tvec3<T, P> u(q.x, q.y, q.z);\n  float Angle = glm::length(u);\n  detail::tvec3<T, P> v(u / Angle);\n  return detail::tquat<T, P>(cos(Angle), sin(Angle) * v);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tquat<T, P> log(detail::tquat<T, P> const& q) {\n  if ((q.x == static_cast<T>(0)) && (q.y == static_cast<T>(0)) &&\n      (q.z == static_cast<T>(0))) {\n    if (q.w > T(0))\n      return detail::tquat<T, P>(log(q.w), T(0), T(0), T(0));\n    else if (q.w < T(0))\n      return detail::tquat<T, P>(\n          log(-q.w), T(3.1415926535897932384626433832795), T(0), T(0));\n    else\n      return detail::tquat<T, P>(std::numeric_limits<T>::infinity(),\n                                 std::numeric_limits<T>::infinity(),\n                                 std::numeric_limits<T>::infinity(),\n                                 std::numeric_limits<T>::infinity());\n  } else {\n    T Vec3Len = sqrt(q.x * q.x + q.y * q.y + q.z * q.z);\n    T QuatLen = sqrt(Vec3Len * Vec3Len + q.w * q.w);\n    T t = atan(Vec3Len, T(q.w)) / Vec3Len;\n    return detail::tquat<T, P>(t * q.x, t * q.y, t * q.z, log(QuatLen));\n  }\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tquat<T, P> pow(detail::tquat<T, P> const& x,\n                                           T const& y) {\n  if (abs(x.w) > T(0.9999)) return x;\n  float Angle = acos(y);\n  float NewAngle = Angle * y;\n  float Div = sin(NewAngle) / sin(Angle);\n  return detail::tquat<T, P>(cos(NewAngle), x.x * Div, x.y * Div, x.z * Div);\n}\n\n// template <typename T, precision P>\n// GLM_FUNC_QUALIFIER detail::tquat<T, P> sqrt\n//(\n//\tdetail::tquat<T, P> const & q\n//)\n//{\n//\tT q0 = static_cast<T>(1) - dot(q, q);\n//\treturn T(2) * (T(1) + q0) * q;\n// }\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> rotate(detail::tquat<T, P> const& q,\n                                              detail::tvec3<T, P> const& v) {\n  return q * v;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> rotate(detail::tquat<T, P> const& q,\n                                              detail::tvec4<T, P> const& v) {\n  return q * v;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T extractRealComponent(detail::tquat<T, P> const& q) {\n  T w = static_cast<T>(1.0) - q.x * q.x - q.y * q.y - q.z * q.z;\n  if (w < T(0))\n    return T(0);\n  else\n    return -sqrt(w);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T length2(detail::tquat<T, P> const& q) {\n  return q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tquat<T, P> shortMix(detail::tquat<T, P> const& x,\n                                                detail::tquat<T, P> const& y,\n                                                T const& a) {\n  if (a <= T(0)) return x;\n  if (a >= T(1)) return y;\n\n  T fCos = dot(x, y);\n  detail::tquat<T, P> y2(y);  // BUG!!! tquat<T> y2;\n  if (fCos < T(0)) {\n    y2 = -y;\n    fCos = -fCos;\n  }\n\n  // if(fCos > 1.0f) // problem\n  T k0, k1;\n  if (fCos > T(0.9999)) {\n    k0 = static_cast<T>(1) - a;\n    k1 = static_cast<T>(0) + a;  // BUG!!! 1.0f + a;\n  } else {\n    T fSin = sqrt(T(1) - fCos * fCos);\n    T fAngle = atan(fSin, fCos);\n    T fOneOverSin = static_cast<T>(1) / fSin;\n    k0 = sin((T(1) - a) * fAngle) * fOneOverSin;\n    k1 = sin((T(0) + a) * fAngle) * fOneOverSin;\n  }\n\n  return detail::tquat<T, P>(k0 * x.w + k1 * y2.w, k0 * x.x + k1 * y2.x,\n                             k0 * x.y + k1 * y2.y, k0 * x.z + k1 * y2.z);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tquat<T, P> fastMix(detail::tquat<T, P> const& x,\n                                               detail::tquat<T, P> const& y,\n                                               T const& a) {\n  return glm::normalize(x * (T(1) - a) + (y * a));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tquat<T, P> rotation(\n    detail::tvec3<T, P> const& orig, detail::tvec3<T, P> const& dest) {\n  T cosTheta = dot(orig, dest);\n  detail::tvec3<T, P> rotationAxis;\n\n  if (cosTheta < T(-1) + epsilon<T>()) {\n    // special case when vectors in opposite directions :\n    // there is no \"ideal\" rotation axis\n    // So guess one; any will do as long as it's perpendicular to start\n    // This implementation favors a rotation around the Up axis (Y),\n    // since it's often what you want to do.\n    rotationAxis = cross(detail::tvec3<T, P>(0, 0, 1), orig);\n    if (length2(rotationAxis) <\n        epsilon<T>())  // bad luck, they were parallel, try again!\n      rotationAxis = cross(detail::tvec3<T, P>(1, 0, 0), orig);\n\n    rotationAxis = normalize(rotationAxis);\n    return angleAxis(pi<T>(), rotationAxis);\n  }\n\n  // Implementation from Stan Melax's Game Programming Gems 1 article\n  rotationAxis = cross(orig, dest);\n\n  T s = sqrt((T(1) + cosTheta) * T(2));\n  T invs = static_cast<T>(1) / s;\n\n  return detail::tquat<T, P>(s * T(0.5f), rotationAxis.x * invs,\n                             rotationAxis.y * invs, rotationAxis.z * invs);\n}\n\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/random.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///////////////////////////////////////////////////////////////////////////////////\n\n#if (defined(GLM_MESSAGES))\n#pragma message( \\\n        \"GLM: GLM_GTX_random extension is deprecated, include GLM_GTC_random instead\")\n#endif\n\n// Promoted:\n#include \"../gtc/random.hpp\"\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/raw_data.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_raw_data\n/// @file glm/gtx/raw_data.hpp\n/// @date 2008-11-19 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_raw_data GLM_GTX_raw_data\n/// @ingroup gtx\n///\n/// @brief Projection of a vector to other one\n///\n/// <glm/gtx/raw_data.hpp> need to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_raw_data\n#define GLM_GTX_raw_data\n\n// Dependencies\n#include \"../detail/setup.hpp\"\n#include \"../detail/type_int.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_raw_data extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_raw_data\n/// @{\n\n//! Type for byte numbers.\n//! From GLM_GTX_raw_data extension.\ntypedef detail::uint8 byte;\n\n//! Type for word numbers.\n//! From GLM_GTX_raw_data extension.\ntypedef detail::uint16 word;\n\n//! Type for dword numbers.\n//! From GLM_GTX_raw_data extension.\ntypedef detail::uint32 dword;\n\n//! Type for qword numbers.\n//! From GLM_GTX_raw_data extension.\ntypedef detail::uint64 qword;\n\n/// @}\n}  // namespace glm\n\n#include \"raw_data.inl\"\n\n#endif  // GLM_GTX_raw_data\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/raw_data.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2008-11-19\n// Updated : 2008-11-19\n// Licence : This source is under MIT License\n// File    : glm/gtx/raw_data.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Dependency:\n// - GLM core\n///////////////////////////////////////////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/reciprocal.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///////////////////////////////////////////////////////////////////////////////////\n\n#if (defined(GLM_MESSAGES))\n#pragma message( \\\n        \"GLM: GLM_GTX_reciprocal extension is deprecated, include GLM_GTC_reciprocal instead\")\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/rotate_normalized_axis.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_rotate_normalized_axis\n/// @file glm/gtx/rotate_normalized_axis.hpp\n/// @date 2012-12-13 / 2012-12-13\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtc_matrix_transform\n/// @see gtc_quaternion\n///\n/// @defgroup gtx_rotate_normalized_axis GLM_GTX_rotate_normalized_axis\n/// @ingroup gtc\n///\n/// @brief Quaternions and matrices rotations around normalized axis.\n///\n/// <glm/gtx/rotate_normalized_axis.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_rotate_normalized_axis\n#define GLM_GTX_rotate_normalized_axis\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtc/epsilon.hpp\"\n#include \"../gtc/quaternion.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_rotate_normalized_axis extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_rotate_normalized_axis\n/// @{\n\n/// Builds a rotation 4 * 4 matrix created from a normalized axis and an angle.\n///\n/// @param m Input matrix multiplied by this rotation matrix.\n/// @param angle Rotation angle expressed in radians if GLM_FORCE_RADIANS is\n/// define or degrees otherwise.\n/// @param axis Rotation axis, must be normalized.\n/// @tparam T Value type used to build the matrix. Currently supported: half\n/// (not recommanded), float or double.\n///\n/// @see gtx_rotate_normalized_axis\n/// @see - rotate(T angle, T x, T y, T z)\n/// @see - rotate(detail::tmat4x4<T, P> const & m, T angle, T x, T y, T z)\n/// @see - rotate(T angle, detail::tvec3<T, P> const & v)\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x4<T, P> rotateNormalizedAxis(\n    detail::tmat4x4<T, P> const& m, T const& angle,\n    detail::tvec3<T, P> const& axis);\n\n/// Rotates a quaternion from a vector of 3 components normalized axis and an\n/// angle.\n///\n/// @param q Source orientation\n/// @param angle Angle expressed in radians if GLM_FORCE_RADIANS is define or\n/// degrees otherwise.\n/// @param axis Normalized axis of the rotation, must be normalized.\n///\n/// @see gtx_rotate_normalized_axis\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tquat<T, P> rotateNormalizedAxis(\n    detail::tquat<T, P> const& q, T const& angle,\n    detail::tvec3<T, P> const& axis);\n\n/// @}\n}  // namespace glm\n\n#include \"rotate_normalized_axis.inl\"\n\n#endif  // GLM_GTX_rotate_normalized_axis\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/rotate_normalized_axis.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_rotate_normalized_axis\n/// @file glm/gtx/rotate_normalized_axis.inl\n/// @date 2012-12-13 / 2012-12-13\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> rotateNormalizedAxis(\n    detail::tmat4x4<T, P> const& m, T const& angle,\n    detail::tvec3<T, P> const& v) {\n#ifdef GLM_FORCE_RADIANS\n  T a = angle;\n#else\n#pragma message( \\\n        \"GLM: rotateNormalizedAxis function taking degrees as parameters is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.\")\n  T a = radians(angle);\n#endif\n  T c = cos(a);\n  T s = sin(a);\n\n  detail::tvec3<T, P> axis = v;\n\n  detail::tvec3<T, P> temp = (T(1) - c) * axis;\n\n  detail::tmat4x4<T, P> Rotate(detail::tmat4x4<T, P>::_null);\n  Rotate[0][0] = c + temp[0] * axis[0];\n  Rotate[0][1] = 0 + temp[0] * axis[1] + s * axis[2];\n  Rotate[0][2] = 0 + temp[0] * axis[2] - s * axis[1];\n\n  Rotate[1][0] = 0 + temp[1] * axis[0] - s * axis[2];\n  Rotate[1][1] = c + temp[1] * axis[1];\n  Rotate[1][2] = 0 + temp[1] * axis[2] + s * axis[0];\n\n  Rotate[2][0] = 0 + temp[2] * axis[0] + s * axis[1];\n  Rotate[2][1] = 0 + temp[2] * axis[1] - s * axis[0];\n  Rotate[2][2] = c + temp[2] * axis[2];\n\n  detail::tmat4x4<T, P> Result(detail::tmat4x4<T, P>::_null);\n  Result[0] = m[0] * Rotate[0][0] + m[1] * Rotate[0][1] + m[2] * Rotate[0][2];\n  Result[1] = m[0] * Rotate[1][0] + m[1] * Rotate[1][1] + m[2] * Rotate[1][2];\n  Result[2] = m[0] * Rotate[2][0] + m[1] * Rotate[2][1] + m[2] * Rotate[2][2];\n  Result[3] = m[3];\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tquat<T, P> rotateNormalizedAxis(\n    detail::tquat<T, P> const& q, T const& angle,\n    detail::tvec3<T, P> const& v) {\n  detail::tvec3<T, P> Tmp = v;\n\n#ifdef GLM_FORCE_RADIANS\n  T const AngleRad(angle);\n#else\n#pragma message( \\\n        \"GLM: rotateNormalizedAxis function taking degrees as parameters is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.\")\n  T const AngleRad = radians(angle);\n#endif\n  T const Sin = sin(AngleRad * T(0.5));\n\n  return q * detail::tquat<T, P>(cos(AngleRad * static_cast<T>(0.5)),\n                                 Tmp.x * Sin, Tmp.y * Sin, Tmp.z * Sin);\n  // return gtc::quaternion::cross(q, detail::tquat<T, P>(cos(AngleRad *\n  // T(0.5)), Tmp.x * fSin, Tmp.y * fSin, Tmp.z * fSin));\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/rotate_vector.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_rotate_vector\n/// @file glm/gtx/rotate_vector.hpp\n/// @date 2006-11-02 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtx_transform (dependence)\n///\n/// @defgroup gtx_rotate_vector GLM_GTX_rotate_vector\n/// @ingroup gtx\n///\n/// @brief Function to directly rotate a vector\n///\n/// <glm/gtx/rotate_vector.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_rotate_vector\n#define GLM_GTX_rotate_vector\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtx/transform.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_rotate_vector extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_rotate_vector\n/// @{\n\n//! Rotate a two dimensional vector.\n//! From GLM_GTX_rotate_vector extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec2<T, P> rotate(detail::tvec2<T, P> const& v,\n                                         T const& angle);\n\n//! Rotate a three dimensional vector around an axis.\n//! From GLM_GTX_rotate_vector extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec3<T, P> rotate(detail::tvec3<T, P> const& v,\n                                         T const& angle,\n                                         detail::tvec3<T, P> const& normal);\n\n//! Rotate a four dimensional vector around an axis.\n//! From GLM_GTX_rotate_vector extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec4<T, P> rotate(detail::tvec4<T, P> const& v,\n                                         T const& angle,\n                                         detail::tvec3<T, P> const& normal);\n\n//! Rotate a three dimensional vector around the X axis.\n//! From GLM_GTX_rotate_vector extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec3<T, P> rotateX(detail::tvec3<T, P> const& v,\n                                          T const& angle);\n\n//! Rotate a three dimensional vector around the Y axis.\n//! From GLM_GTX_rotate_vector extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec3<T, P> rotateY(detail::tvec3<T, P> const& v,\n                                          T const& angle);\n\n//! Rotate a three dimensional vector around the Z axis.\n//! From GLM_GTX_rotate_vector extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec3<T, P> rotateZ(detail::tvec3<T, P> const& v,\n                                          T const& angle);\n\n//! Rotate a four dimentionnals vector around the X axis.\n//! From GLM_GTX_rotate_vector extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec4<T, P> rotateX(detail::tvec4<T, P> const& v,\n                                          T const& angle);\n\n//! Rotate a four dimensional vector around the X axis.\n//! From GLM_GTX_rotate_vector extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec4<T, P> rotateY(detail::tvec4<T, P> const& v,\n                                          T const& angle);\n\n//! Rotate a four dimensional vector around the X axis.\n//! From GLM_GTX_rotate_vector extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tvec4<T, P> rotateZ(detail::tvec4<T, P> const& v,\n                                          T const& angle);\n\n//! Build a rotation matrix from a normal and a up vector.\n//! From GLM_GTX_rotate_vector extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x4<T, P> orientation(\n    detail::tvec3<T, P> const& Normal, detail::tvec3<T, P> const& Up);\n\n/// @}\n}  // namespace glm\n\n#include \"rotate_vector.inl\"\n\n#endif  // GLM_GTX_rotate_vector\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/rotate_vector.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2006-11-02\n// Updated : 2009-02-19\n// Licence : This source is under MIT License\n// File    : glm/gtx/rotate_vector.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<T, P> rotate(detail::tvec2<T, P> const& v,\n                                              T const& angle) {\n  detail::tvec2<T, P> Result;\n#ifdef GLM_FORCE_RADIANS\n  T const Cos(cos(angle));\n  T const Sin(sin(angle));\n#else\n#pragma message( \\\n        \"GLM: rotate function taking degrees as parameters is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.\")\n  T const Cos = cos(radians(angle));\n  T const Sin = sin(radians(angle));\n#endif\n  Result.x = v.x * Cos - v.y * Sin;\n  Result.y = v.x * Sin + v.y * Cos;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> rotate(\n    detail::tvec3<T, P> const& v, T const& angle,\n    detail::tvec3<T, P> const& normal) {\n  return detail::tmat3x3<T, P>(glm::rotate(angle, normal)) * v;\n}\n/*\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> rotateGTX(\n        const detail::tvec3<T, P>& x,\n        T angle,\n        const detail::tvec3<T, P>& normal)\n{\n        const T Cos = cos(radians(angle));\n        const T Sin = sin(radians(angle));\n        return x * Cos + ((x * normal) * (T(1) - Cos)) * normal + cross(x,\nnormal) * Sin;\n}\n*/\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> rotate(\n    detail::tvec4<T, P> const& v, T const& angle,\n    detail::tvec3<T, P> const& normal) {\n  return rotate(angle, normal) * v;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> rotateX(detail::tvec3<T, P> const& v,\n                                               T const& angle) {\n  detail::tvec3<T, P> Result(v);\n\n#ifdef GLM_FORCE_RADIANS\n  T const Cos(cos(angle));\n  T const Sin(sin(angle));\n#else\n#pragma message( \\\n        \"GLM: rotateX function taking degrees as parameters is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.\")\n  T const Cos = cos(radians(angle));\n  T const Sin = sin(radians(angle));\n#endif\n\n  Result.y = v.y * Cos - v.z * Sin;\n  Result.z = v.y * Sin + v.z * Cos;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> rotateY(detail::tvec3<T, P> const& v,\n                                               T const& angle) {\n  detail::tvec3<T, P> Result = v;\n\n#ifdef GLM_FORCE_RADIANS\n  T const Cos(cos(angle));\n  T const Sin(sin(angle));\n#else\n#pragma message( \\\n        \"GLM: rotateY function taking degrees as parameters is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.\")\n  T const Cos(cos(radians(angle)));\n  T const Sin(sin(radians(angle)));\n#endif\n\n  Result.x = v.x * Cos + v.z * Sin;\n  Result.z = -v.x * Sin + v.z * Cos;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> rotateZ(detail::tvec3<T, P> const& v,\n                                               T const& angle) {\n  detail::tvec3<T, P> Result = v;\n\n#ifdef GLM_FORCE_RADIANS\n  T const Cos(cos(angle));\n  T const Sin(sin(angle));\n#else\n#pragma message( \\\n        \"GLM: rotateZ function taking degrees as parameters is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.\")\n  T const Cos(cos(radians(angle)));\n  T const Sin(sin(radians(angle)));\n#endif\n\n  Result.x = v.x * Cos - v.y * Sin;\n  Result.y = v.x * Sin + v.y * Cos;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> rotateX(detail::tvec4<T, P> const& v,\n                                               T const& angle) {\n  detail::tvec4<T, P> Result = v;\n\n#ifdef GLM_FORCE_RADIANS\n  T const Cos(cos(angle));\n  T const Sin(sin(angle));\n#else\n#pragma message( \\\n        \"GLM: rotateX function taking degrees as parameters is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.\")\n  T const Cos(cos(radians(angle)));\n  T const Sin(sin(radians(angle)));\n#endif\n\n  Result.y = v.y * Cos - v.z * Sin;\n  Result.z = v.y * Sin + v.z * Cos;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> rotateY(detail::tvec4<T, P> const& v,\n                                               T const& angle) {\n  detail::tvec4<T, P> Result = v;\n\n#ifdef GLM_FORCE_RADIANS\n  T const Cos(cos(angle));\n  T const Sin(sin(angle));\n#else\n#pragma message( \\\n        \"GLM: rotateX function taking degrees as parameters is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.\")\n  T const Cos(cos(radians(angle)));\n  T const Sin(sin(radians(angle)));\n#endif\n\n  Result.x = v.x * Cos + v.z * Sin;\n  Result.z = -v.x * Sin + v.z * Cos;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> rotateZ(detail::tvec4<T, P> const& v,\n                                               T const& angle) {\n  detail::tvec4<T, P> Result = v;\n\n#ifdef GLM_FORCE_RADIANS\n  T const Cos(cos(angle));\n  T const Sin(sin(angle));\n#else\n#pragma message( \\\n        \"GLM: rotateZ function taking degrees as parameters is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.\")\n  T const Cos(cos(radians(angle)));\n  T const Sin(sin(radians(angle)));\n#endif\n\n  Result.x = v.x * Cos - v.y * Sin;\n  Result.y = v.x * Sin + v.y * Cos;\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> orientation(\n    detail::tvec3<T, P> const& Normal, detail::tvec3<T, P> const& Up) {\n  if (all(equal(Normal, Up))) return detail::tmat4x4<T, P>(T(1));\n\n  detail::tvec3<T, P> RotationAxis = cross(Up, Normal);\n#ifdef GLM_FORCE_RADIANS\n  T Angle = acos(dot(Normal, Up));\n#else\n#pragma message( \\\n        \"GLM: rotateZ function taking degrees as parameters is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.\")\n  T Angle = degrees(acos(dot(Normal, Up)));\n#endif\n  return rotate(Angle, RotationAxis);\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/scalar_relational.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_scalar_relational\n/// @file glm/gtx/scalar_relational.hpp\n/// @date 2013-02-04 / 2013-02-04\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_extend GLM_GTX_scalar_relational\n/// @ingroup gtx\n///\n/// @brief Extend a position from a source to a position at a defined length.\n///\n/// <glm/gtx/scalar_relational.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_scalar_relational\n#define GLM_GTX_scalar_relational\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_extend extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_scalar_relational\n/// @{\n\n/// @}\n}  // namespace glm\n\n#include \"scalar_relational.inl\"\n\n#endif  // GLM_GTX_scalar_relational\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/scalar_relational.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2013-02-04\n// Updated : 2013-02-04\n// Licence : This source is under MIT License\n// File    : glm/gtx/scalar_relational.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\ntemplate <typename T>\nGLM_FUNC_QUALIFIER bool lessThan(T const& x, T const& y) {\n  return x < y;\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER bool lessThanEqual(T const& x, T const& y) {\n  return x <= y;\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER bool greaterThan(T const& x, T const& y) {\n  return x > y;\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER bool greaterThanEqual(T const& x, T const& y) {\n  return x >= y;\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER bool equal(T const& x, T const& y) {\n  return x == y;\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER bool notEqual(T const& x, T const& y) {\n  return x != y;\n}\n\nGLM_FUNC_QUALIFIER bool any(bool const& x) { return x; }\n\nGLM_FUNC_QUALIFIER bool all(bool const& x) { return x; }\n\nGLM_FUNC_QUALIFIER bool not_(bool const& x) { return !x; }\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/simd_mat4.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_simd_vec4\n/// @file glm/gtx/simd_vec4.hpp\n/// @date 2009-05-07 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_simd_mat4 GLM_GTX_simd_mat4\n/// @ingroup gtx\n///\n/// @brief SIMD implementation of mat4 type.\n///\n/// <glm/gtx/simd_mat4.hpp> need to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_simd_mat4\n#define GLM_GTX_simd_mat4\n\n// Dependencies\n#include \"../detail/setup.hpp\"\n\n#if (GLM_ARCH != GLM_ARCH_PURE)\n\n#if (GLM_ARCH & GLM_ARCH_SSE2)\n#include \"../detail/intrinsic_matrix.hpp\"\n#include \"../gtx/simd_vec4.hpp\"\n#else\n#error \\\n    \"GLM: GLM_GTX_simd_mat4 requires compiler support of SSE2 through intrinsics\"\n#endif\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_simd_mat4 extension included\")\n#endif\n\nnamespace glm {\nnamespace detail {\n/// 4x4 Matrix implemented using SIMD SEE intrinsics.\n/// \\ingroup gtx_simd_mat4\nGLM_ALIGNED_STRUCT(16) fmat4x4SIMD {\n  enum ctor { _null };\n  typedef float value_type;\n  typedef fvec4SIMD col_type;\n  typedef fvec4SIMD row_type;\n  typedef std::size_t size_type;\n  typedef fmat4x4SIMD type;\n  typedef fmat4x4SIMD transpose_type;\n\n  GLM_FUNC_DECL length_t length() const;\n\n  fvec4SIMD Data[4];\n\n  //////////////////////////////////////\n  // Constructors\n\n  fmat4x4SIMD();\n  explicit fmat4x4SIMD(float const& s);\n  explicit fmat4x4SIMD(\n      float const& x0, float const& y0, float const& z0, float const& w0,\n      float const& x1, float const& y1, float const& z1, float const& w1,\n      float const& x2, float const& y2, float const& z2, float const& w2,\n      float const& x3, float const& y3, float const& z3, float const& w3);\n  explicit fmat4x4SIMD(fvec4SIMD const& v0, fvec4SIMD const& v1,\n                       fvec4SIMD const& v2, fvec4SIMD const& v3);\n  explicit fmat4x4SIMD(mat4x4 const& m);\n  explicit fmat4x4SIMD(__m128 const in[4]);\n\n  // Conversions\n  // template <typename U>\n  // explicit tmat4x4(tmat4x4<U> const & m);\n\n  // explicit tmat4x4(tmat2x2<T> const & x);\n  // explicit tmat4x4(tmat3x3<T> const & x);\n  // explicit tmat4x4(tmat2x3<T> const & x);\n  // explicit tmat4x4(tmat3x2<T> const & x);\n  // explicit tmat4x4(tmat2x4<T> const & x);\n  // explicit tmat4x4(tmat4x2<T> const & x);\n  // explicit tmat4x4(tmat3x4<T> const & x);\n  // explicit tmat4x4(tmat4x3<T> const & x);\n\n  // Accesses\n  fvec4SIMD& operator[](length_t i);\n  fvec4SIMD const& operator[](length_t i) const;\n\n  // Unary updatable operators\n  fmat4x4SIMD& operator=(fmat4x4SIMD const& m);\n  fmat4x4SIMD& operator+=(float const& s);\n  fmat4x4SIMD& operator+=(fmat4x4SIMD const& m);\n  fmat4x4SIMD& operator-=(float const& s);\n  fmat4x4SIMD& operator-=(fmat4x4SIMD const& m);\n  fmat4x4SIMD& operator*=(float const& s);\n  fmat4x4SIMD& operator*=(fmat4x4SIMD const& m);\n  fmat4x4SIMD& operator/=(float const& s);\n  fmat4x4SIMD& operator/=(fmat4x4SIMD const& m);\n  fmat4x4SIMD& operator++();\n  fmat4x4SIMD& operator--();\n};\n\n// Binary operators\nfmat4x4SIMD operator+(fmat4x4SIMD const& m, float const& s);\nfmat4x4SIMD operator+(float const& s, fmat4x4SIMD const& m);\nfmat4x4SIMD operator+(fmat4x4SIMD const& m1, fmat4x4SIMD const& m2);\n\nfmat4x4SIMD operator-(fmat4x4SIMD const& m, float const& s);\nfmat4x4SIMD operator-(float const& s, fmat4x4SIMD const& m);\nfmat4x4SIMD operator-(fmat4x4SIMD const& m1, fmat4x4SIMD const& m2);\n\nfmat4x4SIMD operator*(fmat4x4SIMD const& m, float const& s);\nfmat4x4SIMD operator*(float const& s, fmat4x4SIMD const& m);\n\nfvec4SIMD operator*(fmat4x4SIMD const& m, fvec4SIMD const& v);\nfvec4SIMD operator*(fvec4SIMD const& v, fmat4x4SIMD const& m);\n\nfmat4x4SIMD operator*(fmat4x4SIMD const& m1, fmat4x4SIMD const& m2);\n\nfmat4x4SIMD operator/(fmat4x4SIMD const& m, float const& s);\nfmat4x4SIMD operator/(float const& s, fmat4x4SIMD const& m);\n\nfvec4SIMD operator/(fmat4x4SIMD const& m, fvec4SIMD const& v);\nfvec4SIMD operator/(fvec4SIMD const& v, fmat4x4SIMD const& m);\n\nfmat4x4SIMD operator/(fmat4x4SIMD const& m1, fmat4x4SIMD const& m2);\n\n// Unary constant operators\nfmat4x4SIMD const operator-(fmat4x4SIMD const& m);\nfmat4x4SIMD const operator--(fmat4x4SIMD const& m, int);\nfmat4x4SIMD const operator++(fmat4x4SIMD const& m, int);\n}  // namespace detail\n\ntypedef detail::fmat4x4SIMD simdMat4;\n\n/// @addtogroup gtx_simd_mat4\n/// @{\n\n//! Convert a simdMat4 to a mat4.\n//! (From GLM_GTX_simd_mat4 extension)\nmat4 mat4_cast(detail::fmat4x4SIMD const& x);\n\n//! Multiply matrix x by matrix y component-wise, i.e.,\n//! result[i][j] is the scalar product of x[i][j] and y[i][j].\n//! (From GLM_GTX_simd_mat4 extension).\ndetail::fmat4x4SIMD matrixCompMult(detail::fmat4x4SIMD const& x,\n                                   detail::fmat4x4SIMD const& y);\n\n//! Treats the first parameter c as a column vector\n//! and the second parameter r as a row vector\n//! and does a linear algebraic matrix multiply c * r.\n//! (From GLM_GTX_simd_mat4 extension).\ndetail::fmat4x4SIMD outerProduct(detail::fvec4SIMD const& c,\n                                 detail::fvec4SIMD const& r);\n\n//! Returns the transposed matrix of x\n//! (From GLM_GTX_simd_mat4 extension).\ndetail::fmat4x4SIMD transpose(detail::fmat4x4SIMD const& x);\n\n//! Return the determinant of a mat4 matrix.\n//! (From GLM_GTX_simd_mat4 extension).\nfloat determinant(detail::fmat4x4SIMD const& m);\n\n//! Return the inverse of a mat4 matrix.\n//! (From GLM_GTX_simd_mat4 extension).\ndetail::fmat4x4SIMD inverse(detail::fmat4x4SIMD const& m);\n\n/// @}\n}  // namespace glm\n\n#include \"simd_mat4.inl\"\n\n#endif  //(GLM_ARCH != GLM_ARCH_PURE)\n\n#endif  // GLM_GTX_simd_mat4\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/simd_mat4.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2009-05-19\n// Updated : 2009-05-19\n// Licence : This source is under MIT License\n// File    : glm/gtx/simd_mat4.hpp\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\nnamespace detail {\n\nGLM_FUNC_QUALIFIER length_t fmat4x4SIMD::length() const { return 4; }\n\n//////////////////////////////////////\n// Accesses\n\nGLM_FUNC_QUALIFIER fvec4SIMD &fmat4x4SIMD::operator[](length_t i) {\n  assert(i < this->length());\n\n  return this->Data[i];\n}\n\nGLM_FUNC_QUALIFIER fvec4SIMD const &fmat4x4SIMD::operator[](length_t i) const {\n  assert(i < this->length());\n\n  return this->Data[i];\n}\n\n//////////////////////////////////////////////////////////////\n// Constructors\n\nGLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD() {\n#ifndef GLM_SIMD_ENABLE_DEFAULT_INIT\n  this->Data[0] = fvec4SIMD(1.0f, 0, 0, 0);\n  this->Data[1] = fvec4SIMD(0, 1.0f, 0, 0);\n  this->Data[2] = fvec4SIMD(0, 0, 1.0f, 0);\n  this->Data[3] = fvec4SIMD(0, 0, 0, 1.0f);\n#endif\n}\n\nGLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD(float const &s) {\n  this->Data[0] = fvec4SIMD(s, 0, 0, 0);\n  this->Data[1] = fvec4SIMD(0, s, 0, 0);\n  this->Data[2] = fvec4SIMD(0, 0, s, 0);\n  this->Data[3] = fvec4SIMD(0, 0, 0, s);\n}\n\nGLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD(\n    float const &x0, float const &y0, float const &z0, float const &w0,\n    float const &x1, float const &y1, float const &z1, float const &w1,\n    float const &x2, float const &y2, float const &z2, float const &w2,\n    float const &x3, float const &y3, float const &z3, float const &w3) {\n  this->Data[0] = fvec4SIMD(x0, y0, z0, w0);\n  this->Data[1] = fvec4SIMD(x1, y1, z1, w1);\n  this->Data[2] = fvec4SIMD(x2, y2, z2, w2);\n  this->Data[3] = fvec4SIMD(x3, y3, z3, w3);\n}\n\nGLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD(fvec4SIMD const &v0,\n                                            fvec4SIMD const &v1,\n                                            fvec4SIMD const &v2,\n                                            fvec4SIMD const &v3) {\n  this->Data[0] = v0;\n  this->Data[1] = v1;\n  this->Data[2] = v2;\n  this->Data[3] = v3;\n}\n\nGLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD(mat4 const &m) {\n  this->Data[0] = fvec4SIMD(m[0]);\n  this->Data[1] = fvec4SIMD(m[1]);\n  this->Data[2] = fvec4SIMD(m[2]);\n  this->Data[3] = fvec4SIMD(m[3]);\n}\n\nGLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD(__m128 const in[4]) {\n  this->Data[0] = in[0];\n  this->Data[1] = in[1];\n  this->Data[2] = in[2];\n  this->Data[3] = in[3];\n}\n\n//////////////////////////////////////////////////////////////\n// mat4 operators\n\nGLM_FUNC_QUALIFIER fmat4x4SIMD &fmat4x4SIMD::operator=(fmat4x4SIMD const &m) {\n  this->Data[0] = m[0];\n  this->Data[1] = m[1];\n  this->Data[2] = m[2];\n  this->Data[3] = m[3];\n  return *this;\n}\n\nGLM_FUNC_QUALIFIER fmat4x4SIMD &fmat4x4SIMD::operator+=(fmat4x4SIMD const &m) {\n  this->Data[0].Data = _mm_add_ps(this->Data[0].Data, m[0].Data);\n  this->Data[1].Data = _mm_add_ps(this->Data[1].Data, m[1].Data);\n  this->Data[2].Data = _mm_add_ps(this->Data[2].Data, m[2].Data);\n  this->Data[3].Data = _mm_add_ps(this->Data[3].Data, m[3].Data);\n  return *this;\n}\n\nGLM_FUNC_QUALIFIER fmat4x4SIMD &fmat4x4SIMD::operator-=(fmat4x4SIMD const &m) {\n  this->Data[0].Data = _mm_sub_ps(this->Data[0].Data, m[0].Data);\n  this->Data[1].Data = _mm_sub_ps(this->Data[1].Data, m[1].Data);\n  this->Data[2].Data = _mm_sub_ps(this->Data[2].Data, m[2].Data);\n  this->Data[3].Data = _mm_sub_ps(this->Data[3].Data, m[3].Data);\n\n  return *this;\n}\n\nGLM_FUNC_QUALIFIER fmat4x4SIMD &fmat4x4SIMD::operator*=(fmat4x4SIMD const &m) {\n  sse_mul_ps(&this->Data[0].Data, &m.Data[0].Data, &this->Data[0].Data);\n  return *this;\n}\n\nGLM_FUNC_QUALIFIER fmat4x4SIMD &fmat4x4SIMD::operator/=(fmat4x4SIMD const &m) {\n  __m128 Inv[4];\n  sse_inverse_ps(&m.Data[0].Data, Inv);\n  sse_mul_ps(&this->Data[0].Data, Inv, &this->Data[0].Data);\n  return *this;\n}\n\nGLM_FUNC_QUALIFIER fmat4x4SIMD &fmat4x4SIMD::operator+=(float const &s) {\n  __m128 Operand = _mm_set_ps1(s);\n  this->Data[0].Data = _mm_add_ps(this->Data[0].Data, Operand);\n  this->Data[1].Data = _mm_add_ps(this->Data[1].Data, Operand);\n  this->Data[2].Data = _mm_add_ps(this->Data[2].Data, Operand);\n  this->Data[3].Data = _mm_add_ps(this->Data[3].Data, Operand);\n  return *this;\n}\n\nGLM_FUNC_QUALIFIER fmat4x4SIMD &fmat4x4SIMD::operator-=(float const &s) {\n  __m128 Operand = _mm_set_ps1(s);\n  this->Data[0].Data = _mm_sub_ps(this->Data[0].Data, Operand);\n  this->Data[1].Data = _mm_sub_ps(this->Data[1].Data, Operand);\n  this->Data[2].Data = _mm_sub_ps(this->Data[2].Data, Operand);\n  this->Data[3].Data = _mm_sub_ps(this->Data[3].Data, Operand);\n  return *this;\n}\n\nGLM_FUNC_QUALIFIER fmat4x4SIMD &fmat4x4SIMD::operator*=(float const &s) {\n  __m128 Operand = _mm_set_ps1(s);\n  this->Data[0].Data = _mm_mul_ps(this->Data[0].Data, Operand);\n  this->Data[1].Data = _mm_mul_ps(this->Data[1].Data, Operand);\n  this->Data[2].Data = _mm_mul_ps(this->Data[2].Data, Operand);\n  this->Data[3].Data = _mm_mul_ps(this->Data[3].Data, Operand);\n  return *this;\n}\n\nGLM_FUNC_QUALIFIER fmat4x4SIMD &fmat4x4SIMD::operator/=(float const &s) {\n  __m128 Operand = _mm_div_ps(one, _mm_set_ps1(s));\n  this->Data[0].Data = _mm_mul_ps(this->Data[0].Data, Operand);\n  this->Data[1].Data = _mm_mul_ps(this->Data[1].Data, Operand);\n  this->Data[2].Data = _mm_mul_ps(this->Data[2].Data, Operand);\n  this->Data[3].Data = _mm_mul_ps(this->Data[3].Data, Operand);\n  return *this;\n}\n\nGLM_FUNC_QUALIFIER fmat4x4SIMD &fmat4x4SIMD::operator++() {\n  this->Data[0].Data = _mm_add_ps(this->Data[0].Data, one);\n  this->Data[1].Data = _mm_add_ps(this->Data[1].Data, one);\n  this->Data[2].Data = _mm_add_ps(this->Data[2].Data, one);\n  this->Data[3].Data = _mm_add_ps(this->Data[3].Data, one);\n  return *this;\n}\n\nGLM_FUNC_QUALIFIER fmat4x4SIMD &fmat4x4SIMD::operator--() {\n  this->Data[0].Data = _mm_sub_ps(this->Data[0].Data, one);\n  this->Data[1].Data = _mm_sub_ps(this->Data[1].Data, one);\n  this->Data[2].Data = _mm_sub_ps(this->Data[2].Data, one);\n  this->Data[3].Data = _mm_sub_ps(this->Data[3].Data, one);\n  return *this;\n}\n\n//////////////////////////////////////////////////////////////\n// Binary operators\n\nGLM_FUNC_QUALIFIER fmat4x4SIMD operator+(const fmat4x4SIMD &m, float const &s) {\n  return detail::fmat4x4SIMD(m[0] + s, m[1] + s, m[2] + s, m[3] + s);\n}\n\nGLM_FUNC_QUALIFIER fmat4x4SIMD operator+(float const &s, const fmat4x4SIMD &m) {\n  return detail::fmat4x4SIMD(m[0] + s, m[1] + s, m[2] + s, m[3] + s);\n}\n\nGLM_FUNC_QUALIFIER fmat4x4SIMD operator+(const fmat4x4SIMD &m1,\n                                         const fmat4x4SIMD &m2) {\n  return detail::fmat4x4SIMD(m1[0] + m2[0], m1[1] + m2[1], m1[2] + m2[2],\n                             m1[3] + m2[3]);\n}\n\nGLM_FUNC_QUALIFIER fmat4x4SIMD operator-(const fmat4x4SIMD &m, float const &s) {\n  return detail::fmat4x4SIMD(m[0] - s, m[1] - s, m[2] - s, m[3] - s);\n}\n\nGLM_FUNC_QUALIFIER fmat4x4SIMD operator-(float const &s, const fmat4x4SIMD &m) {\n  return detail::fmat4x4SIMD(s - m[0], s - m[1], s - m[2], s - m[3]);\n}\n\nGLM_FUNC_QUALIFIER fmat4x4SIMD operator-(const fmat4x4SIMD &m1,\n                                         const fmat4x4SIMD &m2) {\n  return detail::fmat4x4SIMD(m1[0] - m2[0], m1[1] - m2[1], m1[2] - m2[2],\n                             m1[3] - m2[3]);\n}\n\nGLM_FUNC_QUALIFIER fmat4x4SIMD operator*(const fmat4x4SIMD &m, float const &s) {\n  return detail::fmat4x4SIMD(m[0] * s, m[1] * s, m[2] * s, m[3] * s);\n}\n\nGLM_FUNC_QUALIFIER fmat4x4SIMD operator*(float const &s, const fmat4x4SIMD &m) {\n  return detail::fmat4x4SIMD(m[0] * s, m[1] * s, m[2] * s, m[3] * s);\n}\n\nGLM_FUNC_QUALIFIER fvec4SIMD operator*(const fmat4x4SIMD &m,\n                                       fvec4SIMD const &v) {\n  return sse_mul_ps(&m.Data[0].Data, v.Data);\n}\n\nGLM_FUNC_QUALIFIER fvec4SIMD operator*(fvec4SIMD const &v,\n                                       const fmat4x4SIMD &m) {\n  return sse_mul_ps(v.Data, &m.Data[0].Data);\n}\n\nGLM_FUNC_QUALIFIER fmat4x4SIMD operator*(const fmat4x4SIMD &m1,\n                                         const fmat4x4SIMD &m2) {\n  fmat4x4SIMD result;\n  sse_mul_ps(&m1.Data[0].Data, &m2.Data[0].Data, &result.Data[0].Data);\n\n  return result;\n}\n\nGLM_FUNC_QUALIFIER fmat4x4SIMD operator/(const fmat4x4SIMD &m, float const &s) {\n  return detail::fmat4x4SIMD(m[0] / s, m[1] / s, m[2] / s, m[3] / s);\n}\n\nGLM_FUNC_QUALIFIER fmat4x4SIMD operator/(float const &s, const fmat4x4SIMD &m) {\n  return detail::fmat4x4SIMD(s / m[0], s / m[1], s / m[2], s / m[3]);\n}\n\nGLM_FUNC_QUALIFIER detail::fmat4x4SIMD inverse(detail::fmat4x4SIMD const &m) {\n  detail::fmat4x4SIMD result;\n  detail::sse_inverse_ps(&m[0].Data, &result[0].Data);\n  return result;\n}\n\nGLM_FUNC_QUALIFIER fvec4SIMD operator/(const fmat4x4SIMD &m,\n                                       fvec4SIMD const &v) {\n  return inverse(m) * v;\n}\n\nGLM_FUNC_QUALIFIER fvec4SIMD operator/(fvec4SIMD const &v,\n                                       const fmat4x4SIMD &m) {\n  return v * inverse(m);\n}\n\nGLM_FUNC_QUALIFIER fmat4x4SIMD operator/(const fmat4x4SIMD &m1,\n                                         const fmat4x4SIMD &m2) {\n  __m128 result[4];\n  __m128 inv[4];\n\n  sse_inverse_ps(&m2.Data[0].Data, inv);\n  sse_mul_ps(&m1.Data[0].Data, inv, result);\n\n  return fmat4x4SIMD(result);\n}\n\n//////////////////////////////////////////////////////////////\n// Unary constant operators\nGLM_FUNC_QUALIFIER fmat4x4SIMD const operator-(fmat4x4SIMD const &m) {\n  return detail::fmat4x4SIMD(-m[0], -m[1], -m[2], -m[3]);\n}\n\nGLM_FUNC_QUALIFIER fmat4x4SIMD const operator--(fmat4x4SIMD const &m, int) {\n  return detail::fmat4x4SIMD(m[0] - 1.0f, m[1] - 1.0f, m[2] - 1.0f,\n                             m[3] - 1.0f);\n}\n\nGLM_FUNC_QUALIFIER fmat4x4SIMD const operator++(fmat4x4SIMD const &m, int) {\n  return detail::fmat4x4SIMD(m[0] + 1.0f, m[1] + 1.0f, m[2] + 1.0f,\n                             m[3] + 1.0f);\n}\n\n}  // namespace detail\n\nGLM_FUNC_QUALIFIER mat4 mat4_cast(detail::fmat4x4SIMD const &x) {\n  GLM_ALIGN(16) mat4 Result;\n  _mm_store_ps(&Result[0][0], x.Data[0].Data);\n  _mm_store_ps(&Result[1][0], x.Data[1].Data);\n  _mm_store_ps(&Result[2][0], x.Data[2].Data);\n  _mm_store_ps(&Result[3][0], x.Data[3].Data);\n  return Result;\n}\n\nGLM_FUNC_QUALIFIER detail::fmat4x4SIMD matrixCompMult(\n    detail::fmat4x4SIMD const &x, detail::fmat4x4SIMD const &y) {\n  detail::fmat4x4SIMD result;\n  result[0] = x[0] * y[0];\n  result[1] = x[1] * y[1];\n  result[2] = x[2] * y[2];\n  result[3] = x[3] * y[3];\n  return result;\n}\n\nGLM_FUNC_QUALIFIER detail::fmat4x4SIMD outerProduct(\n    detail::fvec4SIMD const &c, detail::fvec4SIMD const &r) {\n  __m128 Shu0 = _mm_shuffle_ps(r.Data, r.Data, _MM_SHUFFLE(0, 0, 0, 0));\n  __m128 Shu1 = _mm_shuffle_ps(r.Data, r.Data, _MM_SHUFFLE(1, 1, 1, 1));\n  __m128 Shu2 = _mm_shuffle_ps(r.Data, r.Data, _MM_SHUFFLE(2, 2, 2, 2));\n  __m128 Shu3 = _mm_shuffle_ps(r.Data, r.Data, _MM_SHUFFLE(3, 3, 3, 3));\n\n  detail::fmat4x4SIMD result(detail::fmat4x4SIMD::_null);\n  result[0].Data = _mm_mul_ps(c.Data, Shu0);\n  result[1].Data = _mm_mul_ps(c.Data, Shu1);\n  result[2].Data = _mm_mul_ps(c.Data, Shu2);\n  result[3].Data = _mm_mul_ps(c.Data, Shu3);\n  return result;\n}\n\nGLM_FUNC_QUALIFIER detail::fmat4x4SIMD transpose(detail::fmat4x4SIMD const &m) {\n  detail::fmat4x4SIMD result;\n  detail::sse_transpose_ps(&m[0].Data, &result[0].Data);\n  return result;\n}\n\nGLM_FUNC_QUALIFIER float determinant(detail::fmat4x4SIMD const &m) {\n  float Result;\n  _mm_store_ss(&Result, detail::sse_det_ps(&m[0].Data));\n  return Result;\n}\n\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/simd_quat.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_simd_quat\n/// @file glm/gtx/simd_quat.hpp\n/// @date 2009-05-07 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_simd_vec4 GLM_GTX_simd_quat\n/// @ingroup gtx\n///\n/// @brief SIMD implementation of quat type.\n///\n/// <glm/gtx/simd_quat.hpp> need to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_simd_quat\n#define GLM_GTX_simd_quat\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtc/quaternion.hpp\"\n#include \"../gtx/fast_trigonometry.hpp\"\n\n#if (GLM_ARCH != GLM_ARCH_PURE)\n\n#if (GLM_ARCH & GLM_ARCH_SSE2)\n#include \"../gtx/simd_mat4.hpp\"\n#else\n#error \\\n    \"GLM: GLM_GTX_simd_quat requires compiler support of SSE2 through intrinsics\"\n#endif\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_simd_quat extension included\")\n#endif\n\n// Warning silencer for nameless struct/union.\n#if (GLM_COMPILER & GLM_COMPILER_VC)\n#pragma warning(push)\n#pragma warning(disable : 4201)  // warning C4201: nonstandard extension used :\n                                 // nameless struct/union\n#endif\n\nnamespace glm {\nnamespace detail {\n/// Quaternion implemented using SIMD SEE intrinsics.\n/// \\ingroup gtx_simd_vec4\nGLM_ALIGNED_STRUCT(16) fquatSIMD {\n  enum ctor { null };\n  typedef __m128 value_type;\n  typedef std::size_t size_type;\n  static size_type value_size();\n\n  typedef fquatSIMD type;\n  typedef tquat<bool, defaultp> bool_type;\n\n#ifdef GLM_SIMD_ENABLE_XYZW_UNION\n  union {\n    __m128 Data;\n    struct {\n      float x, y, z, w;\n    };\n  };\n#else\n  __m128 Data;\n#endif\n\n  //////////////////////////////////////\n  // Implicit basic constructors\n\n  fquatSIMD();\n  fquatSIMD(__m128 const& Data);\n  fquatSIMD(fquatSIMD const& q);\n\n  //////////////////////////////////////\n  // Explicit basic constructors\n\n  explicit fquatSIMD(ctor);\n  explicit fquatSIMD(float const& w, float const& x, float const& y,\n                     float const& z);\n  explicit fquatSIMD(quat const& v);\n  explicit fquatSIMD(vec3 const& eulerAngles);\n\n  //////////////////////////////////////\n  // Unary arithmetic operators\n\n  fquatSIMD& operator=(fquatSIMD const& q);\n  fquatSIMD& operator*=(float const& s);\n  fquatSIMD& operator/=(float const& s);\n};\n\n//////////////////////////////////////\n// Arithmetic operators\n\ndetail::fquatSIMD operator-(detail::fquatSIMD const& q);\n\ndetail::fquatSIMD operator+(detail::fquatSIMD const& q,\n                            detail::fquatSIMD const& p);\n\ndetail::fquatSIMD operator*(detail::fquatSIMD const& q,\n                            detail::fquatSIMD const& p);\n\ndetail::fvec4SIMD operator*(detail::fquatSIMD const& q,\n                            detail::fvec4SIMD const& v);\n\ndetail::fvec4SIMD operator*(detail::fvec4SIMD const& v,\n                            detail::fquatSIMD const& q);\n\ndetail::fquatSIMD operator*(detail::fquatSIMD const& q, float s);\n\ndetail::fquatSIMD operator*(float s, detail::fquatSIMD const& q);\n\ndetail::fquatSIMD operator/(detail::fquatSIMD const& q, float s);\n\n}  // namespace detail\n\ntypedef glm::detail::fquatSIMD simdQuat;\n\n/// @addtogroup gtx_simd_quat\n/// @{\n\n//! Convert a simdQuat to a quat.\n//! (From GLM_GTX_simd_quat extension)\nquat quat_cast(detail::fquatSIMD const& x);\n\n//! Convert a simdMat4 to a simdQuat.\n//! (From GLM_GTX_simd_quat extension)\ndetail::fquatSIMD quatSIMD_cast(detail::fmat4x4SIMD const& m);\n\n//! Converts a mat4 to a simdQuat.\n//! (From GLM_GTX_simd_quat extension)\ntemplate <typename T, precision P>\ndetail::fquatSIMD quatSIMD_cast(detail::tmat4x4<T, P> const& m);\n\n//! Converts a mat3 to a simdQuat.\n//! (From GLM_GTX_simd_quat extension)\ntemplate <typename T, precision P>\ndetail::fquatSIMD quatSIMD_cast(detail::tmat3x3<T, P> const& m);\n\n//! Convert a simdQuat to a simdMat4\n//! (From GLM_GTX_simd_quat extension)\ndetail::fmat4x4SIMD mat4SIMD_cast(detail::fquatSIMD const& q);\n\n//! Converts a simdQuat to a standard mat4.\n//! (From GLM_GTX_simd_quat extension)\nmat4 mat4_cast(detail::fquatSIMD const& q);\n\n/// Returns the length of the quaternion.\n///\n/// @see gtc_quaternion\nfloat length(detail::fquatSIMD const& x);\n\n/// Returns the normalized quaternion.\n///\n/// @see gtc_quaternion\ndetail::fquatSIMD normalize(detail::fquatSIMD const& x);\n\n/// Returns dot product of q1 and q2, i.e., q1[0] * q2[0] + q1[1] * q2[1] + ...\n///\n/// @see gtc_quaternion\nfloat dot(detail::fquatSIMD const& q1, detail::fquatSIMD const& q2);\n\n/// Spherical linear interpolation of two quaternions.\n/// The interpolation is oriented and the rotation is performed at constant\n/// speed. For short path spherical linear interpolation, use the slerp\n/// function.\n///\n/// @param x A quaternion\n/// @param y A quaternion\n/// @param a Interpolation factor. The interpolation is defined beyond the range\n/// [0, 1].\n/// @tparam T Value type used to build the quaternion. Supported: half, float or\n/// double.\n/// @see gtc_quaternion\n/// @see - slerp(detail::fquatSIMD const & x, detail::fquatSIMD const & y, T\n/// const & a)\ndetail::fquatSIMD mix(detail::fquatSIMD const& x, detail::fquatSIMD const& y,\n                      float const& a);\n\n/// Linear interpolation of two quaternions.\n/// The interpolation is oriented.\n///\n/// @param x A quaternion\n/// @param y A quaternion\n/// @param a Interpolation factor. The interpolation is defined in the range [0,\n/// 1].\n/// @tparam T Value type used to build the quaternion. Supported: half, float or\n/// double.\n/// @see gtc_quaternion\ndetail::fquatSIMD lerp(detail::fquatSIMD const& x, detail::fquatSIMD const& y,\n                       float const& a);\n\n/// Spherical linear interpolation of two quaternions.\n/// The interpolation always take the short path and the rotation is performed\n/// at constant speed.\n///\n/// @param x A quaternion\n/// @param y A quaternion\n/// @param a Interpolation factor. The interpolation is defined beyond the range\n/// [0, 1].\n/// @tparam T Value type used to build the quaternion. Supported: half, float or\n/// double.\n/// @see gtc_quaternion\ndetail::fquatSIMD slerp(detail::fquatSIMD const& x, detail::fquatSIMD const& y,\n                        float const& a);\n\n/// Faster spherical linear interpolation of two unit length quaternions.\n///\n/// This is the same as mix(), except for two rules:\n///   1) The two quaternions must be unit length.\n///   2) The interpolation factor (a) must be in the range [0, 1].\n///\n/// This will use the equivalent to fastAcos() and fastSin().\n///\n/// @see gtc_quaternion\n/// @see - mix(detail::fquatSIMD const & x, detail::fquatSIMD const & y, T const\n/// & a)\ndetail::fquatSIMD fastMix(detail::fquatSIMD const& x,\n                          detail::fquatSIMD const& y, float const& a);\n\n/// Identical to fastMix() except takes the shortest path.\n///\n/// The same rules apply here as those in fastMix(). Both quaternions must be\n/// unit length and 'a' must be in the range [0, 1].\n///\n/// @see - fastMix(detail::fquatSIMD const & x, detail::fquatSIMD const & y, T\n/// const & a)\n/// @see - slerp(detail::fquatSIMD const & x, detail::fquatSIMD const & y, T\n/// const & a)\ndetail::fquatSIMD fastSlerp(detail::fquatSIMD const& x,\n                            detail::fquatSIMD const& y, float const& a);\n\n/// Returns the q conjugate.\n///\n/// @see gtc_quaternion\ndetail::fquatSIMD conjugate(detail::fquatSIMD const& q);\n\n/// Returns the q inverse.\n///\n/// @see gtc_quaternion\ndetail::fquatSIMD inverse(detail::fquatSIMD const& q);\n\n/// Build a quaternion from an angle and a normalized axis.\n///\n/// @param angle Angle expressed in radians if GLM_FORCE_RADIANS is define or\n/// degrees otherwise.\n/// @param axis Axis of the quaternion, must be normalized.\n///\n/// @see gtc_quaternion\ndetail::fquatSIMD angleAxisSIMD(float const& angle, vec3 const& axis);\n\n/// Build a quaternion from an angle and a normalized axis.\n///\n/// @param angle Angle expressed in radians if GLM_FORCE_RADIANS is define or\n/// degrees otherwise.\n/// @param x x component of the x-axis, x, y, z must be a normalized axis\n/// @param y y component of the y-axis, x, y, z must be a normalized axis\n/// @param z z component of the z-axis, x, y, z must be a normalized axis\n///\n/// @see gtc_quaternion\ndetail::fquatSIMD angleAxisSIMD(float const& angle, float const& x,\n                                float const& y, float const& z);\n\n// TODO: Move this to somewhere more appropriate. Used with fastMix() and\n// fastSlerp().\n/// Performs the equivalent of glm::fastSin() on each component of the given\n/// __m128.\n__m128 fastSin(__m128 x);\n\n/// @}\n}  // namespace glm\n\n#include \"simd_quat.inl\"\n\n#if (GLM_COMPILER & GLM_COMPILER_VC)\n#pragma warning(pop)\n#endif\n\n#endif  //(GLM_ARCH != GLM_ARCH_PURE)\n\n#endif  // GLM_GTX_simd_quat\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/simd_quat.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2013-04-22\n// Updated : 2013-04-22\n// Licence : This source is under MIT License\n// File    : glm/gtx/simd_quat.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\nnamespace detail {\n\n//////////////////////////////////////\n// Debugging\n#if 0\nvoid print(__m128 v)\n{\n    GLM_ALIGN(16) float result[4];\n    _mm_store_ps(result, v);\n\n    printf(\"__m128:    %f %f %f %f\\n\", result[0], result[1], result[2], result[3]);\n}\n\nvoid print(const fvec4SIMD &v)\n{\n    printf(\"fvec4SIMD: %f %f %f %f\\n\", v.x, v.y, v.z, v.w);\n}\n#endif\n\n//////////////////////////////////////\n// Implicit basic constructors\n\nGLM_FUNC_QUALIFIER fquatSIMD::fquatSIMD()\n#ifdef GLM_SIMD_ENABLE_DEFAULT_INIT\n    : Data(_mm_set_ps(1.0f, 0.0f, 0.0f, 0.0f))\n#endif\n{\n}\n\nGLM_FUNC_QUALIFIER fquatSIMD::fquatSIMD(__m128 const& Data) : Data(Data) {}\n\nGLM_FUNC_QUALIFIER fquatSIMD::fquatSIMD(fquatSIMD const& q) : Data(q.Data) {}\n\n//////////////////////////////////////\n// Explicit basic constructors\n\nGLM_FUNC_QUALIFIER fquatSIMD::fquatSIMD(float const& w, float const& x,\n                                        float const& y, float const& z)\n    : Data(_mm_set_ps(w, z, y, x)) {}\n\nGLM_FUNC_QUALIFIER fquatSIMD::fquatSIMD(quat const& q)\n    : Data(_mm_set_ps(q.w, q.z, q.y, q.x)) {}\n\nGLM_FUNC_QUALIFIER fquatSIMD::fquatSIMD(vec3 const& eulerAngles) {\n  vec3 c = glm::cos(eulerAngles * 0.5f);\n  vec3 s = glm::sin(eulerAngles * 0.5f);\n\n  Data = _mm_set_ps((c.x * c.y * c.z) + (s.x * s.y * s.z),\n                    (c.x * c.y * s.z) - (s.x * s.y * c.z),\n                    (c.x * s.y * c.z) + (s.x * c.y * s.z),\n                    (s.x * c.y * c.z) - (c.x * s.y * s.z));\n}\n\n//////////////////////////////////////\n// Unary arithmetic operators\n\nGLM_FUNC_QUALIFIER fquatSIMD& fquatSIMD::operator=(fquatSIMD const& q) {\n  this->Data = q.Data;\n  return *this;\n}\n\nGLM_FUNC_QUALIFIER fquatSIMD& fquatSIMD::operator*=(float const& s) {\n  this->Data = _mm_mul_ps(this->Data, _mm_set_ps1(s));\n  return *this;\n}\n\nGLM_FUNC_QUALIFIER fquatSIMD& fquatSIMD::operator/=(float const& s) {\n  this->Data = _mm_div_ps(Data, _mm_set1_ps(s));\n  return *this;\n}\n\n// negate operator\nGLM_FUNC_QUALIFIER fquatSIMD operator-(fquatSIMD const& q) {\n  return fquatSIMD(_mm_mul_ps(q.Data, _mm_set_ps(-1.0f, -1.0f, -1.0f, -1.0f)));\n}\n\n// operator+\nGLM_FUNC_QUALIFIER fquatSIMD operator+(fquatSIMD const& q1,\n                                       fquatSIMD const& q2) {\n  return fquatSIMD(_mm_add_ps(q1.Data, q2.Data));\n}\n\n// operator*\nGLM_FUNC_QUALIFIER fquatSIMD operator*(fquatSIMD const& q1,\n                                       fquatSIMD const& q2) {\n  // SSE2 STATS:\n  //    11 shuffle\n  //    8  mul\n  //    8  add\n\n  // SSE4 STATS:\n  //    3 shuffle\n  //    4 mul\n  //    4 dpps\n\n  __m128 mul0 = _mm_mul_ps(\n      q1.Data, _mm_shuffle_ps(q2.Data, q2.Data, _MM_SHUFFLE(0, 1, 2, 3)));\n  __m128 mul1 = _mm_mul_ps(\n      q1.Data, _mm_shuffle_ps(q2.Data, q2.Data, _MM_SHUFFLE(1, 0, 3, 2)));\n  __m128 mul2 = _mm_mul_ps(\n      q1.Data, _mm_shuffle_ps(q2.Data, q2.Data, _MM_SHUFFLE(2, 3, 0, 1)));\n  __m128 mul3 = _mm_mul_ps(q1.Data, q2.Data);\n\n#if ((GLM_ARCH & GLM_ARCH_SSE4))\n  __m128 add0 = _mm_dp_ps(mul0, _mm_set_ps(1.0f, -1.0f, 1.0f, 1.0f), 0xff);\n  __m128 add1 = _mm_dp_ps(mul1, _mm_set_ps(1.0f, 1.0f, 1.0f, -1.0f), 0xff);\n  __m128 add2 = _mm_dp_ps(mul2, _mm_set_ps(1.0f, 1.0f, -1.0f, 1.0f), 0xff);\n  __m128 add3 = _mm_dp_ps(mul3, _mm_set_ps(1.0f, -1.0f, -1.0f, -1.0f), 0xff);\n#else\n  mul0 = _mm_mul_ps(mul0, _mm_set_ps(1.0f, -1.0f, 1.0f, 1.0f));\n  __m128 add0 = _mm_add_ps(mul0, _mm_movehl_ps(mul0, mul0));\n  add0 = _mm_add_ss(add0, _mm_shuffle_ps(add0, add0, 1));\n\n  mul1 = _mm_mul_ps(mul1, _mm_set_ps(1.0f, 1.0f, 1.0f, -1.0f));\n  __m128 add1 = _mm_add_ps(mul1, _mm_movehl_ps(mul1, mul1));\n  add1 = _mm_add_ss(add1, _mm_shuffle_ps(add1, add1, 1));\n\n  mul2 = _mm_mul_ps(mul2, _mm_set_ps(1.0f, 1.0f, -1.0f, 1.0f));\n  __m128 add2 = _mm_add_ps(mul2, _mm_movehl_ps(mul2, mul2));\n  add2 = _mm_add_ss(add2, _mm_shuffle_ps(add2, add2, 1));\n\n  mul3 = _mm_mul_ps(mul3, _mm_set_ps(1.0f, -1.0f, -1.0f, -1.0f));\n  __m128 add3 = _mm_add_ps(mul3, _mm_movehl_ps(mul3, mul3));\n  add3 = _mm_add_ss(add3, _mm_shuffle_ps(add3, add3, 1));\n#endif\n\n  // This SIMD code is a politically correct way of doing this, but in every\n  // test I've tried it has been slower than the final code below. I'll keep\n  // this here for reference - maybe somebody else can do something better...\n  //\n  //__m128 xxyy = _mm_shuffle_ps(add0, add1, _MM_SHUFFLE(0, 0, 0, 0));\n  //__m128 zzww = _mm_shuffle_ps(add2, add3, _MM_SHUFFLE(0, 0, 0, 0));\n  //\n  // return _mm_shuffle_ps(xxyy, zzww, _MM_SHUFFLE(2, 0, 2, 0));\n\n  float x;\n  float y;\n  float z;\n  float w;\n\n  _mm_store_ss(&x, add0);\n  _mm_store_ss(&y, add1);\n  _mm_store_ss(&z, add2);\n  _mm_store_ss(&w, add3);\n\n  return detail::fquatSIMD(w, x, y, z);\n}\n\nGLM_FUNC_QUALIFIER fvec4SIMD operator*(fquatSIMD const& q, fvec4SIMD const& v) {\n  static const __m128 two = _mm_set1_ps(2.0f);\n\n  __m128 q_wwww = _mm_shuffle_ps(q.Data, q.Data, _MM_SHUFFLE(3, 3, 3, 3));\n  __m128 q_swp0 = _mm_shuffle_ps(q.Data, q.Data, _MM_SHUFFLE(3, 0, 2, 1));\n  __m128 q_swp1 = _mm_shuffle_ps(q.Data, q.Data, _MM_SHUFFLE(3, 1, 0, 2));\n  __m128 v_swp0 = _mm_shuffle_ps(v.Data, v.Data, _MM_SHUFFLE(3, 0, 2, 1));\n  __m128 v_swp1 = _mm_shuffle_ps(v.Data, v.Data, _MM_SHUFFLE(3, 1, 0, 2));\n\n  __m128 uv =\n      _mm_sub_ps(_mm_mul_ps(q_swp0, v_swp1), _mm_mul_ps(q_swp1, v_swp0));\n  __m128 uv_swp0 = _mm_shuffle_ps(uv, uv, _MM_SHUFFLE(3, 0, 2, 1));\n  __m128 uv_swp1 = _mm_shuffle_ps(uv, uv, _MM_SHUFFLE(3, 1, 0, 2));\n  __m128 uuv =\n      _mm_sub_ps(_mm_mul_ps(q_swp0, uv_swp1), _mm_mul_ps(q_swp1, uv_swp0));\n\n  uv = _mm_mul_ps(uv, _mm_mul_ps(q_wwww, two));\n  uuv = _mm_mul_ps(uuv, two);\n\n  return _mm_add_ps(v.Data, _mm_add_ps(uv, uuv));\n}\n\nGLM_FUNC_QUALIFIER fvec4SIMD operator*(fvec4SIMD const& v, fquatSIMD const& q) {\n  return glm::inverse(q) * v;\n}\n\nGLM_FUNC_QUALIFIER fquatSIMD operator*(fquatSIMD const& q, float s) {\n  return fquatSIMD(_mm_mul_ps(q.Data, _mm_set1_ps(s)));\n}\n\nGLM_FUNC_QUALIFIER fquatSIMD operator*(float s, fquatSIMD const& q) {\n  return fquatSIMD(_mm_mul_ps(_mm_set1_ps(s), q.Data));\n}\n\n// operator/\nGLM_FUNC_QUALIFIER fquatSIMD operator/(fquatSIMD const& q, float s) {\n  return fquatSIMD(_mm_div_ps(q.Data, _mm_set1_ps(s)));\n}\n\n}  // namespace detail\n\nGLM_FUNC_QUALIFIER quat quat_cast(detail::fquatSIMD const& x) {\n  GLM_ALIGN(16) quat Result;\n  _mm_store_ps(&Result[0], x.Data);\n\n  return Result;\n}\n\ntemplate <typename T>\nGLM_FUNC_QUALIFIER detail::fquatSIMD quatSIMD_cast_impl(const T m0[],\n                                                        const T m1[],\n                                                        const T m2[]) {\n  T trace = m0[0] + m1[1] + m2[2] + T(1.0);\n  if (trace > T(0)) {\n    T s = static_cast<T>(0.5) / sqrt(trace);\n\n    return _mm_set_ps(static_cast<float>(T(0.25) / s),\n                      static_cast<float>((m0[1] - m1[0]) * s),\n                      static_cast<float>((m2[0] - m0[2]) * s),\n                      static_cast<float>((m1[2] - m2[1]) * s));\n  } else {\n    if (m0[0] > m1[1]) {\n      if (m0[0] > m2[2]) {\n        // X is biggest.\n        T s = sqrt(m0[0] - m1[1] - m2[2] + T(1.0)) * T(0.5);\n\n        return _mm_set_ps(static_cast<float>((m1[2] - m2[1]) * s),\n                          static_cast<float>((m2[0] + m0[2]) * s),\n                          static_cast<float>((m0[1] + m1[0]) * s),\n                          static_cast<float>(T(0.5) * s));\n      }\n    } else {\n      if (m1[1] > m2[2]) {\n        // Y is biggest.\n        T s = sqrt(m1[1] - m0[0] - m2[2] + T(1.0)) * T(0.5);\n\n        return _mm_set_ps(static_cast<float>((m2[0] - m0[2]) * s),\n                          static_cast<float>((m1[2] + m2[1]) * s),\n                          static_cast<float>(T(0.5) * s),\n                          static_cast<float>((m0[1] + m1[0]) * s));\n      }\n    }\n\n    // Z is biggest.\n    T s = sqrt(m2[2] - m0[0] - m1[1] + T(1.0)) * T(0.5);\n\n    return _mm_set_ps(static_cast<float>((m0[1] - m1[0]) * s),\n                      static_cast<float>(T(0.5) * s),\n                      static_cast<float>((m1[2] + m2[1]) * s),\n                      static_cast<float>((m2[0] + m0[2]) * s));\n  }\n}\n\nGLM_FUNC_QUALIFIER detail::fquatSIMD quatSIMD_cast(\n    detail::fmat4x4SIMD const& m) {\n  // Scalar implementation for now.\n  GLM_ALIGN(16) float m0[4];\n  GLM_ALIGN(16) float m1[4];\n  GLM_ALIGN(16) float m2[4];\n\n  _mm_store_ps(m0, m[0].Data);\n  _mm_store_ps(m1, m[1].Data);\n  _mm_store_ps(m2, m[2].Data);\n\n  return quatSIMD_cast_impl(m0, m1, m2);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::fquatSIMD quatSIMD_cast(\n    detail::tmat4x4<T, P> const& m) {\n  return quatSIMD_cast_impl(&m[0][0], &m[1][0], &m[2][0]);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::fquatSIMD quatSIMD_cast(\n    detail::tmat3x3<T, P> const& m) {\n  return quatSIMD_cast_impl(&m[0][0], &m[1][0], &m[2][0]);\n}\n\nGLM_FUNC_QUALIFIER detail::fmat4x4SIMD mat4SIMD_cast(\n    detail::fquatSIMD const& q) {\n  detail::fmat4x4SIMD result;\n\n  __m128 _wwww = _mm_shuffle_ps(q.Data, q.Data, _MM_SHUFFLE(3, 3, 3, 3));\n  __m128 _xyzw = q.Data;\n  __m128 _zxyw = _mm_shuffle_ps(q.Data, q.Data, _MM_SHUFFLE(3, 1, 0, 2));\n  __m128 _yzxw = _mm_shuffle_ps(q.Data, q.Data, _MM_SHUFFLE(3, 0, 2, 1));\n\n  __m128 _xyzw2 = _mm_add_ps(_xyzw, _xyzw);\n  __m128 _zxyw2 = _mm_shuffle_ps(_xyzw2, _xyzw2, _MM_SHUFFLE(3, 1, 0, 2));\n  __m128 _yzxw2 = _mm_shuffle_ps(_xyzw2, _xyzw2, _MM_SHUFFLE(3, 0, 2, 1));\n\n  __m128 _tmp0 = _mm_sub_ps(_mm_set1_ps(1.0f), _mm_mul_ps(_yzxw2, _yzxw));\n  _tmp0 = _mm_sub_ps(_tmp0, _mm_mul_ps(_zxyw2, _zxyw));\n\n  __m128 _tmp1 = _mm_mul_ps(_yzxw2, _xyzw);\n  _tmp1 = _mm_add_ps(_tmp1, _mm_mul_ps(_zxyw2, _wwww));\n\n  __m128 _tmp2 = _mm_mul_ps(_zxyw2, _xyzw);\n  _tmp2 = _mm_sub_ps(_tmp2, _mm_mul_ps(_yzxw2, _wwww));\n\n  // There's probably a better, more politically correct way of doing this...\n  result[0].Data = _mm_set_ps(0.0f, reinterpret_cast<float*>(&_tmp2)[0],\n                              reinterpret_cast<float*>(&_tmp1)[0],\n                              reinterpret_cast<float*>(&_tmp0)[0]);\n\n  result[1].Data = _mm_set_ps(0.0f, reinterpret_cast<float*>(&_tmp1)[1],\n                              reinterpret_cast<float*>(&_tmp0)[1],\n                              reinterpret_cast<float*>(&_tmp2)[1]);\n\n  result[2].Data = _mm_set_ps(0.0f, reinterpret_cast<float*>(&_tmp0)[2],\n                              reinterpret_cast<float*>(&_tmp2)[2],\n                              reinterpret_cast<float*>(&_tmp1)[2]);\n\n  result[3].Data = _mm_set_ps(1.0f, 0.0f, 0.0f, 0.0f);\n\n  return result;\n}\n\nGLM_FUNC_QUALIFIER mat4 mat4_cast(detail::fquatSIMD const& q) {\n  return mat4_cast(mat4SIMD_cast(q));\n}\n\nGLM_FUNC_QUALIFIER float length(detail::fquatSIMD const& q) {\n  return glm::sqrt(dot(q, q));\n}\n\nGLM_FUNC_QUALIFIER detail::fquatSIMD normalize(detail::fquatSIMD const& q) {\n  return _mm_mul_ps(q.Data, _mm_set1_ps(1.0f / length(q)));\n}\n\nGLM_FUNC_QUALIFIER float dot(detail::fquatSIMD const& q1,\n                             detail::fquatSIMD const& q2) {\n  float result;\n  _mm_store_ss(&result, detail::sse_dot_ps(q1.Data, q2.Data));\n\n  return result;\n}\n\nGLM_FUNC_QUALIFIER detail::fquatSIMD mix(detail::fquatSIMD const& x,\n                                         detail::fquatSIMD const& y,\n                                         float const& a) {\n  float cosTheta = dot(x, y);\n\n  if (cosTheta > 1.0f - glm::epsilon<float>()) {\n    return _mm_add_ps(x.Data,\n                      _mm_mul_ps(_mm_set1_ps(a), _mm_sub_ps(y.Data, x.Data)));\n  } else {\n    float angle = glm::acos(cosTheta);\n\n    float s0 = glm::sin((1.0f - a) * angle);\n    float s1 = glm::sin(a * angle);\n    float d = 1.0f / glm::sin(angle);\n\n    return (s0 * x + s1 * y) * d;\n  }\n}\n\nGLM_FUNC_QUALIFIER detail::fquatSIMD lerp(detail::fquatSIMD const& x,\n                                          detail::fquatSIMD const& y,\n                                          float const& a) {\n  // Lerp is only defined in [0, 1]\n  assert(a >= 0.0f);\n  assert(a <= 1.0f);\n\n  return _mm_add_ps(x.Data,\n                    _mm_mul_ps(_mm_set1_ps(a), _mm_sub_ps(y.Data, x.Data)));\n}\n\nGLM_FUNC_QUALIFIER detail::fquatSIMD slerp(detail::fquatSIMD const& x,\n                                           detail::fquatSIMD const& y,\n                                           float const& a) {\n  detail::fquatSIMD z = y;\n\n  float cosTheta = dot(x, y);\n\n  // If cosTheta < 0, the interpolation will take the long way around the\n  // sphere. To fix this, one quat must be negated.\n  if (cosTheta < 0.0f) {\n    z = -y;\n    cosTheta = -cosTheta;\n  }\n\n  // Perform a linear interpolation when cosTheta is close to 1 to avoid side\n  // effect of sin(angle) becoming a zero denominator\n  if (cosTheta > 1.0f - epsilon<float>()) {\n    return _mm_add_ps(x.Data,\n                      _mm_mul_ps(_mm_set1_ps(a), _mm_sub_ps(y.Data, x.Data)));\n  } else {\n    float angle = glm::acos(cosTheta);\n\n    float s0 = glm::sin((1.0f - a) * angle);\n    float s1 = glm::sin(a * angle);\n    float d = 1.0f / glm::sin(angle);\n\n    return (s0 * x + s1 * y) * d;\n  }\n}\n\nGLM_FUNC_QUALIFIER detail::fquatSIMD fastMix(detail::fquatSIMD const& x,\n                                             detail::fquatSIMD const& y,\n                                             float const& a) {\n  float cosTheta = dot(x, y);\n\n  if (cosTheta > 1.0f - glm::epsilon<float>()) {\n    return _mm_add_ps(x.Data,\n                      _mm_mul_ps(_mm_set1_ps(a), _mm_sub_ps(y.Data, x.Data)));\n  } else {\n    float angle = glm::fastAcos(cosTheta);\n\n    __m128 s =\n        glm::fastSin(_mm_set_ps((1.0f - a) * angle, a * angle, angle, 0.0f));\n\n    __m128 s0 = _mm_shuffle_ps(s, s, _MM_SHUFFLE(3, 3, 3, 3));\n    __m128 s1 = _mm_shuffle_ps(s, s, _MM_SHUFFLE(2, 2, 2, 2));\n    __m128 d = _mm_div_ps(_mm_set1_ps(1.0f),\n                          _mm_shuffle_ps(s, s, _MM_SHUFFLE(1, 1, 1, 1)));\n\n    return _mm_mul_ps(\n        _mm_add_ps(_mm_mul_ps(s0, x.Data), _mm_mul_ps(s1, y.Data)), d);\n  }\n}\n\nGLM_FUNC_QUALIFIER detail::fquatSIMD fastSlerp(detail::fquatSIMD const& x,\n                                               detail::fquatSIMD const& y,\n                                               float const& a) {\n  detail::fquatSIMD z = y;\n\n  float cosTheta = dot(x, y);\n  if (cosTheta < 0.0f) {\n    z = -y;\n    cosTheta = -cosTheta;\n  }\n\n  if (cosTheta > 1.0f - epsilon<float>()) {\n    return _mm_add_ps(x.Data,\n                      _mm_mul_ps(_mm_set1_ps(a), _mm_sub_ps(y.Data, x.Data)));\n  } else {\n    float angle = glm::fastAcos(cosTheta);\n\n    __m128 s =\n        glm::fastSin(_mm_set_ps((1.0f - a) * angle, a * angle, angle, 0.0f));\n\n    __m128 s0 = _mm_shuffle_ps(s, s, _MM_SHUFFLE(3, 3, 3, 3));\n    __m128 s1 = _mm_shuffle_ps(s, s, _MM_SHUFFLE(2, 2, 2, 2));\n    __m128 d = _mm_div_ps(_mm_set1_ps(1.0f),\n                          _mm_shuffle_ps(s, s, _MM_SHUFFLE(1, 1, 1, 1)));\n\n    return _mm_mul_ps(\n        _mm_add_ps(_mm_mul_ps(s0, x.Data), _mm_mul_ps(s1, y.Data)), d);\n  }\n}\n\nGLM_FUNC_QUALIFIER detail::fquatSIMD conjugate(detail::fquatSIMD const& q) {\n  return detail::fquatSIMD(\n      _mm_mul_ps(q.Data, _mm_set_ps(1.0f, -1.0f, -1.0f, -1.0f)));\n}\n\nGLM_FUNC_QUALIFIER detail::fquatSIMD inverse(detail::fquatSIMD const& q) {\n  return conjugate(q) / dot(q, q);\n}\n\nGLM_FUNC_QUALIFIER detail::fquatSIMD angleAxisSIMD(float const& angle,\n                                                   vec3 const& v) {\n#ifdef GLM_FORCE_RADIANS\n  float a(angle);\n#else\n#pragma message( \\\n        \"GLM: rotateZ function taking degrees as parameters is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.\")\n  float a(glm::radians(angle));\n#endif\n  float s = glm::sin(a * 0.5f);\n\n  return _mm_set_ps(glm::cos(a * 0.5f), v.z * s, v.y * s, v.x * s);\n}\n\nGLM_FUNC_QUALIFIER detail::fquatSIMD angleAxisSIMD(float const& angle,\n                                                   float const& x,\n                                                   float const& y,\n                                                   float const& z) {\n  return angleAxisSIMD(angle, vec3(x, y, z));\n}\n\nGLM_FUNC_QUALIFIER __m128 fastSin(__m128 x) {\n  static const __m128 c0 = _mm_set1_ps(0.16666666666666666666666666666667f);\n  static const __m128 c1 = _mm_set1_ps(0.00833333333333333333333333333333f);\n  static const __m128 c2 = _mm_set1_ps(0.00019841269841269841269841269841f);\n\n  __m128 x3 = _mm_mul_ps(x, _mm_mul_ps(x, x));\n  __m128 x5 = _mm_mul_ps(x3, _mm_mul_ps(x, x));\n  __m128 x7 = _mm_mul_ps(x5, _mm_mul_ps(x, x));\n\n  __m128 y0 = _mm_mul_ps(x3, c0);\n  __m128 y1 = _mm_mul_ps(x5, c1);\n  __m128 y2 = _mm_mul_ps(x7, c2);\n\n  return _mm_sub_ps(_mm_add_ps(_mm_sub_ps(x, y0), y1), y2);\n}\n\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/simd_vec4.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_simd_vec4\n/// @file glm/gtx/simd_vec4.hpp\n/// @date 2009-05-07 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_simd_vec4 GLM_GTX_simd_vec4\n/// @ingroup gtx\n///\n/// @brief SIMD implementation of vec4 type.\n///\n/// <glm/gtx/simd_vec4.hpp> need to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_simd_vec4\n#define GLM_GTX_simd_vec4\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#if (GLM_ARCH != GLM_ARCH_PURE)\n\n#if (GLM_ARCH & GLM_ARCH_SSE2)\n#include \"../detail/intrinsic_common.hpp\"\n#include \"../detail/intrinsic_geometric.hpp\"\n#include \"../detail/intrinsic_integer.hpp\"\n#else\n#error \\\n    \"GLM: GLM_GTX_simd_vec4 requires compiler support of SSE2 through intrinsics\"\n#endif\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_simd_vec4 extension included\")\n#endif\n\n// Warning silencer for nameless struct/union.\n#if (GLM_COMPILER & GLM_COMPILER_VC)\n#pragma warning(push)\n#pragma warning(disable : 4201)  // warning C4201: nonstandard extension used :\n                                 // nameless struct/union\n#endif\n\nnamespace glm {\nenum comp {\n  X = 0,\n  R = 0,\n  S = 0,\n  Y = 1,\n  G = 1,\n  T = 1,\n  Z = 2,\n  B = 2,\n  P = 2,\n  W = 3,\n  A = 3,\n  Q = 3\n};\n\n}  // namespace glm\n\nnamespace glm {\nnamespace detail {\n/// 4-dimensional vector implemented using SIMD SEE intrinsics.\n/// \\ingroup gtx_simd_vec4\nGLM_ALIGNED_STRUCT(16) fvec4SIMD {\n  enum ctor { null };\n  typedef __m128 value_type;\n  typedef std::size_t size_type;\n  static size_type value_size();\n\n  typedef fvec4SIMD type;\n  typedef tvec4<bool, highp> bool_type;\n\n#ifdef GLM_SIMD_ENABLE_XYZW_UNION\n  union {\n    __m128 Data;\n    struct {\n      float x, y, z, w;\n    };\n  };\n#else\n  __m128 Data;\n#endif\n\n  //////////////////////////////////////\n  // Implicit basic constructors\n\n  fvec4SIMD();\n  fvec4SIMD(__m128 const& Data);\n  fvec4SIMD(fvec4SIMD const& v);\n\n  //////////////////////////////////////\n  // Explicit basic constructors\n\n  explicit fvec4SIMD(ctor);\n  explicit fvec4SIMD(float const& s);\n  explicit fvec4SIMD(float const& x, float const& y, float const& z,\n                     float const& w);\n  explicit fvec4SIMD(vec4 const& v);\n\n  ////////////////////////////////////////\n  //// Conversion vector constructors\n\n  fvec4SIMD(vec2 const& v, float const& s1, float const& s2);\n  fvec4SIMD(float const& s1, vec2 const& v, float const& s2);\n  fvec4SIMD(float const& s1, float const& s2, vec2 const& v);\n  fvec4SIMD(vec3 const& v, float const& s);\n  fvec4SIMD(float const& s, vec3 const& v);\n  fvec4SIMD(vec2 const& v1, vec2 const& v2);\n  // fvec4SIMD(ivec4SIMD const & v);\n\n  //////////////////////////////////////\n  // Unary arithmetic operators\n\n  fvec4SIMD& operator=(fvec4SIMD const& v);\n  fvec4SIMD& operator+=(fvec4SIMD const& v);\n  fvec4SIMD& operator-=(fvec4SIMD const& v);\n  fvec4SIMD& operator*=(fvec4SIMD const& v);\n  fvec4SIMD& operator/=(fvec4SIMD const& v);\n\n  fvec4SIMD& operator+=(float const& s);\n  fvec4SIMD& operator-=(float const& s);\n  fvec4SIMD& operator*=(float const& s);\n  fvec4SIMD& operator/=(float const& s);\n\n  fvec4SIMD& operator++();\n  fvec4SIMD& operator--();\n\n  //////////////////////////////////////\n  // Swizzle operators\n\n  template <comp X, comp Y, comp Z, comp W>\n  fvec4SIMD& swizzle();\n  template <comp X, comp Y, comp Z, comp W>\n  fvec4SIMD swizzle() const;\n  template <comp X, comp Y, comp Z>\n  fvec4SIMD swizzle() const;\n  template <comp X, comp Y>\n  fvec4SIMD swizzle() const;\n  template <comp X>\n  fvec4SIMD swizzle() const;\n};\n}  // namespace detail\n\ntypedef glm::detail::fvec4SIMD simdVec4;\n\n/// @addtogroup gtx_simd_vec4\n/// @{\n\n//! Convert a simdVec4 to a vec4.\n/// @see gtx_simd_vec4\nvec4 vec4_cast(detail::fvec4SIMD const& x);\n\n//! Returns x if x >= 0; otherwise, it returns -x.\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD abs(detail::fvec4SIMD const& x);\n\n//! Returns 1.0 if x > 0, 0.0 if x = 0, or -1.0 if x < 0.\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD sign(detail::fvec4SIMD const& x);\n\n//! Returns a value equal to the nearest integer that is less then or equal to\n//! x.\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD floor(detail::fvec4SIMD const& x);\n\n//! Returns a value equal to the nearest integer to x\n//! whose absolute value is not larger than the absolute value of x.\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD trunc(detail::fvec4SIMD const& x);\n\n//! Returns a value equal to the nearest integer to x.\n//! The fraction 0.5 will round in a direction chosen by the\n//! implementation, presumably the direction that is fastest.\n//! This includes the possibility that round(x) returns the\n//! same value as roundEven(x) for all values of x.\n///\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD round(detail::fvec4SIMD const& x);\n\n//! Returns a value equal to the nearest integer to x.\n//! A fractional part of 0.5 will round toward the nearest even\n//! integer. (Both 3.5 and 4.5 for x will return 4.0.)\n///\n/// @see gtx_simd_vec4\n// detail::fvec4SIMD roundEven(detail::fvec4SIMD const & x);\n\n//! Returns a value equal to the nearest integer\n//! that is greater than or equal to x.\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD ceil(detail::fvec4SIMD const& x);\n\n//! Return x - floor(x).\n///\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD fract(detail::fvec4SIMD const& x);\n\n//! Modulus. Returns x - y * floor(x / y)\n//! for each component in x using the floating point value y.\n///\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD mod(detail::fvec4SIMD const& x, detail::fvec4SIMD const& y);\n\n//! Modulus. Returns x - y * floor(x / y)\n//! for each component in x using the floating point value y.\n///\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD mod(detail::fvec4SIMD const& x, float const& y);\n\n//! Returns the fractional part of x and sets i to the integer\n//! part (as a whole number floating point value). Both the\n//! return value and the output parameter will have the same\n//! sign as x.\n//! (From GLM_GTX_simd_vec4 extension, common function)\n// detail::fvec4SIMD modf(\n//\tdetail::fvec4SIMD const & x,\n//\tdetail::fvec4SIMD & i);\n\n//! Returns y if y < x; otherwise, it returns x.\n///\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD min(detail::fvec4SIMD const& x, detail::fvec4SIMD const& y);\n\ndetail::fvec4SIMD min(detail::fvec4SIMD const& x, float const& y);\n\n//! Returns y if x < y; otherwise, it returns x.\n///\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD max(detail::fvec4SIMD const& x, detail::fvec4SIMD const& y);\n\ndetail::fvec4SIMD max(detail::fvec4SIMD const& x, float const& y);\n\n//! Returns min(max(x, minVal), maxVal) for each component in x\n//! using the floating-point values minVal and maxVal.\n///\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD clamp(detail::fvec4SIMD const& x,\n                        detail::fvec4SIMD const& minVal,\n                        detail::fvec4SIMD const& maxVal);\n\ndetail::fvec4SIMD clamp(detail::fvec4SIMD const& x, float const& minVal,\n                        float const& maxVal);\n\n//! \\return If genTypeU is a floating scalar or vector:\n//! Returns x * (1.0 - a) + y * a, i.e., the linear blend of\n//! x and y using the floating-point value a.\n//! The value for a is not restricted to the range [0, 1].\n//!\n//! \\return If genTypeU is a boolean scalar or vector:\n//! Selects which vector each returned component comes\n//! from. For a component of a that is false, the\n//! corresponding component of x is returned. For a\n//! component of a that is true, the corresponding\n//! component of y is returned. Components of x and y that\n//! are not selected are allowed to be invalid floating point\n//! values and will have no effect on the results. Thus, this\n//! provides different functionality than\n//! genType mix(genType x, genType y, genType(a))\n//! where a is a Boolean vector.\n//!\n//! From GLSL 1.30.08 specification, section 8.3\n//!\n//! \\param[in]  x Floating point scalar or vector.\n//! \\param[in]  y Floating point scalar or vector.\n//! \\param[in]  a Floating point or boolean scalar or vector.\n//!\n/// \\todo Test when 'a' is a boolean.\n///\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD mix(detail::fvec4SIMD const& x, detail::fvec4SIMD const& y,\n                      detail::fvec4SIMD const& a);\n\n//! Returns 0.0 if x < edge, otherwise it returns 1.0.\n///\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD step(detail::fvec4SIMD const& edge,\n                       detail::fvec4SIMD const& x);\n\ndetail::fvec4SIMD step(float const& edge, detail::fvec4SIMD const& x);\n\n//! Returns 0.0 if x <= edge0 and 1.0 if x >= edge1 and\n//! performs smooth Hermite interpolation between 0 and 1\n//! when edge0 < x < edge1. This is useful in cases where\n//! you would want a threshold function with a smooth\n//! transition. This is equivalent to:\n//! genType t;\n//! t = clamp ((x - edge0) / (edge1 - edge0), 0, 1);\n//! return t * t * (3 - 2 * t);\n//! Results are undefined if edge0 >= edge1.\n///\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD smoothstep(detail::fvec4SIMD const& edge0,\n                             detail::fvec4SIMD const& edge1,\n                             detail::fvec4SIMD const& x);\n\ndetail::fvec4SIMD smoothstep(float const& edge0, float const& edge1,\n                             detail::fvec4SIMD const& x);\n\n//! Returns true if x holds a NaN (not a number)\n//! representation in the underlying implementation's set of\n//! floating point representations. Returns false otherwise,\n//! including for implementations with no NaN\n//! representations.\n///\n/// @see gtx_simd_vec4\n// bvec4 isnan(detail::fvec4SIMD const & x);\n\n//! Returns true if x holds a positive infinity or negative\n//! infinity representation in the underlying implementation's\n//! set of floating point representations. Returns false\n//! otherwise, including for implementations with no infinity\n//! representations.\n///\n/// @see gtx_simd_vec4\n// bvec4 isinf(detail::fvec4SIMD const & x);\n\n//! Returns a signed or unsigned integer value representing\n//! the encoding of a floating-point value. The floatingpoint\n//! value's bit-level representation is preserved.\n///\n/// @see gtx_simd_vec4\n// detail::ivec4SIMD floatBitsToInt(detail::fvec4SIMD const & value);\n\n//! Returns a floating-point value corresponding to a signed\n//! or unsigned integer encoding of a floating-point value.\n//! If an inf or NaN is passed in, it will not signal, and the\n//! resulting floating point value is unspecified. Otherwise,\n//! the bit-level representation is preserved.\n///\n/// @see gtx_simd_vec4\n// detail::fvec4SIMD intBitsToFloat(detail::ivec4SIMD const & value);\n\n//! Computes and returns a * b + c.\n///\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD fma(detail::fvec4SIMD const& a, detail::fvec4SIMD const& b,\n                      detail::fvec4SIMD const& c);\n\n//! Splits x into a floating-point significand in the range\n//! [0.5, 1.0) and an integral exponent of two, such that:\n//! x = significand * exp(2, exponent)\n//! The significand is returned by the function and the\n//! exponent is returned in the parameter exp. For a\n//! floating-point value of zero, the significant and exponent\n//! are both zero. For a floating-point value that is an\n//! infinity or is not a number, the results are undefined.\n///\n/// @see gtx_simd_vec4\n// detail::fvec4SIMD frexp(detail::fvec4SIMD const & x, detail::ivec4SIMD &\n// exp);\n\n//! Builds a floating-point number from x and the\n//! corresponding integral exponent of two in exp, returning:\n//! significand * exp(2, exponent)\n//! If this product is too large to be represented in the\n//! floating-point type, the result is undefined.\n///\n/// @see gtx_simd_vec4\n// detail::fvec4SIMD ldexp(detail::fvec4SIMD const & x, detail::ivec4SIMD const\n// & exp);\n\n//! Returns the length of x, i.e., sqrt(x * x).\n///\n/// @see gtx_simd_vec4\nfloat length(detail::fvec4SIMD const& x);\n\n//! Returns the length of x, i.e., sqrt(x * x).\n//! Less accurate but much faster than simdLength.\n///\n/// @see gtx_simd_vec4\nfloat fastLength(detail::fvec4SIMD const& x);\n\n//! Returns the length of x, i.e., sqrt(x * x).\n//! Slightly more accurate but much slower than simdLength.\n///\n/// @see gtx_simd_vec4\nfloat niceLength(detail::fvec4SIMD const& x);\n\n//! Returns the length of x, i.e., sqrt(x * x).\n///\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD length4(detail::fvec4SIMD const& x);\n\n//! Returns the length of x, i.e., sqrt(x * x).\n//! Less accurate but much faster than simdLength4.\n///\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD fastLength4(detail::fvec4SIMD const& x);\n\n//! Returns the length of x, i.e., sqrt(x * x).\n//! Slightly more accurate but much slower than simdLength4.\n///\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD niceLength4(detail::fvec4SIMD const& x);\n\n//! Returns the distance betwwen p0 and p1, i.e., length(p0 - p1).\n///\n/// @see gtx_simd_vec4\nfloat distance(detail::fvec4SIMD const& p0, detail::fvec4SIMD const& p1);\n\n//! Returns the distance betwwen p0 and p1, i.e., length(p0 - p1).\n///\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD distance4(detail::fvec4SIMD const& p0,\n                            detail::fvec4SIMD const& p1);\n\n//! Returns the dot product of x and y, i.e., result = x * y.\n///\n/// @see gtx_simd_vec4\nfloat simdDot(detail::fvec4SIMD const& x, detail::fvec4SIMD const& y);\n\n//! Returns the dot product of x and y, i.e., result = x * y.\n///\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD dot4(detail::fvec4SIMD const& x, detail::fvec4SIMD const& y);\n\n//! Returns the cross product of x and y.\n///\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD cross(detail::fvec4SIMD const& x, detail::fvec4SIMD const& y);\n\n//! Returns a vector in the same direction as x but with length of 1.\n///\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD normalize(detail::fvec4SIMD const& x);\n\n//! Returns a vector in the same direction as x but with length of 1.\n//! Less accurate but much faster than simdNormalize.\n///\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD fastNormalize(detail::fvec4SIMD const& x);\n\n//! If dot(Nref, I) < 0.0, return N, otherwise, return -N.\n///\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD simdFaceforward(detail::fvec4SIMD const& N,\n                                  detail::fvec4SIMD const& I,\n                                  detail::fvec4SIMD const& Nref);\n\n//! For the incident vector I and surface orientation N,\n//! returns the reflection direction : result = I - 2.0 * dot(N, I) * N.\n///\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD reflect(detail::fvec4SIMD const& I,\n                          detail::fvec4SIMD const& N);\n\n//! For the incident vector I and surface normal N,\n//! and the ratio of indices of refraction eta,\n//! return the refraction vector.\n///\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD refract(detail::fvec4SIMD const& I,\n                          detail::fvec4SIMD const& N, float const& eta);\n\n//! Returns the positive square root of x.\n///\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD sqrt(detail::fvec4SIMD const& x);\n\n//! Returns the positive square root of x with the nicest quality but very slow.\n//! Slightly more accurate but much slower than simdSqrt.\n///\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD niceSqrt(detail::fvec4SIMD const& x);\n\n//! Returns the positive square root of x\n//! Less accurate but much faster than sqrt.\n///\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD fastSqrt(detail::fvec4SIMD const& x);\n\n//! Returns the reciprocal of the positive square root of x.\n///\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD inversesqrt(detail::fvec4SIMD const& x);\n\n//! Returns the reciprocal of the positive square root of x.\n//! Faster than inversesqrt but less accurate.\n///\n/// @see gtx_simd_vec4\ndetail::fvec4SIMD fastInversesqrt(detail::fvec4SIMD const& x);\n\n/// @}\n}  // namespace glm\n\n#include \"simd_vec4.inl\"\n\n#if (GLM_COMPILER & GLM_COMPILER_VC)\n#pragma warning(pop)\n#endif\n\n#endif  //(GLM_ARCH != GLM_ARCH_PURE)\n\n#endif  // GLM_GTX_simd_vec4\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/simd_vec4.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2009-05-07\n// Updated : 2009-05-07\n// Licence : This source is under MIT License\n// File    : glm/gtx/simd_vec4.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\nnamespace detail {\n\ntemplate <int Value>\nstruct mask {\n  enum { value = Value };\n};\n\n//////////////////////////////////////\n// Implicit basic constructors\n\nGLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD()\n#ifdef GLM_SIMD_ENABLE_DEFAULT_INIT\n    : Data(_mm_set_ps(0.0f, 0.0f, 0.0f, 0.0f))\n#endif\n{\n}\n\nGLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(__m128 const& Data) : Data(Data) {}\n\nGLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(fvec4SIMD const& v) : Data(v.Data) {}\n\nGLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(vec4 const& v)\n    : Data(_mm_set_ps(v.w, v.z, v.y, v.x)) {}\n\n//////////////////////////////////////\n// Explicit basic constructors\n\nGLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(float const& s)\n    : Data(_mm_set1_ps(s)) {}\n\nGLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(float const& x, float const& y,\n                                        float const& z, float const& w)\n    :  //\t\tData(_mm_setr_ps(x, y, z, w))\n      Data(_mm_set_ps(w, z, y, x)) {}\n/*\nGLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(float const v[4]) :\n        Data(_mm_load_ps(v))\n{}\n*/\n//////////////////////////////////////\n// Swizzle constructors\n\n// fvec4SIMD(ref4<float> const & r);\n\n//////////////////////////////////////\n// Conversion vector constructors\n\nGLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(vec2 const& v, float const& s1,\n                                        float const& s2)\n    : Data(_mm_set_ps(s2, s1, v.y, v.x)) {}\n\nGLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(float const& s1, vec2 const& v,\n                                        float const& s2)\n    : Data(_mm_set_ps(s2, v.y, v.x, s1)) {}\n\nGLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(float const& s1, float const& s2,\n                                        vec2 const& v)\n    : Data(_mm_set_ps(v.y, v.x, s2, s1)) {}\n\nGLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(vec3 const& v, float const& s)\n    : Data(_mm_set_ps(s, v.z, v.y, v.x)) {}\n\nGLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(float const& s, vec3 const& v)\n    : Data(_mm_set_ps(v.z, v.y, v.x, s)) {}\n\nGLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(vec2 const& v1, vec2 const& v2)\n    : Data(_mm_set_ps(v2.y, v2.x, v1.y, v1.x)) {}\n\n// GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(ivec4SIMD const & v) :\n//\tData(_mm_cvtepi32_ps(v.Data))\n//{}\n\n//////////////////////////////////////\n// Unary arithmetic operators\n\nGLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator=(fvec4SIMD const& v) {\n  this->Data = v.Data;\n  return *this;\n}\n\nGLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator+=(float const& s) {\n  this->Data = _mm_add_ps(Data, _mm_set_ps1(s));\n  return *this;\n}\n\nGLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator+=(fvec4SIMD const& v) {\n  this->Data = _mm_add_ps(this->Data, v.Data);\n  return *this;\n}\n\nGLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator-=(float const& s) {\n  this->Data = _mm_sub_ps(Data, _mm_set_ps1(s));\n  return *this;\n}\n\nGLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator-=(fvec4SIMD const& v) {\n  this->Data = _mm_sub_ps(this->Data, v.Data);\n  return *this;\n}\n\nGLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator*=(float const& s) {\n  this->Data = _mm_mul_ps(this->Data, _mm_set_ps1(s));\n  return *this;\n}\n\nGLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator*=(fvec4SIMD const& v) {\n  this->Data = _mm_mul_ps(this->Data, v.Data);\n  return *this;\n}\n\nGLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator/=(float const& s) {\n  this->Data = _mm_div_ps(Data, _mm_set1_ps(s));\n  return *this;\n}\n\nGLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator/=(fvec4SIMD const& v) {\n  this->Data = _mm_div_ps(this->Data, v.Data);\n  return *this;\n}\n\nGLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator++() {\n  this->Data = _mm_add_ps(this->Data, glm::detail::one);\n  return *this;\n}\n\nGLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator--() {\n  this->Data = _mm_sub_ps(this->Data, glm::detail::one);\n  return *this;\n}\n\n//////////////////////////////////////\n// Swizzle operators\n\ntemplate <comp X, comp Y, comp Z, comp W>\nGLM_FUNC_QUALIFIER fvec4SIMD fvec4SIMD::swizzle() const {\n  __m128 Data =\n      _mm_shuffle_ps(this->Data, this->Data,\n                     mask<(W << 6) | (Z << 4) | (Y << 2) | (X << 0)>::value);\n  return fvec4SIMD(Data);\n}\n\ntemplate <comp X, comp Y, comp Z, comp W>\nGLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::swizzle() {\n  this->Data =\n      _mm_shuffle_ps(this->Data, this->Data,\n                     mask<(W << 6) | (Z << 4) | (Y << 2) | (X << 0)>::value);\n  return *this;\n}\n\n// operator+\nGLM_FUNC_QUALIFIER fvec4SIMD operator+(fvec4SIMD const& v, float s) {\n  return fvec4SIMD(_mm_add_ps(v.Data, _mm_set1_ps(s)));\n}\n\nGLM_FUNC_QUALIFIER fvec4SIMD operator+(float s, fvec4SIMD const& v) {\n  return fvec4SIMD(_mm_add_ps(_mm_set1_ps(s), v.Data));\n}\n\nGLM_FUNC_QUALIFIER fvec4SIMD operator+(fvec4SIMD const& v1,\n                                       fvec4SIMD const& v2) {\n  return fvec4SIMD(_mm_add_ps(v1.Data, v2.Data));\n}\n\n// operator-\nGLM_FUNC_QUALIFIER fvec4SIMD operator-(fvec4SIMD const& v, float s) {\n  return fvec4SIMD(_mm_sub_ps(v.Data, _mm_set1_ps(s)));\n}\n\nGLM_FUNC_QUALIFIER fvec4SIMD operator-(float s, fvec4SIMD const& v) {\n  return fvec4SIMD(_mm_sub_ps(_mm_set1_ps(s), v.Data));\n}\n\nGLM_FUNC_QUALIFIER fvec4SIMD operator-(fvec4SIMD const& v1,\n                                       fvec4SIMD const& v2) {\n  return fvec4SIMD(_mm_sub_ps(v1.Data, v2.Data));\n}\n\n// operator*\nGLM_FUNC_QUALIFIER fvec4SIMD operator*(fvec4SIMD const& v, float s) {\n  __m128 par0 = v.Data;\n  __m128 par1 = _mm_set1_ps(s);\n  return fvec4SIMD(_mm_mul_ps(par0, par1));\n}\n\nGLM_FUNC_QUALIFIER fvec4SIMD operator*(float s, fvec4SIMD const& v) {\n  __m128 par0 = _mm_set1_ps(s);\n  __m128 par1 = v.Data;\n  return fvec4SIMD(_mm_mul_ps(par0, par1));\n}\n\nGLM_FUNC_QUALIFIER fvec4SIMD operator*(fvec4SIMD const& v1,\n                                       fvec4SIMD const& v2) {\n  return fvec4SIMD(_mm_mul_ps(v1.Data, v2.Data));\n}\n\n// operator/\nGLM_FUNC_QUALIFIER fvec4SIMD operator/(fvec4SIMD const& v, float s) {\n  __m128 par0 = v.Data;\n  __m128 par1 = _mm_set1_ps(s);\n  return fvec4SIMD(_mm_div_ps(par0, par1));\n}\n\nGLM_FUNC_QUALIFIER fvec4SIMD operator/(float s, fvec4SIMD const& v) {\n  __m128 par0 = _mm_set1_ps(s);\n  __m128 par1 = v.Data;\n  return fvec4SIMD(_mm_div_ps(par0, par1));\n}\n\nGLM_FUNC_QUALIFIER fvec4SIMD operator/(fvec4SIMD const& v1,\n                                       fvec4SIMD const& v2) {\n  return fvec4SIMD(_mm_div_ps(v1.Data, v2.Data));\n}\n\n// Unary constant operators\nGLM_FUNC_QUALIFIER fvec4SIMD operator-(fvec4SIMD const& v) {\n  return fvec4SIMD(_mm_sub_ps(_mm_setzero_ps(), v.Data));\n}\n\nGLM_FUNC_QUALIFIER fvec4SIMD operator++(fvec4SIMD const& v, int) {\n  return fvec4SIMD(_mm_add_ps(v.Data, glm::detail::one));\n}\n\nGLM_FUNC_QUALIFIER fvec4SIMD operator--(fvec4SIMD const& v, int) {\n  return fvec4SIMD(_mm_sub_ps(v.Data, glm::detail::one));\n}\n\n}  // namespace detail\n\nGLM_FUNC_QUALIFIER vec4 vec4_cast(detail::fvec4SIMD const& x) {\n  GLM_ALIGN(16) vec4 Result;\n  _mm_store_ps(&Result[0], x.Data);\n  return Result;\n}\n\n// Other possible implementation\n// float abs(float a)\n//{\n//  return max(-a, a);\n//}\nGLM_FUNC_QUALIFIER detail::fvec4SIMD abs(detail::fvec4SIMD const& x) {\n  return detail::sse_abs_ps(x.Data);\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD sign(detail::fvec4SIMD const& x) {\n  return detail::sse_sgn_ps(x.Data);\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD floor(detail::fvec4SIMD const& x) {\n  return detail::sse_flr_ps(x.Data);\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD trunc(detail::fvec4SIMD const& x) {\n  // return x < 0 ? -floor(-x) : floor(x);\n\n  __m128 Flr0 = detail::sse_flr_ps(_mm_sub_ps(_mm_setzero_ps(), x.Data));\n  __m128 Sub0 = _mm_sub_ps(Flr0, x.Data);\n  __m128 Flr1 = detail::sse_flr_ps(x.Data);\n\n  __m128 Cmp0 = _mm_cmplt_ps(x.Data, glm::detail::zero);\n  __m128 Cmp1 = _mm_cmpnlt_ps(x.Data, glm::detail::zero);\n\n  __m128 And0 = _mm_and_ps(Sub0, Cmp0);\n  __m128 And1 = _mm_and_ps(Flr1, Cmp1);\n\n  return _mm_or_ps(And0, And1);\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD round(detail::fvec4SIMD const& x) {\n  return detail::sse_rnd_ps(x.Data);\n}\n\n// GLM_FUNC_QUALIFIER detail::fvec4SIMD roundEven\n//(\n//\tdetail::fvec4SIMD const & x\n//)\n//{\n\n//}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD ceil(detail::fvec4SIMD const& x) {\n  return detail::sse_ceil_ps(x.Data);\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD fract(detail::fvec4SIMD const& x) {\n  return detail::sse_frc_ps(x.Data);\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD mod(detail::fvec4SIMD const& x,\n                                         detail::fvec4SIMD const& y) {\n  return detail::sse_mod_ps(x.Data, y.Data);\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD mod(detail::fvec4SIMD const& x,\n                                         float const& y) {\n  return detail::sse_mod_ps(x.Data, _mm_set1_ps(y));\n}\n\n// GLM_FUNC_QUALIFIER detail::fvec4SIMD modf\n//(\n//\tdetail::fvec4SIMD const & x,\n//\tdetail::fvec4SIMD & i\n//)\n//{\n\n//}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD min(detail::fvec4SIMD const& x,\n                                         detail::fvec4SIMD const& y) {\n  return _mm_min_ps(x.Data, y.Data);\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD min(detail::fvec4SIMD const& x,\n                                         float const& y) {\n  return _mm_min_ps(x.Data, _mm_set1_ps(y));\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD max(detail::fvec4SIMD const& x,\n                                         detail::fvec4SIMD const& y) {\n  return _mm_max_ps(x.Data, y.Data);\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD max(detail::fvec4SIMD const& x,\n                                         float const& y) {\n  return _mm_max_ps(x.Data, _mm_set1_ps(y));\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD clamp(detail::fvec4SIMD const& x,\n                                           detail::fvec4SIMD const& minVal,\n                                           detail::fvec4SIMD const& maxVal) {\n  return detail::sse_clp_ps(x.Data, minVal.Data, maxVal.Data);\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD clamp(detail::fvec4SIMD const& x,\n                                           float const& minVal,\n                                           float const& maxVal) {\n  return detail::sse_clp_ps(x.Data, _mm_set1_ps(minVal), _mm_set1_ps(maxVal));\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD mix(detail::fvec4SIMD const& x,\n                                         detail::fvec4SIMD const& y,\n                                         detail::fvec4SIMD const& a) {\n  __m128 Sub0 = _mm_sub_ps(y.Data, x.Data);\n  __m128 Mul0 = _mm_mul_ps(a.Data, Sub0);\n  return _mm_add_ps(x.Data, Mul0);\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD step(detail::fvec4SIMD const& edge,\n                                          detail::fvec4SIMD const& x) {\n  __m128 cmp0 = _mm_cmpngt_ps(x.Data, edge.Data);\n  return _mm_max_ps(_mm_min_ps(cmp0, _mm_setzero_ps()), detail::one);\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD step(float const& edge,\n                                          detail::fvec4SIMD const& x) {\n  __m128 cmp0 = _mm_cmpngt_ps(x.Data, _mm_set1_ps(edge));\n  return _mm_max_ps(_mm_min_ps(cmp0, _mm_setzero_ps()), detail::one);\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD smoothstep(detail::fvec4SIMD const& edge0,\n                                                detail::fvec4SIMD const& edge1,\n                                                detail::fvec4SIMD const& x) {\n  return detail::sse_ssp_ps(edge0.Data, edge1.Data, x.Data);\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD smoothstep(float const& edge0,\n                                                float const& edge1,\n                                                detail::fvec4SIMD const& x) {\n  return detail::sse_ssp_ps(_mm_set1_ps(edge0), _mm_set1_ps(edge1), x.Data);\n}\n\n// GLM_FUNC_QUALIFIER bvec4 isnan(detail::fvec4SIMD const & x)\n//{\n\n//}\n\n// GLM_FUNC_QUALIFIER bvec4 isinf(detail::fvec4SIMD const & x)\n//{\n\n//}\n\n// GLM_FUNC_QUALIFIER detail::ivec4SIMD floatBitsToInt\n//(\n//\tdetail::fvec4SIMD const & value\n//)\n//{\n\n//}\n\n// GLM_FUNC_QUALIFIER detail::fvec4SIMD intBitsToFloat\n//(\n//\tdetail::ivec4SIMD const & value\n//)\n//{\n\n//}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD fma(detail::fvec4SIMD const& a,\n                                         detail::fvec4SIMD const& b,\n                                         detail::fvec4SIMD const& c) {\n  return _mm_add_ps(_mm_mul_ps(a.Data, b.Data), c.Data);\n}\n\nGLM_FUNC_QUALIFIER float length(detail::fvec4SIMD const& x) {\n  detail::fvec4SIMD dot0 = detail::sse_dot_ss(x.Data, x.Data);\n  detail::fvec4SIMD sqt0 = sqrt(dot0);\n  float Result = 0;\n  _mm_store_ss(&Result, sqt0.Data);\n  return Result;\n}\n\nGLM_FUNC_QUALIFIER float fastLength(detail::fvec4SIMD const& x) {\n  detail::fvec4SIMD dot0 = detail::sse_dot_ss(x.Data, x.Data);\n  detail::fvec4SIMD sqt0 = fastSqrt(dot0);\n  float Result = 0;\n  _mm_store_ss(&Result, sqt0.Data);\n  return Result;\n}\n\nGLM_FUNC_QUALIFIER float niceLength(detail::fvec4SIMD const& x) {\n  detail::fvec4SIMD dot0 = detail::sse_dot_ss(x.Data, x.Data);\n  detail::fvec4SIMD sqt0 = niceSqrt(dot0);\n  float Result = 0;\n  _mm_store_ss(&Result, sqt0.Data);\n  return Result;\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD length4(detail::fvec4SIMD const& x) {\n  return sqrt(dot4(x, x));\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD fastLength4(detail::fvec4SIMD const& x) {\n  return fastSqrt(dot4(x, x));\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD niceLength4(detail::fvec4SIMD const& x) {\n  return niceSqrt(dot4(x, x));\n}\n\nGLM_FUNC_QUALIFIER float distance(detail::fvec4SIMD const& p0,\n                                  detail::fvec4SIMD const& p1) {\n  float Result = 0;\n  _mm_store_ss(&Result, detail::sse_dst_ps(p0.Data, p1.Data));\n  return Result;\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD distance4(detail::fvec4SIMD const& p0,\n                                               detail::fvec4SIMD const& p1) {\n  return detail::sse_dst_ps(p0.Data, p1.Data);\n}\n\nGLM_FUNC_QUALIFIER float dot(detail::fvec4SIMD const& x,\n                             detail::fvec4SIMD const& y) {\n  float Result = 0;\n  _mm_store_ss(&Result, detail::sse_dot_ss(x.Data, y.Data));\n  return Result;\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD dot4(detail::fvec4SIMD const& x,\n                                          detail::fvec4SIMD const& y) {\n  return detail::sse_dot_ps(x.Data, y.Data);\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD cross(detail::fvec4SIMD const& x,\n                                           detail::fvec4SIMD const& y) {\n  return detail::sse_xpd_ps(x.Data, y.Data);\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD normalize(detail::fvec4SIMD const& x) {\n  __m128 dot0 = detail::sse_dot_ps(x.Data, x.Data);\n  __m128 isr0 = inversesqrt(detail::fvec4SIMD(dot0)).Data;\n  __m128 mul0 = _mm_mul_ps(x.Data, isr0);\n  return mul0;\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD fastNormalize(detail::fvec4SIMD const& x) {\n  __m128 dot0 = detail::sse_dot_ps(x.Data, x.Data);\n  __m128 isr0 = fastInversesqrt(dot0).Data;\n  __m128 mul0 = _mm_mul_ps(x.Data, isr0);\n  return mul0;\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD faceforward(\n    detail::fvec4SIMD const& N, detail::fvec4SIMD const& I,\n    detail::fvec4SIMD const& Nref) {\n  return detail::sse_ffd_ps(N.Data, I.Data, Nref.Data);\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD reflect(detail::fvec4SIMD const& I,\n                                             detail::fvec4SIMD const& N) {\n  return detail::sse_rfe_ps(I.Data, N.Data);\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD refract(detail::fvec4SIMD const& I,\n                                             detail::fvec4SIMD const& N,\n                                             float const& eta) {\n  return detail::sse_rfa_ps(I.Data, N.Data, _mm_set1_ps(eta));\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD sqrt(detail::fvec4SIMD const& x) {\n  return _mm_mul_ps(inversesqrt(x).Data, x.Data);\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD niceSqrt(detail::fvec4SIMD const& x) {\n  return _mm_sqrt_ps(x.Data);\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD fastSqrt(detail::fvec4SIMD const& x) {\n  return _mm_mul_ps(fastInversesqrt(x.Data).Data, x.Data);\n}\n\n// SSE scalar reciprocal sqrt using rsqrt op, plus one Newton-Rhaphson iteration\n// By Elan Ruskin, http://assemblyrequired.crashworks.org/\nGLM_FUNC_QUALIFIER detail::fvec4SIMD inversesqrt(detail::fvec4SIMD const& x) {\n  GLM_ALIGN(4)\n  static const __m128 three = {3, 3, 3, 3};  // aligned consts for fast load\n  GLM_ALIGN(4) static const __m128 half = {0.5, 0.5, 0.5, 0.5};\n\n  __m128 recip = _mm_rsqrt_ps(x.Data);  // \"estimate\" opcode\n  __m128 halfrecip = _mm_mul_ps(half, recip);\n  __m128 threeminus_xrr =\n      _mm_sub_ps(three, _mm_mul_ps(x.Data, _mm_mul_ps(recip, recip)));\n  return _mm_mul_ps(halfrecip, threeminus_xrr);\n}\n\nGLM_FUNC_QUALIFIER detail::fvec4SIMD fastInversesqrt(\n    detail::fvec4SIMD const& x) {\n  return _mm_rsqrt_ps(x.Data);\n}\n\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/spline.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_spline\n/// @file glm/gtx/spline.hpp\n/// @date 2007-01-25 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_spline GLM_GTX_spline\n/// @ingroup gtx\n///\n/// @brief Spline functions\n///\n/// <glm/gtx/spline.hpp> need to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_spline\n#define GLM_GTX_spline\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtx/optimum_pow.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_spline extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_spline\n/// @{\n\n//! Return a point from a catmull rom curve.\n/// @see gtx_spline extension.\ntemplate <typename genType>\nGLM_FUNC_DECL genType catmullRom(genType const& v1, genType const& v2,\n                                 genType const& v3, genType const& v4,\n                                 typename genType::value_type const& s);\n\n//! Return a point from a hermite curve.\n/// @see gtx_spline extension.\ntemplate <typename genType>\nGLM_FUNC_DECL genType hermite(genType const& v1, genType const& t1,\n                              genType const& v2, genType const& t2,\n                              typename genType::value_type const& s);\n\n//! Return a point from a cubic curve.\n/// @see gtx_spline extension.\ntemplate <typename genType>\nGLM_FUNC_DECL genType cubic(genType const& v1, genType const& v2,\n                            genType const& v3, genType const& v4,\n                            typename genType::value_type const& s);\n\n/// @}\n}  // namespace glm\n\n#include \"spline.inl\"\n\n#endif  // GLM_GTX_spline\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/spline.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2007-01-25\n// Updated : 2009-02-19\n// Licence : This source is under MIT License\n// File    : glm/gtx/spline.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType catmullRom(genType const& v1, genType const& v2,\n                                      genType const& v3, genType const& v4,\n                                      typename genType::value_type const& s) {\n  typename genType::value_type s1 = s;\n  typename genType::value_type s2 = pow2(s);\n  typename genType::value_type s3 = pow3(s);\n\n  typename genType::value_type f1 =\n      -s3 + typename genType::value_type(2) * s2 - s;\n  typename genType::value_type f2 = typename genType::value_type(3) * s3 -\n                                    typename genType::value_type(5) * s2 +\n                                    typename genType::value_type(2);\n  typename genType::value_type f3 = typename genType::value_type(-3) * s3 +\n                                    typename genType::value_type(4) * s2 + s;\n  typename genType::value_type f4 = s3 - s2;\n\n  return (f1 * v1 + f2 * v2 + f3 * v3 + f4 * v4) /\n         typename genType::value_type(2);\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType hermite(genType const& v1, genType const& t1,\n                                   genType const& v2, genType const& t2,\n                                   typename genType::value_type const& s) {\n  typename genType::value_type s1 = s;\n  typename genType::value_type s2 = pow2(s);\n  typename genType::value_type s3 = pow3(s);\n\n  typename genType::value_type f1 = typename genType::value_type(2) * s3 -\n                                    typename genType::value_type(3) * s2 +\n                                    typename genType::value_type(1);\n  typename genType::value_type f2 = typename genType::value_type(-2) * s3 +\n                                    typename genType::value_type(3) * s2;\n  typename genType::value_type f3 =\n      s3 - typename genType::value_type(2) * s2 + s;\n  typename genType::value_type f4 = s3 - s2;\n\n  return f1 * v1 + f2 * v2 + f3 * t1 + f4 * t2;\n}\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType cubic(genType const& v1, genType const& v2,\n                                 genType const& v3, genType const& v4,\n                                 typename genType::value_type const& s) {\n  return ((v1 * s + v2) * s + v3) * s + v4;\n}\n\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/std_based_type.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_std_based_type\n/// @file glm/gtx/std_based_type.hpp\n/// @date 2008-06-08 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtx_extented_min_max (dependence)\n///\n/// @defgroup gtx_std_based_type GLM_GTX_std_based_type\n/// @ingroup gtx\n///\n/// @brief Adds vector types based on STL value types.\n/// <glm/gtx/std_based_type.hpp> need to be included to use these\n/// functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_std_based_type\n#define GLM_GTX_std_based_type\n\n// Dependency:\n#include <cstdlib>\n\n#include \"../glm.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_std_based_type extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_std_based_type\n/// @{\n\n/// Vector type based of two std::size_t components.\n/// @see GLM_GTX_std_based_type\ntypedef detail::tvec2<std::size_t, defaultp> size2;\n\n/// Vector type based of three std::size_t components.\n/// @see GLM_GTX_std_based_type\ntypedef detail::tvec3<std::size_t, defaultp> size3;\n\n/// Vector type based of four std::size_t components.\n/// @see GLM_GTX_std_based_type\ntypedef detail::tvec4<std::size_t, defaultp> size4;\n\n/// Vector type based of two std::size_t components.\n/// @see GLM_GTX_std_based_type\ntypedef detail::tvec2<std::size_t, defaultp> size2_t;\n\n/// Vector type based of three std::size_t components.\n/// @see GLM_GTX_std_based_type\ntypedef detail::tvec3<std::size_t, defaultp> size3_t;\n\n/// Vector type based of four std::size_t components.\n/// @see GLM_GTX_std_based_type\ntypedef detail::tvec4<std::size_t, defaultp> size4_t;\n\n/// @}\n}  // namespace glm\n\n#include \"std_based_type.inl\"\n\n#endif  // GLM_GTX_std_based_type\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/std_based_type.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2008-06-08\n// Updated : 2008-06-08\n// Licence : This source is under MIT License\n// File    : glm/gtx/std_based_type.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {}\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/string_cast.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_string_cast\n/// @file glm/gtx/string_cast.hpp\n/// @date 2008-04-26 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtc_half_float (dependence)\n/// @see gtx_integer (dependence)\n/// @see gtx_quaternion (dependence)\n///\n/// @defgroup gtx_string_cast GLM_GTX_string_cast\n/// @ingroup gtx\n///\n/// @brief Setup strings for GLM type values\n///\n/// <glm/gtx/string_cast.hpp> need to be included to use these functionalities.\n/// This extension is not supported with CUDA\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_string_cast\n#define GLM_GTX_string_cast\n\n// Dependency:\n#include <string>\n\n#include \"../glm.hpp\"\n#include \"../gtx/integer.hpp\"\n#include \"../gtx/quaternion.hpp\"\n\n#if (GLM_COMPILER & GLM_COMPILER_CUDA)\n#error \"GLM_GTX_string_cast is not supported on CUDA compiler\"\n#endif\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_string_cast extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_string_cast\n/// @{\n\n/// Create a string from a GLM type value.\n/// @see gtx_string_cast extension.\ntemplate <typename genType>\nGLM_FUNC_DECL std::string to_string(genType const& x);\n\n/// @}\n}  // namespace glm\n\n#include \"string_cast.inl\"\n\n#endif  // GLM_GTX_string_cast\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/string_cast.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2006 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2008-04-27\n// Updated : 2008-05-24\n// Licence : This source is under MIT License\n// File    : glm/gtx/string_cast.hpp\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\n#include <cstdarg>\n#include <cstdio>\n\nnamespace glm {\nnamespace detail {\nGLM_FUNC_QUALIFIER std::string format(const char* msg, ...) {\n  std::size_t const STRING_BUFFER(4096);\n  char text[STRING_BUFFER];\n  va_list list;\n\n  if (msg == 0) return std::string();\n\n  va_start(list, msg);\n#if ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC8))\n  vsprintf_s(text, STRING_BUFFER, msg, list);\n#else   //\n  vsprintf(text, msg, list);\n#endif  //\n  va_end(list);\n\n  return std::string(text);\n}\n\nstatic const char* True = \"true\";\nstatic const char* False = \"false\";\n}  // namespace detail\n\n////////////////////////////////\n// Scalars\n\nGLM_FUNC_QUALIFIER std::string to_string(float x) {\n  return detail::format(\"float(%f)\", x);\n}\n\nGLM_FUNC_QUALIFIER std::string to_string(double x) {\n  return detail::format(\"double(%f)\", x);\n}\n\nGLM_FUNC_QUALIFIER std::string to_string(int x) {\n  return detail::format(\"int(%d)\", x);\n}\n\nGLM_FUNC_QUALIFIER std::string to_string(unsigned int x) {\n  return detail::format(\"uint(%d)\", x);\n}\n\n////////////////////////////////\n// Bool vectors\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(detail::tvec2<bool, P> const& v) {\n  return detail::format(\"bvec2(%s, %s)\", v.x ? detail::True : detail::False,\n                        v.y ? detail::True : detail::False);\n}\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(detail::tvec3<bool, P> const& v) {\n  return detail::format(\"bvec3(%s, %s, %s)\", v.x ? detail::True : detail::False,\n                        v.y ? detail::True : detail::False,\n                        v.z ? detail::True : detail::False);\n}\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(detail::tvec4<bool, P> const& v) {\n  return detail::format(\n      \"bvec4(%s, %s, %s, %s)\", v.x ? detail::True : detail::False,\n      v.y ? detail::True : detail::False, v.z ? detail::True : detail::False,\n      v.w ? detail::True : detail::False);\n}\n\n////////////////////////////////\n// Float vectors\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(detail::tvec2<float, P> const& v) {\n  return detail::format(\"fvec2(%f, %f)\", v.x, v.y);\n}\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(detail::tvec3<float, P> const& v) {\n  return detail::format(\"fvec3(%f, %f, %f)\", v.x, v.y, v.z);\n}\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(detail::tvec4<float, P> const& v) {\n  return detail::format(\"fvec4(%f, %f, %f, %f)\", v.x, v.y, v.z, v.w);\n}\n\n////////////////////////////////\n// Double vectors\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(detail::tvec2<double, P> const& v) {\n  return detail::format(\"dvec2(%f, %f)\", v.x, v.y);\n}\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(detail::tvec3<double, P> const& v) {\n  return detail::format(\"dvec3(%f, %f, %f)\", v.x, v.y, v.z);\n}\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(detail::tvec4<double, P> const& v) {\n  return detail::format(\"dvec4(%f, %f, %f, %f)\", v.x, v.y, v.z, v.w);\n}\n\n////////////////////////////////\n// Int vectors\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(detail::tvec2<int, P> const& v) {\n  return detail::format(\"ivec2(%d, %d)\", v.x, v.y);\n}\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(detail::tvec3<int, P> const& v) {\n  return detail::format(\"ivec3(%d, %d, %d)\", v.x, v.y, v.z);\n}\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(detail::tvec4<int, P> const& v) {\n  return detail::format(\"ivec4(%d, %d, %d, %d)\", v.x, v.y, v.z, v.w);\n}\n\n////////////////////////////////\n// Unsigned int vectors\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(\n    detail::tvec2<unsigned int, P> const& v) {\n  return detail::format(\"uvec2(%d, %d)\", v.x, v.y);\n}\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(\n    detail::tvec3<unsigned int, P> const& v) {\n  return detail::format(\"uvec3(%d, %d, %d)\", v.x, v.y, v.z);\n}\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(\n    detail::tvec4<unsigned int, P> const& v) {\n  return detail::format(\"uvec4(%d, %d, %d, %d)\", v.x, v.y, v.z, v.w);\n}\n\n////////////////////////////////\n// Float matrices\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(detail::tmat2x2<float, P> const& x) {\n  return detail::format(\"mat2x2((%f, %f), (%f, %f))\", x[0][0], x[0][1], x[1][0],\n                        x[1][1]);\n}\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(detail::tmat2x3<float, P> const& x) {\n  return detail::format(\"mat2x3((%f, %f, %f), (%f, %f, %f))\", x[0][0], x[0][1],\n                        x[0][2], x[1][0], x[1][1], x[1][2]);\n}\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(detail::tmat2x4<float, P> const& x) {\n  return detail::format(\"mat2x4((%f, %f, %f, %f), (%f, %f, %f, %f))\", x[0][0],\n                        x[0][1], x[0][2], x[0][3], x[1][0], x[1][1], x[1][2],\n                        x[1][3]);\n}\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(detail::tmat3x2<float, P> const& x) {\n  return detail::format(\"mat3x2((%f, %f), (%f, %f), (%f, %f))\", x[0][0],\n                        x[0][1], x[1][0], x[1][1], x[2][0], x[2][1]);\n}\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(detail::tmat3x3<float, P> const& x) {\n  return detail::format(\"mat3x3((%f, %f, %f), (%f, %f, %f), (%f, %f, %f))\",\n                        x[0][0], x[0][1], x[0][2], x[1][0], x[1][1], x[1][2],\n                        x[2][0], x[2][1], x[2][2]);\n}\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(detail::tmat3x4<float, P> const& x) {\n  return detail::format(\n      \"mat3x4((%f, %f, %f, %f), (%f, %f, %f, %f), (%f, %f, %f, %f))\", x[0][0],\n      x[0][1], x[0][2], x[0][3], x[1][0], x[1][1], x[1][2], x[1][3], x[2][0],\n      x[2][1], x[2][2], x[2][3]);\n}\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(detail::tmat4x2<float, P> const& x) {\n  return detail::format(\"mat4x2((%f, %f), (%f, %f), (%f, %f), (%f, %f))\",\n                        x[0][0], x[0][1], x[1][0], x[1][1], x[2][0], x[2][1],\n                        x[3][0], x[3][1]);\n}\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(detail::tmat4x3<float, P> const& x) {\n  return detail::format(\n      \"mat4x3((%f, %f, %f), (%f, %f, %f), (%f, %f, %f), (%f, %f, %f))\", x[0][0],\n      x[0][1], x[0][2], x[1][0], x[1][1], x[1][2], x[2][0], x[2][1], x[2][2],\n      x[3][0], x[3][1], x[3][2]);\n}\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(detail::tmat4x4<float, P> const& x) {\n  return detail::format(\n      \"mat4x4((%f, %f, %f, %f), (%f, %f, %f, %f), (%f, %f, %f, %f), (%f, %f, \"\n      \"%f, %f))\",\n      x[0][0], x[0][1], x[0][2], x[0][3], x[1][0], x[1][1], x[1][2], x[1][3],\n      x[2][0], x[2][1], x[2][2], x[2][3], x[3][0], x[3][1], x[3][2], x[3][3]);\n}\n\n////////////////////////////////\n// Double matrices\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(detail::tmat2x2<double, P> const& x) {\n  return detail::format(\"dmat2x2((%f, %f), (%f, %f))\", x[0][0], x[0][1],\n                        x[1][0], x[1][1]);\n}\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(detail::tmat2x3<double, P> const& x) {\n  return detail::format(\"dmat2x3((%f, %f, %f), (%f, %f, %f))\", x[0][0], x[0][1],\n                        x[0][2], x[1][0], x[1][1], x[1][2]);\n}\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(detail::tmat2x4<double, P> const& x) {\n  return detail::format(\"dmat2x4((%f, %f, %f, %f), (%f, %f, %f, %f))\", x[0][0],\n                        x[0][1], x[0][2], x[0][3], x[1][0], x[1][1], x[1][2],\n                        x[1][3]);\n}\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(detail::tmat3x2<double, P> const& x) {\n  return detail::format(\"dmat3x2((%f, %f), (%f, %f), (%f, %f))\", x[0][0],\n                        x[0][1], x[1][0], x[1][1], x[2][0], x[2][1]);\n}\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(detail::tmat3x3<double, P> const& x) {\n  return detail::format(\"dmat3x3((%f, %f, %f), (%f, %f, %f), (%f, %f, %f))\",\n                        x[0][0], x[0][1], x[0][2], x[1][0], x[1][1], x[1][2],\n                        x[2][0], x[2][1], x[2][2]);\n}\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(detail::tmat3x4<double, P> const& x) {\n  return detail::format(\n      \"dmat3x4((%f, %f, %f, %f), (%f, %f, %f, %f), (%f, %f, %f, %f))\", x[0][0],\n      x[0][1], x[0][2], x[0][3], x[1][0], x[1][1], x[1][2], x[1][3], x[2][0],\n      x[2][1], x[2][2], x[2][3]);\n}\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(detail::tmat4x2<double, P> const& x) {\n  return detail::format(\"dmat4x2((%f, %f), (%f, %f), (%f, %f), (%f, %f))\",\n                        x[0][0], x[0][1], x[1][0], x[1][1], x[2][0], x[2][1],\n                        x[3][0], x[3][1]);\n}\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(detail::tmat4x3<double, P> const& x) {\n  return detail::format(\n      \"dmat4x3((%f, %f, %f), (%f, %f, %f), (%f, %f, %f), (%f, %f, %f))\",\n      x[0][0], x[0][1], x[0][2], x[1][0], x[1][1], x[1][2], x[2][0], x[2][1],\n      x[2][2], x[3][0], x[3][1], x[3][2]);\n}\n\ntemplate <precision P>\nGLM_FUNC_QUALIFIER std::string to_string(detail::tmat4x4<double, P> const& x) {\n  return detail::format(\n      \"dmat4x4((%f, %f, %f, %f), (%f, %f, %f, %f), (%f, %f, %f, %f), (%f, %f, \"\n      \"%f, %f))\",\n      x[0][0], x[0][1], x[0][2], x[0][3], x[1][0], x[1][1], x[1][2], x[1][3],\n      x[2][0], x[2][1], x[2][2], x[2][3], x[3][0], x[3][1], x[3][2], x[3][3]);\n}\n\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/transform.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_transform\n/// @file glm/gtx/transform.hpp\n/// @date 2005-12-21 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtc_matrix_transform (dependence)\n/// @see gtx_transform\n/// @see gtx_transform2\n///\n/// @defgroup gtx_transform GLM_GTX_transform\n/// @ingroup gtx\n///\n/// @brief Add transformation matrices\n///\n/// <glm/gtx/transform.hpp> need to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_transform\n#define GLM_GTX_transform\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtc/matrix_transform.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_transform extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_transform\n/// @{\n\n/// Transforms a matrix with a translation 4 * 4 matrix created from 3 scalars.\n/// - From \\link gtx_transform GLM_GTX_transform \\endlink extension\n/// - See also: \\link glm::translate GLM_GTC_matrix_transform \\endlink\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x4<T, P> translate(detail::tvec3<T, P> const& v);\n\n/// Builds a rotation 4 * 4 matrix created from an axis of 3 scalars and an\n/// angle expressed in degrees.\n/// - From \\link gtx_transform GLM_GTX_transform \\endlink extension\n/// - See also: \\link glm::rotate GLM_GTC_matrix_transform \\endlink\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x4<T, P> rotate(T angle,\n                                           detail::tvec3<T, P> const& v);\n\n/// Transforms a matrix with a scale 4 * 4 matrix created from a vector of 3\n/// components.\n/// - From \\link gtx_transform GLM_GTX_transform \\endlink extension\n/// - See also: \\link glm::scale GLM_GTC_matrix_transform \\endlink\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x4<T, P> scale(detail::tvec3<T, P> const& v);\n\n/// @}\n}  // namespace glm\n\n#include \"transform.inl\"\n\n#endif  // GLM_GTX_transform\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/transform.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2005-12-21\n// Updated : 2009-04-29\n// Licence : This source is under MIT License\n// File    : glm/gtx/transform.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> translate(\n    detail::tvec3<T, P> const& v) {\n  return translate(detail::tmat4x4<T, P>(1.0f), v);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> rotate(T angle,\n                                                detail::tvec3<T, P> const& v) {\n  return rotate(detail::tmat4x4<T, P>(1), angle, v);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> scale(detail::tvec3<T, P> const& v) {\n  return scale(detail::tmat4x4<T, P>(1.0f), v);\n}\n\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/transform2.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_transform2\n/// @file glm/gtx/transform2.hpp\n/// @date 2005-12-21 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtx_transform (dependence)\n///\n/// @defgroup gtx_transform2 GLM_GTX_transform2\n/// @ingroup gtx\n///\n/// @brief Add extra transformation matrices\n///\n/// <glm/gtx/transform2.hpp> need to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_transform2\n#define GLM_GTX_transform2\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtx/transform.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_transform2 extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_transform2\n/// @{\n\n//! Transforms a matrix with a shearing on X axis.\n//! From GLM_GTX_transform2 extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat3x3<T, P> shearX2D(detail::tmat3x3<T, P> const& m,\n                                             T y);\n\n//! Transforms a matrix with a shearing on Y axis.\n//! From GLM_GTX_transform2 extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat3x3<T, P> shearY2D(detail::tmat3x3<T, P> const& m,\n                                             T x);\n\n//! Transforms a matrix with a shearing on X axis\n//! From GLM_GTX_transform2 extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x4<T, P> shearX3D(const detail::tmat4x4<T, P>& m,\n                                             T y, T z);\n\n//! Transforms a matrix with a shearing on Y axis.\n//! From GLM_GTX_transform2 extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x4<T, P> shearY3D(const detail::tmat4x4<T, P>& m,\n                                             T x, T z);\n\n//! Transforms a matrix with a shearing on Z axis.\n//! From GLM_GTX_transform2 extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x4<T, P> shearZ3D(const detail::tmat4x4<T, P>& m,\n                                             T x, T y);\n\n// template <typename T> GLM_FUNC_QUALIFIER detail::tmat4x4<T, P> shear(const\n// detail::tmat4x4<T, P> & m, shearPlane, planePoint, angle)\n//  Identity + tan(angle) * cross(Normal, OnPlaneVector)     0\n//  - dot(PointOnPlane, normal) * OnPlaneVector              1\n\n// Reflect functions seem to don't work\n// template <typename T> detail::tmat3x3<T, P> reflect2D(const\n// detail::tmat3x3<T, P> & m, const detail::tvec3<T, P>& normal){return\n// reflect2DGTX(m, normal);}\n// //!< \\brief Build a reflection matrix (from GLM_GTX_transform2 extension)\n// template <typename T> detail::tmat4x4<T, P> reflect3D(const\n// detail::tmat4x4<T, P> & m, const detail::tvec3<T, P>& normal){return\n// reflect3DGTX(m, normal);}\n// //!< \\brief Build a reflection matrix (from GLM_GTX_transform2 extension)\n\n//! Build planar projection matrix along normal axis.\n//! From GLM_GTX_transform2 extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat3x3<T, P> proj2D(const detail::tmat3x3<T, P>& m,\n                                           const detail::tvec3<T, P>& normal);\n\n//! Build planar projection matrix along normal axis.\n//! From GLM_GTX_transform2 extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL detail::tmat4x4<T, P> proj3D(const detail::tmat4x4<T, P>& m,\n                                           const detail::tvec3<T, P>& normal);\n\n//! Build a scale bias matrix.\n//! From GLM_GTX_transform2 extension.\ntemplate <typename valType, precision P>\nGLM_FUNC_DECL detail::tmat4x4<valType, P> scaleBias(valType scale,\n                                                    valType bias);\n\n//! Build a scale bias matrix.\n//! From GLM_GTX_transform2 extension.\ntemplate <typename valType, precision P>\nGLM_FUNC_DECL detail::tmat4x4<valType, P> scaleBias(\n    detail::tmat4x4<valType, P> const& m, valType scale, valType bias);\n\n/// @}\n}  // namespace glm\n\n#include \"transform2.inl\"\n\n#endif  // GLM_GTX_transform2\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/transform2.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2005-02-28\n// Updated : 2005-04-23\n// Licence : This source is under MIT License\n// File : glm/gtx/transform2.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat3x3<T, P> shearX2D(\n    const detail::tmat3x3<T, P>& m, T s) {\n  detail::tmat3x3<T, P> r(1);\n  r[0][1] = s;\n  return m * r;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat3x3<T, P> shearY2D(\n    const detail::tmat3x3<T, P>& m, T s) {\n  detail::tmat3x3<T, P> r(1);\n  r[1][0] = s;\n  return m * r;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> shearX3D(\n    const detail::tmat4x4<T, P>& m, T s, T t) {\n  detail::tmat4x4<T, P> r(1);\n  r[1][0] = s;\n  r[2][0] = t;\n  return m * r;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> shearY3D(\n    const detail::tmat4x4<T, P>& m, T s, T t) {\n  detail::tmat4x4<T, P> r(1);\n  r[0][1] = s;\n  r[2][1] = t;\n  return m * r;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> shearZ3D(\n    const detail::tmat4x4<T, P>& m, T s, T t) {\n  detail::tmat4x4<T, P> r(1);\n  r[0][2] = s;\n  r[1][2] = t;\n  return m * r;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat3x3<T, P> reflect2D(\n    const detail::tmat3x3<T, P>& m, const detail::tvec3<T, P>& normal) {\n  detail::tmat3x3<T, P> r(1);\n  r[0][0] = 1 - 2 * normal.x * normal.x;\n  r[0][1] = -2 * normal.x * normal.y;\n  r[1][0] = -2 * normal.x * normal.y;\n  r[1][1] = 1 - 2 * normal.y * normal.y;\n  return m * r;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> reflect3D(\n    const detail::tmat4x4<T, P>& m, const detail::tvec3<T, P>& normal) {\n  detail::tmat4x4<T, P> r(1);\n  r[0][0] = 1 - 2 * normal.x * normal.x;\n  r[0][1] = -2 * normal.x * normal.y;\n  r[0][2] = -2 * normal.x * normal.z;\n\n  r[1][0] = -2 * normal.x * normal.y;\n  r[1][1] = 1 - 2 * normal.y * normal.y;\n  r[1][2] = -2 * normal.y * normal.z;\n\n  r[2][0] = -2 * normal.x * normal.z;\n  r[2][1] = -2 * normal.y * normal.z;\n  r[2][2] = 1 - 2 * normal.z * normal.z;\n  return m * r;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat3x3<T, P> proj2D(\n    const detail::tmat3x3<T, P>& m, const detail::tvec3<T, P>& normal) {\n  detail::tmat3x3<T, P> r(1);\n  r[0][0] = 1 - normal.x * normal.x;\n  r[0][1] = -normal.x * normal.y;\n  r[1][0] = -normal.x * normal.y;\n  r[1][1] = 1 - normal.y * normal.y;\n  return m * r;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> proj3D(\n    const detail::tmat4x4<T, P>& m, const detail::tvec3<T, P>& normal) {\n  detail::tmat4x4<T, P> r(1);\n  r[0][0] = 1 - normal.x * normal.x;\n  r[0][1] = -normal.x * normal.y;\n  r[0][2] = -normal.x * normal.z;\n  r[1][0] = -normal.x * normal.y;\n  r[1][1] = 1 - normal.y * normal.y;\n  r[1][2] = -normal.y * normal.z;\n  r[2][0] = -normal.x * normal.z;\n  r[2][1] = -normal.y * normal.z;\n  r[2][2] = 1 - normal.z * normal.z;\n  return m * r;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> scaleBias(T scale, T bias) {\n  detail::tmat4x4<T, P> result;\n  result[3] = detail::tvec4<T, P>(detail::tvec3<T, P>(bias), T(1));\n  result[0][0] = scale;\n  result[1][1] = scale;\n  result[2][2] = scale;\n  return result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tmat4x4<T, P> scaleBias(\n    const detail::tmat4x4<T, P>& m, T scale, T bias) {\n  return m * scaleBias(scale, bias);\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/ulp.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///////////////////////////////////////////////////////////////////////////////////\n\n#if (defined(GLM_MESSAGES))\n#pragma message( \\\n        \"GLM: GLM_GTX_ulp extension is deprecated, include GLM_GTC_ulp (glm/gtc/ulp.hpp) instead\")\n#endif\n\n// Promoted:\n#include \"../gtc/ulp.hpp\"\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/unsigned_int.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///////////////////////////////////////////////////////////////////////////////////\n\n#if (defined(GLM_MESSAGES))\n#pragma message( \\\n        \"GLM: GLM_GTX_unsigned_int extension is deprecated, include GLM_GTX_integer instead\")\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/unsigned_int.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2005-12-24\n// Updated : 2008-10-07\n// Licence : This source is under MIT License\n// File    : glm/gtx/unsigned_int.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/vec1.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_vec1\n/// @file glm/gtx/vec1.hpp\n/// @date 2010-02-08 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_vec1 GLM_GTX_vec1\n/// @ingroup gtx\n///\n/// @brief Add vec1, ivec1, uvec1 and bvec1 types.\n/// <glm/gtx/vec1.hpp> need to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_vec1\n#define GLM_GTX_vec1\n\n// Dependency:\n#include \"../detail/type_vec1.hpp\"\n#include \"../glm.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_vec1 extension included\")\n#endif\n\nnamespace glm {\n//! 1 component vector of high precision floating-point numbers.\n//! There is no guarantee on the actual precision.\n/// @see gtx_vec1 extension.\ntypedef highp_vec1_t highp_vec1;\n\n//! 1 component vector of medium precision floating-point numbers.\n//! There is no guarantee on the actual precision.\n/// @see gtx_vec1 extension.\ntypedef mediump_vec1_t mediump_vec1;\n\n//! 1 component vector of low precision floating-point numbers.\n//! There is no guarantee on the actual precision.\n/// @see gtx_vec1 extension.\ntypedef lowp_vec1_t lowp_vec1;\n\n//! 1 component vector of high precision signed integer numbers.\n//! There is no guarantee on the actual precision.\n/// @see gtx_vec1 extension.\ntypedef highp_ivec1_t highp_ivec1;\n\n//! 1 component vector of medium precision signed integer numbers.\n//! There is no guarantee on the actual precision.\n/// @see gtx_vec1 extension.\ntypedef mediump_ivec1_t mediump_ivec1;\n\n//! 1 component vector of low precision signed integer numbers.\n//! There is no guarantee on the actual precision.\n/// @see gtx_vec1 extension.\ntypedef lowp_ivec1_t lowp_ivec1;\n\n//! 1 component vector of high precision unsigned integer numbers.\n//! There is no guarantee on the actual precision.\n/// @see gtx_vec1 extension.\ntypedef highp_uvec1_t highp_uvec1;\n\n//! 1 component vector of medium precision unsigned integer numbers.\n//! There is no guarantee on the actual precision.\n/// @see gtx_vec1 extension.\ntypedef mediump_uvec1_t mediump_uvec1;\n\n//! 1 component vector of low precision unsigned integer numbers.\n//! There is no guarantee on the actual precision.\n/// @see gtx_vec1 extension.\ntypedef lowp_uvec1_t lowp_uvec1;\n\n//! 1 component vector of high precision boolean.\n//! There is no guarantee on the actual precision.\n/// @see gtx_vec1 extension.\ntypedef highp_bvec1_t highp_bvec1;\n\n//! 1 component vector of medium precision boolean.\n//! There is no guarantee on the actual precision.\n/// @see gtx_vec1 extension.\ntypedef mediump_bvec1_t mediump_bvec1;\n\n//! 1 component vector of low precision boolean.\n//! There is no guarantee on the actual precision.\n/// @see gtx_vec1 extension.\ntypedef lowp_bvec1_t lowp_bvec1;\n\n//////////////////////////\n// vec1 definition\n\n#if (defined(GLM_PRECISION_HIGHP_BOOL))\ntypedef highp_bvec1 bvec1;\n#elif (defined(GLM_PRECISION_MEDIUMP_BOOL))\ntypedef mediump_bvec1 bvec1;\n#elif (defined(GLM_PRECISION_LOWP_BOOL))\ntypedef lowp_bvec1 bvec1;\n#else\n/// 1 component vector of boolean.\n/// @see gtx_vec1 extension.\ntypedef highp_bvec1 bvec1;\n#endif  // GLM_PRECISION\n\n#if (defined(GLM_PRECISION_HIGHP_FLOAT))\ntypedef highp_vec1 vec1;\n#elif (defined(GLM_PRECISION_MEDIUMP_FLOAT))\ntypedef mediump_vec1 vec1;\n#elif (defined(GLM_PRECISION_LOWP_FLOAT))\ntypedef lowp_vec1 vec1;\n#else\n/// 1 component vector of floating-point numbers.\n/// @see gtx_vec1 extension.\ntypedef highp_vec1 vec1;\n#endif  // GLM_PRECISION\n\n#if (defined(GLM_PRECISION_HIGHP_INT))\ntypedef highp_ivec1 ivec1;\n#elif (defined(GLM_PRECISION_MEDIUMP_INT))\ntypedef mediump_ivec1 ivec1;\n#elif (defined(GLM_PRECISION_LOWP_INT))\ntypedef lowp_ivec1 ivec1;\n#else\n/// 1 component vector of signed integer numbers.\n/// @see gtx_vec1 extension.\ntypedef highp_ivec1 ivec1;\n#endif  // GLM_PRECISION\n\n#if (defined(GLM_PRECISION_HIGHP_UINT))\ntypedef highp_uvec1 uvec1;\n#elif (defined(GLM_PRECISION_MEDIUMP_UINT))\ntypedef mediump_uvec1 uvec1;\n#elif (defined(GLM_PRECISION_LOWP_UINT))\ntypedef lowp_uvec1 uvec1;\n#else\n/// 1 component vector of unsigned integer numbers.\n/// @see gtx_vec1 extension.\ntypedef highp_uvec1 uvec1;\n#endif  // GLM_PRECISION\n\n}  // namespace glm\n\n#include \"vec1.inl\"\n\n#endif  // GLM_GTX_vec1\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/vec1.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_vec1\n/// @file glm/gtx/vec1.inl\n/// @date 2013-03-16 / 2013-03-16\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/vector_angle.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_vector_angle\n/// @file glm/gtx/vector_angle.hpp\n/// @date 2005-12-30 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n/// @see gtx_quaternion (dependence)\n/// @see gtx_epsilon (dependence)\n///\n/// @defgroup gtx_vector_angle GLM_GTX_vector_angle\n/// @ingroup gtx\n///\n/// @brief Compute angle between vectors\n///\n/// <glm/gtx/vector_angle.hpp> need to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_vector_angle\n#define GLM_GTX_vector_angle\n\n// Dependency:\n#include \"../glm.hpp\"\n#include \"../gtc/epsilon.hpp\"\n#include \"../gtx/quaternion.hpp\"\n#include \"../gtx/rotate_vector.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_vector_angle extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_vector_angle\n/// @{\n\n//! Returns the absolute angle between two vectors\n//! Parameters need to be normalized.\n/// @see gtx_vector_angle extension\ntemplate <typename vecType>\nGLM_FUNC_DECL typename vecType::value_type angle(vecType const& x,\n                                                 vecType const& y);\n\n//! Returns the oriented angle between two 2d vectors\n//! Parameters need to be normalized.\n/// @see gtx_vector_angle extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL T orientedAngle(detail::tvec2<T, P> const& x,\n                              detail::tvec2<T, P> const& y);\n\n//! Returns the oriented angle between two 3d vectors based from a reference\n//! axis. Parameters need to be normalized.\n/// @see gtx_vector_angle extension.\ntemplate <typename T, precision P>\nGLM_FUNC_DECL T orientedAngle(detail::tvec3<T, P> const& x,\n                              detail::tvec3<T, P> const& y,\n                              detail::tvec3<T, P> const& ref);\n\n/// @}\n}  // namespace glm\n\n#include \"vector_angle.inl\"\n\n#endif  // GLM_GTX_vector_angle\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/vector_angle.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2005-12-30\n// Updated : 2008-09-29\n// Licence : This source is under MIT License\n// File    : glm/gtx/vector_angle.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType angle(genType const& x, genType const& y) {\n  GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559,\n                    \"'angle' only accept floating-point inputs\");\n\n  genType const Angle(acos(clamp(dot(x, y), genType(-1), genType(1))));\n\n#ifdef GLM_FORCE_RADIANS\n  return Angle;\n#else\n#pragma message( \\\n        \"GLM: angle function returning degrees is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.\")\n  return degrees(Angle);\n#endif\n}\n\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER T angle(vecType<T, P> const& x, vecType<T, P> const& y) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'angle' only accept floating-point inputs\");\n\n  T const Angle(acos(clamp(dot(x, y), T(-1), T(1))));\n\n#ifdef GLM_FORCE_RADIANS\n  return Angle;\n#else\n#pragma message( \\\n        \"GLM: angle function returning degrees is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.\")\n  return degrees(Angle);\n#endif\n}\n\n//! \\todo epsilon is hard coded to 0.01\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T orientedAngle(detail::tvec2<T, P> const& x,\n                                   detail::tvec2<T, P> const& y) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'orientedAngle' only accept floating-point inputs\");\n\n  T const Dot = clamp(dot(x, y), T(-1), T(1));\n\n#ifdef GLM_FORCE_RADIANS\n  T const Angle(acos(Dot));\n#else\n#pragma message( \\\n        \"GLM: orientedAngle function returning degrees is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.\")\n  T const Angle(degrees(acos(Dot)));\n#endif\n  detail::tvec2<T, P> const TransformedVector(glm::rotate(x, Angle));\n  if (all(epsilonEqual(y, TransformedVector, T(0.01))))\n    return Angle;\n  else\n    return -Angle;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER T orientedAngle(detail::tvec3<T, P> const& x,\n                                   detail::tvec3<T, P> const& y,\n                                   detail::tvec3<T, P> const& ref) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'orientedAngle' only accept floating-point inputs\");\n\n  T const Dot = clamp(dot(x, y), T(-1), T(1));\n\n#ifdef GLM_FORCE_RADIANS\n  T const Angle(acos(Dot));\n#else\n#pragma message( \\\n        \"GLM: orientedAngle function returning degrees is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.\")\n  T const Angle(degrees(acos(Dot)));\n#endif\n\n  if (dot(ref, cross(x, y)) < T(0))\n    return -Angle;\n  else\n    return Angle;\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/vector_query.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_vector_query\n/// @file glm/gtx/vector_query.hpp\n/// @date 2008-03-10 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_vector_query GLM_GTX_vector_query\n/// @ingroup gtx\n///\n/// @brief Query informations of vector types\n///\n/// <glm/gtx/vector_query.hpp> need to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_vector_query\n#define GLM_GTX_vector_query\n\n// Dependency:\n#include <cfloat>\n#include <limits>\n\n#include \"../glm.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_vector_query extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_vector_query\n/// @{\n\n//! Check whether two vectors are collinears.\n/// @see gtx_vector_query extensions.\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_DECL bool areCollinear(vecType<T, P> const& v0,\n                                vecType<T, P> const& v1, T const& epsilon);\n\n//! Check whether two vectors are orthogonals.\n/// @see gtx_vector_query extensions.\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_DECL bool areOrthogonal(vecType<T, P> const& v0,\n                                 vecType<T, P> const& v1, T const& epsilon);\n\n//! Check whether a vector is normalized.\n/// @see gtx_vector_query extensions.\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_DECL bool isNormalized(vecType<T, P> const& v, T const& epsilon);\n\n//! Check whether a vector is null.\n/// @see gtx_vector_query extensions.\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_DECL bool isNull(vecType<T, P> const& v, T const& epsilon);\n\n//! Check whether a each component of a vector is null.\n/// @see gtx_vector_query extensions.\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_DECL vecType<bool, P> isCompNull(vecType<T, P> const& v,\n                                          T const& epsilon);\n\n//! Check whether two vectors are orthonormal.\n/// @see gtx_vector_query extensions.\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_DECL bool areOrthonormal(vecType<T, P> const& v0,\n                                  vecType<T, P> const& v1, T const& epsilon);\n\n/// @}\n}  // namespace glm\n\n#include \"vector_query.inl\"\n\n#endif  // GLM_GTX_vector_query\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/vector_query.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2007-03-05\n// Updated : 2010-02-16\n// Licence : This source is under MIT License\n// File    : glm/gtx/vector_query.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Dependency:\n// - GLM core\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\n#include <cassert>\n\nnamespace glm {\nnamespace detail {\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nstruct compute_areCollinear {};\n\ntemplate <typename T, precision P>\nstruct compute_areCollinear<T, P, tvec2> {\n  GLM_FUNC_QUALIFIER static bool call(detail::tvec2<T, P> const& v0,\n                                      detail::tvec2<T, P> const& v1,\n                                      T const& epsilon) {\n    return length(cross(detail::tvec3<T, P>(v0, static_cast<T>(0)),\n                        detail::tvec3<T, P>(v1, static_cast<T>(0)))) < epsilon;\n  }\n};\n\ntemplate <typename T, precision P>\nstruct compute_areCollinear<T, P, tvec3> {\n  GLM_FUNC_QUALIFIER static bool call(detail::tvec3<T, P> const& v0,\n                                      detail::tvec3<T, P> const& v1,\n                                      T const& epsilon) {\n    return length(cross(v0, v1)) < epsilon;\n  }\n};\n\ntemplate <typename T, precision P>\nstruct compute_areCollinear<T, P, tvec4> {\n  GLM_FUNC_QUALIFIER static bool call(detail::tvec4<T, P> const& v0,\n                                      detail::tvec4<T, P> const& v1,\n                                      T const& epsilon) {\n    return length(cross(detail::tvec3<T, P>(v0), detail::tvec3<T, P>(v1))) <\n           epsilon;\n  }\n};\n\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nstruct compute_isCompNull {};\n\ntemplate <typename T, precision P>\nstruct compute_isCompNull<T, P, tvec2> {\n  GLM_FUNC_QUALIFIER static detail::tvec2<bool, P> call(\n      detail::tvec2<T, P> const& v, T const& epsilon) {\n    return detail::tvec2<bool, P>((abs(v.x) < epsilon), (abs(v.y) < epsilon));\n  }\n};\n\ntemplate <typename T, precision P>\nstruct compute_isCompNull<T, P, tvec3> {\n  GLM_FUNC_QUALIFIER static detail::tvec3<bool, P> call(\n      detail::tvec3<T, P> const& v, T const& epsilon) {\n    return detail::tvec3<bool, P>((abs(v.x) < epsilon), (abs(v.y) < epsilon),\n                                  (abs(v.z) < epsilon));\n  }\n};\n\ntemplate <typename T, precision P>\nstruct compute_isCompNull<T, P, tvec4> {\n  GLM_FUNC_QUALIFIER static detail::tvec4<bool, P> call(\n      detail::tvec4<T, P> const& v, T const& epsilon) {\n    return detail::tvec4<bool, P>((abs(v.x) < epsilon), (abs(v.y) < epsilon),\n                                  (abs(v.z) < epsilon), (abs(v.w) < epsilon));\n  }\n};\n\n}  // namespace detail\n\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER bool areCollinear(vecType<T, P> const& v0,\n                                     vecType<T, P> const& v1,\n                                     T const& epsilon) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'areCollinear' only accept floating-point inputs\");\n\n  return detail::compute_areCollinear<T, P, vecType>::call(v0, v1, epsilon);\n}\n\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER bool areOrthogonal(vecType<T, P> const& v0,\n                                      vecType<T, P> const& v1,\n                                      T const& epsilon) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'areOrthogonal' only accept floating-point inputs\");\n\n  return abs(dot(v0, v1)) <= max(static_cast<T>(1), length(v0)) *\n                                 max(static_cast<T>(1), length(v1)) * epsilon;\n}\n\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER bool isNormalized(vecType<T, P> const& v, T const& epsilon) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'isNormalized' only accept floating-point inputs\");\n\n  return abs(length(v) - static_cast<T>(1)) <= static_cast<T>(2) * epsilon;\n}\n\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER bool isNull(vecType<T, P> const& v, T const& epsilon) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'isNull' only accept floating-point inputs\");\n\n  return length(v) <= epsilon;\n}\n\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER vecType<bool, P> isCompNull(vecType<T, P> const& v,\n                                               T const& epsilon) {\n  GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,\n                    \"'isCompNull' only accept floating-point inputs\");\n\n  return detail::compute_isCompNull<T, P, vecType>::call(v, epsilon);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<bool, P> isCompNull(\n    detail::tvec2<T, P> const& v, T const& epsilon) {\n  return detail::tvec2<bool, P>(abs(v.x) < epsilon, abs(v.y) < epsilon);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<bool, P> isCompNull(\n    detail::tvec3<T, P> const& v, T const& epsilon) {\n  return detail::tvec3<bool, P>(abs(v.x) < epsilon, abs(v.y) < epsilon,\n                                abs(v.z) < epsilon);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<bool, P> isCompNull(\n    detail::tvec4<T, P> const& v, T const& epsilon) {\n  return detail::tvec4<bool, P>(abs(v.x) < epsilon, abs(v.y) < epsilon,\n                                abs(v.z) < epsilon, abs(v.w) < epsilon);\n}\n\ntemplate <typename T, precision P, template <typename, precision> class vecType>\nGLM_FUNC_QUALIFIER bool areOrthonormal(vecType<T, P> const& v0,\n                                       vecType<T, P> const& v1,\n                                       T const& epsilon) {\n  return isNormalized(v0, epsilon) && isNormalized(v1, epsilon) &&\n         (abs(dot(v0, v1)) <= epsilon);\n}\n\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/wrap.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref gtx_wrap\n/// @file glm/gtx/wrap.hpp\n/// @date 2009-11-25 / 2011-06-07\n/// @author Christophe Riccio\n///\n/// @see core (dependence)\n///\n/// @defgroup gtx_wrap GLM_GTX_wrap\n/// @ingroup gtx\n///\n/// @brief Wrapping mode of texture coordinates.\n///\n/// <glm/gtx/wrap.hpp> need to be included to use these functionalities.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_GTX_wrap\n#define GLM_GTX_wrap\n\n// Dependency:\n#include \"../glm.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))\n#pragma message(\"GLM: GLM_GTX_wrap extension included\")\n#endif\n\nnamespace glm {\n/// @addtogroup gtx_wrap\n/// @{\n\n/// Simulate GL_CLAMP OpenGL wrap mode\n/// @see gtx_wrap extension.\ntemplate <typename genType>\nGLM_FUNC_DECL genType clamp(genType const& Texcoord);\n\n/// Simulate GL_REPEAT OpenGL wrap mode\n/// @see gtx_wrap extension.\ntemplate <typename genType>\nGLM_FUNC_DECL genType repeat(genType const& Texcoord);\n\n/// Simulate GL_MIRROR_REPEAT OpenGL wrap mode\n/// @see gtx_wrap extension.\ntemplate <typename genType>\nGLM_FUNC_DECL genType mirrorRepeat(genType const& Texcoord);\n\n/// @}\n}  // namespace glm\n\n#include \"wrap.inl\"\n\n#endif  // GLM_GTX_wrap\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/gtx/wrap.inl",
    "content": "///////////////////////////////////////////////////////////////////////////////////////////////////\n// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Created : 2009-11-25\n// Updated : 2010-02-13\n// Licence : This source is under MIT License\n// File    : glm/gtx/wrap.inl\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Dependency:\n// - GLM core\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nnamespace glm {\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType clamp(genType const& Texcoord) {\n  return glm::clamp(Texcoord, genType(0), genType(1));\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<T, P> clamp(\n    detail::tvec2<T, P> const& Texcoord) {\n  detail::tvec2<T, P> Result;\n  for (typename detail::tvec2<T, P>::size_type i = 0;\n       i < detail::tvec2<T, P>::value_size(); ++i)\n    Result[i] = clamp(Texcoord[i]);\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> clamp(\n    detail::tvec3<T, P> const& Texcoord) {\n  detail::tvec3<T, P> Result;\n  for (typename detail::tvec3<T, P>::size_type i = 0;\n       i < detail::tvec3<T, P>::value_size(); ++i)\n    Result[i] = clamp(Texcoord[i]);\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> clamp(\n    detail::tvec4<T, P> const& Texcoord) {\n  detail::tvec4<T, P> Result;\n  for (typename detail::tvec4<T, P>::size_type i = 0;\n       i < detail::tvec4<T, P>::value_size(); ++i)\n    Result[i] = clamp(Texcoord[i]);\n  return Result;\n}\n\n////////////////////////\n// repeat\n\ntemplate <typename genType>\nGLM_FUNC_QUALIFIER genType repeat(genType const& Texcoord) {\n  return glm::fract(Texcoord);\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<T, P> repeat(\n    detail::tvec2<T, P> const& Texcoord) {\n  detail::tvec2<T, P> Result;\n  for (typename detail::tvec2<T, P>::size_type i = 0;\n       i < detail::tvec2<T, P>::value_size(); ++i)\n    Result[i] = repeat(Texcoord[i]);\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> repeat(\n    detail::tvec3<T, P> const& Texcoord) {\n  detail::tvec3<T, P> Result;\n  for (typename detail::tvec3<T, P>::size_type i = 0;\n       i < detail::tvec3<T, P>::value_size(); ++i)\n    Result[i] = repeat(Texcoord[i]);\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> repeat(\n    detail::tvec4<T, P> const& Texcoord) {\n  detail::tvec4<T, P> Result;\n  for (typename detail::tvec4<T, P>::size_type i = 0;\n       i < detail::tvec4<T, P>::value_size(); ++i)\n    Result[i] = repeat(Texcoord[i]);\n  return Result;\n}\n\n////////////////////////\n// mirrorRepeat\n\ntemplate <typename genType, precision P>\nGLM_FUNC_QUALIFIER genType mirrorRepeat(genType const& Texcoord) {\n  genType const Clamp = genType(int(glm::floor(Texcoord)) % 2);\n  genType const Floor = glm::floor(Texcoord);\n  genType const Rest = Texcoord - Floor;\n  genType const Mirror = Clamp + Rest;\n\n  genType Out;\n  if (Mirror >= genType(1))\n    Out = genType(1) - Rest;\n  else\n    Out = Rest;\n  return Out;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec2<T, P> mirrorRepeat(\n    detail::tvec2<T, P> const& Texcoord) {\n  detail::tvec2<T, P> Result;\n  for (typename detail::tvec2<T, P>::size_type i = 0;\n       i < detail::tvec2<T, P>::value_size(); ++i)\n    Result[i] = mirrorRepeat(Texcoord[i]);\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec3<T, P> mirrorRepeat(\n    detail::tvec3<T, P> const& Texcoord) {\n  detail::tvec3<T, P> Result;\n  for (typename detail::tvec3<T, P>::size_type i = 0;\n       i < detail::tvec3<T, P>::value_size(); ++i)\n    Result[i] = mirrorRepeat(Texcoord[i]);\n  return Result;\n}\n\ntemplate <typename T, precision P>\nGLM_FUNC_QUALIFIER detail::tvec4<T, P> mirrorRepeat(\n    detail::tvec4<T, P> const& Texcoord) {\n  detail::tvec4<T, P> Result;\n  for (typename detail::tvec4<T, P>::size_type i = 0;\n       i < detail::tvec4<T, P>::value_size(); ++i)\n    Result[i] = mirrorRepeat(Texcoord[i]);\n  return Result;\n}\n}  // namespace glm\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/integer.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/integer.hpp\n/// @date 2013-12-24 / 2013-12-24\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_INTEGER_INCLUDED\n#define GLM_INTEGER_INCLUDED\n\n#include \"detail/func_integer.hpp\"\n\n#endif  // GLM_INTEGER_INCLUDED\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/mat2x2.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/mat2x2.hpp\n/// @date 2013-12-24 / 2013-12-24\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_MAT2X2_INCLUDED\n#define GLM_MAT2X2_INCLUDED\n\n#include \"detail/type_mat2x2.hpp\"\n\nnamespace glm {\n/// 2 columns of 2 components matrix of low precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x2<float, lowp> lowp_mat2;\n\n/// 2 columns of 2 components matrix of medium precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x2<float, mediump> mediump_mat2;\n\n/// 2 columns of 2 components matrix of high precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x2<float, highp> highp_mat2;\n\n/// 2 columns of 2 components matrix of low precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x2<float, lowp> lowp_mat2x2;\n\n/// 2 columns of 2 components matrix of medium precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x2<float, mediump> mediump_mat2x2;\n\n/// 2 columns of 2 components matrix of high precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x2<float, highp> highp_mat2x2;\n\n}  // namespace glm\n\n#endif  // GLM_MAT2X2_INCLUDED\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/mat2x3.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/mat2x3.hpp\n/// @date 2013-12-24 / 2013-12-24\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_MAT2X3_INCLUDED\n#define GLM_MAT2X3_INCLUDED\n\n#include \"detail/type_mat2x3.hpp\"\n\nnamespace glm {\n/// 2 columns of 3 components matrix of low precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x3<float, lowp> lowp_mat2x3;\n\n/// 2 columns of 3 components matrix of medium precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x3<float, mediump> mediump_mat2x3;\n\n/// 2 columns of 3 components matrix of high precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x3<float, highp> highp_mat2x3;\n\n}  // namespace glm\n\n#endif  // GLM_MAT2X3_INCLUDED\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/mat2x4.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/mat2x4.hpp\n/// @date 2013-12-24 / 2013-12-24\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_MAT2X4_INCLUDED\n#define GLM_MAT2X4_INCLUDED\n\n#include \"detail/type_mat2x4.hpp\"\n\nnamespace glm {\n/// 2 columns of 4 components matrix of low precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x4<float, lowp> lowp_mat2x4;\n\n/// 2 columns of 4 components matrix of medium precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x4<float, mediump> mediump_mat2x4;\n\n/// 2 columns of 4 components matrix of high precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat2x4<float, highp> highp_mat2x4;\n\n}  // namespace glm\n\n#endif  // GLM_MAT2X4_INCLUDED\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/mat3x2.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/mat3x2.hpp\n/// @date 2013-12-24 / 2013-12-24\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_MAT3X2_INCLUDED\n#define GLM_MAT3X2_INCLUDED\n\n#include \"detail/type_mat3x2.hpp\"\n\nnamespace glm {\n/// 3 columns of 2 components matrix of low precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x2<float, lowp> lowp_mat3x2;\n\n/// 3 columns of 2 components matrix of medium precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x2<float, mediump> mediump_mat3x2;\n\n/// 3 columns of 2 components matrix of high precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x2<float, highp> highp_mat3x2;\n\n}  // namespace glm\n\n#endif  // GLM_MAT3X2_INCLUDED\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/mat3x3.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/mat3x3.hpp\n/// @date 2013-12-24 / 2013-12-24\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_MAT3X3_INCLUDED\n#define GLM_MAT3X3_INCLUDED\n\n#include \"detail/type_mat3x3.hpp\"\n\nnamespace glm {\n/// 3 columns of 3 components matrix of low precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x3<float, lowp> lowp_mat3;\n\n/// 3 columns of 3 components matrix of medium precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x3<float, mediump> mediump_mat3;\n\n/// 3 columns of 3 components matrix of high precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x3<float, highp> highp_mat3;\n\n/// 3 columns of 3 components matrix of low precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x3<float, lowp> lowp_mat3x3;\n\n/// 3 columns of 3 components matrix of medium precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x3<float, mediump> mediump_mat3x3;\n\n/// 3 columns of 3 components matrix of high precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x3<float, highp> highp_mat3x3;\n\n}  // namespace glm\n\n#endif  // GLM_MAT3X3_INCLUDED\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/mat3x4.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/mat3x4.hpp\n/// @date 2013-12-24 / 2013-12-24\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_MAT3X4_INCLUDED\n#define GLM_MAT3X4_INCLUDED\n\n#include \"detail/type_mat3x4.hpp\"\n\nnamespace glm {\n/// 3 columns of 4 components matrix of low precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x4<float, lowp> lowp_mat3x4;\n\n/// 3 columns of 4 components matrix of medium precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x4<float, mediump> mediump_mat3x4;\n\n/// 3 columns of 4 components matrix of high precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat3x4<float, highp> highp_mat3x4;\n\n}  // namespace glm\n\n#endif  // GLM_MAT3X4_INCLUDED\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/mat4x2.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/mat4x2.hpp\n/// @date 2013-12-24 / 2013-12-24\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_MAT4X2_INCLUDED\n#define GLM_MAT4X2_INCLUDED\n\n#include \"detail/type_mat4x2.hpp\"\n\nnamespace glm {\n/// 4 columns of 2 components matrix of low precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x2<float, lowp> lowp_mat4x2;\n\n/// 4 columns of 2 components matrix of medium precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x2<float, mediump> mediump_mat4x2;\n\n/// 4 columns of 2 components matrix of high precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x2<float, highp> highp_mat4x2;\n\n}  // namespace glm\n\n#endif  // GLM_MAT4X2_INCLUDED\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/mat4x3.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/mat4x4.hpp\n/// @date 2013-12-24 / 2013-12-24\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_MAT4X3_INCLUDED\n#define GLM_MAT4X3_INCLUDED\n\n#include \"detail/type_mat4x3.hpp\"\n\nnamespace glm {\n/// 4 columns of 3 components matrix of low precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x3<float, lowp> lowp_mat4x3;\n\n/// 4 columns of 3 components matrix of medium precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x3<float, mediump> mediump_mat4x3;\n\n/// 4 columns of 3 components matrix of high precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x3<float, highp> highp_mat4x3;\n\n}  // namespace glm\n\n#endif  // GLM_MAT4X3_INCLUDED\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/mat4x4.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/mat4x4.hpp\n/// @date 2013-12-24 / 2013-12-24\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_MAT4X4_INCLUDED\n#define GLM_MAT4X4_INCLUDED\n\n#include \"detail/type_mat4x4.hpp\"\n\nnamespace glm {\n/// 4 columns of 4 components matrix of low precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x4<float, lowp> lowp_mat4;\n\n/// 4 columns of 4 components matrix of medium precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x4<float, mediump> mediump_mat4;\n\n/// 4 columns of 4 components matrix of high precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x4<float, highp> highp_mat4;\n\n/// 4 columns of 4 components matrix of low precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x4<float, lowp> lowp_mat4x4;\n\n/// 4 columns of 4 components matrix of medium precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x4<float, mediump> mediump_mat4x4;\n\n/// 4 columns of 4 components matrix of high precision floating-point numbers.\n/// There is no guarantee on the actual precision.\n///\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.1.6 Matrices</a>\n/// @see <a\n/// href=\"http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf\">GLSL 4.20.8\n/// specification, section 4.7.2 Precision Qualifier</a>\ntypedef detail::tmat4x4<float, highp> highp_mat4x4;\n\n}  // namespace glm\n\n#endif  // GLM_MAT4X4_INCLUDED\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/matrix.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/matrix.hpp\n/// @date 2013-12-24 / 2013-12-24\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_MATRIX_INCLUDED\n#define GLM_MATRIX_INCLUDED\n\n#include \"detail/func_matrix.hpp\"\n\n#endif  // GLM_MATRIX_INCLUDED\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/packing.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/packing.hpp\n/// @date 2013-12-24 / 2013-12-24\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_PACKING_INCLUDED\n#define GLM_PACKING_INCLUDED\n\n#include \"detail/func_packing.hpp\"\n\n#endif  // GLM_PACKING_INCLUDED\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/trigonometric.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/trigonometric.hpp\n/// @date 2013-12-24 / 2013-12-24\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_TRIGONOMETRIC_INCLUDED\n#define GLM_TRIGONOMETRIC_INCLUDED\n\n#include \"detail/func_trigonometric.hpp\"\n\n#endif  // GLM_TRIGONOMETRIC_INCLUDED\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/vec2.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/vec2.hpp\n/// @date 2013-12-24 / 2013-12-24\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_VEC2_INCLUDED\n#define GLM_VEC2_INCLUDED\n\n#include \"detail/type_vec2.hpp\"\n\n#endif  // GLM_VEC2_INCLUDED\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/vec3.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/vec3.hpp\n/// @date 2013-12-24 / 2013-12-24\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_VEC3_INCLUDED\n#define GLM_VEC3_INCLUDED\n\n#include \"detail/type_vec3.hpp\"\n\n#endif  // GLM_VEC3_INCLUDED\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/vec4.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/vec4.hpp\n/// @date 2013-12-24 / 2013-12-24\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_VEC4_INCLUDED\n#define GLM_VEC4_INCLUDED\n\n#include \"detail/type_vec4.hpp\"\n\n#endif  // GLM_VEC4_INCLUDED\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/vector_relational.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref core\n/// @file glm/vector_relational.hpp\n/// @date 2013-12-24 / 2013-12-24\n/// @author Christophe Riccio\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_VECTOR_RELATIONAL_INCLUDED\n#define GLM_VECTOR_RELATIONAL_INCLUDED\n\n#include \"detail/func_vector_relational.hpp\"\n\n#endif  // GLM_VECTOR_RELATIONAL_INCLUDED\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/glm/virtrev/xstream.hpp",
    "content": "///////////////////////////////////////////////////////////////////////////////////\n/// OpenGL Mathematics (glm.g-truc.net)\n///\n/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)\n/// Permission is hereby granted, free of charge, to any person obtaining a copy\n/// of this software and associated documentation files (the \"Software\"), to\n/// deal in the Software without restriction, including without limitation the\n/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n/// sell copies of the Software, and to permit persons to whom the Software is\n/// furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n/// IN THE SOFTWARE.\n///\n/// @ref virtrev_xstream\n/// @file glm/virtrev/xstream.hpp\n/// @date 2008-05-24 / 2008-05-26\n/// @author Mathieu Roumillac (matrem84.free.fr)\n///\n/// @see core (dependence)\n/// @see gtc_matrix_access (dependence)\n///\n/// @defgroup virtrev_xstream GLM_VIRTREV_xstream: xml like output\n/// @ingroup virtrev\n///\n/// @brief Streaming vector and matrix in a xml way.\n///\n/// Include <glm/virtrev/xstream.hpp> for this functionality.\n///////////////////////////////////////////////////////////////////////////////////\n\n#ifndef GLM_VIRTREV_xstream\n#define GLM_VIRTREV_xstream GLM_VERSION\n\n#include <iostream>\n\n#include \"../glm.hpp\"\n#include \"../gtc/matrix_access.hpp\"\n\n#if (defined(GLM_MESSAGES) && !defined(glm_ext))\n#pragma message(\"GLM: GLM_VIRTREV_xstream extension included\")\n#endif\n/*\nnamespace glm{\nnamespace detail\n{\n        template<typename T>\n        std::ostream & operator << (std::ostream & stream, glm::detail::tvec2<T,\nP> const & vec)\n        {\n                stream << \"<glm_vec2 \";\n                stream << \"x=\\\"\" << vec.x << \"\\\" \";\n                stream << \"y=\\\"\" << vec.y << \"\\\" \";\n                stream << \"/>\";\n\n                return stream;\n        }\n\n        template<typename T>\n        std::ostream & operator << (std::ostream & stream, glm::detail::tvec3<T,\nP> const & vec)\n        {\n                stream << \"<glm_vec3 \";\n                stream << \"x=\\\"\" << vec.x << \"\\\" \";\n                stream << \"y=\\\"\" << vec.y << \"\\\" \";\n                stream << \"z=\\\"\" << vec.z << \"\\\" \";\n                stream << \"/>\";\n\n                return stream;\n        }\n\n        template<typename T>\n        std::ostream & operator << (std::ostream & stream, glm::detail::tvec4<T,\nP> const & vec)\n        {\n                stream << \"<glm_vec4 \";\n                stream << \"x=\\\"\" << vec.x << \"\\\" \";\n                stream << \"y=\\\"\" << vec.y << \"\\\" \";\n                stream << \"z=\\\"\" << vec.z << \"\\\" \";\n                stream << \"w=\\\"\" << vec.w << \"\\\" \";\n                stream << \"/>\";\n\n                return stream;\n        }\n\n        template<typename T>\n        std::ostream & operator << (std::ostream & stream,\nglm::detail::tmat2x2<T, P> const & mat)\n        {\n                stream << \"<glm_mat2>\" << std::endl;\n                stream << \"<row \";\n                stream << \"x=\\\"\" << glm::row(mat, 0)[0] << \"\\\" \";\n                stream << \"y=\\\"\" << glm::row(mat, 0)[1] << \"\\\" \";\n                stream << \"/>\" << std::endl;\n                stream << \"<row \";\n                stream << \"x=\\\"\" << glm::row(mat, 1)[0] << \"\\\" \";\n                stream << \"y=\\\"\" << glm::row(mat, 1)[1] << \"\\\" \";\n                stream << \"/>\" << std::endl;\n                stream << \"</glm_mat2>\";\n\n                return stream;\n        }\n\n        template<typename T>\n        std::ostream & operator << (std::ostream & stream,\nglm::detail::tmat3x3<T, P> const & mat)\n        {\n                stream << \"<glm_mat3>\" << std::endl;\n                stream << \"<row \";\n                stream << \"x=\\\"\" << glm::row(mat, 0)[0] << \"\\\" \";\n                stream << \"y=\\\"\" << glm::row(mat, 0)[1] << \"\\\" \";\n                stream << \"z=\\\"\" << glm::row(mat, 0)[2] << \"\\\" \";\n                stream << \"/>\" << std::endl;\n                stream << \"<row \";\n                stream << \"x=\\\"\" << glm::row(mat, 1)[0] << \"\\\" \";\n                stream << \"y=\\\"\" << glm::row(mat, 1)[1] << \"\\\" \";\n                stream << \"z=\\\"\" << glm::row(mat, 1)[2] << \"\\\" \";\n                stream << \"/>\" << std::endl;\n                stream << \"<row \";\n                stream << \"x=\\\"\" << glm::row(mat, 2)[0] << \"\\\" \";\n                stream << \"y=\\\"\" << glm::row(mat, 2)[1] << \"\\\" \";\n                stream << \"z=\\\"\" << glm::row(mat, 2)[2] << \"\\\" \";\n                stream << \"/>\" << std::endl;\n                stream << \"</glm_mat3>\";\n\n                return stream;\n        }\n\n        template<typename T>\n        std::ostream & operator << (std::ostream & stream,\nglm::detail::tmat4x4<T, P> const & mat)\n        {\n                stream << \"<glm_mat4>\" << std::endl;\n                stream << \"<row \";\n                stream << \"x=\\\"\" << glm::row(mat, 0)[0] << \"\\\" \";\n                stream << \"y=\\\"\" << glm::row(mat, 0)[1] << \"\\\" \";\n                stream << \"z=\\\"\" << glm::row(mat, 0)[2] << \"\\\" \";\n                stream << \"w=\\\"\" << glm::row(mat, 0)[3] << \"\\\" \";\n                stream << \"/>\" << std::endl;\n                stream << \"<row \";\n                stream << \"x=\\\"\" << glm::row(mat, 1)[0] << \"\\\" \";\n                stream << \"y=\\\"\" << glm::row(mat, 1)[1] << \"\\\" \";\n                stream << \"z=\\\"\" << glm::row(mat, 1)[2] << \"\\\" \";\n                stream << \"w=\\\"\" << glm::row(mat, 1)[3] << \"\\\" \";\n                stream << \"/>\" << std::endl;\n                stream << \"<row \";\n                stream << \"x=\\\"\" << glm::row(mat, 2)[0] << \"\\\" \";\n                stream << \"y=\\\"\" << glm::row(mat, 2)[1] << \"\\\" \";\n                stream << \"z=\\\"\" << glm::row(mat, 2)[2] << \"\\\" \";\n                stream << \"w=\\\"\" << glm::row(mat, 2)[3] << \"\\\" \";\n                stream << \"/>\" << std::endl;\n                stream << \"<row \";\n                stream << \"x=\\\"\" << glm::row(mat, 3)[0] << \"\\\" \";\n                stream << \"y=\\\"\" << glm::row(mat, 3)[1] << \"\\\" \";\n                stream << \"z=\\\"\" << glm::row(mat, 3)[2] << \"\\\" \";\n                stream << \"w=\\\"\" << glm::row(mat, 3)[3] << \"\\\" \";\n                stream << \"/>\" << std::endl;\n                stream << \"</glm_mat4>\";\n\n                return stream;\n        }\n\n}//namespace detail\n}//namespace glm\n*/\n#endif  // GLM_VIRTREV_xstream\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/indexbuf.cpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#include \"indexbuf.hpp\"\n\nIndexBuf::IndexBuf(GLushort* data, int dataSizeBytes) {\n  mCount = dataSizeBytes / sizeof(GLushort);\n\n  glGenBuffers(1, &mIbo);\n  BindBuffer();\n  glBufferData(GL_ELEMENT_ARRAY_BUFFER, dataSizeBytes, data, GL_STATIC_DRAW);\n  UnbindBuffer();\n}\n\nIndexBuf::~IndexBuf() {\n  glDeleteBuffers(1, &mIbo);\n  mIbo = 0;\n}\n\nvoid IndexBuf::BindBuffer() { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIbo); }\n\nvoid IndexBuf::UnbindBuffer() { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); }\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/indexbuf.hpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef endlesstunnel_indexbuf_hpp\n#define endlesstunnel_indexbuf_hpp\n\n#include \"common.hpp\"\n\n/* Represents an index buffer (IBO). */\nclass IndexBuf {\n public:\n  IndexBuf(GLushort *data, int dataSizeBytes);\n  ~IndexBuf();\n\n  void BindBuffer();\n  void UnbindBuffer();\n  int GetCount() { return mCount; }\n\n private:\n  GLuint mIbo;\n  int mCount;\n};\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/input_util.cpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#include \"input_util.hpp\"\n\n#include <dlfcn.h>\n\n#include \"joystick-support.hpp\"\n#include \"our_key_codes.hpp\"\n#include \"util.hpp\"\n\n// cached device motion ranges\nstruct DeviceMotionRange {\n  int deviceId;\n  int source;\n  float minX, maxX, minY, maxY;\n};\n#define MOTION_RANGE_CACHE_MAX 128\nstruct DeviceMotionRange _motion_range_cache[MOTION_RANGE_CACHE_MAX];\nint _motion_range_cache_items = 0;\n\nstatic bool _init_done = false;\nstatic bool _key_state[OURKEY_COUNT] = {0};\nstatic _getAxisValue_sig _getAxisValue = NULL;\n\nstatic void _init() {\n  if (_init_done) {\n    return;\n  }\n\n  _init_done = true;\n\n  // look up the AMotionEvent_getAxisValue function\n  void* lib_android;\n  LOGD(\"Trying to dlopen libandroid.so\");\n  if ((lib_android = dlopen(\"libandroid.so\", 0))) {\n    LOGD(\"Opened libandroid.so, looking for AMotionEvent_getAxisValue.\");\n    _getAxisValue =\n        (_getAxisValue_sig)dlsym(lib_android, \"AMotionEvent_getAxisValue\");\n    LOGD(\"AMotionEvent_getAxisValue() address is %p\", _getAxisValue);\n  } else {\n    LOGD(\"Failed to open libandroid.so.\");\n  }\n}\n\nstatic int _translate_keycode(int code) {\n  switch (code) {\n    case AKEYCODE_DPAD_LEFT:\n      return OURKEY_LEFT;\n    case AKEYCODE_DPAD_RIGHT:\n      return OURKEY_RIGHT;\n    case AKEYCODE_DPAD_UP:\n      return OURKEY_UP;\n    case AKEYCODE_DPAD_DOWN:\n      return OURKEY_DOWN;\n    case AKEYCODE_DPAD_CENTER:\n    case AKEYCODE_ENTER:\n    case AKEYCODE_BUTTON_X:\n    case AKEYCODE_BUTTON_A:\n      return OURKEY_ENTER;\n    case AKEYCODE_BUTTON_Y:\n    case AKEYCODE_BUTTON_B:\n      return OURKEY_ESCAPE;\n    default:\n      return -1;\n  }\n}\n\nstatic void _report_key_state(int keyCode, bool state,\n                              CookedEventCallback callback) {\n  bool wentDown = !_key_state[keyCode] && state;\n  bool wentUp = _key_state[keyCode] && !state;\n  _key_state[keyCode] = state;\n\n  struct CookedEvent ev;\n  memset(&ev, 0, sizeof(struct CookedEvent));\n  ev.keyCode = keyCode;\n\n  if (wentUp) {\n    ev.type = COOKED_EVENT_TYPE_KEY_UP;\n    callback(&ev);\n  } else if (wentDown) {\n    ev.type = COOKED_EVENT_TYPE_KEY_DOWN;\n    callback(&ev);\n  }\n}\n\nstatic void _report_key_states_from_axes(float x, float y,\n                                         CookedEventCallback callback) {\n  _report_key_state(OURKEY_LEFT, x < -0.5f, callback);\n  _report_key_state(OURKEY_RIGHT, x > 0.5f, callback);\n  _report_key_state(OURKEY_UP, y < -0.5f, callback);\n  _report_key_state(OURKEY_DOWN, y > 0.5f, callback);\n}\n\nstatic bool _process_keys(bool isJoy, AInputEvent* event,\n                          CookedEventCallback callback) {\n  if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_KEY) {\n    int action = AKeyEvent_getAction(event);\n    int code = _translate_keycode(AKeyEvent_getKeyCode(event));\n    bool handled = code >= 0;\n    if (code >= 0 && action == AKEY_EVENT_ACTION_DOWN) {\n      _report_key_state(code, true, callback);\n    } else if (code >= 0 && action == AKEY_EVENT_ACTION_UP) {\n      _report_key_state(code, false, callback);\n    }\n    return handled;\n  } else if (isJoy) {\n    // use joystick axes to emulate directional key events (we could leave this\n    // up to the platform, but joystick-to-dpad conversion doesn't work\n    // on NDK on older devices,  so we implement manually for maximum\n    // compatibility)\n    float x = AMotionEvent_getX(event, 0);\n    float y = AMotionEvent_getY(event, 0);\n    if (_getAxisValue) {\n      // take the hat switches into account too, so that either the\n      // regular axes or the hat axes can be used to navigate UIs\n      x += _getAxisValue(event, AXIS_HAT_X, 0);\n      y += _getAxisValue(event, AXIS_HAT_Y, 0);\n      x = Clamp(x, -1.0f, 1.0f);\n      y = Clamp(y, -1.0f, 1.0f);\n    }\n    _report_key_states_from_axes(x, y, callback);\n    return true;\n  }\n  return false;\n}\n\nstatic void _look_up_motion_range(int deviceId, int source, float* outMinX,\n                                  float* outMaxX, float* outMinY,\n                                  float* outMaxY) {\n  int i;\n  for (i = 0; i < _motion_range_cache_items; i++) {\n    DeviceMotionRange* item = &_motion_range_cache[i];\n    if (item->deviceId == deviceId && item->source == source) {\n      *outMinX = item->minX;\n      *outMaxX = item->maxX;\n      *outMinY = item->minY;\n      *outMaxY = item->maxY;\n      return;\n    }\n  }\n\n  DeviceMotionRange* newItem;\n  if (_motion_range_cache_items >= MOTION_RANGE_CACHE_MAX) {\n    static bool warned = false;\n    if (!warned) {\n      LOGW(\n          \"**** Warning: Motion range cache exceeded. This shouldn't normally \"\n          \"happen.\");\n      warned = true;\n    }\n    // as an emergency measure, overwrite (arbitrarily) the 1st entry:\n    newItem = &_motion_range_cache[i];\n  } else {\n    // create a new entry\n    newItem = &_motion_range_cache[_motion_range_cache_items++];\n  }\n\n  LOGD(\"New device/source pair %d,%d. Querying motion range via JNI.\", deviceId,\n       source);\n\n  newItem->deviceId = deviceId;\n  newItem->source = source;\n\n  LOGD(\"====Calling _look_up_motion_range() for device %d\", deviceId);\n#if 0\n    /*\n     * What this is ?\n     */\n    BGNActivity_GetDeviceMotionRange(deviceId, source, &(newItem->minX), &(newItem->maxX),\n            &(newItem->minY), &(newItem->maxY));\n#endif\n  LOGD(\"Motion range for (device %d, source %d) is X:%f-%f, Y:%f-%f\", deviceId,\n       source, newItem->minX, newItem->maxX, newItem->minY, newItem->maxY);\n  *outMinX = newItem->minX;\n  *outMaxX = newItem->maxX;\n  *outMinY = newItem->minY;\n  *outMaxY = newItem->maxY;\n}\n\nstatic bool CookEvent_Joy(AInputEvent* event, CookedEventCallback callback) {\n  struct CookedEvent ev;\n  memset(&ev, 0, sizeof(ev));\n  ev.type = COOKED_EVENT_TYPE_JOY;\n  ev.joyX = AMotionEvent_getX(event, 0);\n  ev.joyY = AMotionEvent_getY(event, 0);\n  _process_keys(true, event, callback);\n  return callback(&ev);\n}\n\nstatic bool CookEvent_Motion(AInputEvent* event, CookedEventCallback callback) {\n  int src = AInputEvent_getSource(event);\n  int action = AMotionEvent_getAction(event);\n  int actionMasked = action & AMOTION_EVENT_ACTION_MASK;\n  int ptrIndex = (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >>\n                 AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;\n\n  struct CookedEvent ev;\n  memset(&ev, 0, sizeof(ev));\n\n  if (actionMasked == AMOTION_EVENT_ACTION_DOWN ||\n      actionMasked == AMOTION_EVENT_ACTION_POINTER_DOWN) {\n    ev.type = COOKED_EVENT_TYPE_POINTER_DOWN;\n  } else if (actionMasked == AMOTION_EVENT_ACTION_UP ||\n             actionMasked == AMOTION_EVENT_ACTION_POINTER_UP) {\n    ev.type = COOKED_EVENT_TYPE_POINTER_UP;\n  } else {\n    ev.type = COOKED_EVENT_TYPE_POINTER_MOVE;\n  }\n\n  ev.motionPointerId = AMotionEvent_getPointerId(event, ptrIndex);\n  ev.motionIsOnScreen = (src & AINPUT_SOURCE_TOUCHSCREEN) != 0;\n  ev.motionX = AMotionEvent_getX(event, ptrIndex);\n  ev.motionY = AMotionEvent_getY(event, ptrIndex);\n\n  if (ev.motionIsOnScreen) {\n    // use screen size as the motion range\n    ev.motionMinX = 0.0f;\n    ev.motionMaxX = SceneManager::GetInstance()->GetScreenWidth();\n    ev.motionMinY = 0.0f;\n    ev.motionMaxY = SceneManager::GetInstance()->GetScreenHeight();\n  } else {\n    // look up motion range for this device\n    _look_up_motion_range((int)AInputEvent_getDeviceId(event),\n                          (int)AInputEvent_getSource(event), &ev.motionMinX,\n                          &ev.motionMaxX, &ev.motionMinY, &ev.motionMaxY);\n  }\n\n  // deliver event\n  callback(&ev);\n\n  // deliver motion info about other pointers (for multi-touch)\n  int ptrCount = AMotionEvent_getPointerCount(event);\n  for (int i = 0; i < ptrCount; i++) {\n    ev.type = COOKED_EVENT_TYPE_POINTER_MOVE;\n    ev.motionX = AMotionEvent_getX(event, i);\n    ev.motionY = AMotionEvent_getY(event, i);\n    ev.motionPointerId = AMotionEvent_getPointerId(event, i);\n    callback(&ev);\n  }\n\n  // If this is a touch-nav event, return false to indicate that we haven't\n  // handled it. This will trigger translation of swipes to DPAD keys, which is\n  // what we want. Otherwise, we say that we've handled it.\n  return (src != SOURCE_TOUCH_NAVIGATION);\n}\n\nbool CookEvent(AInputEvent* event, CookedEventCallback callback) {\n  int type = AInputEvent_getType(event);\n  int src = AInputEvent_getSource(event);\n  bool isJoy = (type == AINPUT_EVENT_TYPE_MOTION) &&\n               (src & AINPUT_SOURCE_CLASS_MASK) == SOURCE_CLASS_JOYSTICK;\n\n  if (!_init_done) {\n    _init();\n    _init_done = true;\n  }\n\n  if (isJoy) {\n    return CookEvent_Joy(event, callback);\n  } else if (type == AINPUT_EVENT_TYPE_KEY) {\n    bool handled = _process_keys(false, event, callback);\n    if (AKeyEvent_getKeyCode(event) == AKEYCODE_BACK &&\n        0 == AKeyEvent_getAction(event)) {\n      // back key was pressed\n      struct CookedEvent ev;\n      memset(&ev, 0, sizeof(ev));\n      ev.type = COOKED_EVENT_TYPE_BACK;\n      return callback(&ev);\n    }\n    // Note: if you want to handle other keys, add code here. For now we only\n    // handle DPAD keys as indicated in _process_keys.\n    return handled;\n  } else if (type == AINPUT_EVENT_TYPE_MOTION) {\n    return CookEvent_Motion(event, callback);\n  }\n\n  return false;\n}\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/input_util.hpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef endlesstunnel_input_util_hpp\n#define endlesstunnel_input_util_hpp\n\n#include \"engine.hpp\"\n#include \"our_key_codes.hpp\"\n\n// event type\n#define COOKED_EVENT_TYPE_JOY 0\n#define COOKED_EVENT_TYPE_POINTER_DOWN 1\n#define COOKED_EVENT_TYPE_POINTER_UP 2\n#define COOKED_EVENT_TYPE_POINTER_MOVE 3\n#define COOKED_EVENT_TYPE_KEY_DOWN 4\n#define COOKED_EVENT_TYPE_KEY_UP 5\n#define COOKED_EVENT_TYPE_BACK 6\n\nstruct CookedEvent {\n  int type;\n\n  // for joystick events:\n  float joyX, joyY;\n\n  // for pointer events\n  int motionPointerId;\n  bool motionIsOnScreen;\n  float motionX, motionY;\n  float motionMinX, motionMaxX;\n  float motionMinY, motionMaxY;\n\n  // for key events\n  int keyCode;\n};\n\ntypedef bool (*CookedEventCallback)(struct CookedEvent *event);\nbool CookEvent(AInputEvent *event, CookedEventCallback callback);\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/jni_util.cpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// clang-format off\n#include \"common.hpp\"\n// clang-format on\n#include \"jni_util.hpp\"\n\n#include \"native_engine.hpp\"\n\nstatic struct JniSetup _jni_setup = {};\n\nstruct JniSetup* GetJNISetup() {\n  if (!_jni_setup.env) {\n    _jni_setup.env = NativeEngine::GetInstance()->GetJniEnv();\n    _jni_setup.thiz =\n        NativeEngine::GetInstance()->GetAndroidApp()->activity->clazz;\n    _jni_setup.clazz = _jni_setup.env->GetObjectClass(_jni_setup.thiz);\n  }\n  return &_jni_setup;\n}\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/jni_util.hpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef endlesstunnel_jniutil_hpp\n#define endlesstunnel_jniutil_hpp\n\nstruct JniSetup {\n  jclass clazz;  // activity class\n  jobject thiz;  // activity object\n  JNIEnv* env;   // jni env\n};\n\n// Does JNI setup (if needed) and returns a struct with convenience objects.\nstruct JniSetup* GetJNISetup();\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/joystick-support.hpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef endlesstunnel_joystick_support_hpp\n#define endlesstunnel_joystick_support_hpp\n\n// A few declarations we need for NDK joystick support as of NDK release 9\ntypedef float (*_getAxisValue_sig)(const AInputEvent*, int32_t, size_t);\nstatic const int AXIS_HAT_X = 15, AXIS_HAT_Y = 16;\nstatic const int SOURCE_CLASS_JOYSTICK = 16;\nstatic const int KEYCODE_BUTTON_X = 99;\nstatic const int KEYCODE_BUTTON_Y = 100;\nstatic const int KEYCODE_BUTTON_A = 96;\nstatic const int KEYCODE_BUTTON_B = 97;\n\n// source type for \"touch navigation\" devices (introduced in API 18)\nstatic const int SOURCE_TOUCH_NAVIGATION = 0x00200000;\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/libgame.map.txt",
    "content": "LIBGAME {\n  global:\n    ANativeActivity_onCreate;\n  local:\n    *;\n};\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/native_engine.cpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#include \"native_engine.hpp\"\n\n#include \"common.hpp\"\n#include \"input_util.hpp\"\n#include \"joystick-support.hpp\"\n#include \"scene_manager.hpp\"\n#include \"welcome_scene.hpp\"\n\n// verbose debug logs on?\n#define VERBOSE_LOGGING 1\n\n#if VERBOSE_LOGGING\n#define VLOGD LOGD\n#else\n#define VLOGD\n#endif\n\n// max # of GL errors to print before giving up\n#define MAX_GL_ERRORS 200\n\nstatic NativeEngine* _singleton = NULL;\n\n// workaround for internal bug b/149866792\nstatic NativeEngineSavedState appState = {false};\n\nNativeEngine::NativeEngine(struct android_app* app) {\n  LOGD(\"NativeEngine: initializing.\");\n  mApp = app;\n  mHasFocus = mIsVisible = mHasWindow = false;\n  mHasGLObjects = false;\n  mEglDisplay = EGL_NO_DISPLAY;\n  mEglSurface = EGL_NO_SURFACE;\n  mEglContext = EGL_NO_CONTEXT;\n  mEglConfig = 0;\n  mSurfWidth = mSurfHeight = 0;\n  mApiVersion = 0;\n  mJniEnv = NULL;\n  memset(&mState, 0, sizeof(mState));\n  mIsFirstFrame = true;\n\n  if (app->savedState != NULL) {\n    // we are starting with previously saved state -- restore it\n    mState = *(struct NativeEngineSavedState*)app->savedState;\n  }\n\n  // only one instance of NativeEngine may exist!\n  MY_ASSERT(_singleton == NULL);\n  _singleton = this;\n\n  VLOGD(\"NativeEngine: querying API level.\");\n  LOGD(\"NativeEngine: API version %d.\", mApiVersion);\n}\n\nNativeEngine* NativeEngine::GetInstance() {\n  MY_ASSERT(_singleton != NULL);\n  return _singleton;\n}\n\nNativeEngine::~NativeEngine() {\n  VLOGD(\"NativeEngine: destructor running\");\n  KillContext();\n  if (mJniEnv) {\n    LOGD(\"Detaching current thread from JNI.\");\n    mApp->activity->vm->DetachCurrentThread();\n    LOGD(\"Current thread detached from JNI.\");\n    mJniEnv = NULL;\n  }\n  _singleton = NULL;\n}\n\nstatic void _handle_cmd_proxy(struct android_app* app, int32_t cmd) {\n  NativeEngine* engine = (NativeEngine*)app->userData;\n  engine->HandleCommand(cmd);\n}\n\nstatic int _handle_input_proxy(struct android_app* app, AInputEvent* event) {\n  NativeEngine* engine = (NativeEngine*)app->userData;\n  return engine->HandleInput(event) ? 1 : 0;\n}\n\nbool NativeEngine::IsAnimating() {\n  return mHasFocus && mIsVisible && mHasWindow;\n}\n\nvoid NativeEngine::GameLoop() {\n  mApp->userData = this;\n  mApp->onAppCmd = _handle_cmd_proxy;\n  mApp->onInputEvent = _handle_input_proxy;\n\n  while (!mApp->destroyRequested) {\n    // If not animating, block until we get an event; if animating, don't block.\n    struct android_poll_source* source = nullptr;\n    auto result = ALooper_pollOnce(IsAnimating() ? 0 : -1, NULL, nullptr,\n                                   (void**)&source);\n    MY_ASSERT(result != ALOOPER_POLL_ERROR);\n    // process event\n    if (source != NULL) {\n      source->process(mApp, source);\n    }\n\n    if (IsAnimating()) {\n      DoFrame();\n    }\n  }\n}\n\nJNIEnv* NativeEngine::GetJniEnv() {\n  if (!mJniEnv) {\n    LOGD(\"Attaching current thread to JNI.\");\n    if (0 != mApp->activity->vm->AttachCurrentThread(&mJniEnv, NULL)) {\n      LOGE(\"*** FATAL ERROR: Failed to attach thread to JNI.\");\n      ABORT_GAME;\n    }\n    MY_ASSERT(mJniEnv != NULL);\n    LOGD(\"Attached current thread to JNI, %p\", mJniEnv);\n  }\n\n  return mJniEnv;\n}\n\nvoid NativeEngine::HandleCommand(int32_t cmd) {\n  SceneManager* mgr = SceneManager::GetInstance();\n\n  VLOGD(\"NativeEngine: handling command %d.\", cmd);\n  switch (cmd) {\n    case APP_CMD_SAVE_STATE:\n      // The system has asked us to save our current state.\n      VLOGD(\"NativeEngine: APP_CMD_SAVE_STATE\");\n      mState.mHasFocus = mHasFocus;\n      mApp->savedState = malloc(sizeof(mState));\n      *((NativeEngineSavedState*)mApp->savedState) = mState;\n      mApp->savedStateSize = sizeof(mState);\n      break;\n    case APP_CMD_INIT_WINDOW:\n      // We have a window!\n      VLOGD(\"NativeEngine: APP_CMD_INIT_WINDOW\");\n      if (mApp->window != NULL) {\n        mHasWindow = true;\n        if (mApp->savedStateSize == sizeof(mState) &&\n            mApp->savedState != nullptr) {\n          mState = *((NativeEngineSavedState*)mApp->savedState);\n          mHasFocus = mState.mHasFocus;\n        } else {\n          // Workaround APP_CMD_GAINED_FOCUS issue where the focus state is not\n          // passed down from NativeActivity when restarting Activity\n          mHasFocus = appState.mHasFocus;\n        }\n      }\n      VLOGD(\"HandleCommand(%d): hasWindow = %d, hasFocus = %d\", cmd,\n            mHasWindow ? 1 : 0, mHasFocus ? 1 : 0);\n      break;\n    case APP_CMD_TERM_WINDOW:\n      // The window is going away -- kill the surface\n      VLOGD(\"NativeEngine: APP_CMD_TERM_WINDOW\");\n      KillSurface();\n      mHasWindow = false;\n      break;\n    case APP_CMD_GAINED_FOCUS:\n      VLOGD(\"NativeEngine: APP_CMD_GAINED_FOCUS\");\n      mHasFocus = true;\n      mState.mHasFocus = appState.mHasFocus = mHasFocus;\n      break;\n    case APP_CMD_LOST_FOCUS:\n      VLOGD(\"NativeEngine: APP_CMD_LOST_FOCUS\");\n      mHasFocus = false;\n      mState.mHasFocus = appState.mHasFocus = mHasFocus;\n      break;\n    case APP_CMD_PAUSE:\n      VLOGD(\"NativeEngine: APP_CMD_PAUSE\");\n      mgr->OnPause();\n      break;\n    case APP_CMD_RESUME:\n      VLOGD(\"NativeEngine: APP_CMD_RESUME\");\n      mgr->OnResume();\n      break;\n    case APP_CMD_STOP:\n      VLOGD(\"NativeEngine: APP_CMD_STOP\");\n      mIsVisible = false;\n      break;\n    case APP_CMD_START:\n      VLOGD(\"NativeEngine: APP_CMD_START\");\n      mIsVisible = true;\n      break;\n    case APP_CMD_WINDOW_RESIZED:\n    case APP_CMD_CONFIG_CHANGED:\n      VLOGD(\"NativeEngine: %s\", cmd == APP_CMD_WINDOW_RESIZED\n                                    ? \"APP_CMD_WINDOW_RESIZED\"\n                                    : \"APP_CMD_CONFIG_CHANGED\");\n      // Window was resized or some other configuration changed.\n      // Note: we don't handle this event because we check the surface\n      // dimensions every frame, so that's how we know it was resized. If you\n      // are NOT doing that, then you need to handle this event!\n      break;\n    case APP_CMD_LOW_MEMORY:\n      VLOGD(\"NativeEngine: APP_CMD_LOW_MEMORY\");\n      // system told us we have low memory. So if we are not visible, let's\n      // cooperate by deallocating all of our graphic resources.\n      if (!mHasWindow) {\n        VLOGD(\"NativeEngine: trimming memory footprint (deleting GL objects).\");\n        KillGLObjects();\n      }\n      break;\n    default:\n      VLOGD(\"NativeEngine: (unknown command).\");\n      break;\n  }\n\n  VLOGD(\"NativeEngine: STATUS: F%d, V%d, W%d, EGL: D %p, S %p, CTX %p, CFG %p\",\n        mHasFocus, mIsVisible, mHasWindow, mEglDisplay, mEglSurface,\n        mEglContext, mEglConfig);\n}\n\nstatic bool _cooked_event_callback(struct CookedEvent* event) {\n  SceneManager* mgr = SceneManager::GetInstance();\n  PointerCoords coords;\n  memset(&coords, 0, sizeof(coords));\n  coords.x = event->motionX;\n  coords.y = event->motionY;\n  coords.minX = event->motionMinX;\n  coords.maxX = event->motionMaxX;\n  coords.minY = event->motionMinY;\n  coords.maxY = event->motionMaxY;\n  coords.isScreen = event->motionIsOnScreen;\n\n  switch (event->type) {\n    case COOKED_EVENT_TYPE_JOY:\n      mgr->UpdateJoy(event->joyX, event->joyY);\n      return true;\n    case COOKED_EVENT_TYPE_POINTER_DOWN:\n      mgr->OnPointerDown(event->motionPointerId, &coords);\n      return true;\n    case COOKED_EVENT_TYPE_POINTER_UP:\n      mgr->OnPointerUp(event->motionPointerId, &coords);\n      return true;\n    case COOKED_EVENT_TYPE_POINTER_MOVE:\n      mgr->OnPointerMove(event->motionPointerId, &coords);\n      return true;\n    case COOKED_EVENT_TYPE_KEY_DOWN:\n      mgr->OnKeyDown(event->keyCode);\n      return true;\n    case COOKED_EVENT_TYPE_KEY_UP:\n      mgr->OnKeyUp(event->keyCode);\n      return true;\n    case COOKED_EVENT_TYPE_BACK:\n      return mgr->OnBackKeyPressed();\n    default:\n      return false;\n  }\n}\n\nbool NativeEngine::HandleInput(AInputEvent* event) {\n  return CookEvent(event, _cooked_event_callback);\n}\n\nbool NativeEngine::InitDisplay() {\n  if (mEglDisplay != EGL_NO_DISPLAY) {\n    // nothing to do\n    LOGD(\"NativeEngine: no need to init display (already had one).\");\n    return true;\n  }\n\n  LOGD(\"NativeEngine: initializing display.\");\n  mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);\n  if (EGL_FALSE == eglInitialize(mEglDisplay, 0, 0)) {\n    LOGE(\"NativeEngine: failed to init display, error %d\", eglGetError());\n    return false;\n  }\n  return true;\n}\n\nbool NativeEngine::InitSurface() {\n  // need a display\n  MY_ASSERT(mEglDisplay != EGL_NO_DISPLAY);\n\n  if (mEglSurface != EGL_NO_SURFACE) {\n    // nothing to do\n    LOGD(\"NativeEngine: no need to init surface (already had one).\");\n    return true;\n  }\n\n  LOGD(\"NativeEngine: initializing surface.\");\n\n  EGLint numConfigs;\n\n  const EGLint attribs[] = {EGL_RENDERABLE_TYPE,\n                            EGL_OPENGL_ES2_BIT,  // request OpenGL ES 2.0\n                            EGL_SURFACE_TYPE,\n                            EGL_WINDOW_BIT,\n                            EGL_BLUE_SIZE,\n                            8,\n                            EGL_GREEN_SIZE,\n                            8,\n                            EGL_RED_SIZE,\n                            8,\n                            EGL_DEPTH_SIZE,\n                            16,\n                            EGL_NONE};\n\n  // since this is a simple sample, we have a trivial selection process. We pick\n  // the first EGLConfig that matches:\n  eglChooseConfig(mEglDisplay, attribs, &mEglConfig, 1, &numConfigs);\n\n  // create EGL surface\n  mEglSurface =\n      eglCreateWindowSurface(mEglDisplay, mEglConfig, mApp->window, NULL);\n  if (mEglSurface == EGL_NO_SURFACE) {\n    LOGE(\"Failed to create EGL surface, EGL error %d\", eglGetError());\n    return false;\n  }\n\n  LOGD(\"NativeEngine: successfully initialized surface.\");\n  return true;\n}\n\nbool NativeEngine::InitContext() {\n  // need a display\n  MY_ASSERT(mEglDisplay != EGL_NO_DISPLAY);\n\n  EGLint attribList[] = {EGL_CONTEXT_CLIENT_VERSION, 2,\n                         EGL_NONE};  // OpenGL 2.0\n\n  if (mEglContext != EGL_NO_CONTEXT) {\n    // nothing to do\n    LOGD(\"NativeEngine: no need to init context (already had one).\");\n    return true;\n  }\n\n  LOGD(\"NativeEngine: initializing context.\");\n\n  // create EGL context\n  mEglContext = eglCreateContext(mEglDisplay, mEglConfig, NULL, attribList);\n  if (mEglContext == EGL_NO_CONTEXT) {\n    LOGE(\"Failed to create EGL context, EGL error %d\", eglGetError());\n    return false;\n  }\n\n  LOGD(\"NativeEngine: successfull initialized context.\");\n\n  return true;\n}\n\nvoid NativeEngine::ConfigureOpenGL() {\n  glClearColor(0.0f, 0.0f, 0.0f, 1.0f);\n  glEnable(GL_DEPTH_TEST);\n  glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);\n}\n\nbool NativeEngine::PrepareToRender() {\n  if (mEglDisplay == EGL_NO_DISPLAY || mEglSurface == EGL_NO_SURFACE ||\n      mEglContext == EGL_NO_CONTEXT) {\n    // create display if needed\n    if (!InitDisplay()) {\n      LOGE(\"NativeEngine: failed to create display.\");\n      return false;\n    }\n\n    // create surface if needed\n    if (!InitSurface()) {\n      LOGE(\"NativeEngine: failed to create surface.\");\n      return false;\n    }\n\n    // create context if needed\n    if (!InitContext()) {\n      LOGE(\"NativeEngine: failed to create context.\");\n      return false;\n    }\n\n    LOGD(\n        \"NativeEngine: binding surface and context (display %p, surface %p, \"\n        \"context %p)\",\n        mEglDisplay, mEglSurface, mEglContext);\n\n    // bind them\n    if (EGL_FALSE ==\n        eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext)) {\n      LOGE(\"NativeEngine: eglMakeCurrent failed, EGL error %d\", eglGetError());\n      HandleEglError(eglGetError());\n    }\n\n    // configure our global OpenGL settings\n    ConfigureOpenGL();\n  }\n  if (!mHasGLObjects) {\n    LOGD(\"NativeEngine: creating OpenGL objects.\");\n    if (!InitGLObjects()) {\n      LOGE(\"NativeEngine: unable to initialize OpenGL objects.\");\n      return false;\n    }\n  }\n\n  // ready to render\n  return true;\n}\n\nvoid NativeEngine::KillGLObjects() {\n  if (mHasGLObjects) {\n    SceneManager* mgr = SceneManager::GetInstance();\n    mgr->KillGraphics();\n    mHasGLObjects = false;\n  }\n}\n\nvoid NativeEngine::KillSurface() {\n  LOGD(\"NativeEngine: killing surface.\");\n  eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);\n  if (mEglSurface != EGL_NO_SURFACE) {\n    eglDestroySurface(mEglDisplay, mEglSurface);\n    mEglSurface = EGL_NO_SURFACE;\n  }\n  LOGD(\"NativeEngine: Surface killed successfully.\");\n}\n\nvoid NativeEngine::KillContext() {\n  LOGD(\"NativeEngine: killing context.\");\n\n  // since the context is going away, we have to kill the GL objects\n  KillGLObjects();\n\n  eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);\n\n  if (mEglContext != EGL_NO_CONTEXT) {\n    eglDestroyContext(mEglDisplay, mEglContext);\n    mEglContext = EGL_NO_CONTEXT;\n  }\n  LOGD(\"NativeEngine: Context killed successfully.\");\n}\n\nvoid NativeEngine::KillDisplay() {\n  // causes context and surface to go away too, if they are there\n  LOGD(\"NativeEngine: killing display.\");\n  KillContext();\n  KillSurface();\n\n  if (mEglDisplay != EGL_NO_DISPLAY) {\n    LOGD(\"NativeEngine: terminating display now.\");\n    eglTerminate(mEglDisplay);\n    mEglDisplay = EGL_NO_DISPLAY;\n  }\n  LOGD(\"NativeEngine: display killed successfully.\");\n}\n\nbool NativeEngine::HandleEglError(EGLint error) {\n  switch (error) {\n    case EGL_SUCCESS:\n      // nothing to do\n      return true;\n    case EGL_CONTEXT_LOST:\n      LOGW(\"NativeEngine: egl error: EGL_CONTEXT_LOST. Recreating context.\");\n      KillContext();\n      return true;\n    case EGL_BAD_CONTEXT:\n      LOGW(\"NativeEngine: egl error: EGL_BAD_CONTEXT. Recreating context.\");\n      KillContext();\n      return true;\n    case EGL_BAD_DISPLAY:\n      LOGW(\"NativeEngine: egl error: EGL_BAD_DISPLAY. Recreating display.\");\n      KillDisplay();\n      return true;\n    case EGL_BAD_SURFACE:\n      LOGW(\"NativeEngine: egl error: EGL_BAD_SURFACE. Recreating display.\");\n      KillSurface();\n      return true;\n    default:\n      LOGW(\"NativeEngine: unknown egl error: %d\", error);\n      return false;\n  }\n}\n\nstatic void _log_opengl_error(GLenum err) {\n  switch (err) {\n    case GL_NO_ERROR:\n      LOGE(\"*** OpenGL error: GL_NO_ERROR\");\n      break;\n    case GL_INVALID_ENUM:\n      LOGE(\"*** OpenGL error: GL_INVALID_ENUM\");\n      break;\n    case GL_INVALID_VALUE:\n      LOGE(\"*** OpenGL error: GL_INVALID_VALUE\");\n      break;\n    case GL_INVALID_OPERATION:\n      LOGE(\"*** OpenGL error: GL_INVALID_OPERATION\");\n      break;\n    case GL_INVALID_FRAMEBUFFER_OPERATION:\n      LOGE(\"*** OpenGL error: GL_INVALID_FRAMEBUFFER_OPERATION\");\n      break;\n    case GL_OUT_OF_MEMORY:\n      LOGE(\"*** OpenGL error: GL_OUT_OF_MEMORY\");\n      break;\n    default:\n      LOGE(\"*** OpenGL error: error %d\", err);\n      break;\n  }\n}\n\nvoid NativeEngine::DoFrame() {\n  // prepare to render (create context, surfaces, etc, if needed)\n  if (!PrepareToRender()) {\n    // not ready\n    VLOGD(\"NativeEngine: preparation to render failed.\");\n    return;\n  }\n\n  SceneManager* mgr = SceneManager::GetInstance();\n\n  // how big is the surface? We query every frame because it's cheap, and some\n  // strange devices out there change the surface size without calling any\n  // callbacks...\n  int width, height;\n  eglQuerySurface(mEglDisplay, mEglSurface, EGL_WIDTH, &width);\n  eglQuerySurface(mEglDisplay, mEglSurface, EGL_HEIGHT, &height);\n\n  if (width != mSurfWidth || height != mSurfHeight) {\n    // notify scene manager that the surface has changed size\n    LOGD(\"NativeEngine: surface changed size %dx%d --> %dx%d\", mSurfWidth,\n         mSurfHeight, width, height);\n    mSurfWidth = width;\n    mSurfHeight = height;\n    mgr->SetScreenSize(mSurfWidth, mSurfHeight);\n    glViewport(0, 0, mSurfWidth, mSurfHeight);\n  }\n\n  // if this is the first frame, install the welcome scene\n  if (mIsFirstFrame) {\n    mIsFirstFrame = false;\n    mgr->RequestNewScene(new WelcomeScene());\n  }\n\n  // render!\n  mgr->DoFrame();\n\n  // swap buffers\n  if (EGL_FALSE == eglSwapBuffers(mEglDisplay, mEglSurface)) {\n    // failed to swap buffers...\n    LOGW(\"NativeEngine: eglSwapBuffers failed, EGL error %d\", eglGetError());\n    HandleEglError(eglGetError());\n  }\n\n  // print out GL errors, if any\n  GLenum e;\n  static int errorsPrinted = 0;\n  while ((e = glGetError()) != GL_NO_ERROR) {\n    if (errorsPrinted < MAX_GL_ERRORS) {\n      _log_opengl_error(e);\n      ++errorsPrinted;\n      if (errorsPrinted >= MAX_GL_ERRORS) {\n        LOGE(\"*** NativeEngine: TOO MANY OPENGL ERRORS. NO LONGER PRINTING.\");\n      }\n    }\n  }\n}\n\nandroid_app* NativeEngine::GetAndroidApp() { return mApp; }\n\nbool NativeEngine::InitGLObjects() {\n  if (!mHasGLObjects) {\n    SceneManager* mgr = SceneManager::GetInstance();\n    mgr->StartGraphics();\n    _log_opengl_error(glGetError());\n    mHasGLObjects = true;\n  }\n  return true;\n}\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/native_engine.hpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef endlesstunnel_native_engine_hpp\n#define endlesstunnel_native_engine_hpp\n\n#include \"common.hpp\"\n\nstruct NativeEngineSavedState {\n  bool mHasFocus;\n};\n\nclass NativeEngine {\n public:\n  // create an engine\n  NativeEngine(struct android_app *app);\n  ~NativeEngine();\n\n  // runs application until it dies\n  void GameLoop();\n\n  // returns the JNI environment\n  JNIEnv *GetJniEnv();\n\n  // returns the Android app object\n  android_app *GetAndroidApp();\n\n  // returns the (singleton) instance\n  static NativeEngine *GetInstance();\n\n private:\n  // variables to track Android lifecycle:\n  bool mHasFocus, mIsVisible, mHasWindow;\n\n  // are our OpenGL objects (textures, etc) currently loaded?\n  bool mHasGLObjects;\n\n  // android API version (0 if not yet queried)\n  int mApiVersion;\n\n  // EGL stuff\n  EGLDisplay mEglDisplay;\n  EGLSurface mEglSurface;\n  EGLContext mEglContext;\n  EGLConfig mEglConfig;\n\n  // known surface size\n  int mSurfWidth, mSurfHeight;\n\n  // android_app structure\n  struct android_app *mApp;\n\n  // additional saved state\n  struct NativeEngineSavedState mState;\n\n  // JNI environment\n  JNIEnv *mJniEnv;\n\n  // is this the first frame we're drawing?\n  bool mIsFirstFrame;\n\n  // initialize the display\n  bool InitDisplay();\n\n  // initialize surface. Requires display to have been initialized first.\n  bool InitSurface();\n\n  // initialize context. Requires display to have been initialized first.\n  bool InitContext();\n\n  // kill context\n  void KillContext();\n  void KillSurface();\n  void KillDisplay();  // also causes context and surface to get killed\n\n  bool HandleEglError(EGLint error);\n\n  bool InitGLObjects();\n  void KillGLObjects();\n\n  void ConfigureOpenGL();\n\n  bool PrepareToRender();\n\n  void DoFrame();\n\n  bool IsAnimating();\n\n public:\n  // these are public for simplicity because we have internal static callbacks\n  void HandleCommand(int32_t cmd);\n  bool HandleInput(AInputEvent *event);\n};\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/obstacle.cpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"obstacle.hpp\"\n\n#define BONUS_PROBABILITY 0.7f\n\nvoid Obstacle::PutRandomBonus() {\n  if (Random(100) * 0.01f > BONUS_PROBABILITY) {\n    return;\n  }\n\n  bool candidate[OBS_GRID_SIZE][OBS_GRID_SIZE];\n  memset(candidate, 0, sizeof(candidate));\n\n  int r, c;\n  int i, j;\n\n  // (This is the most deeply indented code I have written in my life)\n  // It goes through the grid and marks all the squares that are adjacent to\n  // a solid square as candidates for the bonus.\n  for (r = 0; r < OBS_GRID_SIZE; r++) {\n    for (c = 0; c < OBS_GRID_SIZE; c++) {\n      if (grid[c][r]) {\n        for (i = r - 1; i <= r + 1; i++) {\n          for (j = c - 1; j <= c + 1; j++) {\n            if (i >= 0 && i < OBS_GRID_SIZE && j >= 0 && j < OBS_GRID_SIZE) {\n              candidate[j][i] = true;\n            }\n          }\n        }\n      }\n    }\n  }\n\n  // now we randomly choose one of the candidates\n  int r0 = Random(0, OBS_GRID_SIZE);\n  int c0 = Random(0, OBS_GRID_SIZE);\n  int rd, cd;\n  bonusRow = bonusCol = -1;\n  for (rd = 0; rd < OBS_GRID_SIZE && bonusRow < 0; rd++) {\n    for (cd = 0; cd < OBS_GRID_SIZE; cd++) {\n      int my_r = (r0 + rd) % OBS_GRID_SIZE;\n      int my_c = (c0 + cd) % OBS_GRID_SIZE;\n      if (!grid[my_c][my_r] && candidate[my_c][my_r]) {\n        bonusRow = my_r;\n        bonusCol = my_c;\n        break;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/obstacle.hpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef endlesstunnel_obstacle_hpp\n#define endlesstunnel_obstacle_hpp\n\n#include \"engine.hpp\"\n#include \"game_consts.hpp\"\n#include \"util.hpp\"\n\n// An obstacle consists of a grid of OBS_GRID_SIZE x OBS_GRID_SIZE cells; each\n// of them may or may not contain a box. One of the cells may be the bonus cell,\n// which gives the player a bonus when hit.\n//\n// The obstacle grid lies on the XZ plane.\nclass Obstacle {\n public:\n  bool grid[OBS_GRID_SIZE][OBS_GRID_SIZE];  // indexed as [col][row]\n  int style;  // obstacle style (currently, this specifies its color).\n  int bonusRow, bonusCol;\n  const static int STYLE_NULL = 0;  // a null obstacle (not displayed)\n\n  glm::vec3 GetBoxCenter(int gridCol, int gridRow, float posY) {\n    return glm::vec3(-TUNNEL_HALF_W + (gridCol + 0.5f) * OBS_CELL_SIZE, posY,\n                     -TUNNEL_HALF_H + (gridRow + 0.5f) * OBS_CELL_SIZE);\n  }\n\n  glm::vec3 GetBoxSize() {\n    return glm::vec3(OBS_BOX_SIZE, OBS_BOX_SIZE, OBS_BOX_SIZE);\n  }\n\n  int GetRowAt(float z) {\n    return Clamp((int)floor((z + TUNNEL_HALF_H) / OBS_CELL_SIZE), 0,\n                 OBS_GRID_SIZE - 1);\n  }\n\n  int GetColAt(float x) {\n    return Clamp((int)floor((x + TUNNEL_HALF_W) / OBS_CELL_SIZE), 0,\n                 OBS_GRID_SIZE - 1);\n  }\n\n  float GetMinY(float posY) { return posY - OBS_BOX_SIZE * 0.5f; }\n  float GetMaxY(float posY) { return posY + OBS_BOX_SIZE * 0.5f; }\n\n  void Reset() {\n    style = STYLE_NULL;\n    bonusRow = bonusCol = -1;\n    memset(grid, 0, sizeof(grid));\n  }\n\n  void SetBonus(int col, int row) {\n    bonusCol = col;\n    bonusRow = row;\n  }\n\n  void PutRandomBonus();\n\n  void DeleteBonus() { bonusCol = bonusRow = -1; }\n\n  bool HasBonus() {\n    return bonusRow >= 0 && bonusRow < OBS_GRID_SIZE && bonusCol >= 0 &&\n           bonusCol < OBS_GRID_SIZE && !grid[bonusCol][bonusRow];\n  }\n};\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/obstacle_generator.cpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"obstacle_generator.hpp\"\n\n#include \"game_consts.hpp\"\n\nvoid ObstacleGenerator::Generate(Obstacle* result) {\n  static const int PROB_TABLE[] = {\n      // EASY   MED  INT  HARD\n      100, 0,   0,   0,   // difficulty 0\n      75,  25,  0,   0,   // difficulty 1\n      50,  50,  0,   0,   // difficulty 2\n      25,  75,  0,   0,   // difficulty 3\n      0,   100, 0,   0,   // difficulty 4\n      0,   75,  25,  0,   // difficulty 5\n      0,   50,  50,  0,   // difficulty 6\n      0,   25,  75,  0,   // difficulty 7\n      0,   0,   100, 0,   // difficulty 8\n      0,   0,   75,  25,  // difficulty 9\n      0,   0,   50,  50,  // difficulty 10\n      0,   0,   25,  75,  // difficulty 11\n      0,   0,   0,   100  // difficulty 12+\n  };\n  result->Reset();\n  result->style = 1 + Random(7);\n\n  int d = Clamp(mDifficulty, 0, 12);\n  int easyProb = PROB_TABLE[d * 4];\n  int medProb = PROB_TABLE[d * 4 + 1];\n  int intermediateProb = PROB_TABLE[d * 4 + 2];\n  int roll = Random(100);\n  if (roll <= easyProb) {\n    GenEasy(result);\n  } else if (roll <= easyProb + medProb) {\n    GenMedium(result);\n  } else if (roll <= easyProb + medProb + intermediateProb) {\n    GenIntermediate(result);\n  } else {\n    GenHard(result);\n  }\n  result->PutRandomBonus();\n}\n\nvoid ObstacleGenerator::FillRow(Obstacle* result, int row) {\n  for (int i = 0; i < OBS_GRID_SIZE; ++i) {\n    result->grid[i][row] = true;\n  }\n}\n\nvoid ObstacleGenerator::FillCol(Obstacle* result, int col) {\n  for (int i = 0; i < OBS_GRID_SIZE; ++i) {\n    result->grid[col][i] = true;\n  }\n}\n\nvoid ObstacleGenerator::GenEasy(Obstacle* result) {\n  int n = Random(4);\n  int i, j;\n  Obstacle* o = result;  // shorthand\n  switch (n) {\n    case 0:\n      i = Random(1, OBS_GRID_SIZE - 1);           // i is the row of the bonus\n      FillRow(result, i + (Random(2) ? 1 : -1));  // horizontal bar next to i\n      break;\n    case 1:\n      i = Random(1, OBS_GRID_SIZE - 1);  // i is the column of the bonus\n      FillCol(result, i + (Random(2) ? 1 : -1));  // vertical bar next to i\n      break;\n    case 2:\n      FillRow(result, 0);\n      FillRow(result, OBS_GRID_SIZE - 1);\n      FillCol(result, 0);\n      FillCol(result, OBS_GRID_SIZE - 1);\n      break;\n    default:\n      i = Random(0, OBS_GRID_SIZE - 2);  // i is the row of the bonus\n      j = Random(0, OBS_GRID_SIZE - 2);  // i is the row of the bonus\n      o->grid[i][j] = o->grid[i + 1][j] = o->grid[i][j + 1] =\n          o->grid[i + 1][j + 1] = true;\n      break;\n  }\n}\n\nvoid ObstacleGenerator::GenMedium(Obstacle* result) {\n  int n = Random(3);\n  int i;\n  switch (n) {\n    case 0:\n      i = Random(1, OBS_GRID_SIZE - 1);  // i is the row of the bonus\n      FillRow(result, i + 1);\n      FillRow(result, i - 1);\n      break;\n    case 1:\n      i = Random(1, OBS_GRID_SIZE - 1);  // i is the column of the bonus\n      FillCol(result, i - 1);\n      FillCol(result, i + 1);\n      break;\n    default:\n      i = Random(1, OBS_GRID_SIZE - 1);  // i is the column of the bonus\n      FillRow(result, i);\n      FillCol(result, i);\n      break;\n  }\n}\n\nvoid ObstacleGenerator::GenIntermediate(Obstacle* result) {\n  int n = Random(3);\n  int i;\n  switch (n) {\n    case 0:\n      i = Random(0, OBS_GRID_SIZE - 2);\n      FillRow(result, i);\n      FillRow(result, i + 1);\n      FillRow(result, i + 2);\n      break;\n    case 1:\n      i = Random(0, OBS_GRID_SIZE - 2);  // i is the column of the bonus\n      FillCol(result, i);\n      FillCol(result, i + 1);\n      FillCol(result, i + 2);\n      break;\n    default:\n      i = Random(1, OBS_GRID_SIZE - 2);  // i is the column of the bonus\n      FillCol(result, i - 1);\n      FillCol(result, i + 1);\n      FillCol(result, i + 2);\n      break;\n  }\n}\n\nvoid ObstacleGenerator::GenHard(Obstacle* result) {\n  int n = Random(4);\n  int i;\n  int j;\n  switch (n) {\n    case 0:\n      i = Random(0, OBS_GRID_SIZE - 3);\n      FillRow(result, i);\n      FillRow(result, i + 1);\n      FillRow(result, i + 2);\n      FillRow(result, i + 3);\n      result->grid[Random(0, OBS_GRID_SIZE)][Random(0, OBS_GRID_SIZE)] = false;\n      break;\n    case 1:\n      i = Random(0, OBS_GRID_SIZE - 3);\n      FillCol(result, i);\n      FillCol(result, i + 1);\n      FillCol(result, i + 2);\n      FillCol(result, i + 3);\n      result->grid[Random(0, OBS_GRID_SIZE)][Random(0, OBS_GRID_SIZE)] = false;\n      break;\n    case 2:\n      i = Random(0, OBS_GRID_SIZE);\n      for (j = 0; j < OBS_GRID_SIZE; j++) {\n        if (i != j) {\n          FillCol(result, i);\n        }\n      }\n      result->grid[Random(0, OBS_GRID_SIZE)][Random(0, OBS_GRID_SIZE)] = false;\n      break;\n    default:\n      i = Random(0, OBS_GRID_SIZE);\n      for (j = 0; j < OBS_GRID_SIZE; j++) {\n        if (i != j) {\n          FillRow(result, i);\n        }\n      }\n      result->grid[Random(0, OBS_GRID_SIZE)][Random(0, OBS_GRID_SIZE)] = false;\n      break;\n  }\n}\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/obstacle_generator.hpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef endlesstunnel_obstacle_generator_hpp\n#define endlesstunnel_obstacle_generator_hpp\n\n#include \"engine.hpp\"\n#include \"obstacle.hpp\"\n\n// Generates obstacles given a difficulty level.\nclass ObstacleGenerator {\n private:\n  int mDifficulty;\n\n public:\n  ObstacleGenerator() { mDifficulty = 0; }\n\n  void SetDifficulty(int dif) { mDifficulty = dif; }\n\n  // generate a new obstacle.\n  void Generate(Obstacle *result);\n\n private:\n  void GenEasy(Obstacle *result);\n  void GenMedium(Obstacle *result);\n  void GenIntermediate(Obstacle *result);\n  void GenHard(Obstacle *result);\n\n  void FillRow(Obstacle *result, int row);\n  void FillCol(Obstacle *result, int col);\n};\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/our_key_codes.hpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef endlesstunnel_our_key_codes_hpp\n#define endlesstunnel_our_key_codes_hpp\n\n// Our keycodes:\n#define OURKEY_UP 0\n#define OURKEY_RIGHT 1\n#define OURKEY_DOWN 2\n#define OURKEY_LEFT 3\n#define OURKEY_ENTER 4\n#define OURKEY_ESCAPE 5\n#define OURKEY_COUNT 6  // how many keycodes there are\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/our_shader.cpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"our_shader.hpp\"\n\n#include \"data/our_shader.inl\"\n\nOurShader::OurShader() : Shader() {\n  mColorLoc = (GLint)-1;\n  mTintLoc = -1;\n  mTexCoordLoc = (GLint)-1;\n  mSamplerLoc = -1;\n  mPointLightPosLoc = -1;\n  mPointLightColorLoc = -1;\n}\n\nOurShader::~OurShader() {}\n\nvoid OurShader::Compile() {\n  // let base class handle compilation\n  Shader::Compile();\n\n  // get location of the color attribute\n  BindShader();\n  mColorLoc = glGetAttribLocation(mProgramH, \"a_Color\");\n  if (mColorLoc < 0) {\n    LOGE(\"*** Couldn't get color attrib location from shader (OurShader).\");\n    ABORT_GAME;\n  }\n  mTintLoc = glGetUniformLocation(mProgramH, \"u_Tint\");\n  if (mTintLoc < 0) {\n    LOGE(\"*** Couldn't get Tint attrib location from shader (OurShader).\");\n    ABORT_GAME;\n  }\n  mSamplerLoc = glGetUniformLocation(mProgramH, \"u_Sampler\");\n  if (mSamplerLoc < 0) {\n    LOGE(\"*** Couldn't get sampler location from shader (OurShader).\");\n    ABORT_GAME;\n  }\n  mTexCoordLoc = (GLuint)glGetAttribLocation(mProgramH, \"a_TexCoord\");\n  if (mTexCoordLoc < 0) {\n    LOGE(\n        \"*** Couldn't get tex coord attribute location from shader \"\n        \"(OurShader).\");\n    ABORT_GAME;\n  }\n  mPointLightPosLoc = glGetUniformLocation(mProgramH, \"u_PointLightPos\");\n  if (mPointLightPosLoc < 0) {\n    LOGE(\"**** Couldn't get point light position uniform (OurShader).\");\n    ABORT_GAME;\n  }\n  mPointLightColorLoc = glGetUniformLocation(mProgramH, \"u_PointLightColor\");\n  if (mPointLightColorLoc < 0) {\n    LOGE(\"**** Couldn't get point light position uniform (OurShader).\");\n    ABORT_GAME;\n  }\n  UnbindShader();\n}\n\nvoid OurShader::SetTintColor(float r, float g, float b) {\n  MY_ASSERT(mTintLoc >= 0);\n  MY_ASSERT(mPreparedVertexBuf != NULL);\n  glUniform4f(mTintLoc, r, g, b, 1.0f);\n}\n\nvoid OurShader::SetTexture(Texture* t) {\n  MY_ASSERT(mPreparedVertexBuf != NULL);\n  t->Bind(GL_TEXTURE0);\n  glUniform1i(mSamplerLoc, 0);\n}\n\nvoid OurShader::EnablePointLight(glm::vec3 pos, float r, float g, float b) {\n  MY_ASSERT(mPreparedVertexBuf != NULL);\n  glUniform4f(mPointLightColorLoc, r, g, b, 1.0);\n  glUniform4f(mPointLightPosLoc, pos.x, pos.y, pos.z, 1.0);\n}\n\nvoid OurShader::DisablePointLight() {\n  MY_ASSERT(mPreparedVertexBuf != NULL);\n  glUniform4f(mPointLightColorLoc, 0.0f, 0.0f, 0.0f, 0.0f);\n}\n\nvoid OurShader::BeginRender(VertexBuf* geom) {\n  // let superclass begin the render\n  Shader::BeginRender(geom);\n\n  // Confirm that geometry has color and texture data\n  MY_ASSERT(geom->HasColors());\n  MY_ASSERT(mColorLoc >= 0);\n  MY_ASSERT(geom->HasTexCoords());\n  MY_ASSERT(mTexCoordLoc >= 0);\n\n  // push color data\n  glVertexAttribPointer(mColorLoc, 3, GL_FLOAT, GL_FALSE, geom->GetStride(),\n                        reinterpret_cast<void*>(geom->GetColorsOffset()));\n  glEnableVertexAttribArray(mColorLoc);\n\n  // push texture coordinates\n  glVertexAttribPointer(mTexCoordLoc, 2, GL_FLOAT, GL_FALSE, geom->GetStride(),\n                        reinterpret_cast<void*>(geom->GetTexCoordsOffset()));\n  glEnableVertexAttribArray(mTexCoordLoc);\n\n  // set neutral tint color (white) as a default\n  SetTintColor(1.0, 1.0, 1.0);\n\n  // by default, no point light\n  DisablePointLight();\n}\n\nconst char* OurShader::GetVertShaderSource() {\n  return OUR_VERTEX_SHADER_SOURCE;\n}\n\nconst char* OurShader::GetFragShaderSource() { return OUR_FRAG_SHADER_SOURCE; }\n\nconst char* OurShader::GetShaderName() { return \"OurShader\"; }\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/our_shader.hpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef endlesstunnel_our_shader_hpp\n#define endlesstunnel_our_shader_hpp\n\n#include \"engine.hpp\"\n\n// An OpenGL shader that can apply a texture and a point light.\n// We use to to render the tunnel and the obstacles.\nclass OurShader : public Shader {\n protected:\n  GLint mColorLoc;\n  GLint mTexCoordLoc;\n  int mTintLoc;\n  int mSamplerLoc;\n  int mPointLightPosLoc;\n  int mPointLightColorLoc;\n\n public:\n  OurShader();\n  virtual ~OurShader();\n  virtual void Compile();\n  void SetTexture(Texture *t);\n  void SetTintColor(float r, float g, float b);\n  void EnablePointLight(glm::vec3 pos, float r, float g, float b);\n  void DisablePointLight();\n  virtual void BeginRender(VertexBuf *geom);\n\n protected:\n  virtual const char *GetVertShaderSource();\n  virtual const char *GetFragShaderSource();\n  virtual const char *GetShaderName();\n};\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/play_scene.cpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#include \"play_scene.hpp\"\n\n#include <cstdio>\n\n#include \"anim.hpp\"\n#include \"ascii_to_geom.hpp\"\n#include \"data/ascii_art.inl\"\n#include \"data/cube_geom.inl\"\n#include \"data/strings.inl\"\n#include \"data/tunnel_geom.inl\"\n#include \"game_consts.hpp\"\n#include \"our_shader.hpp\"\n#include \"util.hpp\"\n#include \"welcome_scene.hpp\"\n\n#define WALL_TEXTURE_SIZE 64\n\n// colors for menus\nstatic const float MENUITEM_SEL_COLOR[] = {1.0f, 1.0f, 0.0f};\nstatic const float MENUITEM_COLOR[] = {1.0f, 1.0f, 1.0f};\n\n// obstacle colors\nstatic const float OBS_COLORS[] = {0.0f, 0.0f, 0.0f,  // style 0 (not used)\n                                   0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,\n                                   0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,\n                                   1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f};\n\nstatic const char* TONE_BONUS[] = {\n    \"d70 f150. f250. f350. f450.\", \"d70 f200. f300. f400. f500.\",\n    \"d70 f250. f350. f450. f550.\", \"d70 f300. f400. f500. f600.\",\n    \"d70 f350. f450. f550. f650.\", \"d70 f400. f500. f600. f700.\",\n    \"d70 f450. f550. f650. f750.\", \"d70 f500. f600. f700. f800.\",\n    \"d70 f550. f650. f750. f850.\"};\n\nPlayScene::PlayScene() : Scene() {\n  mOurShader = NULL;\n  mTrivialShader = NULL;\n  mTextRenderer = NULL;\n  mShapeRenderer = NULL;\n  mShipSteerX = mShipSteerZ = 0.0f;\n  mFilteredSteerX = mFilteredSteerZ = 0.0f;\n\n  mPlayerDir = glm::vec3(0.0f, 1.0f, 0.0f);  // forward\n  mDifficulty = 0;\n  mUseCloudSave = false;\n\n  mCubeGeom = NULL;\n  mTunnelGeom = NULL;\n\n  mObstacleCount = 0;\n  mFirstObstacle = 0;\n  mFirstSection = 0;\n  mSteering = STEERING_NONE;\n  mPointerId = -1;\n  mPointerAnchorX = mPointerAnchorY = 0.0f;\n\n  mWallTexture = NULL;\n\n  memset(mMenuItemText, 0, sizeof(mMenuItemText));\n  mMenuItemText[MENUITEM_UNPAUSE] = S_UNPAUSE;\n  mMenuItemText[MENUITEM_QUIT] = S_QUIT;\n  mMenuItemText[MENUITEM_START_OVER] = S_START_OVER;\n  mMenuItemText[MENUITEM_RESUME] = S_RESUME;\n\n  memset(mMenuItems, 0, sizeof(mMenuItems));\n  mMenuItemCount = 0;\n\n  mMenu = MENU_NONE;\n  mMenuSel = 0;\n\n  mSignText = NULL;\n  mSignTimeLeft = 0.0f;\n\n  mShowedHowto = false;\n  mLifeGeom = NULL;\n\n  mLives = PLAYER_LIVES;\n\n  mRollAngle = 0.0f;\n\n  mPlayerSpeed = 0.0f;\n  mBlinkingHeart = false;\n  mGameStartTime = Clock();\n\n  mBonusInARow = 0;\n  mLastCrashSection = -1;\n\n  mFrameClock.SetMaxDelta(MAX_DELTA_T);\n  mLastAmbientBeepEmitted = 0;\n  mMenuTouchActive = false;\n\n  mCheckpointSignPending = false;\n\n  SetScore(0);\n\n  /*\n   * where do I put the program???\n   */\n  const char* savePath = \"/mnt/sdcard/com.google.example.games.tunnel.fix\";\n  int len = strlen(savePath) + strlen(SAVE_FILE_NAME) + 3;\n  mSaveFileName = new char[len];\n  strcpy(mSaveFileName, savePath);\n  strcat(mSaveFileName, \"/\");\n  strcat(mSaveFileName, SAVE_FILE_NAME);\n  LOGD(\"Save file name: %s\", mSaveFileName);\n  LoadProgress();\n\n  if (mSavedCheckpoint) {\n    // start with the menu that asks whether or not to start from the saved\n    // level or start over from scratch\n    ShowMenu(MENU_LEVEL);\n  }\n}\n\nvoid PlayScene::LoadProgress() {\n  // try to load save file\n  mSavedCheckpoint = 0;\n\n  LOGD(\"Attempting to load: %s\", mSaveFileName);\n  FILE* f = fopen(mSaveFileName, \"r\");\n  bool hasLocalFile = false;\n  if (f) {\n    hasLocalFile = true;\n    LOGD(\"File found. Loading data.\");\n    if (1 != fscanf(f, \"v1 %d\", &mSavedCheckpoint)) {\n      LOGE(\"Error parsing save file.\");\n      mSavedCheckpoint = 0;\n    } else {\n      LOGD(\"Loaded. Level = %d\", mSavedCheckpoint);\n      mSavedCheckpoint =\n          (mSavedCheckpoint / LEVELS_PER_CHECKPOINT) * LEVELS_PER_CHECKPOINT;\n      LOGD(\"Normalized check-point: level %d\", mSavedCheckpoint);\n    }\n    fclose(f);\n  } else {\n    LOGD(\"Save file not present.\");\n  }\n\n  // check cloud save.\n  LOGD(\"Checking cloud save data.\");\n  if (true) {\n    LOGD(\"No cloud save available because we are not signed in.\");\n    mUseCloudSave = false;\n  }\n\n  if (mUseCloudSave && hasLocalFile) {\n    // since we're using cloud save, we can delete the local progress file\n    LOGD(\"Since we're using cloud save, deleting local progress file %s\",\n         mSaveFileName);\n    if (0 != remove(mSaveFileName)) {\n      LOGW(\"WARNING: failed to remove local progress file.\");\n    }\n  }\n\n  LOGD(\"Final decision on starting level: %d\", mSavedCheckpoint);\n  LOGD(\"Final decision on whether to use cloud: %s\",\n       mUseCloudSave ? \"USE CLOUD\" : \"DO NOT USE CLOUD (failed)\");\n}\n\nvoid PlayScene::WriteSaveFile(int level) {\n  LOGD(\"Saving progress (level %d) to file: %s\", level, mSaveFileName);\n  FILE* f = fopen(mSaveFileName, \"w\");\n  if (!f) {\n    LOGE(\"Error writing to save game file.\");\n    return;\n  }\n  fprintf(f, \"v1 %d\", level);\n  fclose(f);\n  LOGD(\"Save file written.\");\n}\n\nvoid PlayScene::SaveProgress() {\n  if (mDifficulty <= mSavedCheckpoint) {\n    // nothing to do\n    LOGD(\"No need to save level, current = %d, saved = %d\", mDifficulty,\n         mSavedCheckpoint);\n    return;\n  } else if (!IsCheckpointLevel()) {\n    LOGD(\"Current level %d is not a checkpoint level. Nothing to save.\",\n         mDifficulty);\n    return;\n  }\n\n  mSavedCheckpoint = mDifficulty;\n\n  // Save state locally or to the cloud, depending on configuration:\n  if (mUseCloudSave) {\n    LOGD(\"Saving progress to the cloud: level %d\", mDifficulty);\n    /*\n     * No where to save\n     */\n  } else {\n    LOGD(\"Saving progress to LOCAL FILE: level %d\", mDifficulty);\n    WriteSaveFile(mDifficulty);\n  }\n\n  // Show a \"checkpoint saved\" sign when possible. We don't show it right away\n  // because will already be showing the \"Level N\" sign, so we just set this\n  // flag to remind us to show it right after.\n  mCheckpointSignPending = true;\n}\n\nstatic unsigned char* _gen_wall_texture() {\n  static unsigned char pixel_data[WALL_TEXTURE_SIZE * WALL_TEXTURE_SIZE * 3];\n  unsigned char* p;\n  int x, y;\n  for (y = 0, p = pixel_data; y < WALL_TEXTURE_SIZE; y++) {\n    for (x = 0; x < WALL_TEXTURE_SIZE; x++, p += 3) {\n      p[0] = p[1] = p[2] = 128 + ((x > 2 && y > 2) ? Random(128) : 0);\n    }\n  }\n  return pixel_data;\n}\n\nvoid PlayScene::OnStartGraphics() {\n  // build shaders\n  mOurShader = new OurShader();\n  mOurShader->Compile();\n  mTrivialShader = new TrivialShader();\n  mTrivialShader->Compile();\n\n  // build projection matrix\n  UpdateProjectionMatrix();\n\n  // build tunnel geometry\n  mTunnelGeom = new SimpleGeom(\n      new VertexBuf(TUNNEL_GEOM, sizeof(TUNNEL_GEOM), TUNNEL_GEOM_STRIDE),\n      new IndexBuf(TUNNEL_GEOM_INDICES, sizeof(TUNNEL_GEOM_INDICES)));\n  mTunnelGeom->vbuf->SetColorsOffset(TUNNEL_GEOM_COLOR_OFFSET);\n  mTunnelGeom->vbuf->SetTexCoordsOffset(TUNNEL_GEOM_TEXCOORD_OFFSET);\n\n  // build cube geometry (to draw obstacles)\n  mCubeGeom = new SimpleGeom(\n      new VertexBuf(CUBE_GEOM, sizeof(CUBE_GEOM), CUBE_GEOM_STRIDE));\n  mCubeGeom->vbuf->SetColorsOffset(CUBE_GEOM_COLOR_OFFSET);\n  mCubeGeom->vbuf->SetTexCoordsOffset(CUBE_GEOM_TEXCOORD_OFFSET);\n\n  // make the wall texture\n  mWallTexture = new Texture();\n  mWallTexture->InitFromRawRGB(WALL_TEXTURE_SIZE, WALL_TEXTURE_SIZE, false,\n                               _gen_wall_texture());\n\n  // reset frame clock so the animation doesn't jump\n  mFrameClock.Reset();\n\n  // life icon geometry\n  mLifeGeom = AsciiArtToGeom(ART_LIFE, LIFE_ICON_SCALE);\n\n  // create text renderer and shape renderer\n  mTextRenderer = new TextRenderer(mTrivialShader);\n  mShapeRenderer = new ShapeRenderer(mTrivialShader);\n}\n\nvoid PlayScene::OnKillGraphics() {\n  CleanUp(&mTextRenderer);\n  CleanUp(&mShapeRenderer);\n  CleanUp(&mOurShader);\n  CleanUp(&mTrivialShader);\n  CleanUp(&mTunnelGeom);\n  CleanUp(&mCubeGeom);\n  CleanUp(&mWallTexture);\n  CleanUp(&mLifeGeom);\n}\n\nvoid PlayScene::DoFrame() {\n  float deltaT = mFrameClock.ReadDelta();\n  float previousY = mPlayerPos.y;\n\n  // clear screen\n  glClearColor(0.0, 0.0, 0.0, 1.0);\n  glEnable(GL_DEPTH_TEST);\n  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n\n  // rotate the view matrix according to current roll angle\n  glm::vec3 upVec = glm::vec3(-sin(mRollAngle), 0, cos(mRollAngle));\n\n  // set up view matrix according to player's ship position and direction\n  mViewMat = glm::lookAt(mPlayerPos, mPlayerPos + mPlayerDir, upVec);\n\n  // render tunnel walls\n  RenderTunnel();\n\n  // render obstacles\n  RenderObstacles();\n\n  if (mMenu) {\n    RenderMenu();\n    // nothing more to do\n    return;\n  }\n\n  // render HUD (lives, score, etc)\n  RenderHUD();\n\n  // deduct from the time remaining to remove a sign from the screen\n  if (mSignText && mSignExpires) {\n    mSignTimeLeft -= deltaT;\n    if (mSignTimeLeft < 0.0f) {\n      mSignText = NULL;\n    }\n  }\n\n  // if a \"saved checkpoint\" sign pending? Can we show it right now?\n  if (!mSignText && mCheckpointSignPending) {\n    mCheckpointSignPending = false;\n    ShowSign(S_CHECKPOINT_SAVED, SIGN_DURATION);\n  }\n\n  // did we already show the howto?\n  if (!mShowedHowto && mDifficulty == 0) {\n    mShowedHowto = true;\n    ShowSign(S_HOWTO_WITHOUT_JOY, SIGN_DURATION);\n  }\n\n  // deduct from the time remaining on the blinking heart animation\n  if (mBlinkingHeart && Clock() > mBlinkingHeartExpire) {\n    mBlinkingHeart = false;\n  }\n\n  // update speed\n  float targetSpeed = PLAYER_SPEED + PLAYER_SPEED_INC_PER_LEVEL * mDifficulty;\n  float accel = mPlayerSpeed >= 0.0f ? PLAYER_ACCELERATION_POSITIVE_SPEED\n                                     : PLAYER_ACCELERATION_NEGATIVE_SPEED;\n  if (mLives <= 0) {\n    targetSpeed = 0.0f;\n  }\n  mPlayerSpeed = Approach(mPlayerSpeed, targetSpeed, deltaT * accel);\n\n  // apply noise filter on steering\n  mFilteredSteerX =\n      (mFilteredSteerX * (NOISE_FILTER_SAMPLES - 1) + mShipSteerX) /\n      NOISE_FILTER_SAMPLES;\n  mFilteredSteerZ =\n      (mFilteredSteerZ * (NOISE_FILTER_SAMPLES - 1) + mShipSteerZ) /\n      NOISE_FILTER_SAMPLES;\n\n  // move player\n  if (mLives > 0) {\n    float steerX = mFilteredSteerX, steerZ = mFilteredSteerZ;\n    if (mSteering == STEERING_TOUCH) {\n      // touch steering\n      mPlayerPos.x =\n          Approach(mPlayerPos.x, steerX, PLAYER_MAX_LAT_SPEED * deltaT);\n      mPlayerPos.z =\n          Approach(mPlayerPos.z, steerZ, PLAYER_MAX_LAT_SPEED * deltaT);\n    } else if (mSteering == STEERING_JOY) {\n      // joystick steering\n      mPlayerPos.x += deltaT * steerX;\n      mPlayerPos.z += deltaT * steerZ;\n    }\n  }\n  mPlayerPos.y += deltaT * mPlayerSpeed;\n\n  // make sure player didn't leave tunnel\n  mPlayerPos.x = Clamp(mPlayerPos.x, PLAYER_MIN_X, PLAYER_MAX_X);\n  mPlayerPos.z = Clamp(mPlayerPos.z, PLAYER_MIN_Z, PLAYER_MAX_Z);\n\n  // shift sections if needed\n  ShiftIfNeeded();\n\n  // generate more obstacles!\n  GenObstacles();\n\n  // detect collisions\n  DetectCollisions(previousY);\n\n  // update ship's roll speed according to level\n  static float roll_speeds[] = ROLL_SPEEDS;\n  int count = sizeof(roll_speeds) / sizeof(float);\n  float speed = roll_speeds[mDifficulty % count];\n  mRollAngle += deltaT * speed;\n  while (mRollAngle < 0) {\n    mRollAngle += 2 * M_PI;\n  }\n  while (mRollAngle > 2 * M_PI) {\n    mRollAngle -= 2 * M_PI;\n  }\n\n  // did the game expire?\n  if (mLives <= 0 && Clock() > mGameOverExpire) {\n    SceneManager::GetInstance()->RequestNewScene(new WelcomeScene());\n  }\n\n  // produce the ambient sound\n  int soundPoint = (int)floor(mPlayerPos.y / (TUNNEL_SECTION_LENGTH / 3));\n  if (soundPoint % 3 != 0 && soundPoint > mLastAmbientBeepEmitted) {\n    mLastAmbientBeepEmitted = soundPoint;\n    SfxMan::GetInstance()->PlayTone(soundPoint % 2 ? TONE_AMBIENT_0\n                                                   : TONE_AMBIENT_1);\n  }\n}\n\nstatic float GetSectionCenterY(int i) {\n  return (float)i * TUNNEL_SECTION_LENGTH;\n}\n\nstatic float GetSectionEndY(int i) {\n  return GetSectionCenterY(i) + 0.5f * TUNNEL_SECTION_LENGTH;\n}\n\nstatic void _get_obs_color(int style, float* r, float* g, float* b) {\n  style = Clamp(style, 1, 6);\n  *r = OBS_COLORS[style * 3];\n  *g = OBS_COLORS[style * 3 + 1];\n  *b = OBS_COLORS[style * 3 + 2];\n}\n\nvoid PlayScene::RenderTunnel() {\n  glm::mat4 modelMat;\n  glm::mat4 mvpMat;\n  int i, oi;\n\n  mOurShader->BeginRender(mTunnelGeom->vbuf);\n  mOurShader->SetTexture(mWallTexture);\n  for (i = mFirstSection, oi = 0;\n       i <= mFirstSection + RENDER_TUNNEL_SECTION_COUNT; ++i, ++oi) {\n    float segCenterY = GetSectionCenterY(i);\n    modelMat = glm::translate(glm::mat4(1.0), glm::vec3(0.0, segCenterY, 0.0));\n    mvpMat = mProjMat * mViewMat * modelMat;\n\n    Obstacle* o = oi >= mObstacleCount ? NULL : GetObstacleAt(oi);\n\n    // the point light is given in model coordinates, which is 0,0,0 is ok\n    // (center of tunnel section)\n    if (o) {\n      float red, green, blue;\n      _get_obs_color(o->style, &red, &green, &blue);\n      mOurShader->EnablePointLight(glm::vec3(0.0, 0.0f, 0.0f), red, green,\n                                   blue);\n    } else {\n      mOurShader->DisablePointLight();\n    }\n\n    // render tunnel section\n    mOurShader->Render(mTunnelGeom->ibuf, &mvpMat);\n  }\n  mOurShader->EndRender();\n}\n\nvoid PlayScene::RenderObstacles() {\n  int i;\n  int r, c;\n  float red, green, blue;\n  glm::mat4 modelMat;\n  glm::mat4 mvpMat;\n\n  mOurShader->BeginRender(mCubeGeom->vbuf);\n  mOurShader->SetTexture(mWallTexture);\n\n  for (i = 0; i < mObstacleCount; i++) {\n    Obstacle* o = GetObstacleAt(i);\n    float posY = GetSectionCenterY(mFirstSection + i);\n\n    if (o->style == Obstacle::STYLE_NULL) {\n      // don't render null obstacles\n      continue;\n    }\n\n    for (r = 0; r < OBS_GRID_SIZE; r++) {\n      for (c = 0; c < OBS_GRID_SIZE; c++) {\n        bool isBonus = r == o->bonusRow && c == o->bonusCol;\n        if (o->grid[c][r]) {\n          // set up matrices\n          modelMat =\n              glm::translate(glm::mat4(1.0f), o->GetBoxCenter(c, r, posY));\n          modelMat = glm::scale(modelMat, o->GetBoxSize());\n          mvpMat = mProjMat * mViewMat * modelMat;\n\n          // set up color\n          _get_obs_color(o->style, &red, &green, &blue);\n          mOurShader->SetTintColor(red, green, blue);\n\n          // render box\n          mOurShader->Render(&mvpMat);\n        } else if (isBonus) {\n          modelMat =\n              glm::translate(glm::mat4(1.0f), o->GetBoxCenter(c, r, posY));\n          modelMat = glm::scale(\n              modelMat,\n              glm::vec3(OBS_BONUS_SIZE, OBS_BONUS_SIZE, OBS_BONUS_SIZE));\n          modelMat = glm::rotate(modelMat, Clock() * 90.0f,\n                                 glm::vec3(0.0f, 0.0f, 1.0f));\n          mvpMat = mProjMat * mViewMat * modelMat;\n          mOurShader->SetTintColor(\n              SineWave(0.8f, 1.0f, 0.5f, 0.0f),\n              SineWave(0.8f, 1.0f, 0.5f, 0.0f),\n              SineWave(0.8f, 1.0f, 0.5f, 0.0f));  // shimmering color\n          mOurShader->Render(&mvpMat);            // render\n        }\n      }\n    }\n  }\n  mOurShader->EndRender();\n}\n\nvoid PlayScene::GenObstacles() {\n  while (mObstacleCount < MAX_OBS) {\n    // generate a new obstacle\n    int index = (mFirstObstacle + mObstacleCount) % MAX_OBS;\n\n    int section = mFirstSection + mObstacleCount;\n    if (section < OBS_START_SECTION) {\n      // generate an empty obstacle\n      mObstacleCircBuf[index].Reset();\n      mObstacleCircBuf[index].style = Obstacle::STYLE_NULL;\n    } else {\n      // generate a normal obstacle\n      mObstacleGen.Generate(&mObstacleCircBuf[index]);\n    }\n    mObstacleCount++;\n  }\n}\n\nvoid PlayScene::ShiftIfNeeded() {\n  // is it time to discard a section and shift forward?\n  while (mPlayerPos.y > GetSectionEndY(mFirstSection) + SHIFT_THRESH) {\n    // shift to the next turnnel section\n    mFirstSection++;\n\n    // discard obstacle corresponding to the deleted section\n    if (mObstacleCount > 0) {\n      // discarding first object (shifting) is easy because it's a circular\n      // buffer!\n      mFirstObstacle = (mFirstObstacle + 1) % MAX_OBS;\n      --mObstacleCount;\n    }\n  }\n}\n\nvoid PlayScene::UpdateMenuSelFromTouch(float, float y) {\n  // The main menu doesn't go through this code, only the pause menu and game\n  // load menus do. Each only has two buttons (\"Resume\" and \"Quit\" or \"Start\n  // over\" and \"Start from checkpoint\"), listed vertically. This code doesn't\n  // bother trying to precisely determine which button was hit, only which half\n  // of the screen was pushed.\n  float sh = SceneManager::GetInstance()->GetScreenHeight();\n  int item = (int)floor((y / sh) * (mMenuItemCount));\n  mMenuSel = Clamp(item, 0, mMenuItemCount - 1);\n}\n\nvoid PlayScene::OnPointerDown(int pointerId,\n                              const struct PointerCoords* coords) {\n  float x = coords->x, y = coords->y;\n  if (mMenu) {\n    if (coords->isScreen) {\n      UpdateMenuSelFromTouch(x, y);\n      mMenuTouchActive = true;\n    }\n  } else if (mSteering != STEERING_TOUCH) {\n    mPointerId = pointerId;\n    mPointerAnchorX = x;\n    mPointerAnchorY = y;\n    mShipAnchorX = mPlayerPos.x;\n    mShipAnchorZ = mPlayerPos.z;\n    mSteering = STEERING_TOUCH;\n  }\n}\n\nvoid PlayScene::OnPointerUp(int pointerId, const struct PointerCoords* coords) {\n  if (mMenu && mMenuTouchActive) {\n    if (coords->isScreen) {\n      mMenuTouchActive = false;\n      HandleMenu(mMenuItems[mMenuSel]);\n    }\n  } else if (mSteering == STEERING_TOUCH && pointerId == mPointerId) {\n    mSteering = STEERING_NONE;\n  }\n}\n\nvoid PlayScene::OnPointerMove(int pointerId,\n                              const struct PointerCoords* coords) {\n  float rangeY = coords->isScreen\n                     ? SceneManager::GetInstance()->GetScreenHeight()\n                     : (coords->maxY - coords->minY);\n  float x = coords->x, y = coords->y;\n\n  if (mMenu && mMenuTouchActive) {\n    UpdateMenuSelFromTouch(x, y);\n  } else if (mSteering == STEERING_TOUCH && pointerId == mPointerId) {\n    float deltaX = (x - mPointerAnchorX) * TOUCH_CONTROL_SENSIVITY / rangeY;\n    float deltaY = -(y - mPointerAnchorY) * TOUCH_CONTROL_SENSIVITY / rangeY;\n    float rotatedDx = cos(mRollAngle) * deltaX - sin(mRollAngle) * deltaY;\n    float rotatedDy = sin(mRollAngle) * deltaX + cos(mRollAngle) * deltaY;\n\n    mShipSteerX = mShipAnchorX + rotatedDx;\n    mShipSteerZ = mShipAnchorZ + rotatedDy;\n  }\n}\n\nvoid PlayScene::RenderHUD() {\n  float aspect = SceneManager::GetInstance()->GetScreenAspect();\n  glm::mat4 orthoMat = glm::ortho(0.0f, aspect, 0.0f, 1.0f);\n  glm::mat4 modelMat;\n  glm::mat4 mat;\n\n  glDisable(GL_DEPTH_TEST);\n\n  // render score digits\n  int i, unit;\n  static char score_str[6];\n  int score = GetScore();\n  for (i = 0, unit = 10000; i < 5; i++, unit /= 10) {\n    score_str[i] = '0' + (score / unit) % 10;\n  }\n  score_str[i] = '\\0';\n\n  mTextRenderer->SetFontScale(SCORE_FONT_SCALE);\n  mTextRenderer->RenderText(score_str, SCORE_POS_X, SCORE_POS_Y);\n\n  // render current sign\n  if (mSignText) {\n    modelMat = glm::mat4(1.0f);\n    float t = Clock() - mSignStartTime;\n    if (t < SIGN_ANIM_DUR) {\n      float scale = t / SIGN_ANIM_DUR;\n      modelMat = glm::scale(modelMat, glm::vec3(1.0f, scale, 1.0f));\n    } else if (mSignTimeLeft < SIGN_ANIM_DUR) {\n      float scale = mSignTimeLeft / SIGN_ANIM_DUR;\n      modelMat = glm::scale(modelMat, glm::vec3(1.0f, scale, 1.0f));\n    }\n\n    mTextRenderer->SetMatrix(modelMat);\n    mTextRenderer->SetFontScale(SIGN_FONT_SCALE);\n    mTextRenderer->RenderText(mSignText, aspect * 0.5f, 0.5f);\n    mTextRenderer->ResetMatrix();\n  }\n\n  // render life icons\n  glLineWidth(LIFE_LINE_WIDTH);\n  float lifeX = LIFE_POS_X < 0.0f ? aspect + LIFE_POS_X : LIFE_POS_X;\n  modelMat = glm::translate(glm::mat4(1.0), glm::vec3(lifeX, LIFE_POS_Y, 0.0f));\n  modelMat = glm::scale(modelMat, glm::vec3(1.0f, LIFE_SCALE_Y, 1.0f));\n  int ubound = (mBlinkingHeart && BlinkFunc(0.2f)) ? mLives + 1 : mLives;\n  for (int i = 0; i < ubound; i++) {\n    mat = orthoMat * modelMat;\n    mTrivialShader->RenderSimpleGeom(&mat, mLifeGeom);\n    modelMat = glm::translate(modelMat, glm::vec3(LIFE_SPACING_X, 0.0f, 0.0f));\n  }\n\n  glEnable(GL_DEPTH_TEST);\n}\n\nvoid PlayScene::RenderMenu() {\n  float aspect = SceneManager::GetInstance()->GetScreenAspect();\n  glm::mat4 modelMat;\n  glm::mat4 mat;\n\n  glDisable(GL_DEPTH_TEST);\n\n  RenderBackgroundAnimation(mShapeRenderer);\n\n  float scaleFactor =\n      SineWave(1.0f, MENUITEM_PULSE_AMOUNT, MENUITEM_PULSE_PERIOD, 0.0f);\n\n  int i;\n  for (i = 0; i < mMenuItemCount; i++) {\n    float thisFactor = (mMenuSel == i) ? scaleFactor : 1.0f;\n    float y = 1.0f - (i + 1) / ((float)mMenuItemCount + 1);\n    float x = aspect * 0.5f;\n    mTextRenderer->SetFontScale(thisFactor * MENUITEM_FONT_SCALE);\n    mTextRenderer->SetColor(mMenuSel == i ? MENUITEM_SEL_COLOR\n                                          : MENUITEM_COLOR);\n    mTextRenderer->RenderText(mMenuItemText[mMenuItems[i]], x, y);\n  }\n  mTextRenderer->ResetColor();\n\n  glEnable(GL_DEPTH_TEST);\n}\n\nvoid PlayScene::DetectCollisions(float previousY) {\n  Obstacle* o = GetObstacleAt(0);\n  float obsCenter = GetSectionCenterY(mFirstSection);\n  float obsMin = obsCenter - OBS_BOX_SIZE;\n  float curY = mPlayerPos.y;\n\n  if (!o || !(previousY < obsMin && curY >= obsMin)) {\n    // no collision\n    return;\n  }\n\n  // what row/column is the player on?\n  int col = o->GetColAt(mPlayerPos.x);\n  int row = o->GetRowAt(mPlayerPos.z);\n\n  if (o->grid[col][row]) {\n    // crashed against obstacle\n    mLives--;\n    if (mLives > 0) {\n      ShowSign(S_OUCH, SIGN_DURATION);\n      SfxMan::GetInstance()->PlayTone(TONE_CRASHED);\n    } else {\n      // say \"Game Over\"\n      ShowSign(S_GAME_OVER, SIGN_DURATION_GAME_OVER);\n      SfxMan::GetInstance()->PlayTone(TONE_GAME_OVER);\n      mGameOverExpire = Clock() + GAME_OVER_EXPIRE;\n    }\n    mPlayerPos.y = obsMin - PLAYER_RECEDE_AFTER_COLLISION;\n    mPlayerSpeed = PLAYER_SPEED_AFTER_COLLISION;\n    mBlinkingHeart = true;\n    mBlinkingHeartExpire = Clock() + BLINKING_HEART_DURATION;\n\n    mLastCrashSection = mFirstSection;\n\n  } else if (row == o->bonusRow && col == o->bonusCol) {\n    ShowSign(S_GOT_BONUS, SIGN_DURATION_BONUS);\n    o->DeleteBonus();\n    AddScore(BONUS_POINTS);\n    mBonusInARow++;\n\n    if (mBonusInARow >= 10) {\n      mBonusInARow = 0;\n    }\n\n    // update difficulty level, if applicable\n    int score = GetScore();\n    if (mDifficulty < score / SCORE_PER_LEVEL) {\n      mDifficulty = score / SCORE_PER_LEVEL;\n      ShowLevelSign();\n      mObstacleGen.SetDifficulty(mDifficulty);\n      SfxMan::GetInstance()->PlayTone(TONE_LEVEL_UP);\n\n      // save progress, if needed\n      SaveProgress();\n    } else {\n      int tone = (score % SCORE_PER_LEVEL) / BONUS_POINTS - 1;\n      tone = tone < 0 ? 0\n             : tone >= static_cast<int>(sizeof(TONE_BONUS) / sizeof(char*))\n                 ? static_cast<int>(sizeof(TONE_BONUS) / sizeof(char*) - 1)\n                 : tone;\n      SfxMan::GetInstance()->PlayTone(TONE_BONUS[tone]);\n    }\n\n  } else if (o->HasBonus()) {\n    // player missed bonus!\n    mBonusInARow = 0;\n  }\n\n  // was it a close call?\n  if (!o->grid[col][row]) {\n    bool isCloseCall = false;\n    for (int i = -1; i <= 1 && !isCloseCall; i++) {\n      for (int j = -1; j <= 1; j++) {\n        int other_row = o->GetColAt(mPlayerPos.x + i * CLOSE_CALL_CALC_DELTA);\n        int other_col = o->GetRowAt(mPlayerPos.z + j * CLOSE_CALL_CALC_DELTA);\n        if (o->grid[other_col][other_row]) {\n          isCloseCall = true;\n          break;\n        }\n      }\n    }\n  }\n}\n\nbool PlayScene::OnBackKeyPressed() {\n  if (mMenu) {\n    // reset frame clock so that the animation doesn't jump:\n    mFrameClock.Reset();\n\n    // leave menu\n    ShowMenu(MENU_NONE);\n  } else {\n    // enter pause menu\n    ShowMenu(MENU_PAUSE);\n  }\n  return true;\n}\n\nvoid PlayScene::OnJoy(float joyX, float joyY) {\n  if (!mSteering || mSteering == STEERING_JOY) {\n    float deltaX = joyX * JOYSTICK_CONTROL_SENSIVITY;\n    float deltaY = joyY * JOYSTICK_CONTROL_SENSIVITY;\n    float rotatedDx = cos(-mRollAngle) * deltaX - sin(-mRollAngle) * deltaY;\n    float rotatedDy = sin(-mRollAngle) * deltaX + cos(-mRollAngle) * deltaY;\n    mShipSteerX = rotatedDx;\n    mShipSteerZ = -rotatedDy;\n    mSteering = STEERING_JOY;\n\n    // If player is going faster than the reference speed, PLAYER_SPEED, adjust\n    // it. This makes the steering react faster as the ship accelerates in more\n    // difficult levels.\n    if (mPlayerSpeed > PLAYER_SPEED) {\n      mShipSteerX *= mPlayerSpeed / PLAYER_SPEED;\n      mShipSteerZ *= mPlayerSpeed / PLAYER_SPEED;\n    }\n  }\n}\n\nvoid PlayScene::OnKeyDown(int keyCode) {\n  if (mMenu) {\n    if (keyCode == OURKEY_UP) {\n      mMenuSel = mMenuSel > 0 ? mMenuSel - 1 : mMenuSel;\n    } else if (keyCode == OURKEY_DOWN) {\n      mMenuSel = mMenuSel + 1 < mMenuItemCount ? mMenuSel + 1 : mMenuSel;\n    } else if (keyCode == OURKEY_ENTER) {\n      HandleMenu(mMenuItems[mMenuSel]);\n    }\n  }\n}\n\nvoid PlayScene::ShowMenu(int menu) {\n  mMenu = menu;\n  mMenuSel = 0;\n  switch (menu) {\n    case MENU_PAUSE:\n      mMenuItems[0] = MENUITEM_UNPAUSE;\n      mMenuItems[1] = MENUITEM_QUIT;\n      mMenuItemCount = 2;\n      break;\n    case MENU_LEVEL:\n      mMenuItems[0] = MENUITEM_RESUME;\n      mMenuItems[1] = MENUITEM_START_OVER;\n      mMenuItemCount = 2;\n      break;\n    default:\n      // since we're leaving the menu, reset the frame clock to avoid a skip\n      // in the animation\n      mFrameClock.Reset();\n  }\n}\n\nvoid PlayScene::HandleMenu(int menuItem) {\n  switch (menuItem) {\n    case MENUITEM_QUIT:\n      SceneManager::GetInstance()->RequestNewScene(new WelcomeScene());\n      break;\n    case MENUITEM_UNPAUSE:\n      ShowMenu(MENU_NONE);\n      break;\n    case MENUITEM_RESUME:\n      // resume from saved level\n      mDifficulty =\n          (mSavedCheckpoint / LEVELS_PER_CHECKPOINT) * LEVELS_PER_CHECKPOINT;\n      SetScore(SCORE_PER_LEVEL * mDifficulty);\n      mObstacleGen.SetDifficulty(mDifficulty);\n      ShowLevelSign();\n      ShowMenu(MENU_NONE);\n      break;\n    case MENUITEM_START_OVER:\n      // start over from scratch\n      ShowMenu(MENU_NONE);\n      break;\n  }\n}\n\nvoid PlayScene::ShowLevelSign() {\n  static char level_str[] = \"LEVEL XX\";\n  int level = mDifficulty + 1;\n  level_str[6] = '0' + ((level > 9) ? (level / 10) % 10 : level % 10);\n  level_str[7] = (level > 9) ? ('0' + level % 10) : '\\0';\n  level_str[8] = '\\0';\n  ShowSign(level_str, SIGN_DURATION);\n}\n\nvoid PlayScene::OnPause() {\n  if (mMenu == MENU_NONE) {\n    ShowMenu(MENU_PAUSE);\n  }\n}\n\nvoid PlayScene::OnScreenResized(int, int) { UpdateProjectionMatrix(); }\n\nvoid PlayScene::UpdateProjectionMatrix() {\n  SceneManager* mgr = SceneManager::GetInstance();\n  mProjMat = glm::perspective(RENDER_FOV, mgr->GetScreenAspect(),\n                              RENDER_NEAR_CLIP, RENDER_FAR_CLIP);\n}\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/play_scene.hpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef endlesstunnel_play_scene_h\n#define endlesstunnel_play_scene_h\n\n#include \"engine.hpp\"\n#include \"obstacle.hpp\"\n#include \"obstacle_generator.hpp\"\n#include \"sfxman.hpp\"\n#include \"shape_renderer.hpp\"\n#include \"text_renderer.hpp\"\n#include \"util.hpp\"\n\nclass OurShader;\n\n/* This is the gameplay scene -- the scene that shows the player flying down\n * the infinite tunnel, dodging obstacles, collecting bonuses and being awesome.\n */\nclass PlayScene : public Scene {\n public:\n  PlayScene();\n  virtual void OnStartGraphics();\n  virtual void OnKillGraphics();\n  virtual void DoFrame();\n  virtual void OnPointerDown(int pointerId, const struct PointerCoords *coords);\n  virtual void OnPointerUp(int pointerId, const struct PointerCoords *coords);\n  virtual void OnPointerMove(int pointerId, const struct PointerCoords *coords);\n  virtual bool OnBackKeyPressed();\n  virtual void OnScreenResized(int width, int height);\n  virtual void OnJoy(float joyX, float joyY);\n  virtual void OnKeyDown(int keyCode);\n  virtual void OnPause();\n\n protected:\n  // shaders\n  OurShader *mOurShader;\n  TrivialShader *mTrivialShader;\n\n  // the wall texture\n  Texture *mWallTexture;\n\n  // shape and text renderers we use when rendering the HUD\n  ShapeRenderer *mShapeRenderer;\n  TextRenderer *mTextRenderer;\n\n  // matrices\n  glm::mat4 mViewMat, mProjMat;\n\n  // player's position and direction\n  glm::vec3 mPlayerPos, mPlayerDir;\n\n  // lives left\n  int mLives;\n\n  // player's score. As a trivial form of protection (just to give crackers a\n  // hard time), we *actually* store the score encrypted in mEncryptedScore, but\n  // have a fake variable mFakeScore that stores a copy of it. This serves as a\n  // honeypot to an attacker who's trying to crack the game using a memory\n  // editor.\n  unsigned mFakeScore;\n  unsigned mEncryptedScore;\n\n  // current difficulty level\n  int mDifficulty;\n\n  // should we use cloud save? If not, we will save progress to local data only.\n  bool mUseCloudSave;\n\n  // greatest checkpoint level attained by player (loaded from file)\n  int mSavedCheckpoint;\n\n  // vertex buffer and index buffer to render tunnel\n  SimpleGeom *mTunnelGeom;\n\n  // vertex buffer to render obstacles\n  SimpleGeom *mCubeGeom;\n\n  // what is the first tunnel section that we are rendering\n  int mFirstSection;\n\n  // circular buffer of obstacles (mObstacleCircBuf[mFirstObstacle...])\n  // There is exactly one obstacle for each tunnel section:\n  // obstacle 0 is at section mFirstSection\n  // obstacle 1 is at section mFirstSection + 1\n  // and so on and so forth.\n  static const int MAX_OBS = RENDER_TUNNEL_SECTION_COUNT * 2;\n  int mFirstObstacle;\n  int mObstacleCount;\n  Obstacle mObstacleCircBuf[MAX_OBS];\n\n  // obstacle generator\n  ObstacleGenerator mObstacleGen;\n\n  // touch pointer ID and anchor position (where touch started)\n  static const int STEERING_NONE = 0, STEERING_TOUCH = 1, STEERING_JOY = 2;\n  int mSteering;   // is player steering at the moment? If so, how?\n  int mPointerId;  // if so, what's the pointer ID\n  float mPointerAnchorX, mPointerAnchorY;  // where the drag started\n  float mShipAnchorX, mShipAnchorZ;        // x,z of ship when drag started\n  float mShipSteerX,\n      mShipSteerZ;  // target x,z of ship (when using touch control) or\n                    // velocity vector (when using joystick)\n\n  // moving average filter for input (on mShipSteerX and mShipSteerY)\n  static const int NOISE_FILTER_SAMPLES = 5;\n  float mFilteredSteerX, mFilteredSteerZ;\n\n  // frame clock -- it computes the deltas between successive frames so we can\n  // update stuff properly\n  DeltaClock mFrameClock;\n\n  // sign (string) that we're currently showing (NULL if none)\n  const char *mSignText;\n  bool mSignExpires;     // does the sign expire after a while?\n  float mSignTimeLeft;   // for how much longer the sign will still be on screen\n  float mSignStartTime;  // time when sign was shown\n\n  // did we already show the instructions?\n  bool mShowedHowto;\n\n  // are we showing a menu? If so, what menu?\n  static const int MENU_NONE = 0;\n  static const int MENU_PAUSE = 1;  // pause menu\n  static const int MENU_LEVEL = 2;  // select starting level\n  int mMenu;\n\n  // identifiers for each menu item\n  static const int MENUITEM_UNPAUSE = 0;\n  static const int MENUITEM_QUIT = 1;\n  static const int MENUITEM_START_OVER = 2;\n  static const int MENUITEM_RESUME = 3;\n  static const int MENUITEM_COUNT = 4;\n\n  // text for each menu item\n  const char *mMenuItemText[MENUITEM_COUNT];\n\n  // menu items on current menu\n  static const int MENUITEMS_MAX = 4;\n  int mMenuItems[MENUITEMS_MAX];\n  int mMenuItemCount;  // # of menu items\n  int mMenuSel;        // index of selected menu item\n\n  // is user touching the screen to select menu? are they using the buttons?\n  bool mMenuTouchActive;\n\n  // heart geom (to display # lives)\n  SimpleGeom *mLifeGeom;\n\n  // current roll angle, in degrees, counterclockwise from original\n  float mRollAngle;\n\n  // current speed\n  float mPlayerSpeed;\n\n  // are we showing the \"just lost a heart\" animation? If so, when does it\n  // expire?\n  bool mBlinkingHeart;\n  float mBlinkingHeartExpire;\n\n  // when should the game expire? This will be set after the game is over\n  // (mLives <= 0) and indicates when we should return to the main screen\n  float mGameOverExpire;\n\n  // time when game started\n  float mGameStartTime;\n\n  // how many bonuses were collected without missing one?\n  int mBonusInARow;\n\n  // what was the section number of the last obstacle with which the player\n  // crashed?\n  int mLastCrashSection;\n\n  // last subsection were an ambient sound was emitted\n  int mLastAmbientBeepEmitted;\n\n  // name of the save file\n  char *mSaveFileName;\n\n  // pending to show a \"checkpoint saved\" sign?\n  bool mCheckpointSignPending;\n\n  // get current score\n  int GetScore() { return (int)(mEncryptedScore ^ 0x600673); }\n\n  // set current score\n  void SetScore(int s) {\n    mFakeScore = (unsigned)s;\n    mEncryptedScore = mFakeScore ^ 0x600673;\n  }\n\n  // add to current score\n  void AddScore(int s) { SetScore(GetScore() + s); }\n\n  // generate new obstacles as needed\n  void GenObstacles();\n\n  // renders the tunnel walls\n  void RenderTunnel();\n\n  // renders the obstacles\n  void RenderObstacles();\n\n  // renders the HUD (score, lives, etc)\n  void RenderHUD();\n\n  // renders the currently active menu\n  void RenderMenu();\n\n  // Shift tunnel sections if needed (this means discarding the ones the\n  // player has already past and generating the obstacles for the new ones\n  // that came into view)\n  void ShiftIfNeeded();\n\n  // detect if the player hit obstacles or got the bonus\n  void DetectCollisions(float previousY);\n\n  // shows a text sign on the middle of the screen\n  void ShowSign(const char *sign, float timeout) {\n    mSignTimeLeft = timeout;\n    mSignText = sign;\n    mSignExpires = true;\n    mSignStartTime = Clock();\n  }\n  void ShowSign(const char *sign) {\n    mSignText = sign;\n    mSignExpires = false;\n    mSignStartTime = Clock();\n  }\n  Obstacle *GetObstacleAt(int i) {\n    return &mObstacleCircBuf[(mFirstObstacle + i) % MAX_OBS];\n  }\n\n  // shows the given menu\n  void ShowMenu(int menu);\n\n  // handle the fact that the given menu item was selected\n  void HandleMenu(int menuItem);\n\n  // updates which menu item is selected based on where the screen was touched\n  void UpdateMenuSelFromTouch(float x, float y);\n\n  // writes to the local save file\n  void WriteSaveFile(int level);\n\n  // loads progress from the local save file and/or cloudsave\n  void LoadProgress();\n\n  // saves progress to the local save file and/or cloudsave\n  void SaveProgress();\n\n  // returns whether or not this level is a \"checkpoint level\" (that is,\n  // where progress should be saved)\n  bool IsCheckpointLevel() { return 0 == mDifficulty % LEVELS_PER_CHECKPOINT; }\n\n  // shows the sign that tells the player they've reached a new level.\n  // (like \"LEVEL 5\").\n  void ShowLevelSign();\n\n  // update projection matrix\n  void UpdateProjectionMatrix();\n};\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/scene.cpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#include \"scene.hpp\"\n\n// These are all stubs. Subclasses should override to implement their\n// specific functionality.\n\nvoid Scene::OnInstall() {}\nvoid Scene::DoFrame() {}\nvoid Scene::OnUninstall() {}\nvoid Scene::OnStartGraphics() {}\nvoid Scene::OnKillGraphics() {}\nvoid Scene::OnPointerDown(int, const struct PointerCoords*) {}\nvoid Scene::OnPointerUp(int, const struct PointerCoords*) {}\nvoid Scene::OnPointerMove(int, const struct PointerCoords*) {}\nbool Scene::OnBackKeyPressed() { return false; }\nvoid Scene::OnKeyDown(int) {}\nvoid Scene::OnKeyUp(int) {}\nvoid Scene::OnJoy(float, float) {}\nvoid Scene::OnScreenResized(int, int) {}\nvoid Scene::OnPause() {}\nvoid Scene::OnResume() {}\nScene::~Scene() {}\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/scene.hpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef endlesstunnel_scene_hpp\n#define endlesstunnel_scene_hpp\n\nstruct PointerCoords;\n\n/* Represents a scene. A scene is an object that knows how to render itself to\n * the screen and knows how to react to input. At any moment in the game,\n * exactly one scene is active, and that scene is the one who decides what gets\n * drawn to the screen and how input is handled. See also: SceneManager */\nclass Scene {\n public:\n  // Called when graphics context is initialized. This is when textures,\n  // geometry, etc should be initialized.\n  virtual void OnStartGraphics();\n\n  // Called when the graphics context is about to be shut down. Tear down\n  // all geometry, textures, etc.\n  virtual void OnKillGraphics();\n\n  // Called when this scene has just been installed as the active scene.\n  virtual void OnInstall();\n\n  // Called when it's time to draw a frame to the screen.\n  virtual void DoFrame();\n\n  // Called when this scene is about to be uninstalled as the active scene.\n  virtual void OnUninstall();\n\n  // Called when a pointer goes down (e.g. touch, touchpad, etc)\n  virtual void OnPointerDown(int pointerId, const struct PointerCoords *coords);\n\n  // Called when a pointer goes up (e.g. touch, touchpad, etc)\n  virtual void OnPointerUp(int pointerId, const struct PointerCoords *coords);\n\n  // Called when a pointer moves (e.g. touch, touchpad, etc)\n  virtual void OnPointerMove(int pointerId, const struct PointerCoords *coords);\n\n  // Called when the device's back key is pressed\n  virtual bool OnBackKeyPressed();\n\n  // Called when a key goes down\n  virtual void OnKeyDown(int ourKeyCode);\n\n  // Called when a key goes up\n  virtual void OnKeyUp(int ourKeyCode);\n\n  // Called when there is joystick input. joyX and joyY are in the range\n  // [-1.0,1.0].\n  virtual void OnJoy(float joyX, float joyY);\n\n  // Called when screen gets resized\n  virtual void OnScreenResized(int width, int height);\n\n  // Called when game is paused (e.g. onPause())\n  virtual void OnPause();\n\n  // Called when game is resumed (e.g. onResumed())\n  virtual void OnResume();\n\n  // Destructor\n  virtual ~Scene();\n};\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/scene_manager.cpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#include \"scene_manager.hpp\"\n\n#include \"common.hpp\"\n#include \"scene.hpp\"\n\nstatic SceneManager _sceneManager;\n\nSceneManager::SceneManager() {\n  mCurScene = NULL;\n\n  // start with non-bogus (though not accurate) values\n  mScreenWidth = 320;\n  mScreenHeight = 240;\n\n  mSceneToInstall = NULL;\n\n  mHasGraphics = false;\n}\n\nvoid SceneManager::RequestNewScene(Scene* newScene) {\n  LOGD(\"SceneManager: requesting new scene %p\", newScene);\n  mSceneToInstall = newScene;\n}\n\nvoid SceneManager::InstallScene(Scene* newScene) {\n  LOGD(\"SceneManager: installing scene %p.\", newScene);\n\n  // kill graphics, if we have them.\n  bool hadGraphics = mHasGraphics;\n  if (mHasGraphics) {\n    KillGraphics();\n  }\n\n  // If we have an existing scene, uninstall it.\n  if (mCurScene) {\n    mCurScene->OnUninstall();\n    delete mCurScene;\n    mCurScene = NULL;\n  }\n\n  // install the new scene\n  mCurScene = newScene;\n  if (mCurScene) {\n    mCurScene->OnInstall();\n  }\n\n  // if we had graphics before, start them again.\n  if (hadGraphics) {\n    StartGraphics();\n  }\n}\n\nScene* SceneManager::GetScene() { return mCurScene; }\n\nvoid SceneManager::DoFrame() {\n  if (mSceneToInstall) {\n    InstallScene(mSceneToInstall);\n    mSceneToInstall = NULL;\n  }\n\n  if (mHasGraphics && mCurScene) {\n    mCurScene->DoFrame();\n  }\n}\n\nvoid SceneManager::KillGraphics() {\n  if (mHasGraphics) {\n    LOGD(\"SceneManager: killing graphics.\");\n    mHasGraphics = false;\n    if (mCurScene) {\n      mCurScene->OnKillGraphics();\n    }\n  }\n}\n\nvoid SceneManager::StartGraphics() {\n  if (!mHasGraphics) {\n    LOGD(\"SceneManager: starting graphics.\");\n    mHasGraphics = true;\n    if (mCurScene) {\n      LOGD(\"SceneManager: calling mCurScene->OnStartGraphics.\");\n      mCurScene->OnStartGraphics();\n    }\n  }\n}\n\nvoid SceneManager::SetScreenSize(int width, int height) {\n  if (mScreenWidth != width || mScreenHeight != height) {\n    mScreenWidth = width;\n    mScreenHeight = height;\n\n    if (mCurScene && mHasGraphics) {\n      mCurScene->OnScreenResized(width, height);\n    }\n  }\n}\n\nSceneManager* SceneManager::GetInstance() { return &_sceneManager; }\n\nvoid SceneManager::OnPointerDown(int pointerId,\n                                 const struct PointerCoords* coords) {\n  if (mHasGraphics && mCurScene) {\n    mCurScene->OnPointerDown(pointerId, coords);\n  }\n}\n\nvoid SceneManager::OnPointerUp(int pointerId,\n                               const struct PointerCoords* coords) {\n  if (mHasGraphics && mCurScene) {\n    mCurScene->OnPointerUp(pointerId, coords);\n  }\n}\n\nvoid SceneManager::OnPointerMove(int pointerId,\n                                 const struct PointerCoords* coords) {\n  if (mHasGraphics && mCurScene) {\n    mCurScene->OnPointerMove(pointerId, coords);\n  }\n}\n\nbool SceneManager::OnBackKeyPressed() {\n  if (mHasGraphics && mCurScene) {\n    return mCurScene->OnBackKeyPressed();\n  }\n  return false;\n}\n\nvoid SceneManager::OnKeyDown(int ourKeycode) {\n  MY_ASSERT(ourKeycode >= 0 && ourKeycode < OURKEY_COUNT);\n  if (mHasGraphics && mCurScene) {\n    mCurScene->OnKeyDown(ourKeycode);\n\n    // if our \"escape\" key (normally corresponding to joystick button B or Y)\n    // was pressed, handle it as a back key\n    if (ourKeycode == OURKEY_ESCAPE) {\n      mCurScene->OnBackKeyPressed();\n    }\n  }\n}\n\nvoid SceneManager::OnKeyUp(int ourKeycode) {\n  MY_ASSERT(ourKeycode >= 0 && ourKeycode < OURKEY_COUNT);\n  if (mHasGraphics && mCurScene) {\n    mCurScene->OnKeyUp(ourKeycode);\n  }\n}\n\nvoid SceneManager::UpdateJoy(float joyX, float joyY) {\n  if (mHasGraphics && mCurScene) {\n    mCurScene->OnJoy(joyX, joyY);\n  }\n}\n\nvoid SceneManager::OnPause() {\n  if (mHasGraphics && mCurScene) {\n    mCurScene->OnPause();\n  }\n}\n\nvoid SceneManager::OnResume() {\n  if (mHasGraphics && mCurScene) {\n    mCurScene->OnResume();\n  }\n}\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/scene_manager.hpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef endlesstunnel_scene_manager_h\n#define endlesstunnel_scene_manager_h\n\n#include \"our_key_codes.hpp\"\n\nclass Scene;\n\nstruct PointerCoords {\n  float x, y;\n\n  // was this generated by a touch on the screen? If not, this touch was\n  // generated in a touch device that's not associated to the screen.\n  bool isScreen;\n\n  // motion range:\n  float minX, minY;\n  float maxX, maxY;\n};\n\n/* Scene manager (singleton). The scene manager is responsible for managing the\n * currently active scene (class Scene) and delivering events to it. */\nclass SceneManager {\n private:\n  Scene *mCurScene;\n  int mScreenWidth, mScreenHeight;\n  bool mHasGraphics;\n  Scene *mSceneToInstall;\n  void InstallScene(Scene *newScene);\n\n public:\n  SceneManager();\n  void SetScreenSize(int width, int height);\n  void KillGraphics();\n  void StartGraphics();\n\n  // Returns screen width in pixels\n  int GetScreenWidth() { return mScreenWidth; }\n\n  // Returns screen height in pixels\n  int GetScreenHeight() { return mScreenHeight; }\n\n  // Returns screen's aspect ratio\n  float GetScreenAspect() { return (float)mScreenWidth / mScreenHeight; }\n\n  // Returns whether or not we have graphics (i.e. OpenGL context etc)\n  bool HasGraphics() { return mHasGraphics; }\n\n  // Returns current scene\n  Scene *GetScene();\n\n  // Renders current scene\n  void DoFrame();\n\n  // Reports that a pointer (e.g. touchscreen, touchpad, etc) went down\n  void OnPointerDown(int pointerId, const struct PointerCoords *coords);\n\n  // Reports that a pointer (e.g. touchscreen, touchpad, etc) went up\n  void OnPointerUp(int pointerId, const struct PointerCoords *coords);\n\n  // Reports that a pointer (e.g. touchscreen, touchpad, etc) moved\n  void OnPointerMove(int pointerId, const struct PointerCoords *coords);\n\n  // Reports that the back key was pressed\n  bool OnBackKeyPressed();\n\n  // Reports that the given key went down\n  void OnKeyDown(int ourKeycode);\n\n  // Reports that the given key went up\n  void OnKeyUp(int ourKeycode);\n\n  // Reports a joystick update\n  void UpdateJoy(float joyX, float joyY);\n\n  // Reports that the game was paused (e.g. Activity got an onPause())\n  void OnPause();\n\n  // Reports that the game was resumed (e.g. Activity got an onResume())\n  void OnResume();\n\n  // Requests that a new scene be installed, replacing the currently active\n  // scene. The new scene will be installed on the next DoFrame() call.\n  void RequestNewScene(Scene *newScene);\n\n  // Returns the (singleton) instance of SceneManager.\n  static SceneManager *GetInstance();\n};\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/sfxman.cpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#include \"sfxman.hpp\"\n\n#include <random>\n\n#define SAMPLES_PER_SEC 8000\n#define BUF_SAMPLES_MAX SAMPLES_PER_SEC * 5  // 5 seconds\n#define DEFAULT_VOLUME 0.9f\n\nstatic SfxMan* _instance = new SfxMan();\nstatic short _sample_buf[BUF_SAMPLES_MAX];\nstatic volatile bool _bufferActive = false;\n\nSfxMan* SfxMan::GetInstance() {\n  return _instance ? _instance : (_instance = new SfxMan());\n}\n\nstatic bool _checkError(SLresult r, const char* what) {\n  if (r != SL_RESULT_SUCCESS) {\n    LOGW(\"SfxMan: Error %s (result %lu)\", what, (long unsigned int)r);\n    LOGW(\"DISABLING SOUND!\");\n    return true;\n  }\n  return false;\n}\n\nstatic void _bqPlayerCallback(SLAndroidSimpleBufferQueueItf, void*) {\n  _bufferActive = false;\n}\n\nSfxMan::SfxMan() {\n  // Note: this initialization code was mostly copied from the NDK audio sample.\n  SLresult result;\n  SLObjectItf engineObject = NULL;\n  SLEngineItf engineEngine;\n  SLObjectItf outputMixObject = NULL;\n  SLEnvironmentalReverbItf outputMixEnvironmentalReverb = NULL;\n  SLObjectItf bqPlayerObject = NULL;\n  SLPlayItf bqPlayerPlay;\n  SLEffectSendItf bqPlayerEffectSend;\n  SLVolumeItf bqPlayerVolume;\n  const SLEnvironmentalReverbSettings reverbSettings =\n      SL_I3DL2_ENVIRONMENT_PRESET_STONECORRIDOR;\n\n  LOGD(\"SfxMan: initializing.\");\n  mPlayerBufferQueue = NULL;\n\n  // create engine\n  result = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL);\n  if (_checkError(result, \"creating engine\")) return;\n\n  // realize the engine\n  result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE);\n  if (_checkError(result, \"realizing engine\")) return;\n\n  // get the engine interface, which is needed in order to create other objects\n  result =\n      (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine);\n  if (_checkError(result, \"getting engine interface\")) return;\n\n  // create output mix, with einitializingnvironmental reverb specified as a\n  // non-required interface\n  const SLInterfaceID ids[1] = {SL_IID_ENVIRONMENTALREVERB};\n  const SLboolean req[1] = {SL_BOOLEAN_FALSE};\n  result = (*engineEngine)\n               ->CreateOutputMix(engineEngine, &outputMixObject, 1, ids, req);\n  if (_checkError(result, \"creating output mix\")) return;\n\n  // realize the output mix\n  result = (*outputMixObject)->Realize(outputMixObject, SL_BOOLEAN_FALSE);\n  if (_checkError(result, \"realizin goutput mix\")) return;\n\n  // get the environmental reverb interface\n  // this could fail if the environmental reverb effect is not available,\n  // either because the feature is not present, excessive CPU load, or\n  // the required MODIFY_AUDIO_SETTINGS permission was not requested and granted\n  result = (*outputMixObject)\n               ->GetInterface(outputMixObject, SL_IID_ENVIRONMENTALREVERB,\n                              &outputMixEnvironmentalReverb);\n  if (SL_RESULT_SUCCESS == result) {\n    result = (*outputMixEnvironmentalReverb)\n                 ->SetEnvironmentalReverbProperties(\n                     outputMixEnvironmentalReverb, &reverbSettings);\n  }\n  // ignore unsuccessful result codes for environmental reverb, as it is\n  // optional for this example\n\n  // configure audio source\n  SLDataLocator_AndroidSimpleBufferQueue loc_bufq = {\n      SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 2};\n  SLDataFormat_PCM format_pcm = {\n      SL_DATAFORMAT_PCM,           1,\n      SL_SAMPLINGRATE_8,           SL_PCMSAMPLEFORMAT_FIXED_16,\n      SL_PCMSAMPLEFORMAT_FIXED_16, SL_SPEAKER_FRONT_CENTER,\n      SL_BYTEORDER_LITTLEENDIAN};\n\n  SLDataSource audioSrc = {&loc_bufq, &format_pcm};\n\n  // configure audio sink\n  SLDataLocator_OutputMix loc_outmix = {SL_DATALOCATOR_OUTPUTMIX,\n                                        outputMixObject};\n  SLDataSink audioSnk = {&loc_outmix, NULL};\n\n  // create audio player\n  const SLInterfaceID player_ids[3] = {SL_IID_BUFFERQUEUE, SL_IID_EFFECTSEND,\n                                       /*SL_IID_MUTESOLO,*/ SL_IID_VOLUME};\n  const SLboolean player_req[3] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE,\n                                   /*SL_BOOLEAN_TRUE,*/ SL_BOOLEAN_TRUE};\n  result = (*engineEngine)\n               ->CreateAudioPlayer(engineEngine, &bqPlayerObject, &audioSrc,\n                                   &audioSnk, 3, player_ids, player_req);\n  if (_checkError(result, \"creating audio player\")) return;\n\n  // realize the player\n  result = (*bqPlayerObject)->Realize(bqPlayerObject, SL_BOOLEAN_FALSE);\n  assert(SL_RESULT_SUCCESS == result);\n\n  // get the play interface\n  result = (*bqPlayerObject)\n               ->GetInterface(bqPlayerObject, SL_IID_PLAY, &bqPlayerPlay);\n  if (_checkError(result, \"realizing audio player\")) return;\n\n  // get the buffer queue interface\n  result = (*bqPlayerObject)\n               ->GetInterface(bqPlayerObject, SL_IID_BUFFERQUEUE,\n                              &mPlayerBufferQueue);\n  if (_checkError(result, \"getting buffer queue interface\")) return;\n\n  // register callback on the buffer queue\n  result = (*mPlayerBufferQueue)\n               ->RegisterCallback(mPlayerBufferQueue, _bqPlayerCallback, NULL);\n  if (_checkError(result, \"registering callback on buffer queue\")) return;\n\n  // get the effect send interface\n  result = (*bqPlayerObject)\n               ->GetInterface(bqPlayerObject, SL_IID_EFFECTSEND,\n                              &bqPlayerEffectSend);\n  if (_checkError(result, \"getting effect send interface\")) return;\n\n  // get the volume interface\n  result = (*bqPlayerObject)\n               ->GetInterface(bqPlayerObject, SL_IID_VOLUME, &bqPlayerVolume);\n  if (_checkError(result, \"getting volume interface\")) return;\n\n  // set the player's state to playing\n  result = (*bqPlayerPlay)->SetPlayState(bqPlayerPlay, SL_PLAYSTATE_PLAYING);\n  if (_checkError(result, \"setting play state to playing\")) return;\n\n  LOGD(\"SfxMan: initialization complete.\");\n  mInitOk = true;\n}\n\nbool SfxMan::IsIdle() { return !_bufferActive; }\n\nstatic const char* _parseInt(const char* s, int* result) {\n  *result = 0;\n  while (*s >= '0' && *s <= '9') {\n    *result = *result * 10 + (*s - '0');\n    s++;\n  }\n  return s;\n}\n\nstatic int _synth(int frequency, float amplitude, short* sample_buf,\n                  int samples) {\n  int i;\n\n  for (i = 0; i < samples; i++) {\n    float t = i / (float)SAMPLES_PER_SEC;\n    float v;\n    if (frequency > 0) {\n      v = amplitude * sin(frequency * t * 2 * M_PI) +\n          (amplitude * 0.1f) * sin(frequency * 2 * t * 2 * M_PI);\n    } else {\n      int r = rand();\n      r = r > 0 ? r : -r;\n      v = amplitude * (-0.5f + (r % 1024) / 512.0f);\n    }\n    int value = (int)(v * 32768.0f);\n    sample_buf[i] = value < -32767 ? -32767 : value > 32767 ? 32767 : value;\n\n    if (i > 0 && sample_buf[i - 1] < 0 && sample_buf[i] >= 0) {\n      // start of new wave -- check if we have room for a full period of it\n      int period_samples = (1.0f / frequency) * SAMPLES_PER_SEC;\n      if (i + period_samples >= samples) break;\n    }\n  }\n\n  return i;\n}\n\nstatic void _taper(short* sample_buf, int samples) {\n  int i;\n  const float TAPER_SAMPLES_FRACTION = 0.1f;\n  int taper_samples = (int)(TAPER_SAMPLES_FRACTION * samples);\n  for (i = 0; i < taper_samples && i < samples; i++) {\n    float factor = i / (float)taper_samples;\n    sample_buf[i] = (short)((float)sample_buf[i] * factor);\n  }\n  for (i = samples - taper_samples; i < samples; i++) {\n    if (i < 0) continue;\n    float factor = (samples - i) / (float)taper_samples;\n    sample_buf[i] = (short)((float)sample_buf[i] * factor);\n  }\n}\n\nvoid SfxMan::PlayTone(const char* tone) {\n  if (!mInitOk) {\n    LOGW(\"SfxMan: not playing sound because initialization failed.\");\n    return;\n  }\n  if (_bufferActive) {\n    // can't play -- the buffer is in use\n    LOGW(\"SfxMan: can't play tone; buffer is active.\");\n    return;\n  }\n\n  // synth the tone\n  int total_samples = 0;\n  int num_samples;\n  int frequency = 100;\n  int duration = 50;\n  int volume_int;\n  float amplitude = DEFAULT_VOLUME;\n\n  while (*tone) {\n    switch (*tone) {\n      case 'f':\n        // set frequency\n        tone = _parseInt(tone + 1, &frequency);\n        break;\n      case 'd':\n        // set duration\n        tone = _parseInt(tone + 1, &duration);\n        break;\n      case 'a':\n        // set amplitude.\n        tone = _parseInt(tone + 1, &volume_int);\n        amplitude = volume_int / 100.0f;\n        amplitude = amplitude < 0.0f   ? 0.0f\n                    : amplitude > 1.0f ? 1.0f\n                                       : amplitude;\n        break;\n      case '.':\n        // synth\n        num_samples = duration * SAMPLES_PER_SEC / 1000;\n        if (num_samples > (BUF_SAMPLES_MAX - total_samples - 1)) {\n          num_samples = BUF_SAMPLES_MAX - total_samples - 1;\n        }\n        num_samples = _synth(frequency, amplitude, _sample_buf + total_samples,\n                             num_samples);\n        total_samples += num_samples;\n        tone++;\n        break;\n      default:\n        // ignore and advance to next character\n        tone++;\n    }\n  }\n\n  SLresult result;\n  int total_size = total_samples * sizeof(short);\n  if (total_size <= 0) {\n    LOGW(\"Tone is empty. Not playing.\");\n    return;\n  }\n\n  _taper(_sample_buf, total_samples);\n\n  _bufferActive = true;\n  result = (*mPlayerBufferQueue)\n               ->Enqueue(mPlayerBufferQueue, _sample_buf, total_size);\n  if (result != SL_RESULT_SUCCESS) {\n    LOGW(\"SfxMan: warning: failed to enqueue buffer: %lu\",\n         (unsigned long)result);\n    return;\n  }\n}\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/sfxman.hpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef endlesstunnel_sfxman_hpp\n#define endlesstunnel_sfxman_hpp\n\n#include <SLES/OpenSLES.h>\n#include <SLES/OpenSLES_Android.h>\n\n#include \"engine.hpp\"\n\n/* Sound effect manager. This class is a singleton that manages sound effect\n * playback. Sound effects are defined by recipes (which are strings) that\n * indicate frequencies and durations. See the PlayTone() method for more info.\n * Note: our sfx generation code is very simplistic and lacks a mixer, so\n * only one sound can be playing at any given time. This is not a problematic\n * limitation for this simple sample but, needless to say, doesn't scale well\n * to a more complex game. */\nclass SfxMan {\n private:\n  bool mInitOk;\n  SLAndroidSimpleBufferQueueItf mPlayerBufferQueue;\n\n public:\n  SfxMan();\n\n  // Returns the (singleton) instance of SfxMan\n  static SfxMan* GetInstance();\n\n  /* Play a tone according to the given recipe. The recipe consists of one or\n   * more tones. Tones are separated by periods ('.'):\n   *\n   *    \"<tone1>.<tone2>.<tone3>.\"\n   *\n   * Also, there must be a period at the end of the string.\n   *\n   * Each tone consists of settings separated by spaces. The order of settings\n   * is irrelevant. Possible settings are:\n   *     f<freq>  set frequency to <freq> Hz. 0 means noise.\n   *     d<dur>   set duration to <dur> milliseconds.\n   *     a<amp>   set amplitude to <amp> percent (0-100)\n   *\n   * Example: \"d100 f300. d50 f250. a0 d100. a100 d50 f0.\"\n   * This will play a 300Hz tone for 100ms, followed by a 250Hz tone\n   * for 50 milliseconds, followed by 100ms of silence, followed\n   * by 50 milliseconds of loud random noise. */\n  void PlayTone(const char* tone);\n\n  // Returns whether or not the sound effect pipeline is idle (able to play\n  // a tone right now).\n  bool IsIdle();\n};\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/shader.cpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#include \"shader.hpp\"\n\n#include \"common.hpp\"\n#include \"indexbuf.hpp\"\n#include \"vertexbuf.hpp\"\n\nShader::Shader() {\n  mVertShaderH = mFragShaderH = mProgramH = 0;\n  mMVPMatrixLoc = -1;\n  mPositionAttribLoc = -1;\n  mPreparedVertexBuf = NULL;\n}\n\nShader::~Shader() {\n  if (mVertShaderH) {\n    glDeleteShader(mVertShaderH);\n    mVertShaderH = 0;\n  }\n  if (mFragShaderH) {\n    glDeleteShader(mFragShaderH);\n    mFragShaderH = 0;\n  }\n  if (mProgramH) {\n    glDeleteProgram(mProgramH);\n    mProgramH = 0;\n  }\n}\n\nstatic void _printShaderLog(GLuint shader) {\n  char buf[2048];\n  memset(buf, 0, sizeof(buf));\n  LOGE(\"*** Getting info log for shader %u\", shader);\n  glGetShaderInfoLog(shader, sizeof(buf) - 1, NULL, buf);\n  LOGE(\"*** Info log:\\n%s\", buf);\n}\n\nstatic void _printProgramLog(GLuint program) {\n  char buf[2048];\n  memset(buf, 0, sizeof(buf));\n  LOGE(\"*** Getting info log for program %u\", program);\n  glGetProgramInfoLog(program, sizeof(buf) - 1, NULL, buf);\n  LOGE(\"*** Info log:\\n%s\", buf);\n}\n\nvoid Shader::Compile() {\n  const char *vsrc = 0, *fsrc = 0;\n  GLint status = 0;\n\n  LOGD(\"Compiling shader.\");\n  LOGD(\"Shader name: %s\", GetShaderName());\n\n  vsrc = GetVertShaderSource();\n  fsrc = GetFragShaderSource();\n\n  mVertShaderH = glCreateShader(GL_VERTEX_SHADER);\n  mFragShaderH = glCreateShader(GL_FRAGMENT_SHADER);\n  if (!mVertShaderH || !mFragShaderH) {\n    LOGE(\"*** Failed to create shader.\");\n    ABORT_GAME;\n  }\n  glShaderSource(mVertShaderH, 1, &vsrc, NULL);\n  glCompileShader(mVertShaderH);\n  glGetShaderiv(mVertShaderH, GL_COMPILE_STATUS, &status);\n  if (status == 0) {\n    LOGE(\"*** Vertex shader compilation failed.\");\n    _printShaderLog(mVertShaderH);\n    ABORT_GAME;\n  }\n  LOGD(\"Vertex shader compilation succeeded.\");\n\n  glShaderSource(mFragShaderH, 1, &fsrc, NULL);\n  glCompileShader(mFragShaderH);\n  glGetShaderiv(mFragShaderH, GL_COMPILE_STATUS, &status);\n  if (status == 0) {\n    LOGE(\"*** Fragment shader compilation failed, %d\", status);\n    _printShaderLog(mFragShaderH);\n    ABORT_GAME;\n  }\n  LOGD(\"Fragment shader compilation succeeded.\");\n\n  mProgramH = glCreateProgram();\n  if (!mProgramH) {\n    LOGE(\"*** Failed to create program\");\n    _printProgramLog(mProgramH);\n    ABORT_GAME;\n  }\n\n  glAttachShader(mProgramH, mVertShaderH);\n  glAttachShader(mProgramH, mFragShaderH);\n  glLinkProgram(mProgramH);\n  glGetProgramiv(mProgramH, GL_LINK_STATUS, &status);\n  if (status == 0) {\n    LOGE(\"*** Shader program link failed, %d\", status);\n    _printProgramLog(mProgramH);\n    ABORT_GAME;\n  }\n  LOGD(\"Program linking succeeded.\");\n\n  glUseProgram(mProgramH);\n  mMVPMatrixLoc = glGetUniformLocation(mProgramH, \"u_MVP\");\n  if (mMVPMatrixLoc < 0) {\n    LOGE(\"*** Couldn't get shader's u_MVP matrix location from shader.\");\n    ABORT_GAME;\n  }\n  mPositionAttribLoc = glGetAttribLocation(mProgramH, \"a_Position\");\n  if (mPositionAttribLoc < 0) {\n    LOGE(\"*** Couldn't get shader's a_Position attribute location.\");\n    ABORT_GAME;\n  }\n  LOGD(\"Shader compilation/linking successful.\");\n  glUseProgram(0);\n}\n\nvoid Shader::BindShader() {\n  if (mProgramH == 0) {\n    LOGW(\"!!! WARNING: attempt to use shader before compiling.\");\n    LOGW(\"!!! Compiling now. Shader: %s\", GetShaderName());\n    Compile();\n  }\n  glUseProgram(mProgramH);\n}\n\nvoid Shader::UnbindShader() { glUseProgram(0); }\n\n// To be called by child classes only.\nvoid Shader::PushMVPMatrix(glm::mat4* mat) {\n  MY_ASSERT(mMVPMatrixLoc >= 0);\n  glUniformMatrix4fv(mMVPMatrixLoc, 1, GL_FALSE, glm::value_ptr(*mat));\n}\n\n// To be called by child classes only.\nvoid Shader::PushPositions(int vbo_offset, int stride) {\n  MY_ASSERT(mPositionAttribLoc >= 0);\n  glVertexAttribPointer(mPositionAttribLoc, 3, GL_FLOAT, GL_FALSE, stride,\n                        reinterpret_cast<void*>(vbo_offset));\n  glEnableVertexAttribArray(mPositionAttribLoc);\n}\n\nvoid Shader::BeginRender(VertexBuf* vbuf) {\n  // Activate shader\n  BindShader();\n\n  // bind geometry's VBO\n  vbuf->BindBuffer();\n\n  // push positions to shader\n  PushPositions(vbuf->GetPositionsOffset(), vbuf->GetStride());\n\n  // store geometry\n  mPreparedVertexBuf = vbuf;\n}\n\nvoid Shader::Render(IndexBuf* ibuf, glm::mat4* mvpMat) {\n  MY_ASSERT(mPreparedVertexBuf != NULL);\n\n  // push MVP matrix to shader\n  PushMVPMatrix(mvpMat);\n\n  if (ibuf) {\n    // draw with index buffer\n    ibuf->BindBuffer();\n    glDrawElements(mPreparedVertexBuf->GetPrimitive(), ibuf->GetCount(),\n                   GL_UNSIGNED_SHORT, nullptr);\n    ibuf->UnbindBuffer();\n  } else {\n    // draw straight from vertex buffer\n    glDrawArrays(mPreparedVertexBuf->GetPrimitive(), 0,\n                 mPreparedVertexBuf->GetCount());\n  }\n}\n\nvoid Shader::EndRender() {\n  if (mPreparedVertexBuf) {\n    mPreparedVertexBuf->UnbindBuffer();\n    mPreparedVertexBuf = NULL;\n  }\n}\n\nTrivialShader::TrivialShader() : Shader() {\n  mColorLoc = -1;\n  mTintLoc = -1;\n  mTint[0] = mTint[1] = mTint[2] = 1.0f;  // white\n}\n\nTrivialShader::~TrivialShader() {}\n\nvoid TrivialShader::Compile() {\n  Shader::Compile();\n  BindShader();\n  mColorLoc = glGetAttribLocation(mProgramH, \"a_Color\");\n  if (mColorLoc < 0) {\n    LOGE(\"*** Couldn't get color attrib location from shader.\");\n    ABORT_GAME;\n  }\n  mTintLoc = glGetUniformLocation(mProgramH, \"u_Tint\");\n  if (mTintLoc < 0) {\n    LOGE(\"*** Couldn't get tint uniform location from shader.\");\n    ABORT_GAME;\n  }\n  UnbindShader();\n}\n\nconst char* TrivialShader::GetVertShaderSource() {\n  return \"uniform mat4 u_MVP;            \\n\"\n         \"uniform vec4 u_Tint;           \\n\"\n         \"attribute vec4 a_Position;     \\n\"\n         \"attribute vec4 a_Color;        \\n\"\n         \"varying vec4 v_Color;          \\n\"\n         \"void main()                    \\n\"\n         \"{                              \\n\"\n         \"   v_Color = a_Color * u_Tint; \\n\"\n         \"   gl_Position = u_MVP         \\n\"\n         \"               * a_Position;   \\n\"\n         \"}                              \\n\";\n}\n\nconst char* TrivialShader::GetFragShaderSource() {\n  return \"precision mediump float;       \\n\"\n         \"varying vec4 v_Color;          \\n\"\n         \"void main()                    \\n\"\n         \"{                              \\n\"\n         \"   gl_FragColor = v_Color;     \\n\"\n         \"}\";\n}\n\nint TrivialShader::GetColorAttribLoc() { return mColorLoc; }\n\nconst char* TrivialShader::GetShaderName() { return \"TrivialShader\"; }\n\nvoid TrivialShader::ResetTintColor() { SetTintColor(1.0f, 1.0f, 1.0f); }\n\nvoid TrivialShader::SetTintColor(float r, float g, float b) {\n  mTint[0] = r;\n  mTint[1] = g;\n  mTint[2] = b;\n\n  if (mPreparedVertexBuf) {\n    // we are in the middle of rendering, so push the new tint color to\n    // the shader right away.\n    glUniform4f(mTintLoc, mTint[0], mTint[1], mTint[2], 1.0f);\n  }\n}\n\nvoid TrivialShader::BeginRender(VertexBuf* geom) {\n  // let superclass do the basic work\n  Shader::BeginRender(geom);\n\n  // this shader requires colors, so make sure we have them.\n  MY_ASSERT(geom->HasColors());\n  MY_ASSERT(mColorLoc >= 0);\n\n  // push colors to shader\n  glVertexAttribPointer(mColorLoc, 3, GL_FLOAT, GL_FALSE, geom->GetStride(),\n                        reinterpret_cast<void*>(geom->GetColorsOffset()));\n  glEnableVertexAttribArray(mColorLoc);\n\n  // push tint color to shader\n  MY_ASSERT(mTintLoc >= 0);\n  glUniform4f(mTintLoc, mTint[0], mTint[1], mTint[2], 1.0f);\n}\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/shader.hpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef endlesstunnel_shader_hpp\n#define endlesstunnel_shader_hpp\n\n#include \"glm/glm.hpp\"\n#include \"simplegeom.hpp\"\n\nclass VertexBuf;\nclass IndexBuf;\n\n/* Represents an OpenGL shader. This class is not meant to be used directly,\n * but, rather to be subclassed to represent specific shaders. To use any shader\n * that's a subclass of this class, first construct it, then call Compile().\n * After that, you can render geometry by calling BeginRender(), then calling\n * Render() as many times as you want, and then EndRender(). This allows you to\n * render the same geometry in multiple places efficiently. If you just want to\n * render a geometry once (simple use case), you can call RenderSimpleGeom(). */\nclass Shader {\n protected:\n  // OpenGL handles\n  int mVertShaderH, mFragShaderH;\n  GLuint mProgramH;\n  int mMVPMatrixLoc;\n  int mPositionAttribLoc;\n\n  // Geometry we are rendering (this is only valid between BeginRender and\n  // EndRender)\n  VertexBuf* mPreparedVertexBuf;\n\n public:\n  Shader();\n  virtual ~Shader();\n\n  // compile shader\n  virtual void Compile();\n\n  // rendering:\n  void BindShader();\n  void UnbindShader();\n\n  // Prepares to render the given geometry.\n  virtual void BeginRender(VertexBuf* vbuf);\n\n  // Renders one copy of the prepared geometry, given a model-view-projection\n  // matrix.\n  void Render(glm::mat4* mvpMat) { Render(NULL, mvpMat); }\n\n  // Renders a subset (given by the index buffer) of the prepared geometry,\n  // using the given model-view-projection matrix.\n  virtual void Render(IndexBuf* ibuf, glm::mat4* mvpMat);\n\n  // Finishes rendering (call this after you're done making calls to Render())\n  virtual void EndRender();\n\n  // Convenience method to render a single copy of a geometry.\n  void RenderSimpleGeom(glm::mat4* mvpMat, SimpleGeom* sg) {\n    BeginRender(sg->vbuf);\n    Render(sg->ibuf, mvpMat);\n    EndRender();\n  }\n\n protected:\n  // Push MVP matrix to the shader\n  void PushMVPMatrix(glm::mat4* mat);\n\n  // Push the vertex positions to the shader\n  void PushPositions(int vbo_offset, int stride);\n\n  // Must return the vertex shader's GLSL source\n  virtual const char* GetVertShaderSource() = 0;\n\n  // Must return the fragment shader's GLSL source\n  virtual const char* GetFragShaderSource() = 0;\n\n  // Must return the shader's name (used for debug/logging purposes)\n  virtual const char* GetShaderName() = 0;\n};\n\n/* A trivial shader that knows how to render geometry and colors, but no\n * lighting or texturing. Compatible with geometry that contains color data. You\n * can also specify a tint color, which will get multiplied by the geometry's\n * built-in color. */\nclass TrivialShader : public Shader {\n protected:\n  int mColorLoc;\n  int mTintLoc;\n  float mTint[3];\n\n public:\n  TrivialShader();\n  ~TrivialShader();\n  int GetColorAttribLoc();\n  void PushColors(int vbo_offset, int stride);\n  void SetTintColor(float r, float g, float b);\n  void ResetTintColor();\n  virtual void Compile();\n  virtual void BeginRender(VertexBuf* geom);\n\n protected:\n  virtual const char* GetVertShaderSource();\n  virtual const char* GetFragShaderSource();\n  virtual const char* GetShaderName();\n};\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/shape_renderer.cpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#include \"shape_renderer.hpp\"\n\n#include \"util.hpp\"\n\n// geometry\nstatic GLfloat RECT_VERTICES[] = {\n    //  x      y     z      r     g     b     a\n    -0.5f, -0.5f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f,  // vertex 0\n    0.5f,  -0.5f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f,  // vertex 1\n    0.5f,  0.5f,  0.0f, 1.0f, 1.0f, 1.0f, 1.0f,  // vertex 2\n    -0.5f, 0.5f,  0.0f, 1.0f, 1.0f, 1.0f, 1.0f   // vertex 3\n};\n\n// indices\nstatic GLushort RECT_INDICES[] = {0, 1, 2, 0, 2, 3};\n\nShapeRenderer::ShapeRenderer(TrivialShader* ts) {\n  mTrivialShader = ts;\n  mColor[0] = mColor[1] = mColor[2] = 1.0f;\n  mGeom = NULL;\n\n  // create geometry\n  VertexBuf* vbuf =\n      new VertexBuf(RECT_VERTICES, sizeof(RECT_VERTICES), 7 * sizeof(GLfloat));\n  vbuf->SetColorsOffset(3 * sizeof(GLfloat));\n  IndexBuf* ibuf = new IndexBuf(RECT_INDICES, sizeof(RECT_INDICES));\n  mGeom = new SimpleGeom(vbuf, ibuf);\n}\n\nShapeRenderer::~ShapeRenderer() {\n  // destroy geometry\n  CleanUp(&mGeom);\n}\n\nvoid ShapeRenderer::RenderRect(float centerX, float centerY, float width,\n                               float height) {\n  float aspect = SceneManager::GetInstance()->GetScreenAspect();\n  glm::mat4 orthoMat = glm::ortho(0.0f, aspect, 0.0f, 1.0f);\n  glm::mat4 modelMat, mat;\n  modelMat = glm::translate(glm::mat4(1.0f), glm::vec3(centerX, centerY, 0.0f));\n  modelMat = glm::scale(modelMat, glm::vec3(width, height, 1.0f));\n  mat = orthoMat * modelMat;\n  mTrivialShader->SetTintColor(mColor[0], mColor[1], mColor[2]);\n  mTrivialShader->RenderSimpleGeom(&mat, mGeom);\n}\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/shape_renderer.hpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef endlesstunnel_shape_renderer_hpp\n#define endlesstunnel_shape_renderer_hpp\n\n#include \"engine.hpp\"\n\n/* Convenience class that renders shapes (currently, only rects). The\n * coordinate system is the \"normalized 2D coordinate system\" -- see\n * README for more info. */\nclass ShapeRenderer {\n private:\n  TrivialShader *mTrivialShader;\n  float mColor[3];\n  SimpleGeom *mGeom;\n\n public:\n  ShapeRenderer(TrivialShader *trivialShader);\n  ~ShapeRenderer();\n\n  void SetColor(float r, float g, float b) {\n    mColor[0] = r, mColor[1] = g, mColor[2] = b;\n  }\n  void SetColor(const float *v) {\n    mColor[0] = v[0], mColor[1] = v[1], mColor[2] = v[2];\n  }\n\n  // Render a rectangle\n  void RenderRect(float centerX, float centerY, float width, float height);\n};\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/simplegeom.hpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef endlesstunnel_simplegeom_hpp\n#define endlesstunnel_simplegeom_hpp\n\n#include \"indexbuf.hpp\"\n#include \"vertexbuf.hpp\"\n\n// Convenience class that represents a geometry in terms of a\n// vertex buffer + index buffer.\nclass SimpleGeom {\n public:\n  VertexBuf *vbuf;\n  IndexBuf *ibuf;\n\n  SimpleGeom() {\n    vbuf = NULL;\n    ibuf = NULL;\n  }\n\n  SimpleGeom(VertexBuf *vb, IndexBuf *ib) {\n    vbuf = vb;\n    ibuf = ib;\n  }\n\n  SimpleGeom(VertexBuf *vb) {\n    vbuf = vb;\n    ibuf = NULL;\n  }\n\n  ~SimpleGeom() {\n    if (vbuf) {\n      delete vbuf;\n    }\n    if (ibuf) {\n      delete ibuf;\n    }\n  }\n};\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/tex_quad.cpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#include \"tex_quad.hpp\"\n\nstatic void _put_vertex(float* v, float x, float y, float tex_u, float tex_v) {\n  // position\n  v[0] = x;\n  v[1] = y;\n  v[2] = 0.0f;\n\n  // color\n  v[3] = 1.0f;\n  v[4] = 1.0f;\n  v[5] = 1.0f;\n  v[6] = 1.0f;\n\n  // texture coords\n  v[7] = tex_u;\n  v[8] = tex_v;\n}\n\nvoid TexQuad::CreateGeom(float umin, float vmin, float umax, float vmax) {\n  const int stride_floats =\n      9;  // 3 for coords, 4 for color, 2 for tex coordinates\n  const int stride_bytes = stride_floats * sizeof(GLfloat);\n  int vertices = stride_floats * 4;  // 4 vertices\n  GLfloat* geom = new GLfloat[vertices];\n  int geom_size = sizeof(GLfloat) * vertices;\n  GLushort* indices = new GLushort[6];  // 6 indices\n  int indices_size = sizeof(GLushort) * 6;\n  float left = -mAspect * 0.5f;\n  float right = mAspect * 0.5f;\n  float bottom = -0.5f;\n  float top = 0.5f;\n\n  /*\n    D+----------+C\n     |          |\n     |          |\n    A+----------+B\n  */\n\n  _put_vertex(geom, left, bottom, umin, vmin);                    // point A\n  _put_vertex(geom + stride_floats, right, bottom, umax, vmin);   // point B\n  _put_vertex(geom + 2 * stride_floats, right, top, umax, vmax);  // point C\n  _put_vertex(geom + 3 * stride_floats, left, top, umin, vmax);   // point D\n\n  indices[0] = 0;\n  indices[1] = 1;\n  indices[2] = 2;\n  indices[3] = 0;\n  indices[4] = 2;\n  indices[5] = 3;\n\n  // prepare geometry\n  VertexBuf* vbuf = new VertexBuf(geom, geom_size, stride_bytes);\n  vbuf->SetColorsOffset(3 * sizeof(GLfloat));\n  vbuf->SetTexCoordsOffset(7 * sizeof(GLfloat));\n  IndexBuf* ibuf = new IndexBuf(indices, indices_size);\n  mGeom = new SimpleGeom(vbuf, ibuf);\n\n  // clean up our temporary buffers\n  delete[] geom;\n  geom = NULL;\n  delete[] indices;\n  indices = NULL;\n}\n\nvoid TexQuad::Render(glm::mat4* transform) {\n  float aspect = SceneManager::GetInstance()->GetScreenAspect();\n  glm::mat4 orthoMat = glm::ortho(0.0f, aspect, 0.0f, 1.0f);\n  glm::mat4 modelMat, mat;\n\n  bool hadDepthTest = glIsEnabled(GL_DEPTH_TEST);\n  glDisable(GL_DEPTH_TEST);\n\n  modelMat =\n      glm::translate(glm::mat4(1.0f), glm::vec3(mCenterX, mCenterY, 0.0f));\n  modelMat =\n      glm::scale(modelMat, glm::vec3(mScale * mHeight, mScale * mHeight, 0.0f));\n  if (transform) {\n    mat = orthoMat * (*transform) * modelMat;\n  } else {\n    mat = orthoMat * modelMat;\n  }\n\n  mOurShader->BeginRender(mGeom->vbuf);\n  mOurShader->SetTexture(mTexture);\n  mOurShader->Render(mGeom->ibuf, &mat);\n  mOurShader->EndRender();\n\n  if (hadDepthTest) {\n    glEnable(GL_DEPTH_TEST);\n  }\n}\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/tex_quad.hpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef endlesstunnel_texquad_hpp\n#define endlesstunnel_texquad_hpp\n\n#include \"engine.hpp\"\n#include \"our_shader.hpp\"\n\n// Represents a simple 2D textured quad (that can be used to render an icon, for\n// example)\nclass TexQuad {\n private:\n  Texture *mTexture;\n  OurShader *mOurShader;\n  SimpleGeom *mGeom;\n  float mWidth, mHeight;\n  float mScale;\n  float mCenterX, mCenterY;\n  float mAspect;\n  void CreateGeom(float umin, float vmin, float umax, float vmax);\n  void Init(Texture *t, OurShader *shader, float aspect, float umin, float vmin,\n            float umax, float vmax) {\n    mTexture = t;\n    mOurShader = shader;\n    mAspect = aspect;\n    mWidth = mAspect;\n    mHeight = 1.0f;\n    mCenterX = mCenterY = 0.0f;\n    mScale = 1.0f;\n    CreateGeom(umin, vmin, umax, vmax);\n  }\n\n public:\n  TexQuad(Texture *t, OurShader *shader, float aspect, float umin, float vmin,\n          float umax, float vmax) {\n    Init(t, shader, aspect, umin, vmin, umax, vmax);\n  }\n  TexQuad(Texture *t, OurShader *shader, float umin, float vmin, float umax,\n          float vmax) {\n    Init(t, shader, (umax - umin) / (vmax - vmin), umin, vmin, umax, vmax);\n  }\n  float GetCenterX() { return mCenterX; }\n  float GetCenterY() { return mCenterY; }\n  float GetWidth() { return mWidth; }\n  float GetHeight() { return mHeight; }\n  float GetLeft() { return mCenterX - mWidth * 0.5f; }\n  float GetRight() { return mCenterX + mWidth * 0.5f; }\n  float GetBottom() { return mCenterY - mHeight * 0.5f; }\n  float GetTop() { return mCenterY + mHeight * 0.5f; }\n  bool Contains(float x, float y) {\n    return x >= GetLeft() && x <= GetRight() && y >= GetBottom() &&\n           y <= GetTop();\n  }\n\n  void SetCenter(float x, float y) {\n    mCenterX = x;\n    mCenterY = y;\n  }\n  void SetWidth(float w) {\n    mWidth = w;\n    mHeight = w / mAspect;\n  }\n  void SetHeight(float h) {\n    mHeight = h;\n    mWidth = h * mAspect;\n  }\n  ~TexQuad() {\n    if (mGeom) {\n      delete mGeom;\n    }\n  }\n  void SetScale(float scale) { mScale = scale; }\n  void Render() { Render(NULL); }\n  void Render(glm::mat4 *transform);\n};\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/text_renderer.cpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#include \"text_renderer.hpp\"\n\n#include \"alphabet.inl\"\n#include \"ascii_to_geom.hpp\"\n#include \"util.hpp\"\n\n#define ALPHABET_SCALE 0.01f\n#define CHAR_SPACING_F 0.1f  // as a fraction of char width\n#define LINE_SPACING_F 0.1f  // as a fraction of char height\n#define TEXT_LINE_WIDTH 4.0f\n\n#define CORRECTION_Y -0.02f\n\nTextRenderer::TextRenderer(TrivialShader* t) {\n  mTrivialShader = t;\n  memset(mCharGeom, 0, sizeof(mCharGeom));\n  mFontScale = 1.0f;\n  mMatrix = glm::mat4(1.0f);\n  mColor[0] = mColor[1] = mColor[2] = 1.0f;\n\n  LOGD(\"Loading alphabet glyphs.\");\n  int i;\n  for (i = 0; i < CHAR_CODES; ++i) {\n    if (ALPHABET_ART[i]) {\n      LOGD(\"Creating glyph for chr %d.\", i);\n      mCharGeom[i] = AsciiArtToGeom(ALPHABET_ART[i], ALPHABET_SCALE);\n    }\n  }\n}\n\nTextRenderer::~TextRenderer() {\n  int i;\n  for (i = 0; i < CHAR_CODES; i++) {\n    CleanUp(&mCharGeom[i]);\n  }\n}\n\nTextRenderer* TextRenderer::SetFontScale(float scale) {\n  mFontScale = scale;\n  return this;\n}\n\nstatic void _count_rows_cols(const char* p, int* outCols, int* outRows) {\n  int textCols = 0, textRows = 1;\n  int curCols = 0;\n  for (; *p; ++p) {\n    if (*p == '\\n') {\n      ++textRows;\n      curCols = 0;\n    } else {\n      ++curCols;\n      if (textCols < curCols) {\n        textCols = curCols;\n      }\n    }\n  }\n  *outCols = textCols;\n  *outRows = textRows;\n}\n\nTextRenderer* TextRenderer::SetMatrix(glm::mat4 m) {\n  mMatrix = m;\n  return this;\n}\n\nvoid TextRenderer::MeasureText(const char* str, float fontScale,\n                               float* outWidth,\n                               float* outHeight) {  // static!\n  int rows, cols;\n  _count_rows_cols(str, &cols, &rows);\n  if (outWidth) {\n    *outWidth = cols * ALPHABET_GLYPH_COLS * ALPHABET_SCALE * fontScale;\n  }\n  if (outHeight) {\n    *outHeight = rows * ALPHABET_GLYPH_ROWS * ALPHABET_SCALE * fontScale;\n  }\n}\n\nTextRenderer* TextRenderer::RenderText(const char* str, float centerX,\n                                       float centerY) {\n  float aspect = SceneManager::GetInstance()->GetScreenAspect();\n  glm::mat4 orthoMat = glm::ortho(0.0f, aspect, 0.0f, 1.0f);\n  glm::mat4 modelMat, mat, scaleMat;\n  int cols, rows;\n  bool hadDepthTest;\n\n  centerY += CORRECTION_Y * mFontScale;\n\n  glLineWidth(TEXT_LINE_WIDTH);\n\n  hadDepthTest = glIsEnabled(GL_DEPTH_TEST);\n  glDisable(GL_DEPTH_TEST);\n\n  mTrivialShader->SetTintColor(mColor[0], mColor[1], mColor[2]);\n\n  _count_rows_cols(str, &cols, &rows);\n  scaleMat =\n      glm::scale(glm::mat4(1.0f), glm::vec3(mFontScale, mFontScale, 1.0f));\n  float charWidth = ALPHABET_GLYPH_COLS * ALPHABET_SCALE * mFontScale;\n  float charHeight = ALPHABET_GLYPH_ROWS * ALPHABET_SCALE * mFontScale;\n  float charSpacing = CHAR_SPACING_F * charWidth;\n  float lineSpacing = LINE_SPACING_F * charHeight;\n  float width = cols * charWidth + (cols - 1) * charSpacing;\n  float height = rows * charHeight + (rows - 1) * lineSpacing;\n  float startX = centerX - width * 0.5f + 0.5f * charWidth;\n  float startY = centerY + height * 0.5f - 0.5f * charHeight;\n  float y = startY;\n\n  modelMat = glm::translate(glm::mat4(1.0f), glm::vec3(startX, startY, 0.0f));\n  for (; *str; ++str) {\n    if (*str == '\\n') {\n      y -= charHeight + lineSpacing;\n      modelMat = glm::translate(glm::mat4(1.0f), glm::vec3(startX, y, 0.0f));\n    } else {\n      int code = (int)*str;\n      if (code >= 0 && code < CHAR_CODES && mCharGeom[code]) {\n        mat = orthoMat * modelMat * scaleMat * mMatrix;\n        mTrivialShader->RenderSimpleGeom(&mat, mCharGeom[code]);\n      }\n      modelMat = glm::translate(modelMat,\n                                glm::vec3(charWidth + charSpacing, 0.0f, 0.0f));\n    }\n  }\n\n  glLineWidth(1);\n  if (hadDepthTest) {\n    glEnable(GL_DEPTH_TEST);\n  }\n  return this;\n}\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/text_renderer.hpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef endlesstunnel_text_renderer_hpp\n#define endlesstunnel_text_renderer_hpp\n\n#include \"engine.hpp\"\n\n/* Renders text to the screen. Uses the \"normalized 2D coordinate system\" as\n * described in the README. */\nclass TextRenderer {\n private:\n  static const int CHAR_CODES = 128;\n  SimpleGeom *mCharGeom[CHAR_CODES];\n  TrivialShader *mTrivialShader;\n\n  float mFontScale;\n  float mColor[3];\n  glm::mat4 mMatrix;\n\n public:\n  TextRenderer(TrivialShader *t);\n  ~TextRenderer();\n\n  TextRenderer *SetMatrix(glm::mat4 mat);\n  TextRenderer *SetFontScale(float size);\n  TextRenderer *RenderText(const char *str, float centerX, float centerY);\n  void SetColor(float r, float g, float b) {\n    mColor[0] = r, mColor[1] = g, mColor[2] = b;\n  }\n  void SetColor(const float *c) {\n    mColor[0] = c[0], mColor[1] = c[1], mColor[2] = c[2];\n  }\n  void ResetColor() { SetColor(1.0f, 1.0f, 1.0f); }\n\n  TextRenderer *ResetMatrix() { return SetMatrix(glm::mat4(1.0f)); }\n\n  static void MeasureText(const char *str, float fontScale, float *outWidth,\n                          float *outHeight);\n\n  static float MeasureTextWidth(const char *str, float fontScale) {\n    float w;\n    TextRenderer::MeasureText(str, fontScale, &w, NULL);\n    return w;\n  }\n\n  static float MeasureTextHeight(const char *str, float fontScale) {\n    float h;\n    TextRenderer::MeasureText(str, fontScale, NULL, &h);\n    return h;\n  }\n};\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/texture.cpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#include \"texture.hpp\"\n\n#include \"common.hpp\"\n\nvoid Texture::InitFromRawRGB(int width, int height, bool hasAlpha,\n                             const unsigned char* data) {\n  GLenum format = hasAlpha ? GL_RGBA : GL_RGB;\n\n  glGenTextures(1, &mTextureH);\n  glBindTexture(GL_TEXTURE_2D, mTextureH);\n\n  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);\n  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);\n  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);\n  glPixelStorei(GL_PACK_ALIGNMENT, 1);\n\n  glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format,\n               GL_UNSIGNED_BYTE, data);\n  glBindTexture(GL_TEXTURE_2D, 0);\n}\n\nvoid Texture::Bind(int unit) {\n  glActiveTexture(unit);\n  glBindTexture(GL_TEXTURE_2D, mTextureH);\n}\n\nvoid Texture::Unbind() { glBindTexture(GL_TEXTURE_2D, 0); }\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/texture.hpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef endlesstunnel_texture_hpp\n#define endlesstunnel_texture_hpp\n\n#include \"common.hpp\"\n\n/* Represents an OpenGL texture */\nclass Texture {\n private:\n  GLuint mTextureH;\n\n public:\n  inline Texture() { mTextureH = 0; }\n\n  // Initialize from raw RGB data. If hasAlpha is true, then it's 4 bytes per\n  // pixel (RGBA), otherwise it's interpreted as 3 bytes per pixel (RGB).\n  void InitFromRawRGB(int width, int height, bool hasAlpha,\n                      const unsigned char *data);\n  void Bind(int unit);\n  void Unbind();\n};\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/ui_scene.cpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#include \"ui_scene.hpp\"\n\n#include \"data/strings.inl\"\n\n// how much do buttons pulse?\n#define PULSE_AMOUNT 0.01f\n#define PULSE_PERIOD 0.5f\n\n// how big (as a fraction of the button's dimension) is the border?\n#define BUTTON_BORDER_SIZE 0.1f\n\n// scale of the \"please wait\" sign\n#define WAIT_SIGN_SCALE 1.0f\n\n// transition duration\n#define TRANSITION_DURATION 0.3f\n\n// default button colors\nconst static float BUTTON_FOCUS_COLOR[] = {1.0f, 1.0f, 0.0f};\nconst static float BUTTON_DISABLED_COLOR[] = {0.3f, 0.3f, 0.3f};\n\nUiScene::UiScene() {\n  mWidgetCount = 0;\n  memset(mWidgets, 0, sizeof(mWidgets));\n  mFocusWidget = -1;\n  mTrivialShader = NULL;\n  mTextRenderer = NULL;\n  mShapeRenderer = NULL;\n  mDefaultButton = -1;\n  mPointerDown = false;\n  mWaitScreen = false;\n  mTransitionStart = 0.0f;\n}\n\nUiScene::~UiScene() {\n  // note: cleanup for graphics-related stuff goes in OnKillGraphics\n\n  int i;\n  for (i = 0; i < mWidgetCount; ++i) {\n    CleanUp(&mWidgets[i]);\n  }\n  mWidgetCount = 0;\n}\n\nUiWidget* UiScene::NewWidget() {\n  MY_ASSERT(mWidgetCount + 1 < MAX_WIDGETS);\n  UiWidget* widget = new UiWidget(mWidgetCount);\n  mWidgets[mWidgetCount++] = widget;\n  return widget;\n}\n\nvoid UiScene::OnStartGraphics() {\n  mTrivialShader = new TrivialShader();\n  mTrivialShader->Compile();\n  mTextRenderer = new TextRenderer(mTrivialShader);\n  mShapeRenderer = new ShapeRenderer(mTrivialShader);\n\n  for (int i = 0; i < mWidgetCount; ++i) {\n    mWidgets[i]->StartGraphics();\n  }\n  mTransitionStart = Clock();\n\n  if (mWidgetCount <= 0) {\n    // time to create our widgets\n    OnCreateWidgets();\n  }\n}\n\nvoid UiScene::OnKillGraphics() {\n  CleanUp(&mTextRenderer);\n  CleanUp(&mShapeRenderer);\n  CleanUp(&mTrivialShader);\n\n  for (int i = 0; i < mWidgetCount; ++i) {\n    mWidgets[i]->KillGraphics();\n  }\n\n  // remove all widgets\n  DeleteWidgets();\n}\n\nvoid UiScene::OnScreenResized(int, int) {\n  // screen got resized; if we have widgets and graphics, we have to recreate\n  // them\n  SceneManager* mgr = SceneManager::GetInstance();\n  if (mgr->HasGraphics() && mWidgetCount > 0) {\n    DeleteWidgets();\n    OnCreateWidgets();\n  }\n}\n\nUiWidget* UiScene::GetWidgetById(int id) {\n  return (id < 0 || id >= mWidgetCount) ? NULL : mWidgets[id];\n}\n\nvoid UiScene::DoFrame() {\n  SceneManager* mgr = SceneManager::GetInstance();\n\n  // clear screen\n  glClearColor(0.0f, 0.0f, 0.0f, 1.0f);\n  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n  glDisable(GL_DEPTH_TEST);\n\n  // render background\n  RenderBackground();\n\n  // if we're in wait screen mode, render the \"Please Wait\" sign and do nothing\n  // else\n  if (mWaitScreen) {\n    mTextRenderer->SetFontScale(WAIT_SIGN_SCALE);\n    mTextRenderer->SetColor(1.0f, 1.0f, 1.0f);\n    mTextRenderer->RenderText(S_PLEASE_WAIT, mgr->GetScreenAspect() * 0.5f,\n                              0.5f);\n    glEnable(GL_DEPTH_TEST);\n    return;\n  }\n\n  // if the currently focused widget is not a clickable button, get out of focus\n  // mode\n  if (mFocusWidget >= 0 && !mWidgets[mFocusWidget]->IsClickableButton()) {\n    mFocusWidget = -1;\n  }\n\n  // calculate transition factor, which is 0 when we're starting the transition\n  // and 1 when we've finished the transition\n  float tf =\n      Clamp((Clock() - mTransitionStart) / TRANSITION_DURATION, 0.0f, 1.0f);\n\n  // render ALL the widgets!\n  int i;\n  for (i = 0; i < mWidgetCount; ++i) {\n    mWidgets[i]->Render(mTrivialShader, mTextRenderer, mShapeRenderer,\n                        (mFocusWidget < 0)    ? UiWidget::FOCUS_NOT_APPLICABLE\n                        : (mFocusWidget == i) ? UiWidget::FOCUS_YES\n                                              : UiWidget::FOCUS_NO,\n                        tf);\n  }\n\n  glEnable(GL_DEPTH_TEST);\n}\n\nvoid UiScene::RenderBackground() {\n  // base classes override this to draw background\n}\n\nvoid UiScene::OnButtonClicked(int) {\n  // base classes override this to react to button clicks\n}\n\nvoid UiScene::UpdateTouchFocus(const struct PointerCoords* coords) {\n  // translate to our coordinate system\n  float h = SceneManager::GetInstance()->GetScreenHeight();\n  float x = coords->x / h;\n  float y = (h - coords->y) / h;\n\n  int i;\n  mFocusWidget = -1;\n  for (i = 0; i < mWidgetCount; ++i) {\n    UiWidget* w = mWidgets[i];\n    if (w->PointBelongs(x, y) && w->IsClickableButton()) {\n      mFocusWidget = i;\n      return;\n    }\n  }\n}\n\nvoid UiScene::OnPointerDown(int, const struct PointerCoords* coords) {\n  // If this event was generated by something that's not associated to the\n  // screen, (like a trackpad), ignore it, because our UI is not driven that\n  // way.\n  if (coords->isScreen && !mWaitScreen) {\n    mPointerDown = true;\n    UpdateTouchFocus(coords);\n  }\n}\n\nvoid UiScene::OnPointerMove(int, const struct PointerCoords* coords) {\n  if (coords->isScreen && mPointerDown && !mWaitScreen) {\n    UpdateTouchFocus(coords);\n  }\n}\n\nvoid UiScene::OnPointerUp(int, const struct PointerCoords* coords) {\n  if (!coords->isScreen || mWaitScreen) {\n    return;\n  }\n\n  // if we didn't know the pointer was down, this event should not trigger\n  // anything\n  if (!mPointerDown) {\n    return;\n  }\n\n  mPointerDown = false;\n  UpdateTouchFocus(coords);\n\n  if (mFocusWidget >= 0 && mWidgets[mFocusWidget]->IsButton()) {\n    DispatchButtonClick(mFocusWidget);\n    mFocusWidget = -1;\n  }\n}\n\nvoid UiScene::DispatchButtonClick(int id) {\n  UiWidget* w = GetWidgetById(id);\n  if (w && w->IsClickableButton()) {\n    OnButtonClicked(id);\n  }\n}\n\nint UiScene::FindDefaultButton() {\n  if (mDefaultButton >= 0) {\n    return mDefaultButton;\n  }\n  int i;\n  for (i = 0; i < mWidgetCount; ++i) {\n    UiWidget* w = mWidgets[i];\n    if (w->IsClickableButton()) {\n      return i;\n    }\n  }\n  return -1;\n}\n\nvoid UiScene::OnKeyDown(int ourKeyCode) {\n  if (mWaitScreen) {\n    return;\n  }\n\n  int navDir = -1;\n  switch (ourKeyCode) {\n    case OURKEY_UP:\n      navDir = UI_DIR_UP;\n      break;\n    case OURKEY_DOWN:\n      navDir = UI_DIR_DOWN;\n      break;\n    case OURKEY_LEFT:\n      navDir = UI_DIR_LEFT;\n      break;\n    case OURKEY_RIGHT:\n      navDir = UI_DIR_RIGHT;\n      break;\n    case OURKEY_ENTER:\n      DispatchButtonClick(mFocusWidget >= 0 ? mFocusWidget : mDefaultButton);\n      break;\n  }\n\n  if (navDir >= 0) {\n    if (mFocusWidget < 0) {\n      // enter focus mode\n      mFocusWidget = FindDefaultButton();\n    } else {\n      // navigate\n      int destId = -1;\n      UiWidget* w = GetWidgetById(mFocusWidget);\n      UiWidget* destWidget =\n          w ? GetWidgetById(destId = w->GetNav(navDir)) : NULL;\n      if (destWidget && destWidget->IsClickableButton()) {\n        // navigate to that widget\n        mFocusWidget = destId;\n      }\n    }\n  }\n}\n\nvoid UiScene::AddNav(int fromWidgetId, int dir, int toWidgetId) {\n  UiWidget* from = GetWidgetById(fromWidgetId);\n  UiWidget* to = GetWidgetById(toWidgetId);\n  if (from && to) {\n    from->SetNav(dir, toWidgetId);\n  }\n}\n\nstatic void _apply_transition(int trans, float f, float* x, float* y, float* w,\n                              float* h, float* fontScale) {\n  float maxX = SceneManager::GetInstance()->GetScreenAspect();\n  switch (trans) {\n    case UiWidget::TRANS_SCALE:\n      *w = *w * f;\n      *h = *h * f;\n      *fontScale = *fontScale * f;\n      break;\n    case UiWidget::TRANS_FROM_LEFT:\n      *x = Interpolate(0.0f, *x - *w * 0.5f, 1.0f, *x, f);\n      break;\n    case UiWidget::TRANS_FROM_RIGHT:\n      *x = Interpolate(0.0f, maxX + *w * 0.5f, 1.0f, *x, f);\n      break;\n    case UiWidget::TRANS_FROM_TOP:\n      *y = Interpolate(0.0f, 1.0f + *h * 0.5f, 1.0f, *y, f);\n      break;\n    case UiWidget::TRANS_FROM_BOTTOM:\n      *y = Interpolate(0.0f, *y - *h * 0.5f, 1.0f, *y, f);\n      break;\n  }\n}\n\nvoid UiWidget::Render(TrivialShader*, TextRenderer* textRenderer,\n                      ShapeRenderer* shapeRenderer, int focus,\n                      float transitionFactor) {\n  if (!mVisible) {\n    // that was easy.\n    return;\n  }\n\n  bool pulse = IsClickableButton() && (focus != FOCUS_NO);\n  float factor = pulse ? SineWave(1.0f - PULSE_AMOUNT, 1.0f + PULSE_AMOUNT,\n                                  PULSE_PERIOD, 0.0f)\n                       : 1.0f;\n  const float* color = (mIsButton && focus == FOCUS_YES) ? BUTTON_FOCUS_COLOR\n                       : (mIsButton && !mEnabled)        ? BUTTON_DISABLED_COLOR\n                                                         : mTextColor;\n  float borderSize = 0.0f;\n  float x = mCenterX;\n  float y = mCenterY;\n  float w = mWidth;\n  float h = mHeight;\n  float fontScale = mFontScale;\n\n  _apply_transition(mTransition, transitionFactor, &x, &y, &w, &h, &fontScale);\n\n  // Note: right now, we don't support buttons that have borders AND are\n  // transparent. They will be rendered incorrectly (the background will be the\n  // border color).\n\n  if (mHasBorder || (focus == FOCUS_YES && !mTransparent)) {\n    // draw border\n    shapeRenderer->SetColor(color);\n    shapeRenderer->RenderRect(x, y, w * factor, h * factor);\n    borderSize = BUTTON_BORDER_SIZE;\n  }\n\n  // draw background\n  if (mIsButton && !mTransparent) {\n    shapeRenderer->SetColor(mBackColor);\n    shapeRenderer->RenderRect(x, y, w * factor * (1.0f - borderSize),\n                              h * factor * (1.0f - borderSize));\n  }\n\n  // draw text\n  if (mText) {\n    textRenderer->SetColor(color);\n    textRenderer->SetFontScale(fontScale * factor);\n    textRenderer->RenderText(mText, x, y);\n  }\n}\n\nvoid UiScene::OnCreateWidgets() {}\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/ui_scene.hpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef endlesstunnel_ui_scene_hpp\n#define endlesstunnel_ui_scene_hpp\n\n#include \"ascii_to_geom.hpp\"\n#include \"engine.hpp\"\n#include \"shape_renderer.hpp\"\n#include \"text_renderer.hpp\"\n#include \"util.hpp\"\n\n#define UI_DIR_UP 0\n#define UI_DIR_RIGHT 1\n#define UI_DIR_DOWN 2\n#define UI_DIR_LEFT 3\n\nclass UiWidget;\n\n/* UI scene. This is a base class for all scenes that present menus, etc. */\nclass UiScene : public Scene {\n protected:\n  // the widgets we currently have\n  static const int MAX_WIDGETS = 64;\n  int mWidgetCount;\n  UiWidget* mWidgets[MAX_WIDGETS];\n\n  // which widget currently has focus? If we are not in focus mode, this is -1\n  int mFocusWidget;\n\n  // is a touch pointer (a.k.a. finger) down at the moment?\n  bool mPointerDown;\n\n  // what is the default button? The default widget is the one that we assume\n  // was clicked if the user presses ENTER on the DPAD when not in focus mode.\n  int mDefaultButton;\n\n  // renderers and shaders we need\n  TrivialShader* mTrivialShader;\n  TextRenderer* mTextRenderer;\n  ShapeRenderer* mShapeRenderer;\n\n  // if true, shows a \"please wait\" screen instead of the interface\n  bool mWaitScreen;\n\n  // must be implemented by subclass\n  virtual void OnButtonClicked(int buttonId);\n  virtual void RenderBackground();\n\n  // transition start time\n  float mTransitionStart;\n\n  // add a new widget\n  UiWidget* NewWidget();\n\n  // set default button -- the button that is assumed to be clicked when the\n  // user presses the the \"confirm\" button (usually DPAD_CENTER or the ENTER key\n  // on a keyboard).\n  void SetDefaultButton(int id) { mDefaultButton = id; }\n\n  void SetWaitScreen(bool b) {\n    mWaitScreen = b;\n    if (mWaitScreen) {\n      mTransitionStart = Clock();\n    }\n  }\n\n  // add a navigation rule\n  void AddNav(int fromWidgetId, int dir, int toWidgetId);\n\n  // subclasses must override these to create their widgets\n  virtual void OnCreateWidgets();\n\n public:\n  UiScene();\n  virtual ~UiScene();\n\n  virtual void OnStartGraphics();\n  virtual void OnKillGraphics();\n  virtual void DoFrame();\n  virtual void OnPointerDown(int pointerId, const struct PointerCoords* coords);\n  virtual void OnPointerMove(int pointerId, const struct PointerCoords* coords);\n  virtual void OnPointerUp(int pointerId, const struct PointerCoords* coords);\n  virtual void OnKeyDown(int ourKeyCode);\n  virtual void OnScreenResized(int width, int height);\n\n  UiWidget* GetWidgetById(int id);\n\n private:\n  void UpdateTouchFocus(const struct PointerCoords* coords);\n  void DispatchButtonClick(int id);\n  int FindDefaultButton();\n\n  void DeleteWidgets() { mWidgetCount = 0; }\n};\n\n/* Represents a single UI widget on the screen, like a block of text or a\n * button. */\nclass UiWidget {\n private:\n  int mId;\n  float mCenterX, mCenterY, mWidth, mHeight;\n  float mBackColor[3], mTextColor[3];\n  bool mHasBorder;\n  bool mTransparent;\n  bool mIsButton;\n  bool mVisible;\n  bool mEnabled;\n  const char* mText;\n  const char* mIconArt;\n  float mIconScale;\n  float mFontScale;\n  int mTransition;\n\n  // only exists between StartGraphics() and KillGraphics()\n  SimpleGeom* mIconGeom;\n\n  // which widget lies logically to each direction of this widget (for\n  // dpad navigation). Indexed by the UI_DIR_* constants.\n  int mNav[4];\n\n public:\n  static const int TRANS_NONE = 0;\n  static const int TRANS_SCALE = 1;\n  static const int TRANS_FROM_LEFT = 2;\n  static const int TRANS_FROM_RIGHT = 3;\n  static const int TRANS_FROM_TOP = 4;\n  static const int TRANS_FROM_BOTTOM = 5;\n\n  UiWidget(int id) {\n    mId = id;\n    mTransition = TRANS_NONE;\n    mCenterX = mCenterY = mWidth = mHeight = 0.0f;\n    mIsButton = false;\n    memset(mBackColor, 0, sizeof(mBackColor));\n    memset(mTextColor, 0, sizeof(mTextColor));\n    mTextColor[0] = mTextColor[1] = mTextColor[2] = 1.0f;\n    mText = NULL;\n    mIconGeom = NULL;\n    mEnabled = true;\n    mHasBorder = false;\n    mTransparent = false;\n    mVisible = true;\n    mFontScale = 1.0f;\n    mNav[0] = mNav[1] = mNav[2] = mNav[3] = -1;\n    mIconScale = 1.0f;\n    mIconArt = NULL;\n  }\n\n  ~UiWidget() { CleanUp(&mIconGeom); }\n\n  int GetId() { return mId; }\n  bool IsButton() { return mIsButton; }\n  int GetNav(int dir) { return dir >= 0 && dir < 4 ? mNav[dir] : -1; }\n\n  UiWidget* SetNav(int dir, int id) {\n    if (dir >= 0 && dir < 4) {\n      mNav[dir] = id;\n    }\n    return this;\n  }\n\n  UiWidget* SetTransition(int trans) {\n    mTransition = trans;\n    return this;\n  }\n\n  UiWidget* SetCenter(float x, float y) {\n    mCenterX = x;\n    mCenterY = y;\n    return this;\n  }\n\n  UiWidget* SetSize(float w, float h) {\n    mWidth = w;\n    mHeight = h;\n    return this;\n  }\n\n  UiWidget* SetText(const char* text) {\n    mText = text;\n    return this;\n  }\n\n  UiWidget* SetTextColor(float r, float g, float b) {\n    mTextColor[0] = r;\n    mTextColor[1] = g;\n    mTextColor[2] = b;\n    return this;\n  }\n\n  UiWidget* SetFontScale(float scale) {\n    mFontScale = scale;\n    return this;\n  }\n\n  UiWidget* SetIsButton(bool isButton) {\n    mIsButton = isButton;\n    mHasBorder = true;\n    return this;\n  }\n\n  void StartGraphics() {\n    if (mIconArt) {\n      mIconGeom = AsciiArtToGeom(mIconArt, mIconScale);\n    }\n  }\n\n  void KillGraphics() { CleanUp(&mIconGeom); }\n\n  bool PointBelongs(float x, float y) {\n    float dx = fabsf(x - mCenterX);\n    float dy = fabsf(y - mCenterY);\n    return dx < 0.5f * mWidth && dy < 0.5f * mHeight;\n  }\n\n  bool IsClickableButton() { return mIsButton && mVisible && mEnabled; }\n\n  static const int FOCUS_NOT_APPLICABLE = 0;\n  static const int FOCUS_YES = 1;\n  static const int FOCUS_NO = 2;\n  void Render(TrivialShader* trivialShader, TextRenderer* textRenderer,\n              ShapeRenderer* shapeRenderer, int focus, float transitionFactor);\n};\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/util.cpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#include \"util.hpp\"\n\n#include <cstdlib>\n#include <ctime>\n\nint Random(int uboundExclusive) {\n  int r = rand();\n  return r % uboundExclusive;\n}\n\nint Random(int lbound, int uboundExclusive) {\n  int r = rand();\n  r = r % (uboundExclusive - lbound);\n  return lbound + r;\n}\n\nfloat Clock() {\n  static struct timespec _base;\n  static bool firstCall = true;\n\n  if (firstCall) {\n    clock_gettime(CLOCK_MONOTONIC, &_base);\n    firstCall = false;\n  }\n\n  struct timespec t;\n  clock_gettime(CLOCK_MONOTONIC, &t);\n  float secDiff = (float)(t.tv_sec - _base.tv_sec);\n  float msecDiff = (float)((t.tv_nsec - _base.tv_nsec) / 1000000);\n  return secDiff + 0.001f * msecDiff;\n}\n\nfloat SineWave(float min, float max, float period, float phase) {\n  float ampl = max - min;\n  return min + ampl * sin(((Clock() / period) + phase) * 2 * M_PI);\n}\n\nbool BlinkFunc(float period) { return (int)(Clock() / period) & 1; }\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/util.hpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef endlesstunnel_util_hpp\n#define endlesstunnel_util_hpp\n\n#include <cmath>\n#include <ctime>\n\n// Clean up a resource (delete and set to null).\ntemplate <typename T>\nvoid CleanUp(T** pptr) {\n  if (*pptr) {\n    delete *pptr;\n    *pptr = NULL;\n  }\n}\n\nint Random(int uboundExclusive);\nint Random(int lbound, int uboundExclusive);\n\ntemplate <typename T>\nT Max(T a, T b) {\n  return a > b ? a : b;\n}\ntemplate <typename T>\nT Min(T a, T b) {\n  return a < b ? a : b;\n}\ntemplate <typename T>\nT Clamp(T v, T min, T max) {\n  return (v < min) ? min : (v > max) ? max : v;\n}\n\n// Linear interpolation. If x < x1, returns y1. If x > x2, returns y2. If x1 <=\n// x <= x2, then let f() be a linear function such that f(x1) = y1 and f(x2) =\n// y2. Returns f(x).\ntemplate <typename T>\nT Interpolate(T x1, T y1, T x2, T y2, T x) {\n  if (x2 < x1) return Interpolate(x2, y2, x1, y1, x);\n  return (x < x1)   ? y1\n         : (x > x2) ? y2\n                    : y1 + ((x - x1) / (x2 - x1)) * (y2 - y1);\n}\n\n// If abs(orig - target) <= amount, returns target. Otherwise, returns\n// either orig + amount or orig - amount, whichever one is closer to the target.\n// Intuitively, this means we are at x=orig and are aiming at x=target, and can\n// move up to <amount> units. For example, if orig is 50 and the target is 100,\n// then moving it by 10 will yield 60. If the target were 0, it would yield\n// 40. Now, if the target is within reach of the delta, the target is returned.\n// So if we're at 50, the target is 60 and the delta amount is 20, this returns\n// 60.\ntemplate <typename T>\nT Approach(T orig, T target, T amount) {\n  float absDiff = orig - target;\n  if (absDiff < static_cast<T>(0)) absDiff = -absDiff;\n  if (absDiff < amount) {\n    return target;\n  } else if (target > orig) {\n    return orig + amount;\n  } else {\n    return orig - amount;\n  }\n}\n\ntemplate <typename T>\nT Abs(T f) {\n  return f > static_cast<T>(0) ? f : -f;\n}\n\n// Returns current wall clock time (seconds elapsed since an arbitrary fixed\n// point in the past).\nfloat Clock();\nfloat SineWave(float min, float max, float period, float phase);\nbool BlinkFunc(float period);\n\n/* A simple chronometer that computes elapsed time. */\nclass DeltaClock {\n private:\n  float mLastTick;\n  float mMaxDelta;\n  bool mHasMax;\n\n public:\n  DeltaClock() {\n    mLastTick = Clock();\n    mHasMax = false;\n  }\n  DeltaClock(float maxDelta) {\n    mLastTick = Clock();\n    mMaxDelta = maxDelta;\n    mHasMax = true;\n  }\n  float ReadDelta() {\n    float d = Clamp(Clock() - mLastTick, 0.0f, mMaxDelta);\n    mLastTick = Clock();\n    return d;\n  }\n  void SetMaxDelta(float m) { mMaxDelta = m; }\n  void Reset() { mLastTick = Clock(); }\n};\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/vertexbuf.cpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#include \"vertexbuf.hpp\"\n\nVertexBuf::VertexBuf(GLfloat* geomData, int dataSize, int stride) {\n  MY_ASSERT(dataSize % stride == 0);\n\n  mPrimitive = GL_TRIANGLES;\n  mVbo = 0;\n  mStride = stride;\n  mColorsOffset = mTexCoordsOffset = 0;\n  mCount = dataSize / stride;\n\n  // build VBO\n  glGenBuffers(1, &mVbo);\n  BindBuffer();\n  glBufferData(GL_ARRAY_BUFFER, dataSize, geomData, GL_STATIC_DRAW);\n  UnbindBuffer();\n}\n\nvoid VertexBuf::BindBuffer() { glBindBuffer(GL_ARRAY_BUFFER, mVbo); }\n\nvoid VertexBuf::UnbindBuffer() { glBindBuffer(GL_ARRAY_BUFFER, 0); }\n\nVertexBuf::~VertexBuf() {\n  glDeleteBuffers(1, &mVbo);\n  mVbo = 0;\n}\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/vertexbuf.hpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef endlesstunnel_vertexbuf_hpp\n#define endlesstunnel_vertexbuf_hpp\n\n#include \"common.hpp\"\n\n/* Represents a vertex buffer (VBO). */\nclass VertexBuf {\n private:\n  GLuint mVbo;\n  GLenum mPrimitive;\n  int mStride;\n  int mColorsOffset;\n  int mTexCoordsOffset;\n  int mCount;\n\n public:\n  VertexBuf(GLfloat *geomData, int dataSize, int stride);\n  ~VertexBuf();\n\n  void BindBuffer();\n  void UnbindBuffer();\n\n  int GetStride() { return mStride; }\n  int GetCount() { return mCount; }\n  int GetPositionsOffset() { return 0; }\n\n  bool HasColors() { return mColorsOffset > 0; }\n  int GetColorsOffset() { return mColorsOffset; }\n  void SetColorsOffset(int offset) { mColorsOffset = offset; }\n\n  bool HasTexCoords() { return mTexCoordsOffset > 0; }\n  void SetTexCoordsOffset(int offset) { mTexCoordsOffset = offset; }\n  int GetTexCoordsOffset() { return mTexCoordsOffset; }\n\n  GLenum GetPrimitive() { return mPrimitive; }\n  void SetPrimitive(GLenum primitive) { mPrimitive = primitive; }\n};\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/welcome_scene.cpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#include \"welcome_scene.hpp\"\n\n#include \"anim.hpp\"\n#include \"blurb.inl\"\n#include \"dialog_scene.hpp\"\n#include \"play_scene.hpp\"\n#include \"strings.inl\"\n\n#define TITLE_POS center, 0.85f\n#define TITLE_FONT_SCALE 1.0f\n#define TITLE_COLOR 0.0f, 1.0f, 0.0f\n\n// button defaults:\n#define BUTTON_COLOR 0.0f, 1.0f, 0.0f\n#define BUTTON_SIZE 0.2f, 0.2f\n#define BUTTON_FONT_SCALE 0.5f\n\n// button geometry\n#define BUTTON_PLAY_POS center, 0.5f\n#define BUTTON_PLAY_SIZE 0.4f, 0.4f\n#define BUTTON_PLAY_FONT_SCALE 1.0f\n\n// size of all side buttons (story, about)\n#define BUTTON_SIDEBUTTON_WIDTH (center - 0.4f)\n#define BUTTON_SIDEBUTTON_HEIGHT 0.2f\n#define BUTTON_SIDEBUTTON_SIZE BUTTON_SIDEBUTTON_WIDTH, BUTTON_SIDEBUTTON_HEIGHT\n\n// position of each side button (the buttons on the sides of the PLAY button)\n#define BUTTON_STORY_POS 0.1f + 0.5f * BUTTON_SIDEBUTTON_WIDTH, 0.5f\n#define BUTTON_ABOUT_POS center + 0.3f + 0.5f * BUTTON_SIDEBUTTON_WIDTH, 0.5f\n\nWelcomeScene::WelcomeScene() {}\n\nWelcomeScene::~WelcomeScene() {}\n\nvoid WelcomeScene::RenderBackground() {\n  RenderBackgroundAnimation(mShapeRenderer);\n}\n\nvoid WelcomeScene::OnButtonClicked(int id) {\n  SceneManager* mgr = SceneManager::GetInstance();\n\n  if (id == mPlayButtonId) {\n    mgr->RequestNewScene(new PlayScene());\n  } else if (id == mStoryButtonId) {\n    mgr->RequestNewScene(\n        (new DialogScene())\n            ->SetText(BLURB_STORY)\n            ->SetSingleButton(S_OK, DialogScene::ACTION_RETURN));\n  } else if (id == mAboutButtonId) {\n    mgr->RequestNewScene(\n        (new DialogScene())\n            ->SetText(BLURB_ABOUT)\n            ->SetSingleButton(S_OK, DialogScene::ACTION_RETURN));\n  }\n}\n\nvoid WelcomeScene::DoFrame() {\n  // update widget states based on signed-in status\n  UpdateWidgetStates();\n\n  // if the sign in or cloud save process is in progress, show a wait screen.\n  // Otherwise, not:\n  SetWaitScreen(false);\n\n  // draw the UI\n  UiScene::DoFrame();\n}\n\nvoid WelcomeScene::UpdateWidgetStates() {\n  // Build navigation\n  AddNav(mPlayButtonId, UI_DIR_LEFT, mStoryButtonId);\n  AddNav(mPlayButtonId, UI_DIR_RIGHT, mAboutButtonId);\n\n  AddNav(mStoryButtonId, UI_DIR_RIGHT, mPlayButtonId);\n\n  AddNav(mAboutButtonId, UI_DIR_LEFT, mPlayButtonId);\n}\n\nvoid WelcomeScene::OnStartGraphics() { UiScene::OnStartGraphics(); }\n\nvoid WelcomeScene::OnCreateWidgets() {\n  // create widgets\n  float maxX = SceneManager::GetInstance()->GetScreenAspect();\n  float center = 0.5f * maxX;\n\n  // create the static title\n  NewWidget()\n      ->SetText(S_TITLE)\n      ->SetCenter(TITLE_POS)\n      ->SetTextColor(TITLE_COLOR)\n      ->SetFontScale(TITLE_FONT_SCALE)\n      ->SetTransition(UiWidget::TRANS_FROM_TOP);\n\n  // create the \"play\" button\n  mPlayButtonId = NewWidget()\n                      ->SetText(S_PLAY)\n                      ->SetTextColor(BUTTON_COLOR)\n                      ->SetCenter(BUTTON_PLAY_POS)\n                      ->SetSize(BUTTON_PLAY_SIZE)\n                      ->SetFontScale(BUTTON_PLAY_FONT_SCALE)\n                      ->SetIsButton(true)\n                      ->SetTransition(UiWidget::TRANS_SCALE)\n                      ->GetId();\n\n  // story button\n  mStoryButtonId = NewWidget()\n                       ->SetTextColor(BUTTON_COLOR)\n                       ->SetText(S_STORY)\n                       ->SetCenter(BUTTON_STORY_POS)\n                       ->SetSize(BUTTON_SIDEBUTTON_SIZE)\n                       ->SetFontScale(BUTTON_FONT_SCALE)\n                       ->SetIsButton(true)\n                       ->SetTransition(UiWidget::TRANS_FROM_RIGHT)\n                       ->GetId();\n\n  // about button\n  mAboutButtonId = NewWidget()\n                       ->SetTextColor(BUTTON_COLOR)\n                       ->SetText(S_ABOUT)\n                       ->SetCenter(BUTTON_ABOUT_POS)\n                       ->SetSize(BUTTON_SIDEBUTTON_SIZE)\n                       ->SetFontScale(BUTTON_FONT_SCALE)\n                       ->SetIsButton(true)\n                       ->SetTransition(UiWidget::TRANS_FROM_RIGHT)\n                       ->GetId();\n\n  // \"Play\" button is the default button\n  SetDefaultButton(mPlayButtonId);\n\n  // enable/disable widgets as appropriate to signed in state\n  UpdateWidgetStates();\n}\n\nvoid WelcomeScene::OnKillGraphics() { UiScene::OnKillGraphics(); }\n"
  },
  {
    "path": "endless-tunnel/app/src/main/cpp/welcome_scene.hpp",
    "content": "/*\n * Copyright (C) Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef endlesstunnel_welcome_scene_hpp\n#define endlesstunnel_welcome_scene_hpp\n\n#include \"engine.hpp\"\n#include \"our_shader.hpp\"\n#include \"tex_quad.hpp\"\n#include \"ui_scene.hpp\"\n#include \"util.hpp\"\n\n/* The \"welcome scene\" (main menu) */\nclass WelcomeScene : public UiScene {\n protected:\n  // IDs for our buttons:\n  int mPlayButtonId;\n  int mStoryButtonId;\n  int mAboutButtonId;\n\n  virtual void RenderBackground();\n  virtual void OnButtonClicked(int id);\n\n  void UpdateWidgetStates();\n\n public:\n  WelcomeScene();\n  ~WelcomeScene();\n\n  virtual void OnCreateWidgets();\n  virtual void OnStartGraphics();\n  virtual void OnKillGraphics();\n\n  virtual void DoFrame();\n};\n\n#endif\n"
  },
  {
    "path": "endless-tunnel/app/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n   Copyright (C) 2013 Google Inc.\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n      http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n\n<resources>\n    <string name=\"app_name\">Endless Tunnel</string>\n</resources>\n\n"
  },
  {
    "path": "endless-tunnel/app/src/main/res/values/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n   Copyright (C) 2013 Google Inc.\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n      http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n-->\n\n<resources xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <style name=\"AppTheme\" parent=\"android:Theme.NoTitleBar.Fullscreen\" />\n</resources>\n\n"
  },
  {
    "path": "exceptions/.gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n/.idea/caches\n/.idea/libraries\n/.idea/modules.xml\n/.idea/workspace.xml\n/.idea/navEditor.xml\n/.idea/assetWizardSettings.xml\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n.cxx\nlocal.properties\n"
  },
  {
    "path": "exceptions/README.md",
    "content": "# Exceptions\n\nThis Android sample shows how to handle exceptions across the JNI boundary.\n\n## Handling native exceptions\n\nNative exceptions can be caught in JNI methods and re-thrown in the JVM. Because\nuncaught native exceptions will cause your app to crash, we recommend catching\n**all** exceptions as a fail-safe. You may also want to catch instances of\n`std::exception` or your own exception interface:\n\n```C++\nextern \"C\" JNIEXPORT void JNICALL\nJava_com_example_exceptions_MainActivity_throwsException(JNIEnv* env,\n                                                         jobject /* this */) {\n  try {\n    might_throw();\n  } catch (std::exception& e) {\n    jniThrowRuntimeException(env, e.what());\n  } catch (...) {\n    jniThrowRuntimeException(env, \"Catch-all\");\n  }\n}\n```\n\nThen, you can do the same in your Java/Kotlin code:\n\n```kotlin\n    try {\n        jniMethodThatMightThrow();\n    } catch (e: java.lang.RuntimeException) {\n        // Handle exception\n    }\n```\n\nThe hard part here is using the JNI API to throw an exception in the JVM. That\nis, implementing `jniThrowRuntimeException`. We recommend referring to\n[JNIHelp.h](https://android.googlesource.com/platform/libnativehelper/+/refs/heads/master/include/nativehelper/JNIHelp.h)\nand\n[JNIHelp.c](https://android.googlesource.com/platform/libnativehelper/+/refs/heads/master/JNIHelp.c)\nin the Android platform's libnativehelper, from which\n[exception_helper.h](exceptions/app/src/main/cpp/exception_helper.h) and\n[exception_helper.cpp](exceptions/app/src/main/cpp/exception_helper.cpp) are\nadapted.\n\n## Screenshot\n\n![screenshot](screenshot.png)\n"
  },
  {
    "path": "exceptions/app/.gitignore",
    "content": "/build"
  },
  {
    "path": "exceptions/app/build.gradle",
    "content": "plugins {\n    id \"ndksamples.android.application\"\n    id \"ndksamples.android.kotlin\"\n}\n\nandroid {\n    namespace 'com.example.exceptions'\n\n    defaultConfig {\n        applicationId \"com.example.exceptions\"\n        versionCode 1\n        versionName \"1.0\"\n    }\n\n    externalNativeBuild {\n        cmake {\n            path file('src/main/cpp/CMakeLists.txt')\n        }\n    }\n\n    buildFeatures {\n        prefab true\n        viewBinding true\n    }\n}\n\ndependencies {\n    implementation libs.appcompat\n    implementation libs.material\n    implementation libs.androidx.constraintlayout\n    implementation project(\":base\")\n}"
  },
  {
    "path": "exceptions/app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "exceptions/app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <application\n        android:allowBackup=\"true\"\n        android:dataExtractionRules=\"@xml/data_extraction_rules\"\n        android:fullBackupContent=\"@xml/backup_rules\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:roundIcon=\"@mipmap/ic_launcher_round\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/Theme.Exceptions\"\n        tools:targetApi=\"31\">\n        <activity\n            android:name=\".MainActivity\"\n            android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n\n            <meta-data\n                android:name=\"android.app.lib_name\"\n                android:value=\"\" />\n        </activity>\n    </application>\n\n</manifest>"
  },
  {
    "path": "exceptions/app/src/main/cpp/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.22.1)\nproject(exceptions LANGUAGES CXX)\n\ninclude(AppLibrary)\nfind_package(base CONFIG REQUIRED)\n\nadd_app_library(\n    exceptions\n    SHARED\n    native-lib.cpp\n    exception_helper.cpp\n)\n\ntarget_link_libraries(\n    exceptions\n    PRIVATE\n    base::base\n    log\n)"
  },
  {
    "path": "exceptions/app/src/main/cpp/exception_helper.cpp",
    "content": "/*\n * Copyright (C) 2022 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * Helper functions for throwing Java exceptions from C++.\n *\n * Copied, with a few changes, from JNIHelp.{h,c} in the Android platform's\n * libnativehelper:\n *\n * https://android.googlesource.com/platform/libnativehelper/+/refs/heads/master/include/nativehelper/JNIHelp.h\n * https://android.googlesource.com/platform/libnativehelper/+/refs/heads/master/JNIHelp.c\n */\n\n#include \"exception_helper.h\"\n\n#include <android/log.h>\n\n#include <string>\n\nstatic jmethodID FindMethod(JNIEnv* env, const char* className,\n                            const char* methodName, const char* descriptor) {\n  jclass clazz = env->FindClass(className);\n  jmethodID methodId = env->GetMethodID(clazz, methodName, descriptor);\n  env->DeleteLocalRef(clazz);\n  return methodId;\n}\n\nstatic bool AppendJString(JNIEnv* env, jstring text, std::string* dst) {\n  const char* utfText = env->GetStringUTFChars(text, NULL);\n  if (utfText == NULL) {\n    return false;\n  }\n  dst->append(utfText);\n  env->ReleaseStringUTFChars(text, utfText);\n  return true;\n}\n\n/*\n * Returns a human-readable summary of an exception object.  The buffer will\n * be populated with the \"binary\" class name and, if present, the\n * exception message.\n */\nstatic bool GetExceptionSummary(JNIEnv* env, jthrowable thrown,\n                                std::string* dst) {\n  // Summary is <exception_class_name> \": \" <exception_message>\n  jclass exceptionClass = env->GetObjectClass(thrown);  // Always succeeds\n  jmethodID getName =\n      FindMethod(env, \"java/lang/Class\", \"getName\", \"()Ljava/lang/String;\");\n  jstring className = (jstring)env->CallObjectMethod(exceptionClass, getName);\n  if (className == NULL) {\n    *dst = \"<error getting class name>\";\n    env->ExceptionClear();\n    env->DeleteLocalRef(exceptionClass);\n    return false;\n  }\n  env->DeleteLocalRef(exceptionClass);\n  exceptionClass = NULL;\n  if (!AppendJString(env, className, dst)) {\n    *dst = \"<error getting class name UTF-8>\";\n    env->ExceptionClear();\n    env->DeleteLocalRef(className);\n    return false;\n  }\n  env->DeleteLocalRef(className);\n  className = NULL;\n  jmethodID getMessage = FindMethod(env, \"java/lang/Throwable\", \"getMessage\",\n                                    \"()Ljava/lang/String;\");\n  jstring message = (jstring)env->CallObjectMethod(thrown, getMessage);\n  if (message == NULL) {\n    return true;\n  }\n  dst->append(\": \");\n  bool success = AppendJString(env, message, dst);\n  if (!success) {\n    // Two potential reasons for reaching here:\n    //\n    // 1. managed heap allocation failure (OOME).\n    // 2. native heap allocation failure for the storage in |dst|.\n    //\n    // Attempt to append failure notification, okay to fail, |dst| contains the\n    // class name of |thrown|.\n    dst->append(\"<error getting message>\");\n    // Clear OOME if present.\n    env->ExceptionClear();\n  }\n  env->DeleteLocalRef(message);\n  message = NULL;\n  return success;\n}\n\nstatic jstring CreateExceptionMsg(JNIEnv* env, const char* msg) {\n  jstring detailMessage = env->NewStringUTF(msg);\n  if (detailMessage == NULL) {\n    /* Not really much we can do here. We're probably dead in the water,\n       but let's try to stumble on... */\n    env->ExceptionClear();\n  }\n  return detailMessage;\n}\n\nstatic void DiscardPendingException(JNIEnv* env, const char* className) {\n  jthrowable exception = env->ExceptionOccurred();\n  env->ExceptionClear();\n  if (exception == NULL) {\n    return;\n  }\n  std::string summary;\n  GetExceptionSummary(env, exception, &summary);\n  __android_log_print(ANDROID_LOG_WARN, \"exception_helper::\",\n                      \"Discarding pending exception (%s) to throw %s\",\n                      summary.c_str(), className);\n  env->DeleteLocalRef(exception);\n}\n\nstatic int ThrowException(JNIEnv* env, const char* className,\n                          const char* ctorSig, ...) {\n  int status = -1;\n  jclass exceptionClass = NULL;\n  va_list args;\n  va_start(args, ctorSig);\n  DiscardPendingException(env, className);\n  {\n    /* We want to clean up local references before returning from this function,\n     * so, regardless of return status, the end block must run. Have the work\n     * done in a nested block to avoid using any uninitialized variables in the\n     * end block. */\n    exceptionClass = env->FindClass(className);\n    if (exceptionClass == NULL) {\n      __android_log_print(ANDROID_LOG_ERROR, \"exception_helper::\",\n                          \"Unable to find exception class %s\", className);\n      /* an exception, most likely ClassNotFoundException, will now be pending\n       */\n      goto end;\n    }\n    jmethodID init = env->GetMethodID(exceptionClass, \"<init>\", ctorSig);\n    if (init == NULL) {\n      __android_log_print(ANDROID_LOG_ERROR, \"exception_helper::\",\n                          \"Failed to find constructor for '%s' '%s'\", className,\n                          ctorSig);\n      goto end;\n    }\n    jobject instance = env->NewObjectV(exceptionClass, init, args);\n    if (instance == NULL) {\n      __android_log_print(ANDROID_LOG_ERROR,\n                          \"exception_helper::\", \"Failed to construct '%s'\",\n                          className);\n      goto end;\n    }\n    if (env->Throw((jthrowable)instance) != JNI_OK) {\n      __android_log_print(ANDROID_LOG_ERROR,\n                          \"exception_helper::\", \"Failed to throw '%s'\",\n                          className);\n      /* an exception, most likely OOM, will now be pending */\n      goto end;\n    }\n    /* everything worked fine, just update status to success and clean up */\n    status = 0;\n  }\nend:\n  va_end(args);\n  if (exceptionClass != NULL) {\n    env->DeleteLocalRef(exceptionClass);\n  }\n  return status;\n}\n\n/*\n * Helper macro to deal with conversion of the exception message from a C string\n * to jstring.\n */\n#define THROW_EXCEPTION_WITH_MESSAGE(env, className, ctorSig, msg, ...)   \\\n  ({                                                                      \\\n    jstring _detailMessage = CreateExceptionMsg(env, msg);                \\\n    int _status = ThrowException(env, className, ctorSig, _detailMessage, \\\n                                 ##__VA_ARGS__);                          \\\n    if (_detailMessage != NULL) {                                         \\\n      env->DeleteLocalRef(_detailMessage);                                \\\n    }                                                                     \\\n    _status;                                                              \\\n  })\n\nint jniThrowException(JNIEnv* env, const char* className, const char* msg) {\n  return THROW_EXCEPTION_WITH_MESSAGE(env, className, \"(Ljava/lang/String;)V\",\n                                      msg);\n}\n"
  },
  {
    "path": "exceptions/app/src/main/cpp/exception_helper.h",
    "content": "#pragma once\n\n/*\n * Copyright (C) 2022 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * Helper functions for throwing Java exceptions from C++.\n *\n * Copied, with a few changes, from JNIHelp.{h,c} in the Android platform's\n * libnativehelper:\n *\n * https://android.googlesource.com/platform/libnativehelper/+/refs/heads/master/include/nativehelper/JNIHelp.h\n * https://android.googlesource.com/platform/libnativehelper/+/refs/heads/master/JNIHelp.c\n */\n\n#include <jni.h>\n\n/*\n * Throw an exception with the specified class and an optional message.\n *\n * The \"className\" argument will be passed directly to FindClass, which\n * takes strings with slashes (e.g. \"java/lang/Object\").\n *\n * If an exception is currently pending, we log a warning message and\n * clear it.\n *\n * Returns 0 on success, nonzero if something failed (e.g. the exception\n * class couldn't be found, so *an* exception will still be pending).\n *\n * Currently aborts the VM if it can't throw the exception.\n */\nint jniThrowException(JNIEnv* env, const char* className, const char* msg);\n\nstatic inline int jniThrowRuntimeException(JNIEnv* env, const char* msg) {\n  return jniThrowException(env, \"java/lang/RuntimeException\", msg);\n}"
  },
  {
    "path": "exceptions/app/src/main/cpp/libexceptions.map.txt",
    "content": "LIBEXCEPTIONS {\n  global:\n    JNI_OnLoad;\n  local:\n    *;\n};\n"
  },
  {
    "path": "exceptions/app/src/main/cpp/native-lib.cpp",
    "content": "#include <base/macros.h>\n#include <jni.h>\n\n#include <stdexcept>\n\n#include \"exception_helper.h\"\n\nvoid might_throw() { throw std::runtime_error(\"A C++ runtime_error\"); }\n\nvoid ThrowsException(JNIEnv* env, jobject /* this */) {\n  try {\n    might_throw();\n  } catch (std::exception& e) {\n    jniThrowRuntimeException(env, e.what());\n  } catch (...) {\n    // We don't want any C++ exceptions to cross the JNI boundary, so include a\n    // catch-all.\n    jniThrowRuntimeException(env, \"Catch-all\");\n  }\n}\n\nextern \"C\" JNIEXPORT jint JNI_OnLoad(JavaVM* _Nonnull vm, void* _Nullable) {\n  JNIEnv* env;\n  if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {\n    return JNI_ERR;\n  }\n\n  jclass c = env->FindClass(\"com/example/exceptions/MainActivity\");\n  if (c == nullptr) return JNI_ERR;\n\n  static const JNINativeMethod methods[] = {\n      {\"throwsException\", \"()V\", reinterpret_cast<void*>(ThrowsException)},\n  };\n  int rc = env->RegisterNatives(c, methods, arraysize(methods));\n  if (rc != JNI_OK) return rc;\n\n  return JNI_VERSION_1_6;\n}\n"
  },
  {
    "path": "exceptions/app/src/main/java/com/example/exceptions/MainActivity.kt",
    "content": "package com.example.exceptions\n\nimport androidx.appcompat.app.AppCompatActivity\nimport android.os.Bundle\nimport android.widget.TextView\nimport com.example.exceptions.databinding.ActivityMainBinding\n\nclass MainActivity : AppCompatActivity() {\n\n    private lateinit var binding: ActivityMainBinding\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        binding = ActivityMainBinding.inflate(layoutInflater)\n        setContentView(binding.root)\n\n        try {\n            throwsException();\n            binding.sampleText.text = \"No exception thrown\";\n        } catch (e: java.lang.RuntimeException) {\n            binding.sampleText.text = \"RuntimeException caught. Message: \\\"\" + e.message + \"\\\"\";\n        }\n\n    }\n\n    external fun throwsException()\n\n    companion object {\n        // Used to load the 'exceptions' library on application startup.\n        init {\n            System.loadLibrary(\"exceptions\")\n        }\n    }\n}"
  },
  {
    "path": "exceptions/app/src/main/res/drawable/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path\n        android:fillColor=\"#3DDC84\"\n        android:pathData=\"M0,0h108v108h-108z\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M9,0L9,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,0L19,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,0L29,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,0L39,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,0L49,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,0L59,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,0L69,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,0L79,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M89,0L89,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M99,0L99,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,9L108,9\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,19L108,19\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,29L108,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,39L108,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,49L108,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,59L108,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,69L108,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,79L108,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,89L108,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,99L108,99\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,29L89,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,39L89,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,49L89,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,59L89,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,69L89,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,79L89,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,19L29,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,19L39,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,19L49,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,19L59,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,19L69,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,19L79,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n</vector>\n"
  },
  {
    "path": "exceptions/app/src/main/res/drawable-v24/ic_launcher_foreground.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path android:pathData=\"M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z\">\n        <aapt:attr name=\"android:fillColor\">\n            <gradient\n                android:endX=\"85.84757\"\n                android:endY=\"92.4963\"\n                android:startX=\"42.9492\"\n                android:startY=\"49.59793\"\n                android:type=\"linear\">\n                <item\n                    android:color=\"#44000000\"\n                    android:offset=\"0.0\" />\n                <item\n                    android:color=\"#00000000\"\n                    android:offset=\"1.0\" />\n            </gradient>\n        </aapt:attr>\n    </path>\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:fillType=\"nonZero\"\n        android:pathData=\"M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z\"\n        android:strokeWidth=\"1\"\n        android:strokeColor=\"#00000000\" />\n</vector>"
  },
  {
    "path": "exceptions/app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".MainActivity\">\n\n    <TextView\n        android:id=\"@+id/sample_text\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"Hello World!\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "exceptions/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\" />\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "exceptions/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\" />\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "exceptions/app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"purple_200\">#FFBB86FC</color>\n    <color name=\"purple_500\">#FF6200EE</color>\n    <color name=\"purple_700\">#FF3700B3</color>\n    <color name=\"teal_200\">#FF03DAC5</color>\n    <color name=\"teal_700\">#FF018786</color>\n    <color name=\"black\">#FF000000</color>\n    <color name=\"white\">#FFFFFFFF</color>\n</resources>"
  },
  {
    "path": "exceptions/app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">Exceptions</string>\n</resources>"
  },
  {
    "path": "exceptions/app/src/main/res/values/themes.xml",
    "content": "<resources xmlns:tools=\"http://schemas.android.com/tools\">\n    <!-- Base application theme. -->\n    <style name=\"Theme.Exceptions\" parent=\"Theme.MaterialComponents.DayNight.DarkActionBar\">\n        <!-- Primary brand color. -->\n        <item name=\"colorPrimary\">@color/purple_500</item>\n        <item name=\"colorPrimaryVariant\">@color/purple_700</item>\n        <item name=\"colorOnPrimary\">@color/white</item>\n        <!-- Secondary brand color. -->\n        <item name=\"colorSecondary\">@color/teal_200</item>\n        <item name=\"colorSecondaryVariant\">@color/teal_700</item>\n        <item name=\"colorOnSecondary\">@color/black</item>\n        <!-- Status bar color. -->\n        <item name=\"android:statusBarColor\">?attr/colorPrimaryVariant</item>\n        <!-- Customize your theme here. -->\n    </style>\n</resources>"
  },
  {
    "path": "exceptions/app/src/main/res/values-night/themes.xml",
    "content": "<resources xmlns:tools=\"http://schemas.android.com/tools\">\n    <!-- Base application theme. -->\n    <style name=\"Theme.Exceptions\" parent=\"Theme.MaterialComponents.DayNight.DarkActionBar\">\n        <!-- Primary brand color. -->\n        <item name=\"colorPrimary\">@color/purple_200</item>\n        <item name=\"colorPrimaryVariant\">@color/purple_700</item>\n        <item name=\"colorOnPrimary\">@color/black</item>\n        <!-- Secondary brand color. -->\n        <item name=\"colorSecondary\">@color/teal_200</item>\n        <item name=\"colorSecondaryVariant\">@color/teal_200</item>\n        <item name=\"colorOnSecondary\">@color/black</item>\n        <!-- Status bar color. -->\n        <item name=\"android:statusBarColor\">?attr/colorPrimaryVariant</item>\n        <!-- Customize your theme here. -->\n    </style>\n</resources>"
  },
  {
    "path": "exceptions/app/src/main/res/xml/backup_rules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Sample backup rules file; uncomment and customize as necessary.\n   See https://developer.android.com/guide/topics/data/autobackup\n   for details.\n   Note: This file is ignored for devices older that API 31\n   See https://developer.android.com/about/versions/12/backup-restore\n-->\n<full-backup-content>\n    <!--\n   <include domain=\"sharedpref\" path=\".\"/>\n   <exclude domain=\"sharedpref\" path=\"device.xml\"/>\n-->\n</full-backup-content>"
  },
  {
    "path": "exceptions/app/src/main/res/xml/data_extraction_rules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Sample data extraction rules file; uncomment and customize as necessary.\n   See https://developer.android.com/about/versions/12/backup-restore#xml-changes\n   for details.\n-->\n<data-extraction-rules>\n    <cloud-backup>\n        <!-- TODO: Use <include> and <exclude> to control what is backed up.\n        <include .../>\n        <exclude .../>\n        -->\n    </cloud-backup>\n    <!--\n    <device-transfer>\n        <include .../>\n        <exclude .../>\n    </device-transfer>\n    -->\n</data-extraction-rules>"
  },
  {
    "path": "gles3jni/README.md",
    "content": "# gles3jni\n\ngles3jni is an Android C++ sample that demonstrates how to use OpenGL ES 3.0\nfrom JNI/native code.\n\nThe OpenGL ES 3.0 rendering path uses a few new features compared to the OpenGL\nES 2.0 path:\n\n- Instanced rendering and vertex attribute divisor to reduce the number of draw\n  calls and uniform changes.\n- Vertex array objects to reduce the number of calls required to set up vertex\n  attribute state on each frame.\n- Explicit assignment of attribute locations, eliminating the need to query\n  assignments.\n\n## Screenshots\n\n![screenshot](screenshot.png)\n"
  },
  {
    "path": "gles3jni/app/build.gradle",
    "content": "plugins {\n    id \"ndksamples.android.application\"\n}\n\nandroid {\n    namespace 'com.android.gles3jni'\n\n    defaultConfig {\n        applicationId 'com.android.gles3jni'\n        externalNativeBuild {\n            cmake {\n                arguments '-DANDROID_STL=c++_static'\n            }\n        }\n    }\n\n    externalNativeBuild {\n        cmake {\n            path 'src/main/cpp/CMakeLists.txt'\n        }\n    }\n\n    buildFeatures {\n        prefab true\n    }\n}\n\ndependencies {\n    implementation project(\":base\")\n}\n"
  },
  {
    "path": "gles3jni/app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Copyright 2013 The Android Open Source Project\n\n     Licensed under the Apache License, Version 2.0 (the \"License\");\n     you may not use this file except in compliance with the License.\n     You may obtain a copy of the License at\n\n          http://www.apache.org/licenses/LICENSE-2.0\n\n     Unless required by applicable law or agreed to in writing, software\n     distributed under the License is distributed on an \"AS IS\" BASIS,\n     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n     See the License for the specific language governing permissions and\n     limitations under the License.\n-->\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n  <uses-feature android:glEsVersion=\"0x00030000\"/>\n  <application\n      android:allowBackup=\"false\"\n      android:fullBackupContent=\"false\"\n      android:icon=\"@mipmap/ic_launcher\"\n      android:label=\"@string/gles3jni_activity\">\n    <activity android:name=\"GLES3JNIActivity\"\n              android:theme=\"@android:style/Theme.NoTitleBar.Fullscreen\"\n              android:launchMode=\"singleTask\"\n              android:configChanges=\"orientation|keyboardHidden\"\n        android:exported=\"true\">\n      <intent-filter>\n        <action android:name=\"android.intent.action.MAIN\" />\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n      </intent-filter>\n    </activity>\n  </application>\n</manifest>\n"
  },
  {
    "path": "gles3jni/app/src/main/cpp/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.22.1)\nproject(Gles3Jni LANGUAGES CXX)\n\ninclude(AppLibrary)\nfind_package(base CONFIG REQUIRED)\n\nadd_app_library(gles3jni SHARED\n    ${GL3STUB_SRC}\n    gles3jni.cpp\n    RendererES2.cpp\n    RendererES3.cpp\n)\n\ntarget_link_libraries(gles3jni\n    base::base\n    GLESv3\n    android\n    EGL\n    log\n    m\n)\n"
  },
  {
    "path": "gles3jni/app/src/main/cpp/RendererES2.cpp",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include <EGL/egl.h>\n\n#include \"gles3jni.h\"\n\nstatic const char VERTEX_SHADER[] =\n    \"#version 100\\n\"\n    \"uniform mat2 scaleRot;\\n\"\n    \"uniform vec2 offset;\\n\"\n    \"attribute vec2 pos;\\n\"\n    \"attribute vec4 color;\\n\"\n    \"varying vec4 vColor;\\n\"\n    \"void main() {\\n\"\n    \"    gl_Position = vec4(scaleRot*pos + offset, 0.0, 1.0);\\n\"\n    \"    vColor = color;\\n\"\n    \"}\\n\";\n\nstatic const char FRAGMENT_SHADER[] =\n    \"#version 100\\n\"\n    \"precision mediump float;\\n\"\n    \"varying vec4 vColor;\\n\"\n    \"void main() {\\n\"\n    \"    gl_FragColor = vColor;\\n\"\n    \"}\\n\";\n\nclass RendererES2 : public Renderer {\n public:\n  RendererES2();\n  virtual ~RendererES2();\n  bool init();\n\n private:\n  virtual float* mapOffsetBuf();\n  virtual void unmapOffsetBuf();\n  virtual float* mapTransformBuf();\n  virtual void unmapTransformBuf();\n  virtual void draw(unsigned int numInstances);\n\n  const EGLContext mEglContext;\n  GLuint mProgram;\n  GLuint mVB;\n  GLint mPosAttrib;\n  GLint mColorAttrib;\n  GLint mScaleRotUniform;\n  GLint mOffsetUniform;\n\n  float mOffsets[2 * MAX_INSTANCES];\n  float mScaleRot[4 * MAX_INSTANCES];  // array of 2x2 column-major matrices\n};\n\nRenderer* createES2Renderer() {\n  RendererES2* renderer = new RendererES2;\n  if (!renderer->init()) {\n    delete renderer;\n    return NULL;\n  }\n  return renderer;\n}\n\nRendererES2::RendererES2()\n    : mEglContext(eglGetCurrentContext()),\n      mProgram(0),\n      mVB(0),\n      mPosAttrib(-1),\n      mColorAttrib(-1),\n      mScaleRotUniform(-1),\n      mOffsetUniform(-1) {}\n\nbool RendererES2::init() {\n  mProgram = createProgram(VERTEX_SHADER, FRAGMENT_SHADER);\n  if (!mProgram) return false;\n  mPosAttrib = glGetAttribLocation(mProgram, \"pos\");\n  mColorAttrib = glGetAttribLocation(mProgram, \"color\");\n  mScaleRotUniform = glGetUniformLocation(mProgram, \"scaleRot\");\n  mOffsetUniform = glGetUniformLocation(mProgram, \"offset\");\n\n  glGenBuffers(1, &mVB);\n  glBindBuffer(GL_ARRAY_BUFFER, mVB);\n  glBufferData(GL_ARRAY_BUFFER, sizeof(QUAD), &QUAD[0], GL_STATIC_DRAW);\n\n  ALOGV(\"Using OpenGL ES 2.0 renderer\");\n  return true;\n}\n\nRendererES2::~RendererES2() {\n  /* The destructor may be called after the context has already been\n   * destroyed, in which case our objects have already been destroyed.\n   *\n   * If the context exists, it must be current. This only happens when we're\n   * cleaning up after a failed init().\n   */\n  if (eglGetCurrentContext() != mEglContext) return;\n  glDeleteBuffers(1, &mVB);\n  glDeleteProgram(mProgram);\n}\n\nfloat* RendererES2::mapOffsetBuf() { return mOffsets; }\n\nvoid RendererES2::unmapOffsetBuf() {}\n\nfloat* RendererES2::mapTransformBuf() { return mScaleRot; }\n\nvoid RendererES2::unmapTransformBuf() {}\n\nvoid RendererES2::draw(unsigned int numInstances) {\n  glUseProgram(mProgram);\n\n  glBindBuffer(GL_ARRAY_BUFFER, mVB);\n  glVertexAttribPointer(mPosAttrib, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex),\n                        (const GLvoid*)offsetof(Vertex, pos));\n  glVertexAttribPointer(mColorAttrib, 4, GL_UNSIGNED_BYTE, GL_TRUE,\n                        sizeof(Vertex), (const GLvoid*)offsetof(Vertex, rgba));\n  glEnableVertexAttribArray(mPosAttrib);\n  glEnableVertexAttribArray(mColorAttrib);\n\n  for (unsigned int i = 0; i < numInstances; i++) {\n    glUniformMatrix2fv(mScaleRotUniform, 1, GL_FALSE, mScaleRot + 4 * i);\n    glUniform2fv(mOffsetUniform, 1, mOffsets + 2 * i);\n    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);\n  }\n}\n"
  },
  {
    "path": "gles3jni/app/src/main/cpp/RendererES3.cpp",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include <EGL/egl.h>\n\n#include \"gles3jni.h\"\n\n#define STR(s) #s\n#define STRV(s) STR(s)\n\n#define POS_ATTRIB 0\n#define COLOR_ATTRIB 1\n#define SCALEROT_ATTRIB 2\n#define OFFSET_ATTRIB 3\n\nstatic const char VERTEX_SHADER[] =\n    \"#version 300 es\\n\"\n    \"layout(location = \" STRV(POS_ATTRIB) \") in vec2 pos;\\n\"\n    \"layout(location=\" STRV(COLOR_ATTRIB) \") in vec4 color;\\n\"\n    \"layout(location=\" STRV(SCALEROT_ATTRIB) \") in vec4 scaleRot;\\n\"\n    \"layout(location=\" STRV(OFFSET_ATTRIB) \") in vec2 offset;\\n\"\n    \"out vec4 vColor;\\n\"\n    \"void main() {\\n\"\n    \"    mat2 sr = mat2(scaleRot.xy, scaleRot.zw);\\n\"\n    \"    gl_Position = vec4(sr*pos + offset, 0.0, 1.0);\\n\"\n    \"    vColor = color;\\n\"\n    \"}\\n\";\n\nstatic const char FRAGMENT_SHADER[] =\n    \"#version 300 es\\n\"\n    \"precision mediump float;\\n\"\n    \"in vec4 vColor;\\n\"\n    \"out vec4 outColor;\\n\"\n    \"void main() {\\n\"\n    \"    outColor = vColor;\\n\"\n    \"}\\n\";\n\nclass RendererES3 : public Renderer {\n public:\n  RendererES3();\n  virtual ~RendererES3();\n  bool init();\n\n private:\n  enum { VB_INSTANCE, VB_SCALEROT, VB_OFFSET, VB_COUNT };\n\n  virtual float* mapOffsetBuf();\n  virtual void unmapOffsetBuf();\n  virtual float* mapTransformBuf();\n  virtual void unmapTransformBuf();\n  virtual void draw(unsigned int numInstances);\n\n  const EGLContext mEglContext;\n  GLuint mProgram;\n  GLuint mVB[VB_COUNT];\n  GLuint mVBState;\n};\n\nRenderer* createES3Renderer() {\n  RendererES3* renderer = new RendererES3;\n  if (!renderer->init()) {\n    delete renderer;\n    return NULL;\n  }\n  return renderer;\n}\n\nRendererES3::RendererES3()\n    : mEglContext(eglGetCurrentContext()), mProgram(0), mVBState(0) {\n  for (int i = 0; i < VB_COUNT; i++) mVB[i] = 0;\n}\n\nbool RendererES3::init() {\n  mProgram = createProgram(VERTEX_SHADER, FRAGMENT_SHADER);\n  if (!mProgram) return false;\n\n  glGenBuffers(VB_COUNT, mVB);\n  glBindBuffer(GL_ARRAY_BUFFER, mVB[VB_INSTANCE]);\n  glBufferData(GL_ARRAY_BUFFER, sizeof(QUAD), &QUAD[0], GL_STATIC_DRAW);\n  glBindBuffer(GL_ARRAY_BUFFER, mVB[VB_SCALEROT]);\n  glBufferData(GL_ARRAY_BUFFER, MAX_INSTANCES * 4 * sizeof(float), NULL,\n               GL_DYNAMIC_DRAW);\n  glBindBuffer(GL_ARRAY_BUFFER, mVB[VB_OFFSET]);\n  glBufferData(GL_ARRAY_BUFFER, MAX_INSTANCES * 2 * sizeof(float), NULL,\n               GL_STATIC_DRAW);\n\n  glGenVertexArrays(1, &mVBState);\n  glBindVertexArray(mVBState);\n\n  glBindBuffer(GL_ARRAY_BUFFER, mVB[VB_INSTANCE]);\n  glVertexAttribPointer(POS_ATTRIB, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex),\n                        (const GLvoid*)offsetof(Vertex, pos));\n  glVertexAttribPointer(COLOR_ATTRIB, 4, GL_UNSIGNED_BYTE, GL_TRUE,\n                        sizeof(Vertex), (const GLvoid*)offsetof(Vertex, rgba));\n  glEnableVertexAttribArray(POS_ATTRIB);\n  glEnableVertexAttribArray(COLOR_ATTRIB);\n\n  glBindBuffer(GL_ARRAY_BUFFER, mVB[VB_SCALEROT]);\n  glVertexAttribPointer(SCALEROT_ATTRIB, 4, GL_FLOAT, GL_FALSE,\n                        4 * sizeof(float), 0);\n  glEnableVertexAttribArray(SCALEROT_ATTRIB);\n  glVertexAttribDivisor(SCALEROT_ATTRIB, 1);\n\n  glBindBuffer(GL_ARRAY_BUFFER, mVB[VB_OFFSET]);\n  glVertexAttribPointer(OFFSET_ATTRIB, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float),\n                        0);\n  glEnableVertexAttribArray(OFFSET_ATTRIB);\n  glVertexAttribDivisor(OFFSET_ATTRIB, 1);\n\n  ALOGV(\"Using OpenGL ES 3.0 renderer\");\n  return true;\n}\n\nRendererES3::~RendererES3() {\n  /* The destructor may be called after the context has already been\n   * destroyed, in which case our objects have already been destroyed.\n   *\n   * If the context exists, it must be current. This only happens when we're\n   * cleaning up after a failed init().\n   */\n  if (eglGetCurrentContext() != mEglContext) return;\n  glDeleteVertexArrays(1, &mVBState);\n  glDeleteBuffers(VB_COUNT, mVB);\n  glDeleteProgram(mProgram);\n}\n\nfloat* RendererES3::mapOffsetBuf() {\n  glBindBuffer(GL_ARRAY_BUFFER, mVB[VB_OFFSET]);\n  return (float*)glMapBufferRange(\n      GL_ARRAY_BUFFER, 0, MAX_INSTANCES * 2 * sizeof(float),\n      GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);\n}\n\nvoid RendererES3::unmapOffsetBuf() { glUnmapBuffer(GL_ARRAY_BUFFER); }\n\nfloat* RendererES3::mapTransformBuf() {\n  glBindBuffer(GL_ARRAY_BUFFER, mVB[VB_SCALEROT]);\n  return (float*)glMapBufferRange(\n      GL_ARRAY_BUFFER, 0, MAX_INSTANCES * 4 * sizeof(float),\n      GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);\n}\n\nvoid RendererES3::unmapTransformBuf() { glUnmapBuffer(GL_ARRAY_BUFFER); }\n\nvoid RendererES3::draw(unsigned int numInstances) {\n  glUseProgram(mProgram);\n  glBindVertexArray(mVBState);\n  glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, numInstances);\n}\n"
  },
  {
    "path": "gles3jni/app/src/main/cpp/gles3jni.cpp",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"gles3jni.h\"\n\n#include <base/macros.h>\n#include <jni.h>\n#include <stdlib.h>\n#include <string.h>\n#include <time.h>\n\nconst Vertex QUAD[4] = {\n    // Square with diagonal < 2 so that it fits in a [-1 .. 1]^2 square\n    // regardless of rotation.\n    {{-0.7f, -0.7f}, {0x00, 0xFF, 0x00}},\n    {{0.7f, -0.7f}, {0x00, 0x00, 0xFF}},\n    {{-0.7f, 0.7f}, {0xFF, 0x00, 0x00}},\n    {{0.7f, 0.7f}, {0xFF, 0xFF, 0xFF}},\n};\n\nbool checkGlError(const char* funcName) {\n  GLint err = glGetError();\n  if (err != GL_NO_ERROR) {\n    ALOGE(\"GL error after %s(): 0x%08x\\n\", funcName, err);\n    return true;\n  }\n  return false;\n}\n\nGLuint createShader(GLenum shaderType, const char* src) {\n  GLuint shader = glCreateShader(shaderType);\n  if (!shader) {\n    checkGlError(\"glCreateShader\");\n    return 0;\n  }\n  glShaderSource(shader, 1, &src, NULL);\n\n  GLint compiled = GL_FALSE;\n  glCompileShader(shader);\n  glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);\n  if (!compiled) {\n    GLint infoLogLen = 0;\n    glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLen);\n    if (infoLogLen > 0) {\n      GLchar* infoLog = (GLchar*)malloc(infoLogLen);\n      if (infoLog) {\n        glGetShaderInfoLog(shader, infoLogLen, NULL, infoLog);\n        ALOGE(\"Could not compile %s shader:\\n%s\\n\",\n              shaderType == GL_VERTEX_SHADER ? \"vertex\" : \"fragment\", infoLog);\n        free(infoLog);\n      }\n    }\n    glDeleteShader(shader);\n    return 0;\n  }\n\n  return shader;\n}\n\nGLuint createProgram(const char* vtxSrc, const char* fragSrc) {\n  GLuint vtxShader = 0;\n  GLuint fragShader = 0;\n  GLuint program = 0;\n  GLint linked = GL_FALSE;\n\n  vtxShader = createShader(GL_VERTEX_SHADER, vtxSrc);\n  if (!vtxShader) goto exit;\n\n  fragShader = createShader(GL_FRAGMENT_SHADER, fragSrc);\n  if (!fragShader) goto exit;\n\n  program = glCreateProgram();\n  if (!program) {\n    checkGlError(\"glCreateProgram\");\n    goto exit;\n  }\n  glAttachShader(program, vtxShader);\n  glAttachShader(program, fragShader);\n\n  glLinkProgram(program);\n  glGetProgramiv(program, GL_LINK_STATUS, &linked);\n  if (!linked) {\n    ALOGE(\"Could not link program\");\n    GLint infoLogLen = 0;\n    glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLogLen);\n    if (infoLogLen) {\n      GLchar* infoLog = (GLchar*)malloc(infoLogLen);\n      if (infoLog) {\n        glGetProgramInfoLog(program, infoLogLen, NULL, infoLog);\n        ALOGE(\"Could not link program:\\n%s\\n\", infoLog);\n        free(infoLog);\n      }\n    }\n    glDeleteProgram(program);\n    program = 0;\n  }\n\nexit:\n  glDeleteShader(vtxShader);\n  glDeleteShader(fragShader);\n  return program;\n}\n\nstatic void printGlString(const char* name, GLenum s) {\n  const char* v = (const char*)glGetString(s);\n  ALOGV(\"GL %s: %s\\n\", name, v);\n}\n\n// ----------------------------------------------------------------------------\n\nRenderer::Renderer() : mNumInstances(0), mLastFrameNs(0) {\n  memset(mScale, 0, sizeof(mScale));\n  memset(mAngularVelocity, 0, sizeof(mAngularVelocity));\n  memset(mAngles, 0, sizeof(mAngles));\n}\n\nRenderer::~Renderer() {}\n\nvoid Renderer::resize(int w, int h) {\n  auto offsets = mapOffsetBuf();\n  calcSceneParams(w, h, offsets);\n  unmapOffsetBuf();\n\n  // Auto gives a signed int :-(\n  for (auto i = (unsigned)0; i < mNumInstances; i++) {\n    mAngles[i] = drand48() * TWO_PI;\n    mAngularVelocity[i] = MAX_ROT_SPEED * (2.0 * drand48() - 1.0);\n  }\n\n  mLastFrameNs = 0;\n\n  glViewport(0, 0, w, h);\n}\n\nvoid Renderer::calcSceneParams(unsigned int w, unsigned int h, float* offsets) {\n  // number of cells along the larger screen dimension\n  const float NCELLS_MAJOR = MAX_INSTANCES_PER_SIDE;\n  // cell size in scene space\n  const float CELL_SIZE = 2.0f / NCELLS_MAJOR;\n\n  // Calculations are done in \"landscape\", i.e. assuming dim[0] >= dim[1].\n  // Only at the end are values put in the opposite order if h > w.\n  const float dim[2] = {fmaxf(w, h), fminf(w, h)};\n  const float aspect[2] = {dim[0] / dim[1], dim[1] / dim[0]};\n  const float scene2clip[2] = {1.0f, aspect[0]};\n  const int ncells[2] = {static_cast<int>(NCELLS_MAJOR),\n                         (int)floorf(NCELLS_MAJOR * aspect[1])};\n\n  float centers[2][MAX_INSTANCES_PER_SIDE];\n  for (int d = 0; d < 2; d++) {\n    auto offset = -ncells[d] / NCELLS_MAJOR;  // -1.0 for d=0\n    for (auto i = 0; i < ncells[d]; i++) {\n      centers[d][i] = scene2clip[d] * (CELL_SIZE * (i + 0.5f) + offset);\n    }\n  }\n\n  int major = w >= h ? 0 : 1;\n  int minor = w >= h ? 1 : 0;\n  // outer product of centers[0] and centers[1]\n  for (int i = 0; i < ncells[0]; i++) {\n    for (int j = 0; j < ncells[1]; j++) {\n      int idx = i * ncells[1] + j;\n      offsets[2 * idx + major] = centers[0][i];\n      offsets[2 * idx + minor] = centers[1][j];\n    }\n  }\n\n  mNumInstances = ncells[0] * ncells[1];\n  mScale[major] = 0.5f * CELL_SIZE * scene2clip[0];\n  mScale[minor] = 0.5f * CELL_SIZE * scene2clip[1];\n}\n\nvoid Renderer::step() {\n  timespec now;\n  clock_gettime(CLOCK_MONOTONIC, &now);\n  auto nowNs = now.tv_sec * 1000000000ull + now.tv_nsec;\n\n  if (mLastFrameNs > 0) {\n    float dt = float(nowNs - mLastFrameNs) * 0.000000001f;\n\n    for (unsigned int i = 0; i < mNumInstances; i++) {\n      mAngles[i] += mAngularVelocity[i] * dt;\n      if (mAngles[i] >= TWO_PI) {\n        mAngles[i] -= TWO_PI;\n      } else if (mAngles[i] <= -TWO_PI) {\n        mAngles[i] += TWO_PI;\n      }\n    }\n\n    float* transforms = mapTransformBuf();\n    for (unsigned int i = 0; i < mNumInstances; i++) {\n      float s = sinf(mAngles[i]);\n      float c = cosf(mAngles[i]);\n      transforms[4 * i + 0] = c * mScale[0];\n      transforms[4 * i + 1] = s * mScale[1];\n      transforms[4 * i + 2] = -s * mScale[0];\n      transforms[4 * i + 3] = c * mScale[1];\n    }\n    unmapTransformBuf();\n  }\n\n  mLastFrameNs = nowNs;\n}\n\nvoid Renderer::render() {\n  step();\n\n  glClearColor(0.2f, 0.2f, 0.3f, 1.0f);\n  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n  draw(mNumInstances);\n  checkGlError(\"Renderer::render\");\n}\n\n// ----------------------------------------------------------------------------\n\nstatic Renderer* g_renderer = NULL;\n\n#if !defined(DYNAMIC_ES3)\nstatic GLboolean gl3stubInit() { return GL_TRUE; }\n#endif\n\nvoid Init(JNIEnv*, jclass) {\n  if (g_renderer) {\n    delete g_renderer;\n    g_renderer = NULL;\n  }\n\n  printGlString(\"Version\", GL_VERSION);\n  printGlString(\"Vendor\", GL_VENDOR);\n  printGlString(\"Renderer\", GL_RENDERER);\n  printGlString(\"Extensions\", GL_EXTENSIONS);\n\n  const char* versionStr = (const char*)glGetString(GL_VERSION);\n  if (strstr(versionStr, \"OpenGL ES 3.\") && gl3stubInit()) {\n    g_renderer = createES3Renderer();\n  } else if (strstr(versionStr, \"OpenGL ES 2.\")) {\n    g_renderer = createES2Renderer();\n  } else {\n    ALOGE(\"Unsupported OpenGL ES version\");\n  }\n}\n\nvoid Resize(JNIEnv*, jclass, jint width, jint height) {\n  if (g_renderer) {\n    g_renderer->resize(width, height);\n  }\n}\n\nvoid Step(JNIEnv*, jclass) {\n  if (g_renderer) {\n    g_renderer->render();\n  }\n}\n\nextern \"C\" JNIEXPORT jint JNI_OnLoad(JavaVM* _Nonnull vm, void* _Nullable) {\n  JNIEnv* env;\n  if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {\n    return JNI_ERR;\n  }\n\n  jclass c = env->FindClass(\"com/android/gles3jni/GLES3JNILib\");\n  if (c == nullptr) return JNI_ERR;\n\n  static const JNINativeMethod methods[] = {\n      {\"init\", \"()V\", reinterpret_cast<void*>(Init)},\n      {\"resize\", \"(II)V\", reinterpret_cast<void*>(Resize)},\n      {\"step\", \"()V\", reinterpret_cast<void*>(Step)},\n  };\n  int rc = env->RegisterNatives(c, methods, arraysize(methods));\n  if (rc != JNI_OK) return rc;\n\n  return JNI_VERSION_1_6;\n}\n"
  },
  {
    "path": "gles3jni/app/src/main/cpp/gles3jni.h",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef GLES3JNI_H\n#define GLES3JNI_H 1\n\n#include <GLES3/gl32.h>\n#include <android/log.h>\n#include <math.h>\n\n#define DEBUG 1\n\n#define LOG_TAG \"GLES3JNI\"\n#define ALOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)\n#if DEBUG\n#define ALOGV(...) \\\n  __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)\n#else\n#define ALOGV(...)\n#endif\n\n// ----------------------------------------------------------------------------\n// Types, functions, and data used by both ES2 and ES3 renderers.\n// Defined in gles3jni.cpp.\n\n#define MAX_INSTANCES_PER_SIDE 16\n#define MAX_INSTANCES (MAX_INSTANCES_PER_SIDE * MAX_INSTANCES_PER_SIDE)\n#define TWO_PI (2.0 * M_PI)\n#define MAX_ROT_SPEED (0.3 * TWO_PI)\n\n// This demo uses three coordinate spaces:\n// - The model (a quad) is in a [-1 .. 1]^2 space\n// - Scene space is either\n//    landscape: [-1 .. 1] x [-1/(2*w/h) .. 1/(2*w/h)]\n//    portrait:  [-1/(2*h/w) .. 1/(2*h/w)] x [-1 .. 1]\n// - Clip space in OpenGL is [-1 .. 1]^2\n//\n// Conceptually, the quads are rotated in model space, then scaled (uniformly)\n// and translated to place them in scene space. Scene space is then\n// non-uniformly scaled to clip space. In practice the transforms are combined\n// so vertices go directly from model to clip space.\n\nstruct Vertex {\n  GLfloat pos[2];\n  GLubyte rgba[4];\n};\nextern const Vertex QUAD[4];\n\n// returns true if a GL error occurred\nextern bool checkGlError(const char* funcName);\nextern GLuint createShader(GLenum shaderType, const char* src);\nextern GLuint createProgram(const char* vtxSrc, const char* fragSrc);\n\n// ----------------------------------------------------------------------------\n// Interface to the ES2 and ES3 renderers, used by JNI code.\n\nclass Renderer {\n public:\n  virtual ~Renderer();\n  void resize(int w, int h);\n  void render();\n\n protected:\n  Renderer();\n\n  // return a pointer to a buffer of MAX_INSTANCES * sizeof(vec2).\n  // the buffer is filled with per-instance offsets, then unmapped.\n  virtual float* mapOffsetBuf() = 0;\n  virtual void unmapOffsetBuf() = 0;\n  // return a pointer to a buffer of MAX_INSTANCES * sizeof(vec4).\n  // the buffer is filled with per-instance scale and rotation transforms.\n  virtual float* mapTransformBuf() = 0;\n  virtual void unmapTransformBuf() = 0;\n\n  virtual void draw(unsigned int numInstances) = 0;\n\n private:\n  void calcSceneParams(unsigned int w, unsigned int h, float* offsets);\n  void step();\n\n  unsigned int mNumInstances;\n  float mScale[2];\n  float mAngularVelocity[MAX_INSTANCES];\n  uint64_t mLastFrameNs;\n  float mAngles[MAX_INSTANCES];\n};\n\nextern Renderer* createES2Renderer();\nextern Renderer* createES3Renderer();\n\n#endif  // GLES3JNI_H\n"
  },
  {
    "path": "gles3jni/app/src/main/cpp/libgles3jni.map.txt",
    "content": "LIBGLES3JNI {\n  global:\n    JNI_OnLoad;\n  local:\n    *;\n};\n"
  },
  {
    "path": "gles3jni/app/src/main/java/com/android/gles3jni/GLES3JNIActivity.java",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.android.gles3jni;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.view.WindowManager;\n\nimport java.io.File;\n\npublic class GLES3JNIActivity extends Activity {\n\n    GLES3JNIView mView;\n\n    @Override protected void onCreate(Bundle icicle) {\n        super.onCreate(icicle);\n        mView = new GLES3JNIView(getApplication());\n        setContentView(mView);\n    }\n\n    @Override protected void onPause() {\n        super.onPause();\n        mView.onPause();\n    }\n\n    @Override protected void onResume() {\n        super.onResume();\n        mView.onResume();\n    }\n}\n"
  },
  {
    "path": "gles3jni/app/src/main/java/com/android/gles3jni/GLES3JNILib.java",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.android.gles3jni;\n\n// Wrapper for native library\n\npublic class GLES3JNILib {\n\n     static {\n          System.loadLibrary(\"gles3jni\");\n     }\n\n     public static native void init();\n     public static native void resize(int width, int height);\n     public static native void step();\n}\n"
  },
  {
    "path": "gles3jni/app/src/main/java/com/android/gles3jni/GLES3JNIView.java",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.android.gles3jni;\n\nimport android.content.Context;\nimport android.graphics.PixelFormat;\nimport android.opengl.GLSurfaceView;\nimport android.util.AttributeSet;\nimport android.util.Log;\nimport android.view.KeyEvent;\nimport android.view.MotionEvent;\n\nimport javax.microedition.khronos.egl.EGL10;\nimport javax.microedition.khronos.egl.EGLConfig;\nimport javax.microedition.khronos.egl.EGLContext;\nimport javax.microedition.khronos.egl.EGLDisplay;\nimport javax.microedition.khronos.opengles.GL10;\n\nclass GLES3JNIView extends GLSurfaceView {\n    private static final String TAG = \"GLES3JNI\";\n    private static final boolean DEBUG = true;\n\n    public GLES3JNIView(Context context) {\n        super(context);\n        // Pick an EGLConfig with RGB8 color, 16-bit depth, no stencil,\n        // supporting OpenGL ES 2.0 or later backwards-compatible versions.\n        setEGLConfigChooser(8, 8, 8, 0, 16, 0);\n        setEGLContextClientVersion(3);\n        setRenderer(new Renderer());\n    }\n\n    private static class Renderer implements GLSurfaceView.Renderer {\n        public void onDrawFrame(GL10 gl) {\n            GLES3JNILib.step();\n        }\n\n        public void onSurfaceChanged(GL10 gl, int width, int height) {\n            GLES3JNILib.resize(width, height);\n        }\n\n        public void onSurfaceCreated(GL10 gl, EGLConfig config) {\n            GLES3JNILib.init();\n        }\n    }\n}\n"
  },
  {
    "path": "gles3jni/app/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Copyright 2013 The Android Open Source Project\n\n     Licensed under the Apache License, Version 2.0 (the \"License\");\n     you may not use this file except in compliance with the License.\n     You may obtain a copy of the License at\n\n          http://www.apache.org/licenses/LICENSE-2.0\n\n     Unless required by applicable law or agreed to in writing, software\n     distributed under the License is distributed on an \"AS IS\" BASIS,\n     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n     See the License for the specific language governing permissions and\n     limitations under the License.\n-->\n\n<!-- This file contains resource definitions for displayed strings, allowing\n     them to be changed based on the locale and options. -->\n\n<resources>\n    <!-- Simple strings. -->\n    <string name=\"gles3jni_activity\">GLES3JNI</string>\n\n</resources>\n"
  },
  {
    "path": "gradle/libs.versions.toml",
    "content": "[versions]\nagp = \"8.13.0\"\nkotlin = \"1.9.0\"\nkotlinxCoroutines = \"1.7.1\"\njunit = \"4.13.2\"\njunitVersion = \"1.2.1\"\nespressoCore = \"3.6.1\"\nandroidxConstraintLayout = \"2.1.4\"\nandroidxCore = \"1.13.1\"\nandroidxGames = \"3.0.5\"\nandroidxJUnitGTest = \"1.0.0-alpha02\"\nappcompat = \"1.6.1\"\nmaterial = \"1.12.0\"\njetbrainsKotlinJvm = \"1.7.21\"\noboe = \"1.9.0\"\n\nactivityCompose = \"1.9.0\"\ncomposeBom = \"2023.08.00\"\ncoreKtx = \"1.13.1\"\ncurl = \"7.79.1-beta-1\"\ngoogletest = \"1.11.0-beta-1\"\njsoncpp = \"1.9.5-beta-1\"\nlifecycleRuntimeKtx = \"2.7.0\"\nopenssl = \"1.1.1q-beta-1\"\n\n[libraries]\njunit = { group = \"junit\", name = \"junit\", version.ref = \"junit\" }\next-junit = { group = \"androidx.test.ext\", name = \"junit\", version.ref = \"junitVersion\" }\nespresso-core = { group = \"androidx.test.espresso\", name = \"espresso-core\", version.ref = \"espressoCore\" }\nandroidx-constraintlayout = { group = \"androidx.constraintlayout\", name = \"constraintlayout\", version.ref = \"androidxConstraintLayout\" }\nandroidx-core = { group = \"androidx.core\", name = \"core\", version.ref = \"androidxCore\" }\nandroidx-games-gameactivity = { group = \"androidx.games\", name = \"games-activity\", version.ref = \"androidxGames\" }\nandroidx-junit-gtest = { group = \"androidx.test.ext\", name = \"junit-gtest\", version.ref = \"androidxJUnitGTest\" }\nappcompat = { group = \"androidx.appcompat\", name = \"appcompat\", version.ref = \"appcompat\" }\nmaterial = { group = \"com.google.android.material\", name = \"material\", version.ref = \"material\" }\nkotlin-gradlePlugin = { group = \"org.jetbrains.kotlin\", name = \"kotlin-gradle-plugin\", version.ref = \"kotlin\" }\noboe = { group = \"com.google.oboe\", name = \"oboe\", version.ref = \"oboe\" }\nkotlinx-coroutines-core = { group = \"org.jetbrains.kotlinx\", name = \"kotlinx-coroutines-core\", version.ref = \"kotlinxCoroutines\" }\nkotlinx-coroutines-android = { group = \"org.jetbrains.kotlinx\", name = \"kotlinx-coroutines-android\", version.ref = \"kotlinxCoroutines\" }\ncurl = { group = \"com.android.ndk.thirdparty\", name = \"curl\", version.ref = \"curl\" }\ngoogletest = { group = \"com.android.ndk.thirdparty\", name = \"googletest\", version.ref = \"googletest\" }\njsoncpp = { group = \"com.android.ndk.thirdparty\", name = \"jsoncpp\", version.ref = \"jsoncpp\" }\nopenssl = { group = \"com.android.ndk.thirdparty\", name = \"openssl\", version.ref = \"openssl\" }\n\n# build-logic dependencies\nandroid-gradlePlugin = { group = \"com.android.tools.build\", name = \"gradle\", version.ref = \"agp\" }\nandroidx-activity-compose = { group = \"androidx.activity\", name = \"activity-compose\", version.ref = \"activityCompose\" }\nandroidx-compose-bom = { group = \"androidx.compose\", name = \"compose-bom\", version.ref = \"composeBom\" }\nandroidx-core-ktx = { group = \"androidx.core\", name = \"core-ktx\", version.ref = \"coreKtx\" }\nandroidx-lifecycle-runtime-ktx = { group = \"androidx.lifecycle\", name = \"lifecycle-runtime-ktx\", version.ref = \"lifecycleRuntimeKtx\" }\nandroidx-material3 = { group = \"androidx.compose.material3\", name = \"material3\" }\nandroidx-ui = { group = \"androidx.compose.ui\", name = \"ui\" }\nandroidx-ui-graphics = { group = \"androidx.compose.ui\", name = \"ui-graphics\" }\nandroidx-ui-test-junit4 = { group = \"androidx.compose.ui\", name = \"ui-test-junit4\" }\nandroidx-ui-test-manifest = { group = \"androidx.compose.ui\", name = \"ui-test-manifest\" }\nandroidx-ui-tooling = { group = \"androidx.compose.ui\", name = \"ui-tooling\" }\nandroidx-ui-tooling-preview = { group = \"androidx.compose.ui\", name = \"ui-tooling-preview\" }\n\n[plugins]\nandroid-application = { id = \"com.android.application\", version.ref = \"agp\" }\nandroid-library = { id = \"com.android.library\", version.ref = \"agp\" }\njetbrainsKotlinAndroid = { id = \"org.jetbrains.kotlin.android\", version.ref = \"kotlin\" }\njetbrains-kotlin-jvm = { id = \"org.jetbrains.kotlin.jvm\", version.ref = \"jetbrainsKotlinJvm\" }\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Mon May 06 16:21:05 PDT 2024\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-8.13-bin.zip\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "gradle.properties",
    "content": "# Project-wide Gradle settings.\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\norg.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. For more details, visit\n# https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects\n# org.gradle.parallel=true\n# AndroidX package structure to make it clearer which packages are bundled with the\n# Android operating system, and which are packaged with your app's APK\n# https://developer.android.com/topic/libraries/support-library/androidx-rn\nandroid.useAndroidX=true\n# Enables namespacing of each library's R class so that its R class includes only the\n# resources declared in the library itself and none from the library's dependencies,\n# thereby reducing the size of the R class for that library\nandroid.nonTransitiveRClass=true\nandroid.nonFinalResIds=false\n"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env sh\n\n#\n# Copyright 2015 the original author or authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn () {\n    echo \"$*\"\n}\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin or MSYS, switch paths to Windows format before running java\nif [ \"$cygwin\" = \"true\" -o \"$msys\" = \"true\" ] ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=`expr $i + 1`\n    done\n    case $i in\n        0) set -- ;;\n        1) set -- \"$args0\" ;;\n        2) set -- \"$args0\" \"$args1\" ;;\n        3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave () {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=`save \"$@\"`\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@rem\n@rem Copyright 2015 the original author or authors.\n@rem\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\n@rem you may not use this file except in compliance with the License.\n@rem You may obtain a copy of the License at\n@rem\n@rem      https://www.apache.org/licenses/LICENSE-2.0\n@rem\n@rem Unless required by applicable law or agreed to in writing, software\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n@rem See the License for the specific language governing permissions and\n@rem limitations under the License.\n@rem\n\n@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Resolve any \".\" and \"..\" in APP_HOME to make it shorter.\nfor %%i in (\"%APP_HOME%\") do set APP_HOME=%%~fi\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif \"%ERRORLEVEL%\" == \"0\" goto execute\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto execute\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %*\n\n:end\n@rem End local scope for the variables with windows NT shell\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\nexit /b 1\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "hello-gl2/README.md",
    "content": "# Hello GL2\n\nHello GL2 is an Android C++ sample that draws a triangle using GLES 2.0 API.\n\nIt uses JNI to do the rendering in C++ over a\n[GLSurfaceView](http://developer.android.com/reference/android/opengl/GLSurfaceView.html)\ncreated from a regular Android Java Activity.\n\n## Screenshots\n\n![screenshot](screenshot.png)\n"
  },
  {
    "path": "hello-gl2/app/build.gradle",
    "content": "plugins {\n    id \"ndksamples.android.application\"\n}\n\nandroid {\n    namespace 'com.android.gl2jni'\n\n    defaultConfig {\n        applicationId 'com.android.gl2jni'\n        externalNativeBuild {\n            cmake {\n                // Available arguments are inside ${SDK}/cmake/.../android.toolchain.cmake file\n                arguments '-DANDROID_STL=c++_static'\n            }\n        }\n    }\n\n    externalNativeBuild {\n        cmake {\n            path 'src/main/cpp/CMakeLists.txt'\n        }\n    }\n\n    buildFeatures {\n        prefab true\n    }\n}\n\ndependencies {\n    implementation project(\":base\")\n}\n"
  },
  {
    "path": "hello-gl2/app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n  <uses-feature android:glEsVersion=\"0x00020000\"/>\n  <application\n      android:allowBackup=\"false\"\n      android:fullBackupContent=\"false\"\n      android:icon=\"@mipmap/ic_launcher\"\n      android:label=\"@string/gl2jni_activity\">\n    <activity android:name=\"GL2JNIActivity\"\n              android:theme=\"@android:style/Theme.NoTitleBar.Fullscreen\"\n              android:launchMode=\"singleTask\"\n              android:configChanges=\"orientation|keyboardHidden\"\n        android:exported=\"true\">\n      <intent-filter>\n        <action android:name=\"android.intent.action.MAIN\" />\n        <category android:name=\"android.intent.category.LAUNCHER\" />\n      </intent-filter>\n    </activity>\n  </application>\n</manifest>\n"
  },
  {
    "path": "hello-gl2/app/src/main/cpp/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.22.1)\nproject(HelloGl2 LANGUAGES CXX)\n\ninclude(AppLibrary)\nfind_package(base CONFIG REQUIRED)\n\nadd_app_library(gl2jni SHARED gl_code.cpp)\n\ntarget_link_libraries(gl2jni\n    PRIVATE\n    base::base\n    android\n    log\n    EGL\n    GLESv2\n)\n\n"
  },
  {
    "path": "hello-gl2/app/src/main/cpp/gl_code.cpp",
    "content": "/*\n * Copyright (C) 2009 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// OpenGL ES 2.0 code\n\n#include <GLES2/gl2.h>\n#include <GLES2/gl2ext.h>\n#include <android/log.h>\n#include <base/macros.h>\n#include <jni.h>\n#include <math.h>\n#include <stdio.h>\n#include <stdlib.h>\n\n#define LOG_TAG \"libgl2jni\"\n#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)\n#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)\n\nstatic void printGLString(const char* name, GLenum s) {\n  const char* v = (const char*)glGetString(s);\n  LOGI(\"GL %s = %s\\n\", name, v);\n}\n\nstatic void checkGlError(const char* op) {\n  for (GLint error = glGetError(); error; error = glGetError()) {\n    LOGI(\"after %s() glError (0x%x)\\n\", op, error);\n  }\n}\n\nauto gVertexShader =\n    \"attribute vec4 vPosition;\\n\"\n    \"void main() {\\n\"\n    \"  gl_Position = vPosition;\\n\"\n    \"}\\n\";\n\nauto gFragmentShader =\n    \"precision mediump float;\\n\"\n    \"void main() {\\n\"\n    \"  gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);\\n\"\n    \"}\\n\";\n\nGLuint loadShader(GLenum shaderType, const char* pSource) {\n  GLuint shader = glCreateShader(shaderType);\n  if (shader) {\n    glShaderSource(shader, 1, &pSource, NULL);\n    glCompileShader(shader);\n    GLint compiled = 0;\n    glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);\n    if (!compiled) {\n      GLint infoLen = 0;\n      glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen);\n      if (infoLen) {\n        char* buf = (char*)malloc(infoLen);\n        if (buf) {\n          glGetShaderInfoLog(shader, infoLen, NULL, buf);\n          LOGE(\"Could not compile shader %d:\\n%s\\n\", shaderType, buf);\n          free(buf);\n        }\n        glDeleteShader(shader);\n        shader = 0;\n      }\n    }\n  }\n  return shader;\n}\n\nGLuint createProgram(const char* pVertexSource, const char* pFragmentSource) {\n  GLuint vertexShader = loadShader(GL_VERTEX_SHADER, pVertexSource);\n  if (!vertexShader) {\n    return 0;\n  }\n\n  GLuint pixelShader = loadShader(GL_FRAGMENT_SHADER, pFragmentSource);\n  if (!pixelShader) {\n    return 0;\n  }\n\n  GLuint program = glCreateProgram();\n  if (program) {\n    glAttachShader(program, vertexShader);\n    checkGlError(\"glAttachShader\");\n    glAttachShader(program, pixelShader);\n    checkGlError(\"glAttachShader\");\n    glLinkProgram(program);\n    GLint linkStatus = GL_FALSE;\n    glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);\n    if (linkStatus != GL_TRUE) {\n      GLint bufLength = 0;\n      glGetProgramiv(program, GL_INFO_LOG_LENGTH, &bufLength);\n      if (bufLength) {\n        char* buf = (char*)malloc(bufLength);\n        if (buf) {\n          glGetProgramInfoLog(program, bufLength, NULL, buf);\n          LOGE(\"Could not link program:\\n%s\\n\", buf);\n          free(buf);\n        }\n      }\n      glDeleteProgram(program);\n      program = 0;\n    }\n  }\n  return program;\n}\n\nGLuint gProgram;\nGLuint gvPositionHandle;\n\nbool setupGraphics(int w, int h) {\n  printGLString(\"Version\", GL_VERSION);\n  printGLString(\"Vendor\", GL_VENDOR);\n  printGLString(\"Renderer\", GL_RENDERER);\n  printGLString(\"Extensions\", GL_EXTENSIONS);\n\n  LOGI(\"setupGraphics(%d, %d)\", w, h);\n  gProgram = createProgram(gVertexShader, gFragmentShader);\n  if (!gProgram) {\n    LOGE(\"Could not create program.\");\n    return false;\n  }\n  gvPositionHandle = glGetAttribLocation(gProgram, \"vPosition\");\n  checkGlError(\"glGetAttribLocation\");\n  LOGI(\"glGetAttribLocation(\\\"vPosition\\\") = %d\\n\", gvPositionHandle);\n\n  glViewport(0, 0, w, h);\n  checkGlError(\"glViewport\");\n  return true;\n}\n\nconst GLfloat gTriangleVertices[] = {0.0f, 0.5f, -0.5f, -0.5f, 0.5f, -0.5f};\n\nvoid renderFrame() {\n  static float grey;\n  grey += 0.01f;\n  if (grey > 1.0f) {\n    grey = 0.0f;\n  }\n  glClearColor(grey, grey, grey, 1.0f);\n  checkGlError(\"glClearColor\");\n  glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);\n  checkGlError(\"glClear\");\n\n  glUseProgram(gProgram);\n  checkGlError(\"glUseProgram\");\n\n  glVertexAttribPointer(gvPositionHandle, 2, GL_FLOAT, GL_FALSE, 0,\n                        gTriangleVertices);\n  checkGlError(\"glVertexAttribPointer\");\n  glEnableVertexAttribArray(gvPositionHandle);\n  checkGlError(\"glEnableVertexAttribArray\");\n  glDrawArrays(GL_TRIANGLES, 0, 3);\n  checkGlError(\"glDrawArrays\");\n}\n\nvoid Init(JNIEnv*, jclass, jint width, jint height) {\n  setupGraphics(width, height);\n}\n\nvoid Step(JNIEnv*, jclass) { renderFrame(); }\n\nextern \"C\" JNIEXPORT jint JNI_OnLoad(JavaVM* _Nonnull vm, void* _Nullable) {\n  JNIEnv* env;\n  if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {\n    return JNI_ERR;\n  }\n\n  jclass c = env->FindClass(\"com/android/gl2jni/GL2JNILib\");\n  if (c == nullptr) return JNI_ERR;\n\n  static const JNINativeMethod methods[] = {\n      {\"init\", \"(II)V\", reinterpret_cast<void*>(Init)},\n      {\"step\", \"()V\", reinterpret_cast<void*>(Step)},\n  };\n  int rc = env->RegisterNatives(c, methods, arraysize(methods));\n  if (rc != JNI_OK) return rc;\n\n  return JNI_VERSION_1_6;\n}\n"
  },
  {
    "path": "hello-gl2/app/src/main/cpp/libgl2jni.map.txt",
    "content": "LIBGL2JNI {\n  global:\n    JNI_OnLoad;\n  local:\n    *;\n};\n"
  },
  {
    "path": "hello-gl2/app/src/main/java/com/android/gl2jni/GL2JNIActivity.java",
    "content": "/*\n * Copyright (C) 2007 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.android.gl2jni;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.view.WindowManager;\n\nimport java.io.File;\n\n\npublic class GL2JNIActivity extends Activity {\n\n    GL2JNIView mView;\n\n    @Override protected void onCreate(Bundle icicle) {\n        super.onCreate(icicle);\n        mView = new GL2JNIView(getApplication());\n\tsetContentView(mView);\n    }\n\n    @Override protected void onPause() {\n        super.onPause();\n        mView.onPause();\n    }\n\n    @Override protected void onResume() {\n        super.onResume();\n        mView.onResume();\n    }\n}\n"
  },
  {
    "path": "hello-gl2/app/src/main/java/com/android/gl2jni/GL2JNILib.java",
    "content": "/*\n * Copyright (C) 2007 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.android.gl2jni;\n\n// Wrapper for native library\n\npublic class GL2JNILib {\n\n     static {\n         System.loadLibrary(\"gl2jni\");\n     }\n\n    /**\n     * @param width the current view width\n     * @param height the current view height\n     */\n     public static native void init(int width, int height);\n     public static native void step();\n}\n"
  },
  {
    "path": "hello-gl2/app/src/main/java/com/android/gl2jni/GL2JNIView.java",
    "content": "/*\n * Copyright (C) 2009 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.android.gl2jni;\n/*\n * Copyright (C) 2008 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nimport android.content.Context;\nimport android.graphics.PixelFormat;\nimport android.opengl.GLSurfaceView;\nimport android.util.AttributeSet;\nimport android.util.Log;\nimport android.view.KeyEvent;\nimport android.view.MotionEvent;\n\nimport javax.microedition.khronos.egl.EGL10;\nimport javax.microedition.khronos.egl.EGLConfig;\nimport javax.microedition.khronos.egl.EGLContext;\nimport javax.microedition.khronos.egl.EGLDisplay;\nimport javax.microedition.khronos.opengles.GL10;\n\n/**\n * A simple GLSurfaceView sub-class that demonstrate how to perform\n * OpenGL ES 2.0 rendering into a GL Surface. Note the following important\n * details:\n *\n * - The class must use a custom context factory to enable 2.0 rendering.\n *   See ContextFactory class definition below.\n *\n * - The class must use a custom EGLConfigChooser to be able to select\n *   an EGLConfig that supports 2.0. This is done by providing a config\n *   specification to eglChooseConfig() that has the attribute\n *   EGL10.ELG_RENDERABLE_TYPE containing the EGL_OPENGL_ES2_BIT flag\n *   set. See ConfigChooser class definition below.\n *\n * - The class must select the surface's format, then choose an EGLConfig\n *   that matches it exactly (with regards to red/green/blue/alpha channels\n *   bit depths). Failure to do so would result in an EGL_BAD_MATCH error.\n */\nclass GL2JNIView extends GLSurfaceView {\n    private static String TAG = \"GL2JNIView\";\n    private static final boolean DEBUG = false;\n\n    public GL2JNIView(Context context) {\n        super(context);\n        init(false, 0, 0);\n    }\n\n    public GL2JNIView(Context context, boolean translucent, int depth, int stencil) {\n        super(context);\n        init(translucent, depth, stencil);\n    }\n\n    private void init(boolean translucent, int depth, int stencil) {\n\n        /* By default, GLSurfaceView() creates a RGB_565 opaque surface.\n         * If we want a translucent one, we should change the surface's\n         * format here, using PixelFormat.TRANSLUCENT for GL Surfaces\n         * is interpreted as any 32-bit surface with alpha by SurfaceFlinger.\n         */\n        if (translucent) {\n            this.getHolder().setFormat(PixelFormat.TRANSLUCENT);\n        }\n\n        /* Setup the context factory for 2.0 rendering.\n         * See ContextFactory class definition below\n         */\n        setEGLContextFactory(new ContextFactory());\n\n        /* We need to choose an EGLConfig that matches the format of\n         * our surface exactly. This is going to be done in our\n         * custom config chooser. See ConfigChooser class definition\n         * below.\n         */\n        setEGLConfigChooser( translucent ?\n                             new ConfigChooser(8, 8, 8, 8, depth, stencil) :\n                             new ConfigChooser(5, 6, 5, 0, depth, stencil) );\n\n        /* Set the renderer responsible for frame rendering */\n        setRenderer(new Renderer());\n    }\n\n    private static class ContextFactory implements GLSurfaceView.EGLContextFactory {\n        private static int EGL_CONTEXT_CLIENT_VERSION = 0x3098;\n        public EGLContext createContext(EGL10 egl, EGLDisplay display, EGLConfig eglConfig) {\n            Log.w(TAG, \"creating OpenGL ES 2.0 context\");\n            checkEglError(\"Before eglCreateContext\", egl);\n            int[] attrib_list = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE };\n            EGLContext context = egl.eglCreateContext(display, eglConfig, EGL10.EGL_NO_CONTEXT, attrib_list);\n            checkEglError(\"After eglCreateContext\", egl);\n            return context;\n        }\n\n        public void destroyContext(EGL10 egl, EGLDisplay display, EGLContext context) {\n            egl.eglDestroyContext(display, context);\n        }\n    }\n\n    private static void checkEglError(String prompt, EGL10 egl) {\n        int error;\n        while ((error = egl.eglGetError()) != EGL10.EGL_SUCCESS) {\n            Log.e(TAG, String.format(\"%s: EGL error: 0x%x\", prompt, error));\n        }\n    }\n\n    private static class ConfigChooser implements GLSurfaceView.EGLConfigChooser {\n\n        public ConfigChooser(int r, int g, int b, int a, int depth, int stencil) {\n            mRedSize = r;\n            mGreenSize = g;\n            mBlueSize = b;\n            mAlphaSize = a;\n            mDepthSize = depth;\n            mStencilSize = stencil;\n        }\n\n        /* This EGL config specification is used to specify 2.0 rendering.\n         * We use a minimum size of 4 bits for red/green/blue, but will\n         * perform actual matching in chooseConfig() below.\n         */\n        private static int EGL_OPENGL_ES2_BIT = 4;\n        private static int[] s_configAttribs2 =\n        {\n            EGL10.EGL_RED_SIZE, 4,\n            EGL10.EGL_GREEN_SIZE, 4,\n            EGL10.EGL_BLUE_SIZE, 4,\n            EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,\n            EGL10.EGL_NONE\n        };\n\n        public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) {\n\n            /* Get the number of minimally matching EGL configurations\n             */\n            int[] num_config = new int[1];\n            egl.eglChooseConfig(display, s_configAttribs2, null, 0, num_config);\n\n            int numConfigs = num_config[0];\n\n            if (numConfigs <= 0) {\n                throw new IllegalArgumentException(\"No configs match configSpec\");\n            }\n\n            /* Allocate then read the array of minimally matching EGL configs\n             */\n            EGLConfig[] configs = new EGLConfig[numConfigs];\n            egl.eglChooseConfig(display, s_configAttribs2, configs, numConfigs, num_config);\n\n            if (DEBUG) {\n                 printConfigs(egl, display, configs);\n            }\n            /* Now return the \"best\" one\n             */\n            return chooseConfig(egl, display, configs);\n        }\n\n        public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display,\n                EGLConfig[] configs) {\n            for(EGLConfig config : configs) {\n                int d = findConfigAttrib(egl, display, config,\n                        EGL10.EGL_DEPTH_SIZE, 0);\n                int s = findConfigAttrib(egl, display, config,\n                        EGL10.EGL_STENCIL_SIZE, 0);\n\n                // We need at least mDepthSize and mStencilSize bits\n                if (d < mDepthSize || s < mStencilSize)\n                    continue;\n\n                // We want an *exact* match for red/green/blue/alpha\n                int r = findConfigAttrib(egl, display, config,\n                        EGL10.EGL_RED_SIZE, 0);\n                int g = findConfigAttrib(egl, display, config,\n                            EGL10.EGL_GREEN_SIZE, 0);\n                int b = findConfigAttrib(egl, display, config,\n                            EGL10.EGL_BLUE_SIZE, 0);\n                int a = findConfigAttrib(egl, display, config,\n                        EGL10.EGL_ALPHA_SIZE, 0);\n\n                if (r == mRedSize && g == mGreenSize && b == mBlueSize && a == mAlphaSize)\n                    return config;\n            }\n            return null;\n        }\n\n        private int findConfigAttrib(EGL10 egl, EGLDisplay display,\n                EGLConfig config, int attribute, int defaultValue) {\n\n            if (egl.eglGetConfigAttrib(display, config, attribute, mValue)) {\n                return mValue[0];\n            }\n            return defaultValue;\n        }\n\n        private void printConfigs(EGL10 egl, EGLDisplay display,\n            EGLConfig[] configs) {\n            int numConfigs = configs.length;\n            Log.w(TAG, String.format(\"%d configurations\", numConfigs));\n            for (int i = 0; i < numConfigs; i++) {\n                Log.w(TAG, String.format(\"Configuration %d:\\n\", i));\n                printConfig(egl, display, configs[i]);\n            }\n        }\n\n        private void printConfig(EGL10 egl, EGLDisplay display,\n                EGLConfig config) {\n            int[] attributes = {\n                    EGL10.EGL_BUFFER_SIZE,\n                    EGL10.EGL_ALPHA_SIZE,\n                    EGL10.EGL_BLUE_SIZE,\n                    EGL10.EGL_GREEN_SIZE,\n                    EGL10.EGL_RED_SIZE,\n                    EGL10.EGL_DEPTH_SIZE,\n                    EGL10.EGL_STENCIL_SIZE,\n                    EGL10.EGL_CONFIG_CAVEAT,\n                    EGL10.EGL_CONFIG_ID,\n                    EGL10.EGL_LEVEL,\n                    EGL10.EGL_MAX_PBUFFER_HEIGHT,\n                    EGL10.EGL_MAX_PBUFFER_PIXELS,\n                    EGL10.EGL_MAX_PBUFFER_WIDTH,\n                    EGL10.EGL_NATIVE_RENDERABLE,\n                    EGL10.EGL_NATIVE_VISUAL_ID,\n                    EGL10.EGL_NATIVE_VISUAL_TYPE,\n                    0x3030, // EGL10.EGL_PRESERVED_RESOURCES,\n                    EGL10.EGL_SAMPLES,\n                    EGL10.EGL_SAMPLE_BUFFERS,\n                    EGL10.EGL_SURFACE_TYPE,\n                    EGL10.EGL_TRANSPARENT_TYPE,\n                    EGL10.EGL_TRANSPARENT_RED_VALUE,\n                    EGL10.EGL_TRANSPARENT_GREEN_VALUE,\n                    EGL10.EGL_TRANSPARENT_BLUE_VALUE,\n                    0x3039, // EGL10.EGL_BIND_TO_TEXTURE_RGB,\n                    0x303A, // EGL10.EGL_BIND_TO_TEXTURE_RGBA,\n                    0x303B, // EGL10.EGL_MIN_SWAP_INTERVAL,\n                    0x303C, // EGL10.EGL_MAX_SWAP_INTERVAL,\n                    EGL10.EGL_LUMINANCE_SIZE,\n                    EGL10.EGL_ALPHA_MASK_SIZE,\n                    EGL10.EGL_COLOR_BUFFER_TYPE,\n                    EGL10.EGL_RENDERABLE_TYPE,\n                    0x3042 // EGL10.EGL_CONFORMANT\n            };\n            String[] names = {\n                    \"EGL_BUFFER_SIZE\",\n                    \"EGL_ALPHA_SIZE\",\n                    \"EGL_BLUE_SIZE\",\n                    \"EGL_GREEN_SIZE\",\n                    \"EGL_RED_SIZE\",\n                    \"EGL_DEPTH_SIZE\",\n                    \"EGL_STENCIL_SIZE\",\n                    \"EGL_CONFIG_CAVEAT\",\n                    \"EGL_CONFIG_ID\",\n                    \"EGL_LEVEL\",\n                    \"EGL_MAX_PBUFFER_HEIGHT\",\n                    \"EGL_MAX_PBUFFER_PIXELS\",\n                    \"EGL_MAX_PBUFFER_WIDTH\",\n                    \"EGL_NATIVE_RENDERABLE\",\n                    \"EGL_NATIVE_VISUAL_ID\",\n                    \"EGL_NATIVE_VISUAL_TYPE\",\n                    \"EGL_PRESERVED_RESOURCES\",\n                    \"EGL_SAMPLES\",\n                    \"EGL_SAMPLE_BUFFERS\",\n                    \"EGL_SURFACE_TYPE\",\n                    \"EGL_TRANSPARENT_TYPE\",\n                    \"EGL_TRANSPARENT_RED_VALUE\",\n                    \"EGL_TRANSPARENT_GREEN_VALUE\",\n                    \"EGL_TRANSPARENT_BLUE_VALUE\",\n                    \"EGL_BIND_TO_TEXTURE_RGB\",\n                    \"EGL_BIND_TO_TEXTURE_RGBA\",\n                    \"EGL_MIN_SWAP_INTERVAL\",\n                    \"EGL_MAX_SWAP_INTERVAL\",\n                    \"EGL_LUMINANCE_SIZE\",\n                    \"EGL_ALPHA_MASK_SIZE\",\n                    \"EGL_COLOR_BUFFER_TYPE\",\n                    \"EGL_RENDERABLE_TYPE\",\n                    \"EGL_CONFORMANT\"\n            };\n            int[] value = new int[1];\n            for (int i = 0; i < attributes.length; i++) {\n                int attribute = attributes[i];\n                String name = names[i];\n                if ( egl.eglGetConfigAttrib(display, config, attribute, value)) {\n                    Log.w(TAG, String.format(\"  %s: %d\\n\", name, value[0]));\n                } else {\n                    // Log.w(TAG, String.format(\"  %s: failed\\n\", name));\n                    while (egl.eglGetError() != EGL10.EGL_SUCCESS);\n                }\n            }\n        }\n\n        // Subclasses can adjust these values:\n        protected int mRedSize;\n        protected int mGreenSize;\n        protected int mBlueSize;\n        protected int mAlphaSize;\n        protected int mDepthSize;\n        protected int mStencilSize;\n        private int[] mValue = new int[1];\n    }\n\n    private static class Renderer implements GLSurfaceView.Renderer {\n        public void onDrawFrame(GL10 gl) {\n            GL2JNILib.step();\n        }\n\n        public void onSurfaceChanged(GL10 gl, int width, int height) {\n            GL2JNILib.init(width, height);\n        }\n\n        public void onSurfaceCreated(GL10 gl, EGLConfig config) {\n            // Do nothing.\n        }\n    }\n}\n"
  },
  {
    "path": "hello-gl2/app/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n/*\n**\n** Copyright 2006, The Android Open Source Project\n**\n** Licensed under the Apache License, Version 2.0 (the \"License\"); \n** you may not use this file except in compliance with the License. \n** You may obtain a copy of the License at \n**\n**     http://www.apache.org/licenses/LICENSE-2.0 \n**\n** Unless required by applicable law or agreed to in writing, software \n** distributed under the License is distributed on an \"AS IS\" BASIS, \n** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. \n** See the License for the specific language governing permissions and \n** limitations under the License.\n*/\n-->\n\n<!-- This file contains resource definitions for displayed strings, allowing\n     them to be changed based on the locale and options. -->\n\n<resources>\n    <!-- Simple strings. -->\n    <string name=\"gl2jni_activity\">GL2JNI</string>\n\n</resources>\n\n"
  },
  {
    "path": "hello-jni/README.md",
    "content": "# Hello JNI\n\nHello JNI is an Android sample that uses JNI to call C code from a Android Java\nActivity.\n\n## Screenshots\n\n![screenshot](screenshot.png)\n"
  },
  {
    "path": "hello-jni/app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "hello-jni/app/build.gradle",
    "content": "plugins {\n    id \"ndksamples.android.application\"\n    id \"ndksamples.android.kotlin\"\n}\n\nandroid {\n    namespace 'com.example.hellojni'\n\n    defaultConfig {\n        applicationId 'com.example.hellojni'\n        versionCode 1\n        versionName \"1.0\"\n    }\n\n    externalNativeBuild {\n        cmake {\n            path \"src/main/cpp/CMakeLists.txt\"\n        }\n    }\n\n    buildFeatures {\n        viewBinding true\n    }\n\n    buildFeatures {\n        prefab true\n    }\n}\n\ndependencies {\n    implementation project(\":base\")\n    implementation libs.appcompat\n    implementation libs.androidx.constraintlayout\n}\n"
  },
  {
    "path": "hello-jni/app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /Users/gfan/dev/sdk_current/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n"
  },
  {
    "path": "hello-jni/app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <application\n        android:allowBackup=\"true\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme\">\n        <activity android:name=\".HelloJni\"\n            android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n    </application>\n\n</manifest>"
  },
  {
    "path": "hello-jni/app/src/main/cpp/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.22.1)\nproject(\"hello-jni\" LANGUAGES CXX)\n\ninclude(AppLibrary)\nfind_package(base CONFIG REQUIRED)\n\nadd_app_library(hello-jni SHARED\n    hello-jni.cpp\n)\n\ntarget_link_libraries(hello-jni\n    PRIVATE\n    base::base\n    android\n    log\n)\n"
  },
  {
    "path": "hello-jni/app/src/main/cpp/hello-jni.cpp",
    "content": "/*\n * Copyright (C) 2016 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n#include <base/macros.h>\n#include <jni.h>\n\n#include <string>\n\njstring StringFromJni(JNIEnv* env, jobject) {\n  std::string hello = \"Hello from JNI.\";\n  return env->NewStringUTF(hello.c_str());\n}\n\nextern \"C\" JNIEXPORT jint JNI_OnLoad(JavaVM* _Nonnull vm, void* _Nullable) {\n  JNIEnv* env;\n  if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {\n    return JNI_ERR;\n  }\n\n  jclass c = env->FindClass(\"com/example/hellojni/HelloJni\");\n  if (c == nullptr) return JNI_ERR;\n\n  static const JNINativeMethod methods[] = {\n      {\"stringFromJNI\", \"()Ljava/lang/String;\",\n       reinterpret_cast<void*>(StringFromJni)},\n  };\n  int rc = env->RegisterNatives(c, methods, arraysize(methods));\n  if (rc != JNI_OK) return rc;\n\n  return JNI_VERSION_1_6;\n}\n"
  },
  {
    "path": "hello-jni/app/src/main/cpp/libhello-jni.map.txt",
    "content": "LIBHELLOJNI {\n  global:\n    JNI_OnLoad;\n  local:\n    *;\n};\n"
  },
  {
    "path": "hello-jni/app/src/main/java/com/example/hellojni/HelloJni.kt",
    "content": "/*\n * Copyright (C) 2016 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.example.hellojni\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.example.hellojni.databinding.ActivityHelloJniBinding\n\nclass HelloJni : AppCompatActivity() {\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        /*\n         * Retrieve our TextView and set its content.\n         * the text is retrieved by calling a native\n         * function.\n         */\n        val binding = ActivityHelloJniBinding.inflate(layoutInflater)\n        setContentView(binding.root)\n        binding.helloTextview.text = stringFromJNI()\n    }\n\n    /*\n     * A native method that is implemented by the\n     * 'hello-jni' native library, which is packaged\n     * with this application.\n     */\n    external fun stringFromJNI(): String?\n\n    /*\n     * This is another native method declaration that is *not*\n     * implemented by 'hello-jni'. This is simply to show that\n     * you can declare as many native methods in your Java code\n     * as you want, their implementation is searched in the\n     * currently loaded native libraries only the first time\n     * you call them.\n     *\n     * Trying to call this function will result in a\n     * java.lang.UnsatisfiedLinkError exception !\n     */\n    external fun unimplementedStringFromJNI(): String?\n\n    companion object {\n    /*\n     * this is used to load the 'hello-jni' library on application\n     * startup. The library has already been unpacked into\n     * /data/data/com.example.hellojni/lib/libhello-jni.so\n     * at the installation time by the package manager.\n     */\n        init {\n            System.loadLibrary(\"hello-jni\")\n        }\n    }\n}\n\n"
  },
  {
    "path": "hello-jni/app/src/main/res/layout/activity_hello_jni.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/activity_hello_jni\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\"com.example.hellojni.HelloJni\">\n\n    <TextView\n        android:id=\"@+id/hello_textview\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"Hello World!\"\n        app:layout_constraintBottom_toBottomOf=\"@+id/activity_hello_jni\"\n        app:layout_constraintLeft_toLeftOf=\"@+id/activity_hello_jni\"\n        app:layout_constraintRight_toRightOf=\"@+id/activity_hello_jni\"\n        app:layout_constraintTop_toTopOf=\"@+id/activity_hello_jni\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "hello-jni/app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"colorPrimaryDark\">#303F9F</color>\n    <color name=\"colorAccent\">#FF4081</color>\n</resources>\n"
  },
  {
    "path": "hello-jni/app/src/main/res/values/dimens.xml",
    "content": "<resources>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"activity_horizontal_margin\">16dp</dimen>\n    <dimen name=\"activity_vertical_margin\">16dp</dimen>\n</resources>\n"
  },
  {
    "path": "hello-jni/app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">HelloJni</string>\n</resources>\n"
  },
  {
    "path": "hello-jni/app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.DarkActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "hello-jni/app/src/main/res/values-w820dp/dimens.xml",
    "content": "<resources>\n    <!-- Example customization of dimensions originally defined in res/values/dimens.xml\n         (such as screen margins) for screens with more than 820dp of available width. This\n         would include 7\" and 10\" devices in landscape (~960dp and ~1280dp respectively). -->\n    <dimen name=\"activity_horizontal_margin\">64dp</dimen>\n</resources>\n"
  },
  {
    "path": "hello-jniCallback/README.md",
    "content": "# Hello JNI Callback\n\nThis sample is an add-on to Hello JNI sample to demonstrate calling back to Java\nfrom C code\n\n- create a java class instance from C code\n- call java class static and non-static member functions\n\n## Screenshots\n\n![screenshot](screenshot.png)\n"
  },
  {
    "path": "hello-jniCallback/app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "hello-jniCallback/app/build.gradle",
    "content": "plugins {\n    id \"ndksamples.android.application\"\n}\n\nandroid {\n    namespace 'com.example.hellojnicallback'\n\n    defaultConfig {\n        applicationId 'com.example.hellojnicallback'\n        versionCode 1\n        versionName \"1.0\"\n    }\n\n    externalNativeBuild {\n        cmake {\n            path \"src/main/cpp/CMakeLists.txt\"\n        }\n    }\n\n    buildFeatures {\n        prefab true\n    }\n}\n\ndependencies {\n    implementation project(\":base\")\n    implementation libs.appcompat\n    implementation libs.androidx.constraintlayout\n}\n"
  },
  {
    "path": "hello-jniCallback/app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /Users/gfan/dev/sdk_current/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n"
  },
  {
    "path": "hello-jniCallback/app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <application\n        android:allowBackup=\"true\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme\">\n        <activity android:name=\".MainActivity\"\n            android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n    </application>\n\n</manifest>"
  },
  {
    "path": "hello-jniCallback/app/src/main/cpp/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.22.1)\nproject(HelloJniCallback LANGUAGES CXX)\n\ninclude(AppLibrary)\nfind_package(base CONFIG REQUIRED)\n\nadd_app_library(hello-jnicallback SHARED hello-jnicallback.cpp)\n\ntarget_link_libraries(hello-jnicallback\n    PRIVATE\n    base::base\n    android\n    log\n)\n"
  },
  {
    "path": "hello-jniCallback/app/src/main/cpp/hello-jnicallback.cpp",
    "content": "/*\n * Copyright (C) 2016 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n#include <android/log.h>\n#include <assert.h>\n#include <base/macros.h>\n#include <inttypes.h>\n#include <jni.h>\n#include <pthread.h>\n#include <string.h>\n\n// Android log function wrappers\nstatic const char* kTAG = \"hello-jniCallback\";\n#define LOGI(...) \\\n  ((void)__android_log_print(ANDROID_LOG_INFO, kTAG, __VA_ARGS__))\n#define LOGW(...) \\\n  ((void)__android_log_print(ANDROID_LOG_WARN, kTAG, __VA_ARGS__))\n#define LOGE(...) \\\n  ((void)__android_log_print(ANDROID_LOG_ERROR, kTAG, __VA_ARGS__))\n\n// processing callback to handler class\ntypedef struct tick_context {\n  JavaVM* javaVM;\n  jclass jniHandlerClz;\n  jobject jniHandlerObj;\n  jclass mainActivityClz;\n  jobject mainActivityObj;\n  pthread_mutex_t lock;\n  int done;\n} TickContext;\nTickContext g_ctx;\n\n/* This is a trivial JNI example where we use a native method\n * to return a new VM String. See the corresponding Java source\n * file located at:\n *\n *   hello-jniCallback/app/src/main/java/com/example/hellojnicallback/MainActivity.java\n */\njstring StringFromJni(JNIEnv* env, jobject) {\n#if defined(__arm__)\n#if defined(__ARM_ARCH_7A__)\n#if defined(__ARM_NEON__)\n#if defined(__ARM_PCS_VFP)\n#define ABI \"armeabi-v7a/NEON (hard-float)\"\n#else\n#define ABI \"armeabi-v7a/NEON\"\n#endif\n#else\n#if defined(__ARM_PCS_VFP)\n#define ABI \"armeabi-v7a (hard-float)\"\n#else\n#define ABI \"armeabi-v7a\"\n#endif\n#endif\n#else\n#define ABI \"armeabi\"\n#endif\n#elif defined(__i386__)\n#define ABI \"x86\"\n#elif defined(__x86_64__)\n#define ABI \"x86_64\"\n#elif defined(__mips64) /* mips64el-* toolchain defines __mips__ too */\n#define ABI \"mips64\"\n#elif defined(__mips__)\n#define ABI \"mips\"\n#elif defined(__aarch64__)\n#define ABI \"arm64-v8a\"\n#else\n#define ABI \"unknown\"\n#endif\n  return env->NewStringUTF(\"Hello from JNI !  Compiled with ABI \" ABI \".\");\n}\n\n/*\n *  A helper function to show how to call\n *     java static functions JniHandler::getBuildVersion()\n *     java non-static function JniHandler::getRuntimeMemorySize()\n *  The trivial implementation for these functions are inside file\n *     JniHandler.java\n */\nvoid queryRuntimeInfo(JNIEnv* env, jobject instance) {\n  // Find out which OS we are running on. It does not matter for this app\n  // just to demo how to call static functions.\n  // Our java JniHandler class id and instance are initialized when this\n  // shared lib got loaded, we just directly use them\n  //    static function does not need instance, so we just need to feed\n  //    class and method id to JNI\n  jmethodID versionFunc = env->GetStaticMethodID(\n      g_ctx.jniHandlerClz, \"getBuildVersion\", \"()Ljava/lang/String;\");\n  if (!versionFunc) {\n    LOGE(\"Failed to retrieve getBuildVersion() methodID @ line %d\", __LINE__);\n    return;\n  }\n  jstring buildVersion = static_cast<jstring>(\n      env->CallStaticObjectMethod(g_ctx.jniHandlerClz, versionFunc));\n  const char* version = env->GetStringUTFChars(buildVersion, NULL);\n  if (!version) {\n    LOGE(\"Unable to get version string @ line %d\", __LINE__);\n    return;\n  }\n  LOGI(\"Android Version - %s\", version);\n  env->ReleaseStringUTFChars(buildVersion, version);\n\n  // we are called from JNI_OnLoad, so got to release LocalRef to avoid leaking\n  env->DeleteLocalRef(buildVersion);\n\n  // Query available memory size from a non-static public function\n  // we need use an instance of JniHandler class to call JNI\n  jmethodID memFunc =\n      env->GetMethodID(g_ctx.jniHandlerClz, \"getRuntimeMemorySize\", \"()J\");\n  if (!memFunc) {\n    LOGE(\"Failed to retrieve getRuntimeMemorySize() methodID @ line %d\",\n         __LINE__);\n    return;\n  }\n  jlong result = env->CallLongMethod(instance, memFunc);\n  LOGI(\"Runtime free memory size: %\" PRId64, result);\n  (void)result;  // silence the compiler warning\n}\n\n/*\n * A helper function to wrap java JniHandler::updateStatus(String msg)\n * JNI allow us to call this function via an instance even it is\n * private function.\n */\nvoid sendJavaMsg(JNIEnv* env, jobject instance, jmethodID func,\n                 const char* msg) {\n  jstring javaMsg = env->NewStringUTF(msg);\n  env->CallVoidMethod(instance, func, javaMsg);\n  env->DeleteLocalRef(javaMsg);\n}\n\n/*\n * Main working thread function. From a pthread,\n *     calling back to MainActivity::updateTimer() to display ticks on UI\n *     calling back to JniHandler::updateStatus(String msg) for msg\n */\nvoid* UpdateTicks(void* context) {\n  TickContext* pctx = (TickContext*)context;\n  JavaVM* javaVM = pctx->javaVM;\n  JNIEnv* env;\n  jint res = javaVM->GetEnv((void**)&env, JNI_VERSION_1_6);\n  if (res != JNI_OK) {\n    res = javaVM->AttachCurrentThread(&env, NULL);\n    if (JNI_OK != res) {\n      LOGE(\"Failed to AttachCurrentThread, ErrorCode = %d\", res);\n      return NULL;\n    }\n  }\n\n  jmethodID statusId = env->GetMethodID(pctx->jniHandlerClz, \"updateStatus\",\n                                        \"(Ljava/lang/String;)V\");\n  sendJavaMsg(env, pctx->jniHandlerObj, statusId,\n              \"TickerThread status: initializing...\");\n\n  // get mainActivity updateTimer function\n  jmethodID timerId =\n      env->GetMethodID(pctx->mainActivityClz, \"updateTimer\", \"()V\");\n\n  struct timeval beginTime, curTime, usedTime, leftTime;\n  const struct timeval kOneSecond = {(__kernel_time_t)1,\n                                     (__kernel_suseconds_t)0};\n\n  sendJavaMsg(env, pctx->jniHandlerObj, statusId,\n              \"TickerThread status: start ticking ...\");\n  while (1) {\n    gettimeofday(&beginTime, NULL);\n    pthread_mutex_lock(&pctx->lock);\n    int done = pctx->done;\n    if (pctx->done) {\n      pctx->done = 0;\n    }\n    pthread_mutex_unlock(&pctx->lock);\n    if (done) {\n      break;\n    }\n    env->CallVoidMethod(pctx->mainActivityObj, timerId);\n\n    gettimeofday(&curTime, NULL);\n    timersub(&curTime, &beginTime, &usedTime);\n    timersub(&kOneSecond, &usedTime, &leftTime);\n    struct timespec sleepTime;\n    sleepTime.tv_sec = leftTime.tv_sec;\n    sleepTime.tv_nsec = leftTime.tv_usec * 1000;\n\n    if (sleepTime.tv_sec <= 1) {\n      nanosleep(&sleepTime, NULL);\n    } else {\n      sendJavaMsg(env, pctx->jniHandlerObj, statusId,\n                  \"TickerThread error: processing too long!\");\n    }\n  }\n\n  sendJavaMsg(env, pctx->jniHandlerObj, statusId,\n              \"TickerThread status: ticking stopped\");\n  javaVM->DetachCurrentThread();\n  return context;\n}\n\n/*\n * Interface to Java side to start ticks, caller is from onResume()\n */\nvoid StartTicks(JNIEnv* env, jobject instance) {\n  pthread_t threadInfo_;\n  pthread_attr_t threadAttr_;\n\n  pthread_attr_init(&threadAttr_);\n  pthread_attr_setdetachstate(&threadAttr_, PTHREAD_CREATE_DETACHED);\n\n  pthread_mutex_init(&g_ctx.lock, NULL);\n\n  jclass clz = env->GetObjectClass(instance);\n  g_ctx.mainActivityClz = static_cast<jclass>(env->NewGlobalRef(clz));\n  g_ctx.mainActivityObj = env->NewGlobalRef(instance);\n\n  int result = pthread_create(&threadInfo_, &threadAttr_, UpdateTicks, &g_ctx);\n  assert(result == 0);\n\n  pthread_attr_destroy(&threadAttr_);\n\n  (void)result;\n}\n\n/*\n * Interface to Java side to stop ticks:\n *    we need to hold and make sure our native thread has finished before return\n *    for a clean shutdown. The caller is from onPause\n */\nvoid StopTicks(JNIEnv* env, jobject) {\n  pthread_mutex_lock(&g_ctx.lock);\n  g_ctx.done = 1;\n  pthread_mutex_unlock(&g_ctx.lock);\n\n  // waiting for ticking thread to flip the done flag\n  struct timespec sleepTime;\n  memset(&sleepTime, 0, sizeof(sleepTime));\n  sleepTime.tv_nsec = 100000000;\n  while (g_ctx.done) {\n    nanosleep(&sleepTime, NULL);\n  }\n\n  // release object we allocated from StartTicks() function\n  env->DeleteGlobalRef(g_ctx.mainActivityClz);\n  env->DeleteGlobalRef(g_ctx.mainActivityObj);\n  g_ctx.mainActivityObj = NULL;\n  g_ctx.mainActivityClz = NULL;\n\n  pthread_mutex_destroy(&g_ctx.lock);\n}\n\n/*\n * processing one time initialization:\n *     Cache the javaVM into our context\n *     Register native methods\n *     Find class ID for JniHandler\n *     Create an instance of JniHandler\n *     Make global reference since we are using them from a native thread\n * Note:\n *     All resources allocated here are never released by application\n *     we rely on system to free all global refs when it goes away;\n *     the pairing function JNI_OnUnload() never gets called at all.\n */\nJNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*) {\n  JNIEnv* env;\n  memset(&g_ctx, 0, sizeof(g_ctx));\n\n  g_ctx.javaVM = vm;\n  if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {\n    return JNI_ERR;  // JNI version not supported.\n  }\n\n  jclass c = env->FindClass(\"com/example/hellojnicallback/MainActivity\");\n  if (c == nullptr) return JNI_ERR;\n\n  static const JNINativeMethod methods[] = {\n      {\"stringFromJNI\", \"()Ljava/lang/String;\",\n       reinterpret_cast<void*>(StringFromJni)},\n      {\"startTicks\", \"()V\", reinterpret_cast<void*>(StartTicks)},\n      {\"StopTicks\", \"()V\", reinterpret_cast<void*>(StopTicks)},\n  };\n  int rc = env->RegisterNatives(c, methods, arraysize(methods));\n  if (rc != JNI_OK) return rc;\n\n  jclass clz = env->FindClass(\"com/example/hellojnicallback/JniHandler\");\n  g_ctx.jniHandlerClz = static_cast<jclass>(env->NewGlobalRef(clz));\n\n  jmethodID jniHandlerCtor =\n      env->GetMethodID(g_ctx.jniHandlerClz, \"<init>\", \"()V\");\n  jobject handler = env->NewObject(g_ctx.jniHandlerClz, jniHandlerCtor);\n  g_ctx.jniHandlerObj = env->NewGlobalRef(handler);\n  queryRuntimeInfo(env, g_ctx.jniHandlerObj);\n\n  g_ctx.done = 0;\n  g_ctx.mainActivityObj = NULL;\n  return JNI_VERSION_1_6;\n}\n"
  },
  {
    "path": "hello-jniCallback/app/src/main/cpp/libhello-jnicallback.map.txt",
    "content": "LIBJNICALLBACK {\n  global:\n    JNI_OnLoad;\n  local:\n    *;\n};\n"
  },
  {
    "path": "hello-jniCallback/app/src/main/java/com/example/hellojnicallback/JniHandler.java",
    "content": "/*\n * Copyright (C) 2016 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\npackage com.example.hellojnicallback;\n\nimport android.os.Build;\nimport androidx.annotation.Keep;\nimport android.util.Log;\n\n/*\n * A helper class to demo that JNI could call into:\n *     private non-static function\n *     public non-static function\n *     static public function\n * The calling code is inside hello-jnicallback.c\n */\npublic class JniHandler {\n    /*\n     * Print out status to logcat\n     */\n    @Keep\n    private void updateStatus(String msg) {\n        if (msg.toLowerCase().contains(\"error\")) {\n            Log.e(\"JniHandler\", \"Native Err: \" + msg);\n        } else {\n            Log.i(\"JniHandler\", \"Native Msg: \" + msg);\n        }\n    }\n\n    /*\n     * Return OS build version: a static function\n     */\n    @Keep\n    static public String getBuildVersion() {\n        return Build.VERSION.RELEASE;\n    }\n\n    /*\n     * Return Java memory info\n     */\n    @Keep\n    public long getRuntimeMemorySize() {\n        return Runtime.getRuntime().freeMemory();\n    }\n}\n"
  },
  {
    "path": "hello-jniCallback/app/src/main/java/com/example/hellojnicallback/MainActivity.java",
    "content": "/*\n * Copyright (C) 2016 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.example.hellojnicallback;\n\nimport androidx.annotation.Keep;\nimport androidx.appcompat.app.AppCompatActivity;\nimport android.os.Bundle;\nimport android.widget.TextView;\n\npublic class MainActivity extends AppCompatActivity {\n\n    int hour = 0;\n    int minute = 0;\n    int second = 0;\n    TextView tickView;\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n        tickView = (TextView) findViewById(R.id.tickView);\n    }\n    @Override\n    public void onResume() {\n        super.onResume();\n        hour = minute = second = 0;\n        ((TextView)findViewById(R.id.hellojniMsg)).setText(stringFromJNI());\n        startTicks();\n    }\n\n    @Override\n    public void onPause () {\n        super.onPause();\n        StopTicks();\n    }\n\n    /*\n     * A function calling from JNI to update current timer\n     */\n    @Keep\n    private void updateTimer() {\n        ++second;\n        if(second >= 60) {\n            ++minute;\n            second -= 60;\n            if(minute >= 60) {\n                ++hour;\n                minute -= 60;\n            }\n        }\n        runOnUiThread(new Runnable() {\n            @Override\n            public void run() {\n                String ticks = \"\" + MainActivity.this.hour + \":\" +\n                        MainActivity.this.minute + \":\" +\n                        MainActivity.this.second;\n                MainActivity.this.tickView.setText(ticks);\n            }\n        });\n    }\n    static {\n        System.loadLibrary(\"hello-jnicallback\");\n    }\n    public native  String stringFromJNI();\n    public native void startTicks();\n    public native void StopTicks();\n}\n"
  },
  {
    "path": "hello-jniCallback/app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/activity_hello_jnicallback\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\"com.example.hellojnicallback.MainActivity\"\n    tools:layout_editor_absoluteX=\"0dp\"\n    tools:layout_editor_absoluteY=\"81dp\">\n\n    <TextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"Hello World!\"\n        android:id=\"@+id/hellojniMsg\"\n        tools:layout_editor_absoluteX=\"129dp\"\n        tools:layout_editor_absoluteY=\"222dp\"\n        app:layout_constraintLeft_toLeftOf=\"@+id/activity_hello_jnicallback\"\n        tools:layout_constraintLeft_creator=\"0\"\n        app:layout_constraintTop_toTopOf=\"@+id/activity_hello_jnicallback\"\n        tools:layout_constraintTop_creator=\"0\"\n        app:layout_constraintRight_toRightOf=\"@+id/activity_hello_jnicallback\"\n        tools:layout_constraintRight_creator=\"0\"\n        tools:layout_constraintBottom_creator=\"0\"\n        app:layout_constraintHorizontal_bias=\"0.42\"\n        app:layout_constraintVertical_bias=\"0.45\" />\n\n    <TextView\n        android:text=\"00:00:00\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        tools:layout_editor_absoluteX=\"124dp\"\n        tools:layout_editor_absoluteY=\"222dp\"\n        android:id=\"@+id/tickView\"\n        android:textAppearance=\"@android:style/TextAppearance.Material.Large\"\n        app:layout_constraintLeft_toLeftOf=\"@+id/activity_hello_jnicallback\"\n        tools:layout_constraintLeft_creator=\"0\"\n        app:layout_constraintTop_toTopOf=\"@+id/activity_hello_jnicallback\"\n        tools:layout_constraintTop_creator=\"0\"\n        app:layout_constraintRight_toRightOf=\"@+id/activity_hello_jnicallback\"\n        tools:layout_constraintRight_creator=\"0\"\n        app:layout_constraintBottom_toBottomOf=\"@+id/activity_hello_jnicallback\"\n        tools:layout_constraintBottom_creator=\"0\" />\n\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "hello-jniCallback/app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"colorPrimaryDark\">#303F9F</color>\n    <color name=\"colorAccent\">#FF4081</color>\n</resources>\n"
  },
  {
    "path": "hello-jniCallback/app/src/main/res/values/dimens.xml",
    "content": "<resources>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"activity_horizontal_margin\">16dp</dimen>\n    <dimen name=\"activity_vertical_margin\">16dp</dimen>\n</resources>\n"
  },
  {
    "path": "hello-jniCallback/app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">Hello-jniCallback</string>\n</resources>\n"
  },
  {
    "path": "hello-jniCallback/app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.DarkActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "hello-jniCallback/app/src/main/res/values-w820dp/dimens.xml",
    "content": "<resources>\n    <!-- Example customization of dimensions originally defined in res/values/dimens.xml\n         (such as screen margins) for screens with more than 820dp of available width. This\n         would include 7\" and 10\" devices in landscape (~960dp and ~1280dp respectively). -->\n    <dimen name=\"activity_horizontal_margin\">64dp</dimen>\n</resources>\n"
  },
  {
    "path": "hello-oboe/README.md",
    "content": "# Sample removed\n\nThis sample has been removed the upstream [Oboe] repository has is own (much\nbetter!) samples.\n\n[Oboe]: https://github.com/google/oboe\n"
  },
  {
    "path": "hello-vulkan/README.md",
    "content": "# Hello VK\n\nHello VK is an Android C++ sample that draws the simple, but traditional Hello\nWorld Triangle.\n\nAside from the base functionality the source code also covers convenient\nfeatures such as:\n\n- Vulkan validation layers. See section below for information on how to enable\n  these\n- Vulkan pre-rotation to enable fast and seamless screen rotation implemented on\n  the application side. You can read more about it here:\n  https://developer.android.com/games/optimize/vulkan-prerotation\n\n## Screenshots\n\n![Vulkan Triangle example](documentation-assets/example-triangle.png)\n\n## Validation layers\n\nAs the validation layer is a sizeable download, we chose to not ship them within\nthe apk. As such in order to enable validation layer, please follow the simple\nsteps below:\n\n1. Download the latest android binaries from:\n   https://github.com/KhronosGroup/Vulkan-ValidationLayers/releases\n1. Place them in their respective ABI folders located in: app/src/main/jniLibs\n1. Go to hellovk.h, search for 'bool enableValidationLayers = false' and toggle\n   that to true.\n\n## Extra information:\n\nAs Vulkan is well documented we will not provide detailed instructions regarding\nthe innerworkings of Vulkan. You should however, find useful comments and\nreferences regarding the android to vulkan bridge. We chose to use Android Glue\nfor a seamless experience. More details here:\nhttps://developer.android.com/reference/games/game-activity/group/android-native-app-glue\n\nThese vulkan tutorials should hopefully cover everything needed to understand\nthe workings of the Vulkan app: https://vulkan-tutorial.com\nhttps://vkguide.dev/docs/chapter-1/vulkan_init_flow/\n\nLastly, you will notice that the Kotlin file is somewhat redundant. Luckily, if\nyou do not require any additional/custom application behaviour, the\nAndroid(Kotlin) source files can be completely removed and the\nAndroidManifest.xml tweaked as specified here:\nhttps://developer.android.com/ndk/samples/sample_na\n"
  },
  {
    "path": "hello-vulkan/app/build.gradle",
    "content": "/*\n * Copyright (C) 2022 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nplugins {\n    id \"ndksamples.android.application\"\n    id \"ndksamples.android.kotlin\"\n}\n\nandroid {\n    namespace 'com.android.hellovk'\n\n    defaultConfig {\n        applicationId 'com.android.hellovk'\n        // TODO: Figure out why this isn't 24.\n        minSdk 30\n        externalNativeBuild {\n            cmake {\n                // Available arguments are inside ${SDK}/cmake/.../android.toolchain.cmake file\n                arguments \"-DANDROID_STL=c++_shared\"\n            }\n        }\n        shaders {\n            glslcArgs.addAll(['-c'])\n        }\n        ndk {\n            // GameActivity doesn't currently (August 2025) include riscv64\n            // libraries.\n            abiFilters.remove(\"riscv64\")\n        }\n    }\n\n    externalNativeBuild {\n        cmake {\n            path 'src/main/cpp/CMakeLists.txt'\n        }\n    }\n\n    buildFeatures {\n        prefab true\n        shaders true\n    }\n}\n\ndependencies {\n    implementation libs.appcompat\n    implementation libs.androidx.games.gameactivity\n}\n"
  },
  {
    "path": "hello-vulkan/app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n  <application\n      android:icon=\"@mipmap/ic_launcher\"\n      android:label=\"@string/hellovk_activity\">\n    <activity android:name=\"VulkanActivity\"\n              android:theme=\"@style/Application.Fullscreen\"\n              android:launchMode=\"singleTask\"\n              android:exported=\"true\"\n              android:configChanges=\"orientation|screenSize|keyboardHidden\">\n      <intent-filter>\n        <action android:name=\"android.intent.action.MAIN\" />\n        <category android:name=\"android.intent.category.LAUNCHER\" />\n      </intent-filter>\n    </activity>\n  </application>\n</manifest>\n"
  },
  {
    "path": "hello-vulkan/app/src/main/cpp/CMakeLists.txt",
    "content": "#[[\n Copyright (C) 2022 The Android Open Source Project\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n      http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n#]]\n\ncmake_minimum_required(VERSION 4.1.0)\nproject(HelloVulkan LANGUAGES CXX)\n\ninclude(AppLibrary)\nfind_package(game-activity REQUIRED CONFIG)\n\nadd_app_library(hellovkjni SHARED\n    vk_main.cpp\n)\n\ntarget_compile_definitions(hellovkjni PRIVATE\n    VK_USE_PLATFORM_ANDROID_KHR=1\n)\n\ntarget_link_libraries(hellovkjni PUBLIC\n    vulkan\n    $<LINK_LIBRARY:WHOLE_ARCHIVE,game-activity::game-activity_static>\n    android\n    log\n)\n"
  },
  {
    "path": "hello-vulkan/app/src/main/cpp/hellovk.h",
    "content": "/*\n * Copyright (C) 2022 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include <android/asset_manager.h>\n#include <android/log.h>\n#include <android/native_window.h>\n#include <android/native_window_jni.h>\n#include <assert.h>\n#include <vulkan/vulkan.h>\n\n#include <array>\n#include <fstream>\n#include <map>\n#include <optional>\n#include <set>\n#include <sstream>\n#include <string>\n#include <vector>\n\n/**\n * HelloVK contains the core of Vulkan pipeline setup. It includes recording\n * draw commands as well as screen clearing during the render pass.\n *\n * Please refer to: https://vulkan-tutorial.com/ for a gentle Vulkan\n * introduction.\n */\n\nnamespace vkt {\n#define LOG_TAG \"hellovkjni\"\n#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)\n#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)\n#define VK_CHECK(x)                           \\\n  do {                                        \\\n    VkResult err = x;                         \\\n    if (err) {                                \\\n      LOGE(\"Detected Vulkan error: %d\", err); \\\n      abort();                                \\\n    }                                         \\\n  } while (0)\n\nconst int MAX_FRAMES_IN_FLIGHT = 2;\n\nstruct UniformBufferObject {\n  std::array<float, 16> mvp;\n};\n\nstruct QueueFamilyIndices {\n  std::optional<uint32_t> graphicsFamily;\n  std::optional<uint32_t> presentFamily;\n  bool isComplete() {\n    return graphicsFamily.has_value() && presentFamily.has_value();\n  }\n};\n\nstruct SwapChainSupportDetails {\n  VkSurfaceCapabilitiesKHR capabilities;\n  std::vector<VkSurfaceFormatKHR> formats;\n  std::vector<VkPresentModeKHR> presentModes;\n};\n\nstruct ANativeWindowDeleter {\n  void operator()(ANativeWindow* window) { ANativeWindow_release(window); }\n};\n\nstd::vector<uint8_t> LoadBinaryFileToVector(const char* file_path,\n                                            AAssetManager* assetManager) {\n  std::vector<uint8_t> file_content;\n  assert(assetManager);\n  AAsset* file =\n      AAssetManager_open(assetManager, file_path, AASSET_MODE_BUFFER);\n  size_t file_length = AAsset_getLength(file);\n\n  file_content.resize(file_length);\n\n  AAsset_read(file, file_content.data(), file_length);\n  AAsset_close(file);\n  return file_content;\n}\n\nconst char* toStringMessageSeverity(VkDebugUtilsMessageSeverityFlagBitsEXT s) {\n  switch (s) {\n    case VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT:\n      return \"VERBOSE\";\n    case VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT:\n      return \"ERROR\";\n    case VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT:\n      return \"WARNING\";\n    case VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT:\n      return \"INFO\";\n    default:\n      return \"UNKNOWN\";\n  }\n}\nconst char* toStringMessageType(VkDebugUtilsMessageTypeFlagsEXT s) {\n  if (s == (VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT |\n            VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT |\n            VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT))\n    return \"General | Validation | Performance\";\n  if (s == (VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT |\n            VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT))\n    return \"Validation | Performance\";\n  if (s == (VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT |\n            VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT))\n    return \"General | Performance\";\n  if (s == (VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT))\n    return \"Performance\";\n  if (s == (VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT |\n            VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT))\n    return \"General | Validation\";\n  if (s == VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT) return \"Validation\";\n  if (s == VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT) return \"General\";\n  return \"Unknown\";\n}\n\nstatic VKAPI_ATTR VkBool32 VKAPI_CALL\ndebugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,\n              VkDebugUtilsMessageTypeFlagsEXT messageType,\n              const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,\n              void* /* pUserData */) {\n  auto ms = toStringMessageSeverity(messageSeverity);\n  auto mt = toStringMessageType(messageType);\n  printf(\"[%s: %s]\\n%s\\n\", ms, mt, pCallbackData->pMessage);\n\n  return VK_FALSE;\n}\n\nstatic void populateDebugMessengerCreateInfo(\n    VkDebugUtilsMessengerCreateInfoEXT& createInfo) {\n  createInfo = {};\n  createInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT;\n  createInfo.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT |\n                               VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT |\n                               VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;\n  createInfo.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT |\n                           VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT |\n                           VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;\n  createInfo.pfnUserCallback = debugCallback;\n}\n\nstatic VkResult CreateDebugUtilsMessengerEXT(\n    VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,\n    const VkAllocationCallbacks* pAllocator,\n    VkDebugUtilsMessengerEXT* pDebugMessenger) {\n  auto func = (PFN_vkCreateDebugUtilsMessengerEXT)vkGetInstanceProcAddr(\n      instance, \"vkCreateDebugUtilsMessengerEXT\");\n  if (func != nullptr) {\n    return func(instance, pCreateInfo, pAllocator, pDebugMessenger);\n  } else {\n    return VK_ERROR_EXTENSION_NOT_PRESENT;\n  }\n}\n\nstatic void DestroyDebugUtilsMessengerEXT(\n    VkInstance instance, VkDebugUtilsMessengerEXT debugMessenger,\n    const VkAllocationCallbacks* pAllocator) {\n  auto func = (PFN_vkDestroyDebugUtilsMessengerEXT)vkGetInstanceProcAddr(\n      instance, \"vkDestroyDebugUtilsMessengerEXT\");\n  if (func != nullptr) {\n    func(instance, debugMessenger, pAllocator);\n  }\n}\n\nclass HelloVK {\n public:\n  void initVulkan();\n  void render();\n  void cleanup();\n  void cleanupSwapChain();\n  void reset(ANativeWindow* newWindow, AAssetManager* newManager);\n  bool initialized = false;\n\n private:\n  void createDevice();\n  void createInstance();\n  void createSurface();\n  void setupDebugMessenger();\n  void pickPhysicalDevice();\n  void createLogicalDeviceAndQueue();\n  void createSwapChain();\n  void createImageViews();\n  void createRenderPass();\n  void createDescriptorSetLayout();\n  void createGraphicsPipeline();\n  void createFramebuffers();\n  void createCommandPool();\n  void createCommandBuffer();\n  void createSyncObjects();\n  QueueFamilyIndices findQueueFamilies(VkPhysicalDevice device);\n  bool checkDeviceExtensionSupport(VkPhysicalDevice device);\n  bool isDeviceSuitable(VkPhysicalDevice device);\n  bool checkValidationLayerSupport();\n  std::vector<const char*> getRequiredExtensions(bool enableValidation);\n  SwapChainSupportDetails querySwapChainSupport(VkPhysicalDevice device);\n  VkExtent2D chooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabilities);\n  VkShaderModule createShaderModule(const std::vector<uint8_t>& code);\n  void recordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex);\n  void recreateSwapChain();\n  void onOrientationChange();\n  uint32_t findMemoryType(uint32_t typeFilter,\n                          VkMemoryPropertyFlags properties);\n  void createBuffer(VkDeviceSize size, VkBufferUsageFlags usage,\n                    VkMemoryPropertyFlags properties, VkBuffer& buffer,\n                    VkDeviceMemory& bufferMemory);\n  void createUniformBuffers();\n  void updateUniformBuffer(uint32_t currentImage);\n  void createDescriptorPool();\n  void createDescriptorSets();\n  void establishDisplaySizeIdentity();\n\n  /*\n   * In order to enable validation layer toggle this to true and\n   * follow the README.md instructions concerning the validation\n   * layers. You will be required to add separate vulkan validation\n   * '*.so' files in order to enable this.\n   *\n   * The validation layers are not shipped with the APK as they are sizeable.\n   */\n  bool enableValidationLayers = false;\n\n  const std::vector<const char*> validationLayers = {\n      \"VK_LAYER_KHRONOS_validation\"};\n  const std::vector<const char*> deviceExtensions = {\n      VK_KHR_SWAPCHAIN_EXTENSION_NAME};\n  std::unique_ptr<ANativeWindow, ANativeWindowDeleter> window;\n  AAssetManager* assetManager;\n\n  VkInstance instance;\n  VkDebugUtilsMessengerEXT debugMessenger;\n\n  VkSurfaceKHR surface;\n\n  VkPhysicalDevice physicalDevice = VK_NULL_HANDLE;\n  VkDevice device;\n\n  VkSwapchainKHR swapChain;\n  std::vector<VkImage> swapChainImages;\n  VkFormat swapChainImageFormat;\n  VkExtent2D swapChainExtent;\n  VkExtent2D displaySizeIdentity;\n  std::vector<VkImageView> swapChainImageViews;\n  std::vector<VkFramebuffer> swapChainFramebuffers;\n  VkCommandPool commandPool;\n  std::vector<VkCommandBuffer> commandBuffers;\n\n  VkQueue graphicsQueue;\n  VkQueue presentQueue;\n\n  VkRenderPass renderPass;\n  VkDescriptorSetLayout descriptorSetLayout;\n  VkPipelineLayout pipelineLayout;\n  VkPipeline graphicsPipeline;\n\n  std::vector<VkBuffer> uniformBuffers;\n  std::vector<VkDeviceMemory> uniformBuffersMemory;\n\n  std::vector<VkSemaphore> imageAvailableSemaphores;\n  std::vector<VkSemaphore> renderFinishedSemaphores;\n  std::vector<VkFence> inFlightFences;\n  VkDescriptorPool descriptorPool;\n  std::vector<VkDescriptorSet> descriptorSets;\n\n  uint32_t currentFrame = 0;\n  bool orientationChanged = false;\n  VkSurfaceTransformFlagBitsKHR pretransformFlag;\n};\n\nvoid HelloVK::initVulkan() {\n  createInstance();\n  createSurface();\n  pickPhysicalDevice();\n  createLogicalDeviceAndQueue();\n  setupDebugMessenger();\n  establishDisplaySizeIdentity();\n  createSwapChain();\n  createImageViews();\n  createRenderPass();\n  createDescriptorSetLayout();\n  createUniformBuffers();\n  createDescriptorPool();\n  createDescriptorSets();\n  createGraphicsPipeline();\n  createFramebuffers();\n  createCommandPool();\n  createCommandBuffer();\n  createSyncObjects();\n  initialized = true;\n}\n\n/*\n *\tCreate a buffer with specified usage and memory properties\n *\ti.e a uniform buffer which uses HOST_COHERENT memory\n *  Upon creation, these buffers will list memory requirements which need to be\n *  satisfied by the device in use in order to be created.\n */\nvoid HelloVK::createBuffer(VkDeviceSize size, VkBufferUsageFlags usage,\n                           VkMemoryPropertyFlags properties, VkBuffer& buffer,\n                           VkDeviceMemory& bufferMemory) {\n  VkBufferCreateInfo bufferInfo{};\n  bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;\n  bufferInfo.size = size;\n  bufferInfo.usage = usage;\n  bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;\n\n  VK_CHECK(vkCreateBuffer(device, &bufferInfo, nullptr, &buffer));\n\n  VkMemoryRequirements memRequirements;\n  vkGetBufferMemoryRequirements(device, buffer, &memRequirements);\n\n  VkMemoryAllocateInfo allocInfo{};\n  allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;\n  allocInfo.allocationSize = memRequirements.size;\n  allocInfo.memoryTypeIndex =\n      findMemoryType(memRequirements.memoryTypeBits, properties);\n\n  VK_CHECK(vkAllocateMemory(device, &allocInfo, nullptr, &bufferMemory));\n\n  vkBindBufferMemory(device, buffer, bufferMemory, 0);\n}\n\n/*\n * Finds the index of the memory heap which matches a particular buffer's memory\n * requirements. Vulkan manages these requirements as a bitset, in this case\n * expressed through a uint32_t.\n */\nuint32_t HelloVK::findMemoryType(uint32_t typeFilter,\n                                 VkMemoryPropertyFlags properties) {\n  VkPhysicalDeviceMemoryProperties memProperties;\n  vkGetPhysicalDeviceMemoryProperties(physicalDevice, &memProperties);\n\n  for (uint32_t i = 0; i < memProperties.memoryTypeCount; i++) {\n    if ((typeFilter & (1 << i)) && (memProperties.memoryTypes[i].propertyFlags &\n                                    properties) == properties) {\n      return i;\n    }\n  }\n\n  assert(false);  // failed to find suitable memory type!\n  return -1;\n}\n\nvoid HelloVK::createUniformBuffers() {\n  VkDeviceSize bufferSize = sizeof(UniformBufferObject);\n\n  uniformBuffers.resize(MAX_FRAMES_IN_FLIGHT);\n  uniformBuffersMemory.resize(MAX_FRAMES_IN_FLIGHT);\n\n  for (size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++) {\n    createBuffer(bufferSize, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,\n                 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |\n                     VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,\n                 uniformBuffers[i], uniformBuffersMemory[i]);\n  }\n}\n\nvoid HelloVK::createDescriptorSetLayout() {\n  VkDescriptorSetLayoutBinding uboLayoutBinding{};\n  uboLayoutBinding.binding = 0;\n  uboLayoutBinding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;\n  uboLayoutBinding.descriptorCount = 1;\n  uboLayoutBinding.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;\n  uboLayoutBinding.pImmutableSamplers = nullptr;\n\n  VkDescriptorSetLayoutCreateInfo layoutInfo{};\n  layoutInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;\n  layoutInfo.bindingCount = 1;\n  layoutInfo.pBindings = &uboLayoutBinding;\n\n  VK_CHECK(vkCreateDescriptorSetLayout(device, &layoutInfo, nullptr,\n                                       &descriptorSetLayout));\n}\n\nvoid HelloVK::reset(ANativeWindow* newWindow, AAssetManager* newManager) {\n  window.reset(newWindow);\n  assetManager = newManager;\n  if (initialized) {\n    createSurface();\n    recreateSwapChain();\n  }\n}\n\nvoid HelloVK::recreateSwapChain() {\n  vkDeviceWaitIdle(device);\n  cleanupSwapChain();\n  createSwapChain();\n  createImageViews();\n  createFramebuffers();\n}\n\nvoid HelloVK::render() {\n  if (orientationChanged) {\n    onOrientationChange();\n  }\n\n  vkWaitForFences(device, 1, &inFlightFences[currentFrame], VK_TRUE,\n                  UINT64_MAX);\n  uint32_t imageIndex;\n  VkResult result = vkAcquireNextImageKHR(\n      device, swapChain, UINT64_MAX, imageAvailableSemaphores[currentFrame],\n      VK_NULL_HANDLE, &imageIndex);\n  if (result == VK_ERROR_OUT_OF_DATE_KHR) {\n    recreateSwapChain();\n    return;\n  }\n  assert(result == VK_SUCCESS ||\n         result == VK_SUBOPTIMAL_KHR);  // failed to acquire swap chain image\n  updateUniformBuffer(currentFrame);\n\n  vkResetFences(device, 1, &inFlightFences[currentFrame]);\n  vkResetCommandBuffer(commandBuffers[currentFrame], 0);\n\n  recordCommandBuffer(commandBuffers[currentFrame], imageIndex);\n\n  VkSubmitInfo submitInfo{};\n  submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;\n\n  VkSemaphore waitSemaphores[] = {imageAvailableSemaphores[currentFrame]};\n  VkPipelineStageFlags waitStages[] = {\n      VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT};\n  submitInfo.waitSemaphoreCount = 1;\n  submitInfo.pWaitSemaphores = waitSemaphores;\n  submitInfo.pWaitDstStageMask = waitStages;\n  submitInfo.commandBufferCount = 1;\n  submitInfo.pCommandBuffers = &commandBuffers[currentFrame];\n  VkSemaphore signalSemaphores[] = {renderFinishedSemaphores[currentFrame]};\n  submitInfo.signalSemaphoreCount = 1;\n  submitInfo.pSignalSemaphores = signalSemaphores;\n\n  VK_CHECK(vkQueueSubmit(graphicsQueue, 1, &submitInfo,\n                         inFlightFences[currentFrame]));\n\n  VkPresentInfoKHR presentInfo{};\n  presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;\n\n  presentInfo.waitSemaphoreCount = 1;\n  presentInfo.pWaitSemaphores = signalSemaphores;\n\n  VkSwapchainKHR swapChains[] = {swapChain};\n  presentInfo.swapchainCount = 1;\n  presentInfo.pSwapchains = swapChains;\n  presentInfo.pImageIndices = &imageIndex;\n  presentInfo.pResults = nullptr;\n\n  result = vkQueuePresentKHR(presentQueue, &presentInfo);\n  if (result == VK_SUBOPTIMAL_KHR) {\n    orientationChanged = true;\n  } else if (result == VK_ERROR_OUT_OF_DATE_KHR) {\n    recreateSwapChain();\n  } else {\n    assert(result == VK_SUCCESS);  // failed to present swap chain image!\n  }\n  currentFrame = (currentFrame + 1) % MAX_FRAMES_IN_FLIGHT;\n}\n\n/*\n * getPrerotationMatrix handles screen rotation with 3 hardcoded rotation\n * matrices (detailed below). We skip the 180 degrees rotation.\n */\nvoid getPrerotationMatrix(const VkSurfaceTransformFlagBitsKHR& pretransformFlag,\n                          std::array<float, 16>& mat) {\n  // mat is initialized to the identity matrix\n  mat = {1., 0., 0., 0., 0., 1., 0., 0., 0., 0., 1., 0., 0., 0., 0., 1.};\n  if (pretransformFlag & VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR) {\n    // mat is set to a 90 deg rotation matrix\n    mat = {0., 1., 0., 0., -1., 0, 0., 0., 0., 0., 1., 0., 0., 0., 0., 1.};\n  }\n\n  else if (pretransformFlag & VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR) {\n    // mat is set to 270 deg rotation matrix\n    mat = {0., -1., 0., 0., 1., 0, 0., 0., 0., 0., 1., 0., 0., 0., 0., 1.};\n  }\n}\n\nvoid HelloVK::createDescriptorPool() {\n  VkDescriptorPoolSize poolSize{};\n  poolSize.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;\n  poolSize.descriptorCount = static_cast<uint32_t>(MAX_FRAMES_IN_FLIGHT);\n\n  VkDescriptorPoolCreateInfo poolInfo{};\n  poolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;\n  poolInfo.poolSizeCount = 1;\n  poolInfo.pPoolSizes = &poolSize;\n  poolInfo.maxSets = static_cast<uint32_t>(MAX_FRAMES_IN_FLIGHT);\n\n  VK_CHECK(vkCreateDescriptorPool(device, &poolInfo, nullptr, &descriptorPool));\n}\n\nvoid HelloVK::createDescriptorSets() {\n  std::vector<VkDescriptorSetLayout> layouts(MAX_FRAMES_IN_FLIGHT,\n                                             descriptorSetLayout);\n  VkDescriptorSetAllocateInfo allocInfo{};\n  allocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;\n  allocInfo.descriptorPool = descriptorPool;\n  allocInfo.descriptorSetCount = static_cast<uint32_t>(MAX_FRAMES_IN_FLIGHT);\n  allocInfo.pSetLayouts = layouts.data();\n\n  descriptorSets.resize(MAX_FRAMES_IN_FLIGHT);\n  VK_CHECK(vkAllocateDescriptorSets(device, &allocInfo, descriptorSets.data()));\n\n  for (size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++) {\n    VkDescriptorBufferInfo bufferInfo{};\n    bufferInfo.buffer = uniformBuffers[i];\n    bufferInfo.offset = 0;\n    bufferInfo.range = sizeof(UniformBufferObject);\n\n    VkWriteDescriptorSet descriptorWrite{};\n    descriptorWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n    descriptorWrite.dstSet = descriptorSets[i];\n    descriptorWrite.dstBinding = 0;\n    descriptorWrite.dstArrayElement = 0;\n    descriptorWrite.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;\n    descriptorWrite.descriptorCount = 1;\n    descriptorWrite.pBufferInfo = &bufferInfo;\n\n    vkUpdateDescriptorSets(device, 1, &descriptorWrite, 0, nullptr);\n  }\n}\n\nvoid HelloVK::updateUniformBuffer(uint32_t currentImage) {\n  SwapChainSupportDetails swapChainSupport =\n      querySwapChainSupport(physicalDevice);\n  UniformBufferObject ubo{};\n  getPrerotationMatrix(pretransformFlag, ubo.mvp);\n  void* data;\n  vkMapMemory(device, uniformBuffersMemory[currentImage], 0, sizeof(ubo), 0,\n              &data);\n  memcpy(data, &ubo, sizeof(ubo));\n  vkUnmapMemory(device, uniformBuffersMemory[currentImage]);\n}\n\nvoid HelloVK::onOrientationChange() {\n  recreateSwapChain();\n  orientationChanged = false;\n}\n\nvoid HelloVK::recordCommandBuffer(VkCommandBuffer commandBuffer,\n                                  uint32_t imageIndex) {\n  VkCommandBufferBeginInfo beginInfo{};\n  beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;\n  beginInfo.flags = 0;\n  beginInfo.pInheritanceInfo = nullptr;\n\n  VK_CHECK(vkBeginCommandBuffer(commandBuffer, &beginInfo));\n\n  VkRenderPassBeginInfo renderPassInfo{};\n  renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;\n  renderPassInfo.renderPass = renderPass;\n  renderPassInfo.framebuffer = swapChainFramebuffers[imageIndex];\n  renderPassInfo.renderArea.offset = {0, 0};\n  renderPassInfo.renderArea.extent = swapChainExtent;\n\n  VkViewport viewport{};\n  viewport.width = (float)swapChainExtent.width;\n  viewport.height = (float)swapChainExtent.height;\n  viewport.minDepth = 0.0f;\n  viewport.maxDepth = 1.0f;\n  vkCmdSetViewport(commandBuffer, 0, 1, &viewport);\n\n  VkRect2D scissor{};\n  scissor.extent = swapChainExtent;\n  vkCmdSetScissor(commandBuffer, 0, 1, &scissor);\n\n  static float grey;\n  grey += 0.005f;\n  if (grey > 1.0f) {\n    grey = 0.0f;\n  }\n  VkClearValue clearColor = {{{grey, grey, grey, 1.0f}}};\n\n  renderPassInfo.clearValueCount = 1;\n  renderPassInfo.pClearValues = &clearColor;\n  vkCmdBeginRenderPass(commandBuffer, &renderPassInfo,\n                       VK_SUBPASS_CONTENTS_INLINE);\n  vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS,\n                    graphicsPipeline);\n  vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS,\n                          pipelineLayout, 0, 1, &descriptorSets[currentFrame],\n                          0, nullptr);\n\n  vkCmdDraw(commandBuffer, 3, 1, 0, 0);\n  vkCmdEndRenderPass(commandBuffer);\n  VK_CHECK(vkEndCommandBuffer(commandBuffer));\n}\n\nvoid HelloVK::cleanupSwapChain() {\n  for (size_t i = 0; i < swapChainFramebuffers.size(); i++) {\n    vkDestroyFramebuffer(device, swapChainFramebuffers[i], nullptr);\n  }\n\n  for (size_t i = 0; i < swapChainImageViews.size(); i++) {\n    vkDestroyImageView(device, swapChainImageViews[i], nullptr);\n  }\n\n  vkDestroySwapchainKHR(device, swapChain, nullptr);\n}\n\nvoid HelloVK::cleanup() {\n  vkDeviceWaitIdle(device);\n  cleanupSwapChain();\n  vkDestroyDescriptorPool(device, descriptorPool, nullptr);\n\n  vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr);\n\n  for (size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++) {\n    vkDestroyBuffer(device, uniformBuffers[i], nullptr);\n    vkFreeMemory(device, uniformBuffersMemory[i], nullptr);\n  }\n\n  for (size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++) {\n    vkDestroySemaphore(device, imageAvailableSemaphores[i], nullptr);\n    vkDestroySemaphore(device, renderFinishedSemaphores[i], nullptr);\n    vkDestroyFence(device, inFlightFences[i], nullptr);\n  }\n  vkDestroyCommandPool(device, commandPool, nullptr);\n  vkDestroyPipeline(device, graphicsPipeline, nullptr);\n  vkDestroyPipelineLayout(device, pipelineLayout, nullptr);\n  vkDestroyRenderPass(device, renderPass, nullptr);\n  vkDestroyDevice(device, nullptr);\n  if (enableValidationLayers) {\n    DestroyDebugUtilsMessengerEXT(instance, debugMessenger, nullptr);\n  }\n  vkDestroySurfaceKHR(instance, surface, nullptr);\n  vkDestroyInstance(instance, nullptr);\n  initialized = false;\n}\n\nvoid HelloVK::setupDebugMessenger() {\n  if (!enableValidationLayers) {\n    return;\n  }\n\n  VkDebugUtilsMessengerCreateInfoEXT createInfo{};\n  populateDebugMessengerCreateInfo(createInfo);\n\n  VK_CHECK(CreateDebugUtilsMessengerEXT(instance, &createInfo, nullptr,\n                                        &debugMessenger));\n}\n\nbool HelloVK::checkValidationLayerSupport() {\n  uint32_t layerCount;\n  vkEnumerateInstanceLayerProperties(&layerCount, nullptr);\n\n  std::vector<VkLayerProperties> availableLayers(layerCount);\n  vkEnumerateInstanceLayerProperties(&layerCount, availableLayers.data());\n\n  for (const char* layerName : validationLayers) {\n    bool layerFound = false;\n    for (const auto& layerProperties : availableLayers) {\n      if (strcmp(layerName, layerProperties.layerName) == 0) {\n        layerFound = true;\n        break;\n      }\n    }\n\n    if (!layerFound) {\n      return false;\n    }\n  }\n  return true;\n}\n\nstd::vector<const char*> HelloVK::getRequiredExtensions(\n    bool enableValidationLayers) {\n  std::vector<const char*> extensions;\n  extensions.push_back(\"VK_KHR_surface\");\n  extensions.push_back(\"VK_KHR_android_surface\");\n  if (enableValidationLayers) {\n    extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);\n  }\n  return extensions;\n}\n\nvoid HelloVK::createInstance() {\n  assert(!enableValidationLayers ||\n         checkValidationLayerSupport());  // validation layers requested, but\n                                          // not available!\n  auto requiredExtensions = getRequiredExtensions(enableValidationLayers);\n\n  VkApplicationInfo appInfo{};\n  appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;\n  appInfo.pApplicationName = \"Hello Triangle\";\n  appInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0);\n  appInfo.pEngineName = \"No Engine\";\n  appInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0);\n  appInfo.apiVersion = VK_API_VERSION_1_0;\n\n  VkInstanceCreateInfo createInfo{};\n  createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;\n  createInfo.pApplicationInfo = &appInfo;\n  createInfo.enabledExtensionCount = (uint32_t)requiredExtensions.size();\n  createInfo.ppEnabledExtensionNames = requiredExtensions.data();\n  createInfo.pApplicationInfo = &appInfo;\n\n  if (enableValidationLayers) {\n    VkDebugUtilsMessengerCreateInfoEXT debugCreateInfo{};\n    createInfo.enabledLayerCount =\n        static_cast<uint32_t>(validationLayers.size());\n    createInfo.ppEnabledLayerNames = validationLayers.data();\n    populateDebugMessengerCreateInfo(debugCreateInfo);\n    createInfo.pNext = (VkDebugUtilsMessengerCreateInfoEXT*)&debugCreateInfo;\n  } else {\n    createInfo.enabledLayerCount = 0;\n    createInfo.pNext = nullptr;\n  }\n  VK_CHECK(vkCreateInstance(&createInfo, nullptr, &instance));\n\n  uint32_t extensionCount = 0;\n  vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr);\n  std::vector<VkExtensionProperties> extensions(extensionCount);\n  vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount,\n                                         extensions.data());\n  LOGI(\"available extensions\");\n  for (const auto& extension : extensions) {\n    LOGI(\"\\t %s\", extension.extensionName);\n  }\n}\n\n/*\n * createSurface can only be called after the android ecosystem has had the\n * chance to provide a native window. This happens after the APP_CMD_START event\n * has had a chance to be called.\n *\n * Notice the window.get() call which is only valid after window has been set to\n * a non null value\n */\nvoid HelloVK::createSurface() {\n  assert(window != nullptr);  // window not initialized\n  const VkAndroidSurfaceCreateInfoKHR create_info{\n      .sType = VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR,\n      .pNext = nullptr,\n      .flags = 0,\n      .window = window.get()};\n\n  VK_CHECK(vkCreateAndroidSurfaceKHR(instance, &create_info,\n                                     nullptr /* pAllocator */, &surface));\n}\n\n// BEGIN DEVICE SUITABILITY\n// Functions to find a suitable physical device to execute Vulkan commands.\n\nQueueFamilyIndices HelloVK::findQueueFamilies(VkPhysicalDevice device) {\n  QueueFamilyIndices indices;\n\n  uint32_t queueFamilyCount = 0;\n  vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, nullptr);\n\n  std::vector<VkQueueFamilyProperties> queueFamilies(queueFamilyCount);\n  vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount,\n                                           queueFamilies.data());\n\n  int i = 0;\n  for (const auto& queueFamily : queueFamilies) {\n    if (queueFamily.queueFlags & VK_QUEUE_GRAPHICS_BIT) {\n      indices.graphicsFamily = i;\n    }\n\n    VkBool32 presentSupport = false;\n    vkGetPhysicalDeviceSurfaceSupportKHR(device, i, surface, &presentSupport);\n    if (presentSupport) {\n      indices.presentFamily = i;\n    }\n\n    if (indices.isComplete()) {\n      break;\n    }\n\n    i++;\n  }\n  return indices;\n}\n\nbool HelloVK::checkDeviceExtensionSupport(VkPhysicalDevice device) {\n  uint32_t extensionCount;\n  vkEnumerateDeviceExtensionProperties(device, nullptr, &extensionCount,\n                                       nullptr);\n\n  std::vector<VkExtensionProperties> availableExtensions(extensionCount);\n  vkEnumerateDeviceExtensionProperties(device, nullptr, &extensionCount,\n                                       availableExtensions.data());\n\n  std::set<std::string> requiredExtensions(deviceExtensions.begin(),\n                                           deviceExtensions.end());\n\n  for (const auto& extension : availableExtensions) {\n    requiredExtensions.erase(extension.extensionName);\n  }\n\n  return requiredExtensions.empty();\n}\n\nSwapChainSupportDetails HelloVK::querySwapChainSupport(\n    VkPhysicalDevice device) {\n  SwapChainSupportDetails details;\n\n  vkGetPhysicalDeviceSurfaceCapabilitiesKHR(device, surface,\n                                            &details.capabilities);\n\n  uint32_t formatCount;\n  vkGetPhysicalDeviceSurfaceFormatsKHR(device, surface, &formatCount, nullptr);\n\n  if (formatCount != 0) {\n    details.formats.resize(formatCount);\n    vkGetPhysicalDeviceSurfaceFormatsKHR(device, surface, &formatCount,\n                                         details.formats.data());\n  }\n\n  uint32_t presentModeCount;\n  vkGetPhysicalDeviceSurfacePresentModesKHR(device, surface, &presentModeCount,\n                                            nullptr);\n\n  if (presentModeCount != 0) {\n    details.presentModes.resize(presentModeCount);\n    vkGetPhysicalDeviceSurfacePresentModesKHR(\n        device, surface, &presentModeCount, details.presentModes.data());\n  }\n  return details;\n}\n\nbool HelloVK::isDeviceSuitable(VkPhysicalDevice device) {\n  QueueFamilyIndices indices = findQueueFamilies(device);\n  bool extensionsSupported = checkDeviceExtensionSupport(device);\n  bool swapChainAdequate = false;\n  if (extensionsSupported) {\n    SwapChainSupportDetails swapChainSupport = querySwapChainSupport(device);\n    swapChainAdequate = !swapChainSupport.formats.empty() &&\n                        !swapChainSupport.presentModes.empty();\n  }\n  return indices.isComplete() && extensionsSupported && swapChainAdequate;\n}\n\nvoid HelloVK::pickPhysicalDevice() {\n  uint32_t deviceCount = 0;\n  vkEnumeratePhysicalDevices(instance, &deviceCount, nullptr);\n\n  assert(deviceCount > 0);  // failed to find GPUs with Vulkan support!\n\n  std::vector<VkPhysicalDevice> devices(deviceCount);\n  vkEnumeratePhysicalDevices(instance, &deviceCount, devices.data());\n\n  for (const auto& device : devices) {\n    if (isDeviceSuitable(device)) {\n      physicalDevice = device;\n      break;\n    }\n  }\n\n  assert(physicalDevice != VK_NULL_HANDLE);  // failed to find a suitable GPU!\n}\n// END DEVICE SUITABILITY\n\nvoid HelloVK::createLogicalDeviceAndQueue() {\n  QueueFamilyIndices indices = findQueueFamilies(physicalDevice);\n  std::vector<VkDeviceQueueCreateInfo> queueCreateInfos;\n  std::set<uint32_t> uniqueQueueFamilies = {indices.graphicsFamily.value(),\n                                            indices.presentFamily.value()};\n  float queuePriority = 1.0f;\n  for (uint32_t queueFamily : uniqueQueueFamilies) {\n    VkDeviceQueueCreateInfo queueCreateInfo{};\n    queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;\n    queueCreateInfo.queueFamilyIndex = queueFamily;\n    queueCreateInfo.queueCount = 1;\n    queueCreateInfo.pQueuePriorities = &queuePriority;\n    queueCreateInfos.push_back(queueCreateInfo);\n  }\n\n  VkPhysicalDeviceFeatures deviceFeatures{};\n\n  VkDeviceCreateInfo createInfo{};\n  createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;\n  createInfo.queueCreateInfoCount =\n      static_cast<uint32_t>(queueCreateInfos.size());\n  createInfo.pQueueCreateInfos = queueCreateInfos.data();\n  createInfo.pEnabledFeatures = &deviceFeatures;\n  createInfo.enabledExtensionCount =\n      static_cast<uint32_t>(deviceExtensions.size());\n  createInfo.ppEnabledExtensionNames = deviceExtensions.data();\n  if (enableValidationLayers) {\n    createInfo.enabledLayerCount =\n        static_cast<uint32_t>(validationLayers.size());\n    createInfo.ppEnabledLayerNames = validationLayers.data();\n  } else {\n    createInfo.enabledLayerCount = 0;\n  }\n\n  VK_CHECK(vkCreateDevice(physicalDevice, &createInfo, nullptr, &device));\n\n  vkGetDeviceQueue(device, indices.graphicsFamily.value(), 0, &graphicsQueue);\n  vkGetDeviceQueue(device, indices.presentFamily.value(), 0, &presentQueue);\n}\n\nVkExtent2D HelloVK::chooseSwapExtent(\n    const VkSurfaceCapabilitiesKHR& capabilities) {\n  if (capabilities.currentExtent.width !=\n      std::numeric_limits<uint32_t>::max()) {\n    return capabilities.currentExtent;\n  } else {\n    int32_t width = ANativeWindow_getWidth(window.get());\n    int32_t height = ANativeWindow_getHeight(window.get());\n    VkExtent2D actualExtent = {static_cast<uint32_t>(width),\n                               static_cast<uint32_t>(height)};\n\n    actualExtent.width =\n        std::clamp(actualExtent.width, capabilities.minImageExtent.width,\n                   capabilities.maxImageExtent.width);\n    actualExtent.height =\n        std::clamp(actualExtent.height, capabilities.minImageExtent.height,\n                   capabilities.maxImageExtent.height);\n    return actualExtent;\n  }\n}\n\nvoid HelloVK::establishDisplaySizeIdentity() {\n  VkSurfaceCapabilitiesKHR capabilities;\n  vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface,\n                                            &capabilities);\n\n  uint32_t width = capabilities.currentExtent.width;\n  uint32_t height = capabilities.currentExtent.height;\n  if (capabilities.currentTransform & VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR ||\n      capabilities.currentTransform & VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR) {\n    // Swap to get identity width and height\n    capabilities.currentExtent.height = width;\n    capabilities.currentExtent.width = height;\n  }\n\n  displaySizeIdentity = capabilities.currentExtent;\n}\n\nvoid HelloVK::createSwapChain() {\n  SwapChainSupportDetails swapChainSupport =\n      querySwapChainSupport(physicalDevice);\n\n  auto chooseSwapSurfaceFormat =\n      [](const std::vector<VkSurfaceFormatKHR>& availableFormats) {\n        for (const auto& availableFormat : availableFormats) {\n          if (availableFormat.format == VK_FORMAT_B8G8R8A8_SRGB &&\n              availableFormat.colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR) {\n            return availableFormat;\n          }\n        }\n        return availableFormats[0];\n      };\n\n  VkSurfaceFormatKHR surfaceFormat =\n      chooseSwapSurfaceFormat(swapChainSupport.formats);\n\n  // Please check\n  // https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkPresentModeKHR.html\n  // for a discourse on different present modes.\n  //\n  // VK_PRESENT_MODE_FIFO_KHR = Hard Vsync\n  // This is always supported on Android phones\n  VkPresentModeKHR presentMode = VK_PRESENT_MODE_FIFO_KHR;\n\n  uint32_t imageCount = swapChainSupport.capabilities.minImageCount + 1;\n  if (swapChainSupport.capabilities.maxImageCount > 0 &&\n      imageCount > swapChainSupport.capabilities.maxImageCount) {\n    imageCount = swapChainSupport.capabilities.maxImageCount;\n  }\n  pretransformFlag = swapChainSupport.capabilities.currentTransform;\n\n  VkSwapchainCreateInfoKHR createInfo{};\n  createInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;\n  createInfo.surface = surface;\n  createInfo.minImageCount = imageCount;\n  createInfo.imageFormat = surfaceFormat.format;\n  createInfo.imageColorSpace = surfaceFormat.colorSpace;\n  createInfo.imageExtent = displaySizeIdentity;\n  createInfo.imageArrayLayers = 1;\n  createInfo.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;\n  createInfo.preTransform = pretransformFlag;\n\n  QueueFamilyIndices indices = findQueueFamilies(physicalDevice);\n  uint32_t queueFamilyIndices[] = {indices.graphicsFamily.value(),\n                                   indices.presentFamily.value()};\n\n  if (indices.graphicsFamily != indices.presentFamily) {\n    createInfo.imageSharingMode = VK_SHARING_MODE_CONCURRENT;\n    createInfo.queueFamilyIndexCount = 2;\n    createInfo.pQueueFamilyIndices = queueFamilyIndices;\n  } else {\n    createInfo.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;\n    createInfo.queueFamilyIndexCount = 0;\n    createInfo.pQueueFamilyIndices = nullptr;\n  }\n  createInfo.compositeAlpha = VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR;\n  createInfo.presentMode = presentMode;\n  createInfo.clipped = VK_TRUE;\n  createInfo.oldSwapchain = VK_NULL_HANDLE;\n\n  VK_CHECK(vkCreateSwapchainKHR(device, &createInfo, nullptr, &swapChain));\n\n  vkGetSwapchainImagesKHR(device, swapChain, &imageCount, nullptr);\n  swapChainImages.resize(imageCount);\n  vkGetSwapchainImagesKHR(device, swapChain, &imageCount,\n                          swapChainImages.data());\n\n  swapChainImageFormat = surfaceFormat.format;\n  swapChainExtent = displaySizeIdentity;\n}\n\nvoid HelloVK::createImageViews() {\n  swapChainImageViews.resize(swapChainImages.size());\n  for (size_t i = 0; i < swapChainImages.size(); i++) {\n    VkImageViewCreateInfo createInfo{};\n    createInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;\n    createInfo.image = swapChainImages[i];\n    createInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;\n    createInfo.format = swapChainImageFormat;\n    createInfo.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;\n    createInfo.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;\n    createInfo.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;\n    createInfo.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;\n    createInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;\n    createInfo.subresourceRange.baseMipLevel = 0;\n    createInfo.subresourceRange.levelCount = 1;\n    createInfo.subresourceRange.baseArrayLayer = 0;\n    createInfo.subresourceRange.layerCount = 1;\n    VK_CHECK(vkCreateImageView(device, &createInfo, nullptr,\n                               &swapChainImageViews[i]));\n  }\n}\n\nvoid HelloVK::createRenderPass() {\n  VkAttachmentDescription colorAttachment{};\n  colorAttachment.format = swapChainImageFormat;\n  colorAttachment.samples = VK_SAMPLE_COUNT_1_BIT;\n\n  colorAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;\n  colorAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;\n\n  colorAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;\n  colorAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;\n\n  colorAttachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;\n  colorAttachment.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;\n\n  VkAttachmentReference colorAttachmentRef{};\n  colorAttachmentRef.attachment = 0;\n  colorAttachmentRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;\n\n  VkSubpassDescription subpass{};\n  subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;\n  subpass.colorAttachmentCount = 1;\n  subpass.pColorAttachments = &colorAttachmentRef;\n\n  VkSubpassDependency dependency{};\n  dependency.srcSubpass = VK_SUBPASS_EXTERNAL;\n  dependency.dstSubpass = 0;\n  dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;\n  dependency.srcAccessMask = 0;\n  dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;\n  dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;\n\n  VkRenderPassCreateInfo renderPassInfo{};\n  renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;\n  renderPassInfo.attachmentCount = 1;\n  renderPassInfo.pAttachments = &colorAttachment;\n  renderPassInfo.subpassCount = 1;\n  renderPassInfo.pSubpasses = &subpass;\n  renderPassInfo.dependencyCount = 1;\n  renderPassInfo.pDependencies = &dependency;\n\n  VK_CHECK(vkCreateRenderPass(device, &renderPassInfo, nullptr, &renderPass));\n}\n\n/*\n * Creates a graphics pipeline loading a simple vertex and fragment shader, both\n * with 'main' set as entrypoint A list of standard parameters are provided:\n * \t- The vertex input coming from the application is set to empty - we are\n * hardcoding the triangle in the vertex shader.\n * \t- The input assembly is configured to draw triangle lists\n *  - We intend to draw onto the whole screen, so the scissoring extent is\n * specified as being the whole swapchain extent.\n * \t- The rasterizer is set to discard fragmets beyond the near and far\n * planes (depthClampEnable=false) as well as sending geometry to the frame\n * buffer and generate fragments for the whole area of the geometry. We consider\n * geometry in terms of the clockwise order of their respective vertex input.\n *  - Multisampling is disabled\n *  - Depth and stencil testing are disabled\n * \t- ColorBlending is set to opaque mode, meaning any new fragments will\n * overwrite the ones already existing in the framebuffer\n *  - We utilise Vulkan's concept of dynamic state for viewport and scissoring.\n * \t\tThe other option is to hardcode the viewport/scissor options,\n * however this means needing to recreate the whole graphics pipeline object\n * when the screen is rotated.\n *  - The pipeline layout sends 1 uniform buffer object to the shader containing\n * a 4x4 rotation matrix specified by the descriptorSetLayout. This is required\n * in order to render a rotated scene when the device has been rotated.\n */\nvoid HelloVK::createGraphicsPipeline() {\n  auto vertShaderCode =\n      LoadBinaryFileToVector(\"shaders/shader.vert.spv\", assetManager);\n  auto fragShaderCode =\n      LoadBinaryFileToVector(\"shaders/shader.frag.spv\", assetManager);\n\n  VkShaderModule vertShaderModule = createShaderModule(vertShaderCode);\n  VkShaderModule fragShaderModule = createShaderModule(fragShaderCode);\n\n  VkPipelineShaderStageCreateInfo vertShaderStageInfo{};\n  vertShaderStageInfo.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;\n  vertShaderStageInfo.stage = VK_SHADER_STAGE_VERTEX_BIT;\n  vertShaderStageInfo.module = vertShaderModule;\n  vertShaderStageInfo.pName = \"main\";\n\n  VkPipelineShaderStageCreateInfo fragShaderStageInfo{};\n  fragShaderStageInfo.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;\n  fragShaderStageInfo.stage = VK_SHADER_STAGE_FRAGMENT_BIT;\n  fragShaderStageInfo.module = fragShaderModule;\n  fragShaderStageInfo.pName = \"main\";\n\n  VkPipelineShaderStageCreateInfo shaderStages[] = {vertShaderStageInfo,\n                                                    fragShaderStageInfo};\n\n  VkPipelineVertexInputStateCreateInfo vertexInputInfo{};\n  vertexInputInfo.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;\n  vertexInputInfo.vertexBindingDescriptionCount = 0;\n  vertexInputInfo.pVertexBindingDescriptions = nullptr;\n  vertexInputInfo.vertexAttributeDescriptionCount = 0;\n  vertexInputInfo.pVertexAttributeDescriptions = nullptr;\n\n  VkPipelineInputAssemblyStateCreateInfo inputAssembly{};\n  inputAssembly.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;\n  inputAssembly.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;\n  inputAssembly.primitiveRestartEnable = VK_FALSE;\n\n  VkPipelineViewportStateCreateInfo viewportState{};\n  viewportState.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;\n  viewportState.viewportCount = 1;\n  viewportState.scissorCount = 1;\n\n  VkPipelineRasterizationStateCreateInfo rasterizer{};\n  rasterizer.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;\n  rasterizer.depthClampEnable = VK_FALSE;\n  rasterizer.rasterizerDiscardEnable = VK_FALSE;\n  rasterizer.polygonMode = VK_POLYGON_MODE_FILL;\n  rasterizer.lineWidth = 1.0f;\n\n  rasterizer.cullMode = VK_CULL_MODE_BACK_BIT;\n  rasterizer.frontFace = VK_FRONT_FACE_CLOCKWISE;\n\n  rasterizer.depthBiasEnable = VK_FALSE;\n  rasterizer.depthBiasConstantFactor = 0.0f;\n  rasterizer.depthBiasClamp = 0.0f;\n  rasterizer.depthBiasSlopeFactor = 0.0f;\n\n  VkPipelineMultisampleStateCreateInfo multisampling{};\n  multisampling.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;\n  multisampling.sampleShadingEnable = VK_FALSE;\n  multisampling.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;\n  multisampling.minSampleShading = 1.0f;\n  multisampling.pSampleMask = nullptr;\n  multisampling.alphaToCoverageEnable = VK_FALSE;\n  multisampling.alphaToOneEnable = VK_FALSE;\n\n  VkPipelineColorBlendAttachmentState colorBlendAttachment{};\n  colorBlendAttachment.colorWriteMask =\n      VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT |\n      VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;\n  colorBlendAttachment.blendEnable = VK_FALSE;\n\n  VkPipelineColorBlendStateCreateInfo colorBlending{};\n  colorBlending.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;\n  colorBlending.logicOpEnable = VK_FALSE;\n  colorBlending.logicOp = VK_LOGIC_OP_COPY;\n  colorBlending.attachmentCount = 1;\n  colorBlending.pAttachments = &colorBlendAttachment;\n  colorBlending.blendConstants[0] = 0.0f;\n  colorBlending.blendConstants[1] = 0.0f;\n  colorBlending.blendConstants[2] = 0.0f;\n  colorBlending.blendConstants[3] = 0.0f;\n\n  VkPipelineLayoutCreateInfo pipelineLayoutInfo{};\n  pipelineLayoutInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;\n  pipelineLayoutInfo.setLayoutCount = 1;\n  pipelineLayoutInfo.pSetLayouts = &descriptorSetLayout;\n  pipelineLayoutInfo.pushConstantRangeCount = 0;\n  pipelineLayoutInfo.pPushConstantRanges = nullptr;\n\n  VK_CHECK(vkCreatePipelineLayout(device, &pipelineLayoutInfo, nullptr,\n                                  &pipelineLayout));\n  std::vector<VkDynamicState> dynamicStateEnables = {VK_DYNAMIC_STATE_VIEWPORT,\n                                                     VK_DYNAMIC_STATE_SCISSOR};\n  VkPipelineDynamicStateCreateInfo dynamicStateCI{};\n  dynamicStateCI.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;\n  dynamicStateCI.pDynamicStates = dynamicStateEnables.data();\n  dynamicStateCI.dynamicStateCount =\n      static_cast<uint32_t>(dynamicStateEnables.size());\n\n  VkGraphicsPipelineCreateInfo pipelineInfo{};\n  pipelineInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;\n  pipelineInfo.stageCount = 2;\n  pipelineInfo.pStages = shaderStages;\n  pipelineInfo.pVertexInputState = &vertexInputInfo;\n  pipelineInfo.pInputAssemblyState = &inputAssembly;\n  pipelineInfo.pViewportState = &viewportState;\n  pipelineInfo.pRasterizationState = &rasterizer;\n  pipelineInfo.pMultisampleState = &multisampling;\n  pipelineInfo.pDepthStencilState = nullptr;\n  pipelineInfo.pColorBlendState = &colorBlending;\n  pipelineInfo.pDynamicState = &dynamicStateCI;\n  pipelineInfo.layout = pipelineLayout;\n  pipelineInfo.renderPass = renderPass;\n  pipelineInfo.subpass = 0;\n  pipelineInfo.basePipelineHandle = VK_NULL_HANDLE;\n  pipelineInfo.basePipelineIndex = -1;\n\n  VK_CHECK(vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1, &pipelineInfo,\n                                     nullptr, &graphicsPipeline));\n  vkDestroyShaderModule(device, fragShaderModule, nullptr);\n  vkDestroyShaderModule(device, vertShaderModule, nullptr);\n}\n\nVkShaderModule HelloVK::createShaderModule(const std::vector<uint8_t>& code) {\n  VkShaderModuleCreateInfo createInfo{};\n  createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;\n  createInfo.codeSize = code.size();\n\n  // Satisifies alignment requirements since the allocator\n  // in vector ensures worst case requirements\n  createInfo.pCode = reinterpret_cast<const uint32_t*>(code.data());\n  VkShaderModule shaderModule;\n  VK_CHECK(vkCreateShaderModule(device, &createInfo, nullptr, &shaderModule));\n\n  return shaderModule;\n}\n\nvoid HelloVK::createFramebuffers() {\n  swapChainFramebuffers.resize(swapChainImageViews.size());\n  for (size_t i = 0; i < swapChainImageViews.size(); i++) {\n    VkImageView attachments[] = {swapChainImageViews[i]};\n\n    VkFramebufferCreateInfo framebufferInfo{};\n    framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;\n    framebufferInfo.renderPass = renderPass;\n    framebufferInfo.attachmentCount = 1;\n    framebufferInfo.pAttachments = attachments;\n    framebufferInfo.width = swapChainExtent.width;\n    framebufferInfo.height = swapChainExtent.height;\n    framebufferInfo.layers = 1;\n\n    VK_CHECK(vkCreateFramebuffer(device, &framebufferInfo, nullptr,\n                                 &swapChainFramebuffers[i]));\n  }\n}\n\nvoid HelloVK::createCommandPool() {\n  QueueFamilyIndices queueFamilyIndices = findQueueFamilies(physicalDevice);\n  VkCommandPoolCreateInfo poolInfo{};\n  poolInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;\n  poolInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;\n  poolInfo.queueFamilyIndex = queueFamilyIndices.graphicsFamily.value();\n  VK_CHECK(vkCreateCommandPool(device, &poolInfo, nullptr, &commandPool));\n}\n\nvoid HelloVK::createCommandBuffer() {\n  commandBuffers.resize(MAX_FRAMES_IN_FLIGHT);\n  VkCommandBufferAllocateInfo allocInfo{};\n  allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;\n  allocInfo.commandPool = commandPool;\n  allocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;\n  allocInfo.commandBufferCount = commandBuffers.size();\n\n  VK_CHECK(vkAllocateCommandBuffers(device, &allocInfo, commandBuffers.data()));\n}\n\nvoid HelloVK::createSyncObjects() {\n  imageAvailableSemaphores.resize(MAX_FRAMES_IN_FLIGHT);\n  renderFinishedSemaphores.resize(MAX_FRAMES_IN_FLIGHT);\n  inFlightFences.resize(MAX_FRAMES_IN_FLIGHT);\n\n  VkSemaphoreCreateInfo semaphoreInfo{};\n  semaphoreInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;\n\n  VkFenceCreateInfo fenceInfo{};\n  fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;\n  fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;\n  for (size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++) {\n    VK_CHECK(vkCreateSemaphore(device, &semaphoreInfo, nullptr,\n                               &imageAvailableSemaphores[i]));\n\n    VK_CHECK(vkCreateSemaphore(device, &semaphoreInfo, nullptr,\n                               &renderFinishedSemaphores[i]));\n\n    VK_CHECK(vkCreateFence(device, &fenceInfo, nullptr, &inFlightFences[i]));\n  }\n}\n\n}  // namespace vkt"
  },
  {
    "path": "hello-vulkan/app/src/main/cpp/libhellovkjni.map.txt",
    "content": "LIBHELLOVKJNI {\n  global:\n    Java_com_google_androidgamesdk_GameActivity_initializeNativeCode;\n  local:\n    *;\n};\n"
  },
  {
    "path": "hello-vulkan/app/src/main/cpp/vk_main.cpp",
    "content": "/*\n * Copyright (C) 2022 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include <android/asset_manager_jni.h>\n#include <android/native_window_jni.h>\n#include <game-activity/native_app_glue/android_native_app_glue.h>\n#include <math.h>\n#include <stdio.h>\n#include <stdlib.h>\n\n#include <iostream>\n\n#include \"hellovk.h\"\n\n/*\n * Shared state for the app. This will be accessed within lifecycle callbacks\n * such as APP_CMD_START or APP_CMD_INIT_WINDOW.\n *\n * We store:\n * struct android_app - a pointer to the Android application handle\n *\n * vkt::HelloVK - a pointer to our (this) Vulkan application in order to call\n *  the rendering logic\n *\n * bool canRender - a flag which signals that we are ready to call the vulkan\n * rendering logic\n *\n */\nstruct VulkanEngine {\n  struct android_app* app;\n  vkt::HelloVK* app_backend;\n  bool canRender = false;\n};\n\n/**\n * Called by the Android runtime whenever events happen so the\n * app can react to it.\n */\nstatic void HandleCmd(struct android_app* app, int32_t cmd) {\n  auto* engine = (VulkanEngine*)app->userData;\n  switch (cmd) {\n    case APP_CMD_START:\n      if (engine->app->window != nullptr) {\n        engine->app_backend->reset(app->window, app->activity->assetManager);\n        engine->app_backend->initVulkan();\n        engine->canRender = true;\n      }\n    case APP_CMD_INIT_WINDOW:\n      // The window is being shown, get it ready.\n      LOGI(\"Called - APP_CMD_INIT_WINDOW\");\n      if (engine->app->window != nullptr) {\n        LOGI(\"Setting a new surface\");\n        engine->app_backend->reset(app->window, app->activity->assetManager);\n        if (!engine->app_backend->initialized) {\n          LOGI(\"Starting application\");\n          engine->app_backend->initVulkan();\n        }\n        engine->canRender = true;\n      }\n      break;\n    case APP_CMD_TERM_WINDOW:\n      // The window is being hidden or closed, clean it up.\n      engine->canRender = false;\n      break;\n    case APP_CMD_DESTROY:\n      // The window is being hidden or closed, clean it up.\n      LOGI(\"Destroying\");\n      engine->app_backend->cleanup();\n    default:\n      break;\n  }\n}\n\n/*\n * Key events filter to GameActivity's android_native_app_glue. This sample does\n * not use/process any input events, return false for all input events so system\n * can still process them.\n */\nextern \"C\" bool VulkanKeyEventFilter(const GameActivityKeyEvent*) {\n  return false;\n}\nextern \"C\" bool VulkanMotionEventFilter(const GameActivityMotionEvent*) {\n  return false;\n}\n\n/*\n * Process user touch and key events. GameActivity double buffers those events,\n * applications can process at any time. All of the buffered events have been\n * reported \"handled\" to OS. For details, refer to:\n * d.android.com/games/agdk/game-activity/get-started#handle-events\n */\nstatic void HandleInputEvents(struct android_app* app) {\n  auto inputBuf = android_app_swap_input_buffers(app);\n  if (inputBuf == nullptr) {\n    return;\n  }\n\n  // For the minimum, apps need to process the exit event (for example,\n  // listening to AKEYCODE_BACK). This sample has done that in the Kotlin side\n  // and not processing other input events, we just reset the event counter\n  // inside the android_input_buffer to keep app glue code in a working state.\n  android_app_clear_motion_events(inputBuf);\n  android_app_clear_motion_events(inputBuf);\n}\n\n/*\n * Entry point required by the Android Glue library.\n * This can also be achieved more verbosely by manually declaring JNI functions\n * and calling them from the Android application layer.\n */\nvoid android_main(struct android_app* state) {\n  VulkanEngine engine{};\n  vkt::HelloVK vulkanBackend{};\n\n  engine.app = state;\n  engine.app_backend = &vulkanBackend;\n  state->userData = &engine;\n  state->onAppCmd = HandleCmd;\n\n  android_app_set_key_event_filter(state, VulkanKeyEventFilter);\n  android_app_set_motion_event_filter(state, VulkanMotionEventFilter);\n\n  while (!state->destroyRequested) {\n    android_poll_source* source;\n    auto result = ALooper_pollOnce(engine.canRender ? 0 : -1, nullptr, nullptr,\n                                   (void**)&source);\n    if (result == ALOOPER_POLL_ERROR) {\n      LOGE(\"ALooper_pollOnce returned an error\");\n      std::abort();\n    }\n\n    if (source != nullptr) {\n      source->process(state, source);\n    }\n\n    HandleInputEvents(state);\n\n    if (engine.canRender) {\n      engine.app_backend->render();\n    }\n  }\n}"
  },
  {
    "path": "hello-vulkan/app/src/main/java/com/android/hellovk/VulkanActivity.kt",
    "content": "/*\n * Copyright (C) 2022 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.android.hellovk\n\nimport android.annotation.SuppressLint\nimport android.os.Build.VERSION\nimport android.os.Build.VERSION_CODES\nimport android.os.Bundle\nimport android.view.KeyEvent\nimport android.view.View\nimport android.view.WindowManager.LayoutParams\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.WindowInsetsControllerCompat\nimport com.google.androidgamesdk.GameActivity\n\n\nclass VulkanActivity : GameActivity() {\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        hideSystemUI()\n    }\n\n    private fun hideSystemUI() {\n        // This will put the game behind any cutouts and waterfalls on devices which have\n        // them, so the corresponding insets will be non-zero.\n\n        // We cannot guarantee that AndroidManifest won't be tweaked\n        // and we don't want to crash if that happens so we suppress warning.\n        @SuppressLint(\"ObsoleteSdkInt\")\n        if (VERSION.SDK_INT >= VERSION_CODES.P) {\n            window.attributes.layoutInDisplayCutoutMode =\n                LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS\n        }\n        val decorView: View = window.decorView\n        val controller = WindowInsetsControllerCompat(\n            window,\n            decorView\n        )\n        controller.hide(WindowInsetsCompat.Type.systemBars())\n        controller.hide(WindowInsetsCompat.Type.displayCutout())\n        controller.systemBarsBehavior =\n            WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE\n    }\n\n    // Filter out back button press, and handle it here after native\n    // side done its processing. Application can also make a reverse JNI\n    // call to onBackPressed()/finish() at the end of the KEYCODE_BACK\n    // processing.\n    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {\n        var processed = super.onKeyDown(keyCode, event);\n        if (keyCode == KeyEvent.KEYCODE_BACK) {\n            onBackPressed()\n            processed = true\n        }\n        return processed\n    }\n\n    // TODO: Migrate to androidx.activity.OnBackPressedCallback.\n    // onBackPressed is deprecated.\n    override fun onBackPressed() {\n        System.gc()\n        System.exit(0)\n    }\n\n    companion object {\n        init {\n            System.loadLibrary(\"hellovkjni\")\n        }\n    }\n}"
  },
  {
    "path": "hello-vulkan/app/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n/*\n**\n** Copyright 2006, The Android Open Source Project\n**\n** Licensed under the Apache License, Version 2.0 (the \"License\"); \n** you may not use this file except in compliance with the License. \n** You may obtain a copy of the License at \n**\n**     http://www.apache.org/licenses/LICENSE-2.0 \n**\n** Unless required by applicable law or agreed to in writing, software \n** distributed under the License is distributed on an \"AS IS\" BASIS, \n** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. \n** See the License for the specific language governing permissions and \n** limitations under the License.\n*/\n-->\n\n<!-- This file contains resource definitions for displayed strings, allowing\n     them to be changed based on the locale and options. -->\n\n<resources>\n    <!-- Simple strings. -->\n    <string name=\"hellovk_activity\">HelloVk</string>\n\n</resources>\n\n"
  },
  {
    "path": "hello-vulkan/app/src/main/res/values/themes.xml",
    "content": "<resources xmlns:tools=\"http://schemas.android.com/tools\">\n    <!-- Base application theme. -->\n    <style name=\"Application.Fullscreen\" parent=\"Theme.AppCompat.Light.NoActionBar\">\n        <item name=\"android:windowFullscreen\">true</item>\n        <item name=\"android:windowContentOverlay\">@null</item>\"\n    </style>\n</resources>"
  },
  {
    "path": "hello-vulkan/app/src/main/shaders/shader.frag",
    "content": "#version 450\n\n// Input colour coming from the vertex shader\nlayout(location = 0) in vec3 fragColor;\n\n// Output colour for the fragment\nlayout(location = 0) out vec4 outColor;\n\nvoid main() {\n    outColor = vec4(fragColor, 1.0);\n}"
  },
  {
    "path": "hello-vulkan/app/src/main/shaders/shader.vert",
    "content": "#version 450\n\n// Colour passed to the fragment shader\nlayout(location = 0) out vec3 fragColor;\n\n// Uniform buffer containing an MVP matrix.\n// Currently the vulkan backend only sets the rotation matix\n// required to handle device rotation.\nlayout(binding = 0) uniform UniformBufferObject {\n    mat4 MVP;\n} ubo;\n\nvec2 positions[3] = vec2[](\n    vec2(0.0, -0.5),\n    vec2(0.5, 0.5),\n    vec2(-0.5, 0.5)\n);\n\nvec3 colors[3] = vec3[](\n    vec3(0.67, 0.1, 0.2),\n    vec3(0.67, 0.1, 0.2),\n    vec3(0.67, 0.1, 0.2)\n);\n\nvoid main() {\n    gl_Position = ubo.MVP * vec4(positions[gl_VertexIndex], 0.0, 1.0);\n    fragColor = colors[gl_VertexIndex];\n}"
  },
  {
    "path": "native-activity/README.md",
    "content": "# Native Activity\n\n> [!WARNING]\n> **Most apps should not use the app development model shown in this sample**.\n> Instead, use a Java or Kotlin `AppCompatActivity` and connect your native code\n> using JNI like the other samples in this repository. `NativeActivity` and\n> `GameActivity` attempt to translate the Android [activity lifecycle] into a\n> desktop style `main()` function with a polled event loop. That is not how\n> Android apps work, and while it may help you get your prototype running more\n> quickly, as your app matures you will likely end up retranslating the\n> `native_app_glue` model to again look like `Activity`.\n\nThis is an Android sample that uses [NativeActivity] with `native_app_glue`,\nwhich enables building NDK apps without having to write any Java code. In\npractice most apps, even games which are predominantly native code, will need to\ncall some Java APIs or customize their app's activity further. While it may save\nyou a small amount of effort during prototyping, it may result in a difficult\nmigration later. It's also worth noting that some of the code in this sample is\nspent undoing the work of `native_app_glue` to create a class very similar to\n`Activity`.\n\nThe more modern approach to this is to use [GameActivity], which has all the\nsame benefits as `NativeActivity` and `native_app_glue`, while also making it\neasier to include Java code in your app without a rewrite later. It's also\nsource compatible. However, it still has all the problems explained in the\nwarning above, and in practice neither `NativeActivity` nor `GameActivity` is\nthe recommended app development model.\n\nThe app here is intentionally quite simple, aiming to show the core event and\ndraw loop necessary for an app using `native_app_glue` without any extra\nclutter. It uses `AChoreographer` to manage the update/render loop, and uses\n`ANativeWindow` and `AHardwareBuffer` to update the screen with a simple color\nclear.\n\n[activity lifecycle]: https://developer.android.com/guide/components/activities/activity-lifecycle\n[GameActivity]: https://developer.android.com/games/agdk/game-activity\n[NativeActivity]: http://developer.android.com/reference/android/app/NativeActivity.html\n\n## Walkthrough\n\nThe interesting sections of code in this sample are in three files:\n[AndroidManifest.xml], [CMakeLists.txt], and [main.cpp]. Each of those files has\ncode comments explaining the portions relevant to using `NativeActivity`, but\nthe high level details of the app are explained here.\n\nThis app uses `NativeActivity` rather than its own child class of `Activity` or\n`AppCompatActivity`. This is specified in the `<activity />` declaration in [the\nmanifest].\n\nApps which use `NativeActivity` are typically written using `native_app_glue`,\nwhich adapts the Android activity lifecycle code to look more like a desktop\nprogram with a `main()` function and an event loop. This is set up in the app's\n[CMakeLists.txt file].\n\nWhen using `native_app_glue` with a [version script], you must export\n`ANativeActivity_onCreate`. This sample does this in\n[libnative-activity.map.txt].\n\nThis is a fairly simple application, so all of the code is in a single file,\n[main.cpp]. The entry point for an app using `native_app_glue` is\n`android_main()`. That function is the best place to start reading in this file\nto learn how the sample works, then follow through to the definition of\n`engine_handle_cmd` and `Engine`.\n\n[CMakeLists.txt file]: app/src/main/cpp/CMakeLists.txt\n[libnative-activity.map.txt]: app/src/main/cpp/libnative-activity.map.txt\n[main.cpp]: app/src/main/cpp/main.cpp\n[the manifest]: app/src/main/AndroidManifest.xml\n[version script]: https://developer.android.com/ndk/guides/symbol-visibility\n"
  },
  {
    "path": "native-activity/app/build.gradle",
    "content": "plugins {\n    id \"ndksamples.android.application\"\n}\n\n// Caution: If you add any Java or Kotlin code to this project, or if you add\n// any dependencies which themselves use Java/Kotlin, you'll need to remove\n// `android:hasCode` from main/AndroidManifest.xml.\n\nandroid {\n    namespace 'com.example.native_activity'\n\n    defaultConfig {\n        applicationId = 'com.example.native_activity'\n        // This is the minimum required for using Choreographer directly from the NDK. If you need\n        // to use a lower minSdkVersion, you must use the Java Choreographer API via JNI.\n        minSdkVersion 24\n        externalNativeBuild {\n            cmake {\n                arguments '-DANDROID_STL=c++_static'\n            }\n        }\n    }\n\n    externalNativeBuild {\n        cmake {\n            path 'src/main/cpp/CMakeLists.txt'\n        }\n    }\n}\n"
  },
  {
    "path": "native-activity/app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:versionCode=\"1\"\n    android:versionName=\"1.0\">\n\n    <!--\n    This .apk has no Java/Kotlin code, so set hasCode to false.\n\n    If you copy from this sample and later add Java/Kotlin code, or add a\n    dependency on a library that does (such as androidx), be sure to set\n    `android:hasCode` to `true` (or just remove it, since that's the default).\n    -->\n    <application\n        android:allowBackup=\"false\"\n        android:fullBackupContent=\"false\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:hasCode=\"false\">\n\n        <!--\n        This app uses android.app.NativeActivity rather than its own child class of\n        Activity or AppCompatActivity. The advantage of this is that we do not have\n        to write any Java code of our own. The Java portion of the app is provided\n        by the OS.\n        -->\n        <activity\n            android:name=\"android.app.NativeActivity\"\n            android:configChanges=\"orientation|keyboardHidden\"\n            android:exported=\"true\">\n            <!--\n            This property tells NativeActivity which of our app's libraries\n            provide the definition of ANativeActivity_onCreate, which is the\n            entry point for apps using ANativeActivity.\n            -->\n            <meta-data\n                android:name=\"android.app.lib_name\"\n                android:value=\"native-activity\" />\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n    </application>\n</manifest>\n"
  },
  {
    "path": "native-activity/app/src/main/cpp/CMakeLists.txt",
    "content": "# Copyright (C) 2010 The Android Open Source Project\n# SPDX-License-Identifier: Apache-2.0\ncmake_minimum_required(VERSION 4.1.0)\nproject(NativeActivity LANGUAGES C CXX)\n\ninclude(AppLibrary)\n\n# This includes the AndroidNdkModules.cmake file, which is shipped with the\n# NDK's CMake distribution. Including this file defines\n# android_ndk_import_module_native_app_glue(), which defines the\n# native_app_glue target when called.\ninclude(AndroidNdkModules)\nandroid_ndk_import_module_native_app_glue()\n\nadd_app_library(native-activity SHARED main.cpp)\n\n# Linking the native_app_glue target with our native-activity target (the\n# library which contains the main app code) includes native_app_glue in the app.\ntarget_link_libraries(native-activity\n    android\n    # We have to use $<LINK_LIBRARY:WHOLE_ARCHIVE,native_app_glue> rather than\n    # the simpler native_app_glue spelling to instruct the linker that the\n    # entire native_app_glue static library should be included in\n    # libnative-activity.so, even if the linker does not find any calls in our\n    # code to native_app_glue. This is because native_app_glue is a static\n    # library rather than a shared library, and normally the linker will only\n    # include code from static libraries when it has found a call to that code.\n    # This is usually a good thing because it reduces the size of the app, but\n    # in this case the calls to native_app_glue, specifically the\n    # ANativeActivity_onCreate function, don't come from us, but instead come\n    # from ANativeActivity, which the linker cannot detect.\n    $<LINK_LIBRARY:WHOLE_ARCHIVE,native_app_glue>\n    log\n)\n\nif(ANDROID_ABI STREQUAL riscv64)\n    # This sample uses Sensor Manager and Choreographer APIs which are\n    # deprecated in modern API levels. Our minSdkVersion is 21, but we also\n    # build for riscv64, which isn't a supported ABI yet and so that\n    # configuration is built for the latest API level supported by the NDK.\n    #\n    # This sample should be tweaked to use the replacement APIs when they're\n    # available at runtime and only use the older APIs on older devices. For\n    # now, just disable the deprecation warnings so we can get the riscv64\n    # samples building in CI, and we can come back to clean that up later.\n    target_compile_options(native-activity PRIVATE -Wno-deprecated-declarations)\nendif()\n"
  },
  {
    "path": "native-activity/app/src/main/cpp/libnative-activity.map.txt",
    "content": "LIBNATIVEACTIVITY {\n  global:\n    # When using NativeActivity and you don't need any of your own JNI\n    # functions this is the only symbol that should be exported. If your app\n    # needs additional JNI functions (and most apps will), then you'll need to\n    # include JNI_OnLoad (or your individual Java_... functions if you're not\n    # using RegisterNatives) here.\n    ANativeActivity_onCreate;\n  local:\n    *;\n};\n"
  },
  {
    "path": "native-activity/app/src/main/cpp/main.cpp",
    "content": "// Copyright (C) 2010 The Android Open Source Project\n// SPDX-License-Identifier: Apache-2.0\n\n#include <android/choreographer.h>\n#include <android/hardware_buffer.h>\n#include <android/log.h>\n#include <android/native_window.h>\n#include <android/set_abort_message.h>\n#include <android_native_app_glue.h>\n\n#include <chrono>\n#include <cstdlib>\n#include <memory>\n\nusing namespace std::literals::chrono_literals;\n\n#define LOG_TAG \"native-activity\"\n\n#define _LOG(priority, fmt, ...)                    \\\n  ((void)__android_log_print((priority), (LOG_TAG), \\\n                             (fmt)__VA_OPT__(, ) __VA_ARGS__))\n\n#define LOGE(fmt, ...) _LOG(ANDROID_LOG_ERROR, (fmt)__VA_OPT__(, ) __VA_ARGS__)\n#define LOGW(fmt, ...) _LOG(ANDROID_LOG_WARN, (fmt)__VA_OPT__(, ) __VA_ARGS__)\n#define LOGI(fmt, ...) _LOG(ANDROID_LOG_INFO, (fmt)__VA_OPT__(, ) __VA_ARGS__)\n\n[[noreturn]] __attribute__((__format__(__printf__, 1, 2))) static void fatal(\n    const char* fmt, ...) {\n  va_list ap;\n  va_start(ap, fmt);\n  char* buf;\n  if (vasprintf(&buf, fmt, ap) < 0) {\n    android_set_abort_message(\"failed for format error message\");\n  } else {\n    android_set_abort_message(buf);\n    // Also log directly, since the default Android Studio logcat filter hides\n    // the backtrace which would otherwise show the abort message.\n    LOGE(\"%s\", buf);\n  }\n  std::abort();\n}\n\n#define CHECK_NOT_NULL(value)                                           \\\n  do {                                                                  \\\n    if ((value) == nullptr) {                                           \\\n      fatal(\"%s:%d:%s must not be null\", __PRETTY_FUNCTION__, __LINE__, \\\n            #value);                                                    \\\n    }                                                                   \\\n  } while (false)\n\n// Note: little endian, the opposite of normal hex color codes. ABGR, rather\n// than RGBA.\nenum class Color : uint32_t {\n  kRed = 0x000000ff,\n  kGreen = 0x0000ff00,\n  kBlue = 0x00ff0000,\n};\n\n/**\n * The implementation for our app.\n *\n * This class implements the activity lifecycle behaviors akin to how Activity\n * would in a Java app. With native_app_glue, those lifecycle events are instead\n * communicated to this class from engine_handle_cmd, which is in turned called\n * by looper (see the description below in android_main).\n *\n * The comments here will briefly explain some aspects of the Android activity\n * lifecycle, but they cannot explain it fully. See\n * https://developer.android.com/guide/components/activities/activity-lifecycle\n * and the other docs in that section for more information.\n */\nclass Engine {\n public:\n  explicit Engine(android_app* app) : app_(app) {}\n\n  void AttachWindow() {\n    // This is called whenever a new native window is created for our app, so we\n    // need to reinitialize the buffer format to the format our render loop\n    // expects.\n    //\n    // Attaching the window will not cause the app to start running its update\n    // and render loop. The app's update cycle is separately enabled by\n    // Engine::Resume.\n    if (ANativeWindow_setBuffersGeometry(\n            app_->window, 0, 0, AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM) < 0) {\n      LOGE(\"Unable to set window buffer geometry\");\n      window_initialized = false;\n      return;\n    }\n    window_initialized = true;\n    color_ = Color::kRed;\n    last_update_ = std::chrono::steady_clock::now();\n  }\n\n  void DetachWindow() {\n    // This is called whenever the native window for our app is destroyed. That\n    // does not necessarily mean that the app is being killed, as it is also\n    // done when the screen rotates.\n    //\n    // For a more typical app where the rendering is done with OpenGL or Vulkan,\n    // this is where you'd perform any window cleanup needed by those\n    // frameworks. For our app, it's sufficient to just set a flag to disable\n    // our render loop.\n    window_initialized = false;\n  }\n\n  /// Resumes ticking the application.\n  void Resume() {\n    // This is called whenever the activity is resumed (brought into the\n    // foreground). When that happens, we schedule our next update tick with\n    // Choreographer. Choreographer is the Android system that paces app render\n    // loops. If you instead render new frames in a loop without frame pacing,\n    // you risk rendering more quickly than the display pipeline is able to\n    // present new frames. This will increase the latency between frame\n    // submission and presentation.\n    // https://developer.android.com/ndk/reference/group/choreographer\n\n    // Checked to make sure we don't double schedule Choreographer.\n    if (!running_) {\n      running_ = true;\n      ScheduleNextTick();\n    }\n  }\n\n  /// Pauses ticking the application.\n  ///\n  /// When paused, sensor and input events will still be processed, but the\n  /// update and render parts of the loop will not run.\n  void Pause() {\n    // This is called whenever something interrupts the activity and moves it\n    // into the background. In multiwindow mode the app might still be visible,\n    // but it is no longer the focused app and should pause accordingly,\n    running_ = false;\n  }\n\n private:\n  android_app* app_;\n  bool window_initialized = false;\n  bool running_ = false;\n  Color color_ = Color::kRed;\n  std::chrono::time_point<std::chrono::steady_clock> last_update_;\n\n  void ScheduleNextTick() {\n    AChoreographer_postFrameCallback(AChoreographer_getInstance(), Tick, this);\n  }\n\n  /// Entry point for Choreographer.\n  ///\n  /// The first argument (the frame time) is not used as it is not needed for\n  /// this sample. If you copy from this sample and make use of that argument,\n  /// note that there's an API bug: that time is a signed 32-bit nanosecond\n  /// counter on 32-bit systems, so it will roll over every ~2 seconds. If your\n  /// minSdkVersion is 29 or higher, use AChoreographer_postFrameCallback64\n  /// instead, which is 64-bits for all architectures. Otherwise, bitwise-and\n  /// the value with the upper bits from CLOCK_MONOTONIC.\n  ///\n  /// \\param data The Engine being ticked.\n  static void Tick(long, void* data) {\n    CHECK_NOT_NULL(data);\n    auto engine = reinterpret_cast<Engine*>(data);\n    engine->DoTick();\n  }\n\n  void DoTick() {\n    if (!running_) {\n      return;\n    }\n\n    // Choreographer does not continuously schedule the callback. We have to re-\n    // register the callback each time we're ticked.\n    ScheduleNextTick();\n    Update();\n    DrawFrame();\n  }\n\n  void Update() {\n    auto now = std::chrono::steady_clock::now();\n    if (now - last_update_ > 1s) {\n      switch (color_) {\n        case Color::kRed:\n          color_ = Color::kGreen;\n          break;\n        case Color::kGreen:\n          color_ = Color::kBlue;\n          break;\n        case Color::kBlue:\n          color_ = Color::kRed;\n          break;\n        default:\n          fatal(\"unexpected color %08x\", static_cast<uint32_t>(color_));\n      }\n      last_update_ = now;\n    }\n  }\n\n  void DrawFrame() const {\n    if (app_->window == nullptr) {\n      LOGE(\"Attempted to draw frame but there is no window attached\");\n      return;\n    }\n\n    // Lock the native window's buffer so we can write to it.\n    ANativeWindow_Buffer buffer;\n    if (ANativeWindow_lock(app_->window, &buffer, nullptr) < 0) {\n      LOGE(\"Unable to lock window buffer\");\n      return;\n    }\n\n    if (!window_initialized) {\n      // If for some reason we were not able to initialize the window geometry,\n      // then we can't assume the buffer format. We could detect the buffer's\n      // format and adjust our buffer fill here to accommodate that, but's a bit\n      // beyond the scope of this sample.\n      return;\n    }\n\n    // Write a solid color to the window buffer.\n    for (auto y = 0; y < buffer.height; y++) {\n      for (auto x = 0; x < buffer.width; x++) {\n        // Note that we index the row by the buffers stride, not its width. The\n        // buffer itself may be wider than the render area.\n        size_t pixel_idx = y * buffer.stride + x;\n        reinterpret_cast<uint32_t*>(buffer.bits)[pixel_idx] =\n            static_cast<uint32_t>(color_);\n      }\n    }\n\n    // Now unlock the buffer, causing the display to update.\n    ANativeWindow_unlockAndPost(app_->window);\n  }\n};\n\n/**\n * The callback for native_app_glue's Activity lifecycle event queue.\n */\nstatic void engine_handle_cmd(android_app* app, int32_t cmd) {\n  auto* engine = (Engine*)app->userData;\n  // There are a lot of lifecycle events that we're ignoring here. See\n  // android_native_app_glue.h for the complete list that native_app_glue\n  // handles (which may not be complete if Activity adds new lifecycle\n  // methods!)\n  //\n  // Most applications will need to handle many more of than just this set.\n  // We're getting away with ignoring most events because this app doesn't do\n  // anything interesting.\n  switch (cmd) {\n    case APP_CMD_INIT_WINDOW:\n      // https://developer.android.com/ndk/reference/struct/a-native-activity-callbacks#onnativewindowcreated\n      engine->AttachWindow();\n      break;\n    case APP_CMD_TERM_WINDOW:\n      // https://developer.android.com/ndk/reference/struct/a-native-activity-callbacks#onnativewindowdestroyed\n      engine->DetachWindow();\n      break;\n    case APP_CMD_GAINED_FOCUS:\n      // https://developer.android.com/ndk/reference/struct/a-native-activity-callbacks#onwindowfocuschanged\n      engine->Resume();\n      break;\n    case APP_CMD_LOST_FOCUS:\n      // https://developer.android.com/ndk/reference/struct/a-native-activity-callbacks#onwindowfocuschanged\n      engine->Pause();\n      break;\n    default:\n      break;\n  }\n}\n\n/**\n * `android_main()` is the entry point for an app using `native_app_glue`.\n *\n * This function is called from a separate thread spawned from\n * `ANativeActivity_onCreate`, which is the native equivalent of the\n * `onCreate` stage in the activity lifecycle:\n * https://developer.android.com/guide/components/activities/activity-lifecycle\n *\n * The `android_main()` implementation typically will perform application setup,\n * enter the main event loop, and shut down if necessary.\n */\nvoid android_main(android_app* state) {\n  Engine engine{state};\n\n  // onAppCmd is called whenever native_app_glue receives one of the activity\n  // lifecycle events from the framework:\n  // https://developer.android.com/guide/components/activities/activity-lifecycle\n  //\n  // Typical native Android applications would implement the various\n  // onPause(), onResume(), etc in JNI methods. native_app_glue handles that\n  // for us and instead presents those method calls as if they were a pollable\n  // event queue. Our engine_handle_cmd callback is the function that will\n  // respond to new events in that queue.\n  state->onAppCmd = engine_handle_cmd;\n\n  // The userData property will be passed to the callback we registered with\n  // onAppCmd.\n  state->userData = &engine;\n\n  // destroyRequested will be set when onDestroy() is called:\n  // https://developer.android.com/guide/components/activities/activity-lifecycle#ondestroy\n  while (!state->destroyRequested) {\n    // native_app_glue communicates events to the app using Looper rather than\n    // method calls like a Java activity would use. Looper is an Android API\n    // similar to POSIX's select(2):\n    // https://developer.android.com/ndk/reference/group/looper#alooper\n    //\n    // Whenever an activity lifecycle method is called on our ANativeActivity,\n    // or an input event is received, native_app_glue will forward that to our\n    // app as a looper event.\n    //\n    // Polling looper can be done in either a blocking or non-blocking manner.\n    // If your app needs to wake periodically on this thread, pass a value for\n    // the poll timeout. Most of the things you'd normally do during this loop\n    // (respond to input or sensor updates, or even render the next frame of\n    // your game) should be driven by callbacks registered with those\n    // subsystems though rather than done here. Our main loop doesn't need to\n    // do anything other than process looper events.\n    android_poll_source* source = nullptr;\n    auto result = ALooper_pollOnce(-1, nullptr, nullptr,\n                                   reinterpret_cast<void**>(&source));\n    if (result == ALOOPER_POLL_ERROR) {\n      fatal(\"ALooper_pollOnce returned an error\");\n    }\n\n    if (source != nullptr) {\n      source->process(state, source);\n    }\n  }\n\n  // Most cleanup code should actually run in response to activity lifecycle\n  // events that are processed in engine_handle_cmd rather than after the main\n  // loop exits, as would be more typical of main loops on desktop platforms.\n}\n"
  },
  {
    "path": "native-activity/app/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"app_name\">NativeActivity</string>\n</resources>\n"
  },
  {
    "path": "native-audio/README.md",
    "content": "# Native Audio\n\nNative Audio is an Android sample that plays and records sounds with the C++\nOpenSLES API using JNI. The recorder / players created are not in fast audio\npath.\n\nThis sample uses the new\n[Android Studio CMake plugin](http://tools.android.com/tech-docs/external-c-builds)\nwith C++ support.\n\n***Note that OpenSL ES is\n[deprecated from Android 11](https://developer.android.com/preview/features#deprecate-opensl),\ndevelopers are recommended to use [Oboe](https://github.com/google/oboe) library\ninstead.***\n\n## Screenshots\n\n![screenshot](screenshot.png)\n\n## Known Issues\n\n- URI Player streaming is\n  [broken](https://github.com/googlesamples/android-ndk/issues/229)\n"
  },
  {
    "path": "native-audio/app/build.gradle",
    "content": "plugins {\n    id \"ndksamples.android.application\"\n}\n\nandroid {\n    namespace 'com.example.nativeaudio'\n\n    defaultConfig {\n        applicationId 'com.example.nativeaudio'\n        minSdkVersion 23\n    }\n\n    externalNativeBuild {\n        cmake {\n            // todo: need to disable REVERT for fast audio recording\n            path 'src/main/cpp/CMakeLists.txt'\n        }\n    }\n\n    buildFeatures {\n        buildConfig = true\n        prefab = true\n    }\n}\n\ndependencies {\n    implementation project(\":base\")\n    implementation libs.appcompat\n}\n"
  },
  {
    "path": "native-audio/app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:versionCode=\"1\"\n          android:versionName=\"1.0\">\n\n  <!-- RECORD_AUDIO is needed to create an audio recorder -->\n  <uses-permission android:name=\"android.permission.RECORD_AUDIO\"></uses-permission>\n  <!-- MODIFY_AUDIO_SETTINGS is needed to use audio effects such as environmental reverb -->\n  <uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"></uses-permission>\n  <!-- INTERNET is needed to use a URI-based audio player, depending on the URI -->\n  <uses-permission android:name=\"android.permission.INTERNET\"></uses-permission>\n\n  <application\n      android:allowBackup=\"false\"\n      android:fullBackupContent=\"false\"\n      android:icon=\"@mipmap/ic_launcher\"\n      android:label=\"@string/app_name\">\n    <activity android:name=\".NativeAudio\"\n              android:label=\"@string/app_name\"\n        android:exported=\"true\">\n      <intent-filter>\n        <action android:name=\"android.intent.action.MAIN\" />\n        <category android:name=\"android.intent.category.LAUNCHER\" />\n      </intent-filter>\n    </activity>\n  </application>\n</manifest>\n"
  },
  {
    "path": "native-audio/app/src/main/assets/README.txt",
    "content": "File background.mp3 (\"Background for talking but don't\") is\ncopyright 2008 by Glenn Kasten and is licensed under a\nCreative Commons Attribution 3.0 Unported License:\n  http://creativecommons.org/licenses/by/3.0/\n"
  },
  {
    "path": "native-audio/app/src/main/cpp/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.22.1)\nproject(NativeAudio LANGUAGES CXX)\n\ninclude(AppLibrary)\nfind_package(base CONFIG REQUIRED)\n\nadd_app_library(native-audio-jni SHARED\n    native-audio-jni.cpp\n)\n\n# Include libraries needed for native-audio-jni lib\ntarget_link_libraries(native-audio-jni\n    PRIVATE\n    base::base\n    android\n    log\n    OpenSLES\n)\n\nif(ANDROID_ABI STREQUAL riscv64)\n    # This sample uses OpenSLES, which was deprecated in API 26. Our\n    # minSdkVersion is 23, but we also build for riscv64, which isn't a\n    # supported ABI yet and so that configuration is built for the latest API\n    # level supported by the NDK.\n    #\n    # Longer term, this sample should migrate to Oboe.\n    target_compile_options(native-audio-jni PRIVATE -Wno-deprecated-declarations)\nendif()\n"
  },
  {
    "path": "native-audio/app/src/main/cpp/android_clip.h",
    "content": "\"\\xfe\\xff\\xfc\\xff\\xfb\\xff\\xfc\\xff\\xfb\\xff\\xff\\xff\\xff\\xff\\xfe\\xff\"\n    \"\\x00\\x00\\xfe\\xff\\xfe\\xff\\x01\\x00\\x02\\x00\\x02\\x00\\x05\\x00\\x04\\x00\"\n    \"\\x02\\x00\\x04\\x00\\x05\\x00\\xff\\xff\\x01\\x00\\xff\\xff\\xfc\\xff\\xfe\\xff\"\n    \"\\xff\\xff\\x02\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x01\\x00\"\n    \"\\xff\\xff\\xfc\\xff\\xf9\\xff\\xfa\\xff\\xf8\\xff\\xfc\\xff\\xfe\\xff\\xfe\\xff\"\n    \"\\xfd\\xff\\xfc\\xff\\x01\\x00\\xff\\xff\\xff\\xff\\x02\\x00\\x04\\x00\\x04\\x00\"\n    \"\\x07\\x00\\x06\\x00\\x04\\x00\\x05\\x00\\x04\\x00\\x05\\x00\\x03\\x00\\x03\\x00\"\n    \"\\x02\\x00\\x04\\x00\\x04\\x00\\x03\\x00\\x05\\x00\\x04\\x00\\x04\\x00\\x05\\x00\"\n    \"\\x03\\x00\\x01\\x00\\x02\\x00\\x03\\x00\\x04\\x00\\x00\\x00\\xfc\\xff\\xfe\\xff\"\n    \"\\xfe\\xff\\xfc\\xff\\xfb\\xff\\xfc\\xff\\xf8\\xff\\xf8\\xff\\xfa\\xff\\xf8\\xff\"\n    \"\\xf8\\xff\\xf7\\xff\\xf7\\xff\\xf5\\xff\\xf8\\xff\\xfb\\xff\\xfc\\xff\\x00\\x00\"\n    \"\\xfd\\xff\\x00\\x00\\x05\\x00\\x03\\x00\\x02\\x00\\x05\\x00\\x08\\x00\\x04\\x00\"\n    \"\\x03\\x00\\x04\\x00\\x03\\x00\\x02\\x00\\x00\\x00\\xff\\xff\\x02\\x00\\x03\\x00\"\n    \"\\x03\\x00\\x02\\x00\\x02\\x00\\x04\\x00\\x04\\x00\\x03\\x00\\x02\\x00\\x02\\x00\"\n    \"\\x04\\x00\\x03\\x00\\xfe\\xff\\xfd\\xff\\xfd\\xff\\xfc\\xff\\xfa\\xff\\xfc\\xff\"\n    \"\\xff\\xff\\xfe\\xff\\xfd\\xff\\xfd\\xff\\xfd\\xff\\xfe\\xff\\xfb\\xff\\xfd\\xff\"\n    \"\\xfd\\xff\\xfd\\xff\\x01\\x00\\x01\\x00\\x00\\x00\\xfd\\xff\\x00\\x00\\x00\\x00\"\n    \"\\xfe\\xff\\x00\\x00\\x01\\x00\\x03\\x00\\x04\\x00\\x04\\x00\\x03\\x00\\x00\\x00\"\n    \"\\x02\\x00\\x05\\x00\\x01\\x00\\x00\\x00\\x04\\x00\\x04\\x00\\x00\\x00\\xff\\xff\"\n    \"\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\x01\\x00\\x01\\x00\\xff\\xff\"\n    \"\\xfe\\xff\\x01\\x00\\x01\\x00\\x01\\x00\\x02\\x00\\x05\\x00\\x04\\x00\\x05\\x00\"\n    \"\\x03\\x00\\x03\\x00\\x03\\x00\\x00\\x00\\x00\\x00\\xfc\\xff\\x01\\x00\\x00\\x00\"\n    \"\\xfe\\xff\\x00\\x00\\x01\\x00\\xfe\\xff\\xfe\\xff\\xff\\xff\\xff\\xff\\x02\\x00\"\n    \"\\x02\\x00\\xff\\xff\\x00\\x00\\x04\\x00\\x02\\x00\\x02\\x00\\x02\\x00\\x03\\x00\"\n    \"\\x02\\x00\\x02\\x00\\x00\\x00\\xfc\\xff\\x00\\x00\\x02\\x00\\x02\\x00\\x00\\x00\"\n    \"\\x00\\x00\\x02\\x00\\x00\\x00\\xfe\\xff\\xff\\xff\\xfc\\xff\\xfd\\xff\\xfb\\xff\"\n    \"\\xfa\\xff\\xfa\\xff\\xf9\\xff\\xf9\\xff\\xfa\\xff\\xf9\\xff\\xf9\\xff\\xfd\\xff\"\n    \"\\xff\\xff\\xfd\\xff\\xfc\\xff\\x00\\x00\\xfe\\xff\\xff\\xff\\x02\\x00\\x03\\x00\"\n    \"\\x06\\x00\\x06\\x00\\x07\\x00\\x04\\x00\\x05\\x00\\x05\\x00\\x05\\x00\\x07\\x00\"\n    \"\\x07\\x00\\x06\\x00\\x06\\x00\\x07\\x00\\x05\\x00\\x03\\x00\\x01\\x00\\x02\\x00\"\n    \"\\xfe\\xff\\xfd\\xff\\xff\\xff\\xfe\\xff\\xff\\xff\\xfd\\xff\\xfc\\xff\\xfc\\xff\"\n    \"\\xfb\\xff\\xfa\\xff\\xfa\\xff\\xfa\\xff\\xf9\\xff\\xfc\\xff\\xfa\\xff\\xfb\\xff\"\n    \"\\xfc\\xff\\xfc\\xff\\xfc\\xff\\xfc\\xff\\xfd\\xff\\xff\\xff\\x00\\x00\\x00\\x00\"\n    \"\\x03\\x00\\x03\\x00\\x04\\x00\\x04\\x00\\x06\\x00\\x04\\x00\\x02\\x00\\x03\\x00\"\n    \"\\xff\\xff\\x00\\x00\\x02\\x00\\xff\\xff\\x02\\x00\\x00\\x00\\xfe\\xff\\x00\\x00\"\n    \"\\x00\\x00\\x01\\x00\\xff\\xff\\x00\\x00\\x02\\x00\\x02\\x00\\x02\\x00\\x01\\x00\"\n    \"\\x01\\x00\\x01\\x00\\xfe\\xff\\xfe\\xff\\xfe\\xff\\xfe\\xff\\xff\\xff\\xff\\xff\"\n    \"\\xfe\\xff\\xff\\xff\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\"\n    \"\\x02\\x00\\x04\\x00\\x03\\x00\\x04\\x00\\x06\\x00\\x02\\x00\\x00\\x00\\x02\\x00\"\n    \"\\x04\\x00\\x02\\x00\\x00\\x00\\x03\\x00\\x04\\x00\\x05\\x00\\x03\\x00\\x03\\x00\"\n    \"\\x03\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\xff\\xff\\xfe\\xff\\xff\\xff\\xfe\\xff\"\n    \"\\xfd\\xff\\xfb\\xff\\xfc\\xff\\xfa\\xff\\xfb\\xff\\xfb\\xff\\xfd\\xff\\xfd\\xff\"\n    \"\\xfc\\xff\\xfc\\xff\\xfb\\xff\\xfb\\xff\\xfd\\xff\\xfe\\xff\\xff\\xff\\x00\\x00\"\n    \"\\xff\\xff\\x01\\x00\\x03\\x00\\x02\\x00\\x03\\x00\\x07\\x00\\x07\\x00\\x06\\x00\"\n    \"\\x05\\x00\\x09\\x00\\x07\\x00\\x04\\x00\\x06\\x00\\x05\\x00\\x01\\x00\\x03\\x00\"\n    \"\\x01\\x00\\x02\\x00\\x02\\x00\\x00\\x00\\xfe\\xff\\xfd\\xff\\xf9\\xff\\xf8\\xff\"\n    \"\\xf8\\xff\\xf6\\xff\\xf9\\xff\\xf7\\xff\\xf8\\xff\\xf7\\xff\\xfc\\xff\\xfc\\xff\"\n    \"\\xfc\\xff\\xff\\xff\\x02\\x00\\x01\\x00\\x02\\x00\\x04\\x00\\x06\\x00\\x06\\x00\"\n    \"\\x04\\x00\\x04\\x00\\x04\\x00\\x05\\x00\\x02\\x00\\x02\\x00\\x02\\x00\\x02\\x00\"\n    \"\\x00\\x00\\xff\\xff\\x01\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xfd\\xff\"\n    \"\\xfc\\xff\\xfe\\xff\\xfe\\xff\\xfc\\xff\\xfc\\xff\\xff\\xff\\xfd\\xff\\xfc\\xff\"\n    \"\\xfe\\xff\\x02\\x00\\x01\\x00\\x05\\x00\\x03\\x00\\x07\\x00\\x03\\x00\\x05\\x00\"\n    \"\\x04\\x00\\xfb\\xff\\xf8\\xff\\xfb\\xff\\xfe\\xff\\xee\\xff\\xee\\xff\\xfd\\xff\"\n    \"\\xf1\\xff\\x02\\x00\\xfb\\xff\\xcd\\xff\\xed\\xff\\x17\\x00\\xa6\\xff\\xfc\\xfe\"\n    \"\\x39\\x00\\xd7\\xff\\xa9\\xfe\\x92\\xff\\x87\\x00\\xf3\\xff\\x55\\xff\\xe3\\x00\"\n    \"\\x44\\x01\\x66\\x00\\x81\\x00\\x4b\\x01\\x24\\x01\\x60\\x00\\x8f\\x00\\xca\\x00\"\n    \"\\x9b\\x00\\x6d\\x00\\x47\\x00\\x86\\x00\\x99\\x00\\x6b\\x00\\xbb\\xff\\x8a\\x00\"\n    \"\\x32\\x00\\x5a\\x00\\xe0\\xff\\x27\\x00\\x61\\x01\\x6c\\x00\\xcc\\xff\\xb2\\xff\"\n    \"\\xe9\\xff\\x58\\xff\\xab\\xfb\\x69\\xfb\\x7e\\xff\\x52\\xfa\\xbf\\xf9\\x7a\\xfd\"\n    \"\\x79\\xff\\x99\\xfd\\xc1\\xfd\\xcf\\x02\\x75\\x02\\xd6\\x00\\xf8\\x00\\x02\\x03\"\n    \"\\x75\\x01\\x11\\x00\\x0f\\x00\\xbb\\x00\\xe8\\x00\\xb5\\x00\\x44\\x01\\x58\\x02\"\n    \"\\x3e\\x04\\x70\\x03\\x05\\x03\\x8c\\x04\\xe7\\x03\\x06\\x02\\xa9\\x00\\xce\\x00\"\n    \"\\x57\\xff\\x4f\\xfd\\x29\\xfd\\x19\\xfd\\x4f\\xfd\\x21\\xfd\\x03\\xfe\\x17\\xff\"\n    \"\\xf4\\xff\\x59\\x00\\x77\\x00\\xfa\\x00\\xd6\\x00\\x1b\\x00\\x62\\xff\\x0d\\xff\"\n    \"\\xd5\\xfe\\xf5\\xfd\\xd3\\xfd\\x74\\xfe\\x35\\xfe\\xac\\xfe\\x51\\xff\\xe4\\xff\"\n    \"\\x2a\\x00\\x82\\x00\\x45\\x01\\x11\\x01\\xee\\x00\\x10\\x01\\xe8\\x00\\x74\\x00\"\n    \"\\x05\\x00\\xe9\\xff\\x32\\x00\\xcb\\xff\\xda\\xff\\x99\\x00\\xee\\x00\\x13\\x01\"\n    \"\\x59\\x01\\x08\\x02\\x1a\\x02\\xa2\\x01\\xaf\\x01\\x9c\\x01\\x9d\\x00\\x3f\\x00\"\n    \"\\xea\\xff\\x3d\\xff\\xd4\\xfe\\xd1\\xfe\\xe4\\xfe\\xa0\\xfe\\x10\\xff\\x7f\\xff\"\n    \"\\x70\\xff\\x87\\xff\\xa0\\xff\\xcc\\xfe\\x18\\xff\\xd7\\xfd\\x8f\\xfc\\x7b\\xfd\"\n    \"\\x76\\xfc\\xf8\\xfb\\x7c\\xfc\\xdd\\xfd\\x71\\xfe\\xa2\\xfe\\x46\\x00\\x88\\x01\"\n    \"\\xca\\x01\\xb3\\x01\\x6a\\x02\\xb3\\x02\\x32\\x02\\xf1\\x01\\x0b\\x02\\x7d\\x02\"\n    \"\\x33\\x02\\x61\\x02\\x87\\x02\\x44\\x03\\xfd\\x02\\x6a\\x02\\xba\\x02\\x35\\x02\"\n    \"\\x8e\\x01\\x5e\\x00\\x2a\\x00\\x7f\\xff\\x8a\\xfe\\x5a\\xfe\\x27\\xfe\\x63\\xfe\"\n    \"\\x70\\xfe\\xd0\\xfe\\x5f\\xff\\xab\\xff\\xed\\xff\\xa9\\xff\\x10\\x00\\x00\\xff\"\n    \"\\x99\\xff\\xc8\\xfe\\xad\\xfe\\x2f\\xff\\x3e\\xff\\xde\\xfe\\xc4\\x01\\xab\\xfe\"\n    \"\\x47\\xfc\\xa8\\x02\\x0f\\xfe\\x5b\\xf9\\x02\\xfb\\xd3\\x00\\xb4\\xfa\\x1c\\xf8\"\n    \"\\xd3\\xff\\x39\\x02\\x61\\xfe\\x6f\\xfe\\x9b\\x05\\x61\\x04\\x34\\x01\\x63\\x02\"\n    \"\\xb2\\x04\\xba\\x02\\x66\\x01\\xb8\\x01\\xca\\x01\\x46\\x03\\x3e\\x02\\x3c\\x01\"\n    \"\\x71\\x03\\xa2\\x04\\xb5\\x02\\xfe\\x00\\x43\\x03\\x4c\\x02\\x22\\xff\\x2b\\xfe\"\n    \"\\xa4\\xfe\\xb4\\xfd\\x6f\\xfb\\xb4\\xfb\\xca\\xfc\\x3e\\xfd\\x2c\\xfd\\x01\\xfe\"\n    \"\\xe4\\xff\\x16\\x00\\x58\\x00\\xd0\\xff\\x03\\x00\\x8f\\x00\\x4e\\xfe\\x54\\xfe\"\n    \"\\x30\\xfe\\xc0\\xfe\\x09\\xfe\\x3d\\xfe\\x33\\x00\\x6d\\x00\\x86\\x00\\x9e\\x01\"\n    \"\\xbb\\x02\\x26\\x02\\x4e\\x02\\x9e\\x02\\xbd\\x02\\xc2\\x01\\x55\\x01\\x35\\x02\"\n    \"\\x7c\\x01\\xec\\x00\\x18\\x01\\xee\\x01\\x06\\x01\\x93\\x00\\x62\\x01\\x02\\x01\"\n    \"\\x2e\\x00\\xb5\\xff\\x63\\x00\\x17\\xff\\x82\\xfe\\xd4\\xfd\\xbb\\xfd\\xd9\\xfc\"\n    \"\\x2c\\xfc\\xd0\\xf9\\x87\\xfa\\xab\\xfc\\x00\\xf9\\xf6\\xf9\\xb8\\xfc\\xbd\\xfe\"\n    \"\\x1e\\xfd\\xb0\\xfe\\x8b\\x02\\x22\\x02\\x7b\\x01\\x1c\\x02\\x86\\x03\\x52\\x02\"\n    \"\\xc1\\x01\\x23\\x02\\xa5\\x02\\x89\\x02\\xb2\\x02\\x5c\\x03\\xcd\\x03\\x9b\\x04\"\n    \"\\x37\\x04\\xce\\x03\\x4e\\x04\\xdd\\x02\\x13\\x02\\xb5\\x00\\x39\\x00\\xc7\\xfd\"\n    \"\\xbf\\xfc\\x79\\xfe\\x5f\\xfb\\xe6\\xfb\\x07\\xfe\\x97\\xfe\\x5e\\xfe\\x70\\xff\"\n    \"\\xbb\\x01\\xfb\\x00\\x28\\x00\\xdd\\x00\\x94\\x00\\xa1\\xff\\xc0\\xfe\\x9e\\xff\"\n    \"\\x46\\xff\\xc1\\xff\\x82\\xff\\xdf\\x00\\x2b\\x00\\x4d\\x01\\x9a\\x00\\xd3\\x00\"\n    \"\\x45\\x01\\x9b\\xff\\xcd\\xff\\x8c\\x03\\xbe\\xff\\x7e\\xf6\\x07\\x05\\xa4\\xff\"\n    \"\\xbe\\xf4\\xd8\\xf6\\xdc\\x01\\x19\\xfd\\xd5\\xf1\\xa7\\xfe\\xc7\\x05\\x55\\x00\"\n    \"\\x9f\\xfb\\x04\\x07\\x81\\x08\\x75\\x01\\xfe\\x00\\x65\\x04\\x7c\\x03\\xaa\\xff\"\n    \"\\xcc\\xff\\x89\\xff\\x27\\x02\\x0a\\x03\\x90\\xff\\x62\\x02\\xa3\\x05\\xa0\\x05\"\n    \"\\xc3\\x00\\xd0\\x01\\x38\\x05\\x63\\x00\\xad\\xfc\\x84\\xfc\\xa0\\xfe\\x59\\xfb\"\n    \"\\xa4\\xf8\\x60\\xfb\\x11\\xfe\\xaf\\xfd\\x52\\xfd\\xc9\\x00\\xc8\\x02\\x7e\\x02\"\n    \"\\x53\\x02\\xd1\\x01\\xb4\\x02\\xc0\\x01\\x69\\xff\\xcf\\xfe\\x72\\xfe\\xf4\\xfd\"\n    \"\\xf3\\xfe\\x19\\xfe\\xa3\\xfe\\x7b\\x00\\xf8\\x01\\xee\\x01\\x3d\\x01\\x8a\\x03\"\n    \"\\x00\\x03\\x97\\x01\\x8a\\x00\\x58\\x00\\x0c\\x00\\x63\\xfe\\xe4\\xfd\\x99\\xfe\"\n    \"\\x98\\xff\\x50\\xff\\x6e\\xff\\x3c\\x01\\x61\\x02\\x85\\x01\\x9b\\x00\\x62\\x02\"\n    \"\\x39\\x01\\xb6\\xff\\xde\\xfe\\x73\\xff\\xdf\\xfd\\x1a\\xfd\\xcc\\xfe\\x51\\xfc\"\n    \"\\xcd\\xfd\\xbb\\xfd\\xc5\\x00\\xcd\\xf9\\x73\\xfb\\x3f\\x03\\xa6\\xfb\\x36\\xf9\"\n    \"\\x9a\\xfc\\x79\\x03\\x8a\\xfc\\x3a\\xfa\\x93\\x03\\x11\\x04\\x90\\xff\\xb7\\xff\"\n    \"\\xe9\\x05\\xf1\\x03\\x36\\x01\\xaa\\x02\\x8a\\x03\\x4e\\x03\\x1f\\x02\\x5a\\x03\"\n    \"\\xd5\\x01\\x7d\\x04\\xc3\\x04\\x19\\x02\\x03\\x02\\x75\\x04\\xde\\x01\\x2d\\xfe\"\n    \"\\x09\\x00\\x98\\xfe\\xad\\xfd\\x59\\xfb\\x47\\xfd\\x16\\xfe\\x7c\\xfd\\x7d\\xfe\"\n    \"\\xe0\\xff\\x00\\x01\\xfd\\x00\\x1c\\x01\\xa0\\x00\\xa1\\x00\\x08\\x00\\x19\\xff\"\n    \"\\x0b\\xfe\\x28\\xfe\\xb3\\xff\\x87\\xfe\\x9b\\xfe\\x78\\x00\\x75\\x01\\xdd\\x00\"\n    \"\\xec\\xff\\x9a\\x01\\xf1\\xff\\x8f\\xff\\x99\\xfe\\x23\\xfe\\xfa\\xfd\\xac\\xfd\"\n    \"\\xed\\xfd\\xc3\\xfd\\xd4\\xfd\\xc7\\xff\\x56\\x00\\x9e\\xfe\\x47\\x00\\x81\\x02\"\n    \"\\x39\\x01\\x9d\\xfc\\x4b\\x00\\xe6\\x02\\x9a\\xfc\\xcd\\xf9\\x24\\x01\\x7c\\x01\"\n    \"\\xb0\\xfb\\xc5\\xfd\\x7f\\x03\\xf8\\x03\\x3b\\xff\\xfc\\x01\\x1b\\x05\\x26\\x03\"\n    \"\\xc1\\x00\\xbc\\x01\\x8d\\x02\\xf1\\x01\\xb6\\x01\\x62\\x01\\x9f\\x02\\x96\\x03\"\n    \"\\x66\\x02\\x48\\x01\\x44\\x02\\x2e\\x01\\x9b\\xff\\x51\\xfc\\xf9\\xfc\\x9f\\xfe\"\n    \"\\x46\\xfb\\xef\\xfa\\x16\\xfd\\x38\\x00\\x33\\xfe\\xac\\xfd\\x05\\x01\\xa8\\x01\"\n    \"\\x6c\\xff\\xed\\xfd\\xcb\\x00\\xe9\\xff\\xb4\\xfe\\x3e\\xff\\x9a\\x00\\x24\\x02\"\n    \"\\x6f\\x01\\x05\\x02\\x1d\\x03\\x3b\\x04\\x6f\\x02\\xe0\\x00\\xd0\\x01\\x1a\\x01\"\n    \"\\x3a\\xff\\x12\\xfe\\xf7\\xfe\\xbd\\xff\\x94\\xfe\\xa5\\xfe\\xa2\\xff\\xf0\\xff\"\n    \"\\x6d\\xff\\x14\\x00\\x7b\\xff\\x8f\\xff\\xd2\\x00\\xc6\\xfe\\xbf\\xff\\x57\\x03\"\n    \"\\x99\\x04\\xfd\\xf6\\x96\\xf7\\xc3\\x07\\xef\\xfc\\xc3\\xec\\xe8\\xf5\\x10\\x07\"\n    \"\\x3a\\xfd\\xac\\xf1\\xf3\\x00\\xea\\x0d\\x17\\x05\\xfd\\xfb\\xd9\\x04\\xbe\\x0a\"\n    \"\\x1e\\x02\\xba\\xfc\\xd3\\xfe\\xc7\\x01\\xa0\\x00\\xdf\\xfe\\x23\\xff\\x8a\\x03\"\n    \"\\x23\\x0a\\xcd\\x06\\x16\\x02\\xc0\\x06\\xdf\\x0b\\x0e\\x04\\x18\\xfb\\x3b\\xff\"\n    \"\\x6b\\x03\\x92\\xfa\\x39\\xf4\\x57\\xfa\\x25\\x00\\x91\\xfb\\xa8\\xfa\\x3e\\xff\"\n    \"\\x0c\\x03\\x34\\x04\\x1a\\xff\\xdd\\xfe\\xec\\x00\\x3a\\x01\\x0f\\xfb\\x6e\\xf9\"\n    \"\\x03\\xfe\\x3e\\xff\\xf5\\xfc\\x25\\xfc\\x5b\\x02\\xaa\\x04\\xf5\\x01\\x96\\x00\"\n    \"\\xbe\\x02\\x29\\x05\\x7f\\x01\\x16\\xff\\x67\\x01\\x03\\x03\\x69\\x01\\x4f\\xfe\"\n    \"\\x84\\xff\\x56\\x02\\x84\\x00\\x08\\xfd\\x8e\\xfd\\x16\\x01\\x83\\xff\\x96\\xfc\"\n    \"\\x22\\xfe\\xf5\\x01\\xb7\\x01\\x04\\xfe\\xb9\\xff\\x9f\\x03\\x48\\x02\\x53\\xfa\"\n    \"\\x4f\\xfd\\x61\\xfa\\x1b\\xf9\\x7f\\xfb\\x05\\xf7\\xc0\\xf9\\xd3\\xfc\\xaf\\x03\"\n    \"\\x6e\\x01\\xa0\\x01\\x0e\\x08\\x1e\\x08\\x67\\x04\\x8c\\xff\\x0a\\x02\\x42\\x02\"\n    \"\\x25\\xfd\\x5e\\xfc\\x14\\xff\\xe6\\x02\\xdf\\x01\\x98\\x03\\x62\\x08\\xdc\\x08\"\n    \"\\x03\\x08\\xca\\x05\\xb2\\x05\\x76\\x03\\xf0\\xff\\xec\\xfc\\x1b\\xfc\\x0b\\xfd\"\n    \"\\x2f\\xfb\\x24\\xfb\\xc4\\xfd\\x0f\\x00\\x25\\x00\\x09\\x00\\x2e\\x01\\x14\\x02\"\n    \"\\x61\\x00\\xbf\\xfd\\x01\\xfe\\xf4\\xfc\\x89\\xfb\\x69\\xfb\\xef\\xfb\\x07\\xfd\"\n    \"\\xaf\\xfc\\xd4\\xfd\\xd6\\xfe\\x07\\xff\\x61\\xfe\\x9f\\xfe\\x70\\xff\\x55\\xfe\"\n    \"\\x9d\\xfe\\x87\\xff\\x18\\x00\\x12\\x01\\x09\\x01\\x0d\\x01\\xf7\\x01\\x15\\x02\"\n    \"\\xd6\\x01\\xf4\\x00\\xcc\\x01\\xad\\x02\\xa4\\x02\\xd1\\x02\\xee\\x02\\xa0\\x04\"\n    \"\\xe8\\x05\\x02\\x04\\x87\\x04\\x93\\x05\\xe1\\x03\\x16\\x01\\x27\\xfd\\x5f\\xfc\"\n    \"\\xbd\\xfb\\xa2\\xf7\\x6d\\xf6\\x88\\xf5\\x80\\xf8\\x48\\xfd\\x1e\\xfc\\xa2\\xfe\"\n    \"\\x88\\x01\\x65\\x05\\x43\\x03\\x80\\xff\\x68\\x00\\xc5\\xff\\xde\\xfe\\xdb\\xfa\"\n    \"\\xbf\\xfb\\xc5\\xff\\x40\\x01\\xbc\\x02\\x4d\\x05\\x45\\x08\\x46\\x09\\xa2\\x08\"\n    \"\\x72\\x07\\xec\\x04\\xa5\\x02\\x0d\\x00\\xc2\\xfd\\x0e\\xfb\\xf0\\xf9\\xd2\\xfb\"\n    \"\\x89\\xf5\\x48\\xfc\\xe2\\x03\\xbf\\xfd\\xa3\\xfe\\xe9\\x02\\xb4\\x09\\xc8\\x03\"\n    \"\\x7b\\xfe\\xe8\\x01\\xbb\\x01\\xee\\xff\\x11\\xfa\\x8a\\xfb\\x0b\\x00\\xa4\\x00\"\n    \"\\xef\\xff\\x97\\xff\\x03\\x03\\x0a\\x05\\x83\\x03\\x2d\\x00\\xea\\xfe\\x26\\x01\"\n    \"\\xc9\\xfe\\xbe\\xf9\\x25\\xfa\\xe1\\xfd\\x63\\xfd\\x40\\xfa\\xaa\\xfd\\xd0\\xff\"\n    \"\\xff\\x04\\x08\\x00\\xa2\\xf7\\x6e\\xfe\\xd5\\xff\\x8b\\xf9\\x26\\xf5\\x83\\xf9\"\n    \"\\x1e\\x00\\xd8\\xff\\x8d\\xff\\xf5\\x04\\xb2\\x09\\x55\\x09\\x94\\x05\\x19\\x05\"\n    \"\\xb4\\x03\\x28\\x01\\x19\\x00\\xd1\\xff\\x7a\\xfe\\x0e\\x00\\x32\\x04\\xd0\\x05\"\n    \"\\xd9\\x05\\x5b\\x07\\x3b\\x09\\x0d\\x06\\x5f\\x02\\x06\\x00\\xd5\\xfc\\x7e\\xfa\"\n    \"\\xbd\\xf9\\x97\\xf8\\x09\\xf8\\x3d\\xfa\\xc2\\xfd\\xd2\\xfd\\xb1\\xfe\\x15\\x01\"\n    \"\\x6e\\x02\\x53\\x01\\x81\\xff\\xd2\\xfc\\x81\\xfb\\xd4\\xfc\\xd0\\xfa\\xb8\\xf8\"\n    \"\\x8d\\xfb\\xa6\\x01\\x0c\\x03\\x22\\x02\\x84\\x04\\x96\\x07\\x3e\\x08\\x2e\\x04\"\n    \"\\xd7\\x00\\x7a\\x01\\xac\\x01\\x9a\\xff\\x95\\xff\\xf8\\x00\\xe2\\x02\\x46\\x04\"\n    \"\\xb4\\x03\\x27\\x02\\x3b\\x02\\x56\\x02\\xab\\xfe\\x02\\xfd\\x18\\xfd\\x61\\xfd\"\n    \"\\x47\\xfd\\x35\\xfe\\x25\\x02\\x91\\x02\\xcb\\xf5\\x92\\xf2\\xc1\\xfb\\x6c\\xff\"\n    \"\\xc9\\xf3\\x1a\\xeb\\x96\\xf9\\x5d\\x06\\x45\\x06\\x47\\xfe\\x59\\x02\\xaa\\x0c\"\n    \"\\x21\\x0b\\x5d\\x00\\x4f\\xfa\\x3d\\xff\\x9b\\x02\\xb3\\xff\\xbf\\xfc\\x9e\\xfc\"\n    \"\\xea\\x03\\x27\\x0c\\x4c\\x0c\\xe9\\x07\\xbc\\x06\\x31\\x0a\\x12\\x09\\xb5\\x01\"\n    \"\\x1c\\xfa\\xb6\\xf9\\x30\\xfd\\x5d\\xfc\\x6d\\xf8\\xaf\\xf8\\x02\\xfe\\xc2\\x03\"\n    \"\\xc4\\x03\\x25\\x01\\x14\\x01\\xf2\\x03\\x60\\x03\\x1f\\xfd\\xb0\\xf7\\x59\\xf9\"\n    \"\\x14\\xfb\\xc3\\xf9\\xff\\xf7\\x56\\xfa\\xc9\\x00\\x46\\x03\\x2e\\x03\\xa0\\x02\"\n    \"\\x4d\\x04\\xd4\\x05\\x3f\\x03\\x1b\\xff\\xd6\\xfd\\x0f\\x00\\xa1\\x01\\x68\\xff\"\n    \"\\x9c\\xff\\xb7\\x01\\xc2\\x04\\x74\\x03\\x7c\\x02\\x59\\x01\\xfa\\x01\\x57\\x02\"\n    \"\\x3b\\x02\\x1c\\xff\\x08\\x02\\x1f\\xff\\xb4\\x04\\xeb\\xfe\\xe8\\xe8\\x6a\\xf6\"\n    \"\\xc6\\xfe\\x1b\\x00\\x65\\xeb\\x41\\xef\\x82\\x07\\x70\\x0d\\x3b\\x07\\xa7\\xfa\"\n    \"\\x65\\x04\\x59\\x0b\\x98\\x04\\x84\\xf8\\x23\\xf5\\x68\\xfd\\x62\\x02\\x6b\\x00\"\n    \"\\x97\\xfc\\xea\\xfc\\x53\\x09\\xe8\\x10\\x0d\\x0c\\xef\\x01\\x3f\\x03\\x07\\x08\"\n    \"\\x2f\\x05\\xc2\\xfc\\xe1\\xf6\\x87\\xf9\\xfe\\xfe\\x77\\x00\\xb8\\xfc\\xe5\\xfb\"\n    \"\\xb3\\x01\\xf1\\x07\\x4d\\x08\\x10\\x02\\xa1\\xfe\\xc4\\x01\\x06\\x04\\x05\\xfd\"\n    \"\\x13\\xf5\\x0e\\xf8\\x07\\xfc\\xf9\\xfd\\xa0\\xfa\\xd1\\xfb\\xd6\\x00\\xae\\x04\"\n    \"\\x1c\\x05\\x08\\x01\\x1b\\x01\\x20\\x03\\x3b\\x01\\xc6\\xfe\\x5c\\xfc\\x88\\xfe\"\n    \"\\xb4\\x00\\x95\\x00\\xf1\\xff\\xba\\x01\\x13\\x03\\xae\\x03\\x9c\\x02\\xd0\\x02\"\n    \"\\xaa\\x00\\x33\\x02\\x07\\x03\\x50\\x00\\x9b\\xff\\x10\\x01\\x53\\xfe\\xc5\\xe6\"\n    \"\\x50\\xf5\\x0b\\x01\\xe6\\xfd\\xc6\\xee\\x58\\xef\\x43\\x0a\\xcb\\x0e\\x34\\x09\"\n    \"\\x74\\xfb\\x45\\x03\\x6c\\x08\\xdd\\x02\\x98\\xfa\\x63\\xf7\\x75\\xfb\\x4b\\x01\"\n    \"\\x3c\\x05\\x7f\\x01\\xfc\\xfd\\xf8\\x06\\x0a\\x12\\xf9\\x0f\\x74\\x03\\x59\\xfe\"\n    \"\\x22\\x03\\xee\\x04\\x6b\\xfe\\x29\\xf5\\x7d\\xf5\\xff\\xfb\\x90\\x01\\xe2\\xfe\"\n    \"\\x30\\xfc\\x3b\\xfe\\x91\\x04\\xaf\\x08\\x96\\x04\\x4e\\xfd\\x23\\xfd\\x33\\x02\"\n    \"\\xca\\x00\\x95\\xf8\\x25\\xf7\\x96\\xfa\\xae\\xfe\\x28\\xff\\x37\\xfd\\x32\\x00\"\n    \"\\x54\\x02\\xc1\\x06\\xab\\x04\\x60\\x03\\xad\\x01\\xbe\\x00\\xea\\x01\\x8a\\x00\"\n    \"\\x7f\\xfd\\x41\\xfd\\xf4\\xff\\x52\\x02\\x96\\x01\\xd5\\xff\\x10\\x02\\x15\\x04\"\n    \"\\xdf\\x04\\xf9\\x00\\x1e\\x02\\x59\\x02\\xc1\\x03\\x0d\\xfe\\xf3\\xfe\\xf5\\xe8\"\n    \"\\xfb\\xeb\\x44\\xfe\\xd6\\xfd\\x8b\\xf3\\x2d\\xe9\\x44\\x04\\x99\\x0e\\x24\\x0f\"\n    \"\\xbb\\xff\\xf4\\xff\\x74\\x06\\x46\\x03\\xcc\\xfc\\x42\\xf7\\x22\\xfa\\x0c\\xfd\"\n    \"\\x92\\x04\\x38\\x07\\x1a\\x03\\x0c\\x04\\xfb\\x0d\\xec\\x13\\x30\\x0c\\x85\\x00\"\n    \"\\x92\\xfe\\x16\\x01\\xbb\\x02\\xa7\\xfa\\xc3\\xf5\\x0d\\xf7\\xbf\\xfe\\x23\\x02\"\n    \"\\x4e\\x00\\xe4\\xfd\\x21\\xff\\xb0\\x04\\x52\\x07\\x77\\x02\\xc1\\xfb\\xb8\\xfb\"\n    \"\\x62\\xff\\x97\\xfd\\xdf\\xf9\\x89\\xf7\\xbe\\xf9\\xb8\\xfe\\xe8\\xff\\x01\\x01\"\n    \"\\x19\\xff\\x15\\x02\\x75\\x04\\xe5\\x05\\x97\\x03\\xd6\\xfe\\x3e\\xfe\\xcf\\x01\"\n    \"\\x18\\x02\\xd0\\xfe\\x38\\xfc\\xa8\\xff\\x1e\\x04\\x88\\x04\\x5d\\x00\\xce\\x00\"\n    \"\\xa5\\x04\\x8a\\x06\\xb8\\x04\\x61\\x02\\xde\\x01\\xc8\\x03\\x09\\xfe\\x92\\xe8\"\n    \"\\xf9\\xed\\x20\\xfa\\x5a\\xff\\x5b\\xef\\x13\\xee\\xb0\\x00\\x56\\x0e\\x36\\x0f\"\n    \"\\xfe\\x01\\x3c\\x01\\x01\\x02\\xf8\\x02\\xf5\\xfb\\x68\\xf8\\xb2\\xf6\\x00\\xfb\"\n    \"\\x1e\\x03\\x17\\x07\\x2d\\x04\\x2d\\x05\\x2e\\x0d\\x98\\x12\\x4d\\x0d\\x55\\x03\"\n    \"\\xa6\\xfd\\x7a\\xff\\xe1\\x00\\xbb\\xfb\\x9d\\xf6\\xff\\xf6\\x79\\xfd\\xa6\\x01\"\n    \"\\xe9\\x01\\x59\\x00\\x6b\\x01\\xe6\\x03\\x87\\x06\\x8d\\x04\\x73\\xff\\xa0\\xfc\"\n    \"\\x36\\xfc\\xef\\xfb\\xc8\\xfc\\xf5\\xf8\\x04\\xf8\\xdf\\xfb\\x2e\\x02\\x37\\x03\"\n    \"\\x02\\x01\\xbe\\x01\\x89\\x03\\xb4\\x05\\x71\\x04\\xfa\\xfe\\xfc\\xfb\\xdb\\xfd\"\n    \"\\x94\\x01\\x49\\x00\\xe0\\xfc\\x64\\xfd\\xbf\\x01\\xe1\\x04\\x5e\\x02\\x41\\x01\"\n    \"\\xe0\\x00\\x70\\x06\\xce\\x04\\xe2\\x02\\x68\\xfe\\x67\\xff\\xa6\\xf4\\xf7\\xef\"\n    \"\\xb6\\xf5\\x88\\xf9\\xf4\\xf8\\x90\\xf2\\xd4\\xfc\\xad\\x04\\x0d\\x0d\\x4a\\x08\"\n    \"\\xcc\\x04\\x50\\x02\\x21\\x02\\xd2\\xff\\xde\\xfb\\xa1\\xf9\\x7a\\xf9\\xba\\xfd\"\n    \"\\xbb\\x02\\x24\\x06\\x64\\x05\\x5a\\x08\\x27\\x0c\\x75\\x0d\\x08\\x09\\x13\\x02\"\n    \"\\x92\\xfd\\xfd\\xfe\\x27\\xfe\\x45\\xfa\\x1e\\xf7\\x66\\xf9\\x3d\\xfd\\x37\\x00\"\n    \"\\xb6\\x01\\xce\\x01\\x9a\\x02\\x0f\\x04\\xe5\\x05\\xba\\x04\\x2a\\x00\\x55\\xfc\"\n    \"\\x7f\\xf9\\x92\\xfb\\x31\\xfb\\x5c\\xf9\\x62\\xf9\\x11\\xfd\\x18\\x03\\xd3\\x04\"\n    \"\\x2c\\x05\\xcf\\x03\\x7b\\x04\\x4b\\x04\\x62\\x02\\x16\\xff\\xdf\\xfc\\xbf\\xfd\"\n    \"\\x48\\xff\\x44\\x00\\xe4\\xfe\\xf0\\xfe\\x3d\\x00\\x1a\\x03\\x26\\x04\\x7e\\x03\"\n    \"\\xae\\x00\\x51\\x00\\xa7\\x02\\x35\\x01\\x8f\\xfc\\x93\\xf1\\x15\\xf2\\x10\\xf7\"\n    \"\\xf0\\xf9\\x6f\\xf7\\xa0\\xf5\\x1b\\xfd\\x71\\x04\\xf9\\x09\\xb6\\x08\\x07\\x06\"\n    \"\\x20\\x03\\x20\\x02\\x57\\x01\\x6e\\xff\\x7f\\xfc\\x64\\xfa\\x3f\\xfd\\xf2\\x01\"\n    \"\\x7c\\x05\\x8e\\x06\\x3d\\x07\\x7f\\x09\\x9b\\x0a\\xe3\\x08\\x09\\x04\\x98\\xff\"\n    \"\\xe4\\xfd\\x56\\xfd\\x59\\xfb\\x3d\\xf9\\x5a\\xf9\\x27\\xfa\\xab\\xfc\\xb0\\xff\"\n    \"\\x58\\x02\\x01\\x03\\x2d\\x03\\x89\\x04\\xb8\\x05\\xc0\\x03\\x3a\\xfe\\x65\\xfb\"\n    \"\\x42\\xfa\\xa1\\xfb\\x73\\xfb\\x0f\\xfa\\x46\\xfb\\xe8\\x00\\x67\\x06\\x35\\x06\"\n    \"\\x79\\x04\\xab\\x03\\x8a\\x04\\x58\\x03\\x8b\\x00\\xe6\\xfd\\x25\\xfd\\x20\\xfe\"\n    \"\\xd5\\xff\\x77\\xff\\x44\\xfe\\x6a\\xfd\\x23\\x01\\x55\\x03\\x21\\x02\\x29\\xfe\"\n    \"\\x2d\\x00\\xc5\\x00\\x70\\x01\\xf6\\xf8\\x57\\xf1\\x17\\xf8\\x04\\xfa\\x28\\xfb\"\n    \"\\x1b\\xf4\\x9f\\xf8\\x35\\xff\\x40\\x06\\xd8\\x07\\x84\\x05\\x8b\\x04\\x34\\x04\"\n    \"\\xb2\\x04\\xbd\\x03\\x80\\x01\\xe8\\xfd\\xdc\\xfd\\xb5\\xff\\x3e\\x03\\xb4\\x02\"\n    \"\\x3a\\x04\\x0d\\x05\\x0e\\x07\\x7d\\x06\\xbe\\x05\\x68\\x03\\x10\\x01\\xe7\\xfe\"\n    \"\\x55\\xfe\\x9e\\xfd\\x13\\xfc\\x9c\\xfa\\x44\\xfa\\xff\\xfb\\xc8\\xfd\\x4a\\xff\"\n    \"\\x34\\x00\\xd7\\x01\\x74\\x03\\x9b\\x03\\xe8\\x01\\xcd\\x00\\xd2\\x00\\x6d\\x00\"\n    \"\\x5f\\xfe\\xa2\\xfd\\x56\\xfd\\xf6\\xfe\\x8c\\xff\\x2d\\x00\\x37\\x00\\xf0\\xff\"\n    \"\\x48\\x00\\xb8\\x00\\x63\\x00\\x4b\\x00\\x68\\x00\\xe9\\xff\\x57\\x00\\x30\\x00\"\n    \"\\x92\\xff\\xc8\\xfe\\xfe\\xfd\\x1a\\xfe\\x15\\xff\\xbf\\xff\\x37\\x00\\xe9\\x00\"\n    \"\\xff\\x01\\x78\\x02\\xab\\x02\\xe8\\x00\\x69\\xff\\xf4\\xfd\\xe6\\xfd\\x64\\xfc\"\n    \"\\x84\\xfa\\x95\\xfa\\xc3\\xfa\\x23\\xfc\\xfb\\xfc\\x60\\xfe\\x9c\\xfd\\x44\\xfd\"\n    \"\\xea\\xfe\\xaf\\x01\\x0c\\x02\\xa0\\x00\\xfb\\x00\\x09\\x03\\x5e\\x03\\x5d\\x02\"\n    \"\\xc3\\x02\\x4b\\x03\\x57\\x03\\x40\\x03\\x01\\x04\\x51\\x04\\x38\\x03\\xa1\\x02\"\n    \"\\x93\\x03\\xc6\\x03\\x0e\\x02\\x81\\x00\\x95\\x00\\xe4\\x00\\x4b\\x00\\x1d\\xff\"\n    \"\\x7f\\xff\\x5b\\x00\\xf6\\xff\\x67\\xfe\\x03\\xfe\\x50\\xfe\\xf0\\xfd\\x3b\\xfd\"\n    \"\\x91\\xfd\\xc0\\xfd\\x20\\xfd\\x69\\xfd\\x2f\\xff\\x89\\x00\\xdb\\xff\\x1c\\xff\"\n    \"\\xb0\\xff\\xc1\\x00\\x0e\\x01\\xcb\\x00\\x96\\x00\\xa4\\x00\\x07\\x01\\x5d\\x01\"\n    \"\\x6a\\x00\\x59\\xff\\x38\\xff\\xd6\\xff\\xfb\\xff\\xd6\\xff\\xf7\\xff\\x47\\x00\"\n    \"\\x2b\\x01\\xc4\\x00\\x29\\xff\\x80\\xfe\\x97\\xfd\\xab\\xfb\\x85\\xfa\\xa1\\xfb\"\n    \"\\xb0\\xfb\\x28\\xfa\\x9b\\xfa\\x89\\xfd\\x48\\xff\\x7c\\xfe\\xc9\\xfe\\x10\\x01\"\n    \"\\x8e\\x02\\x88\\x02\\x19\\x03\\xce\\x03\\xd0\\x03\\xe0\\x03\\xc2\\x04\\x05\\x05\"\n    \"\\xc1\\x03\\xff\\x02\\x2e\\x04\\xbc\\x04\\x8e\\x03\\x3a\\x02\\xc4\\x01\\xdf\\x01\"\n    \"\\x58\\x02\\xc1\\x01\\xd3\\xff\\x97\\xfe\\xdc\\xfe\\xa3\\xff\\xf6\\xfe\\x99\\xfd\"\n    \"\\x19\\xfd\\x04\\xfe\\x89\\xfe\\x62\\xfe\\x92\\xfd\\x33\\xfd\\x98\\xfd\\xb2\\xfe\"\n    \"\\x86\\xff\\x1f\\xff\\xe5\\xfe\\xa1\\xff\\x25\\x01\\x74\\x01\\xb1\\x00\\xd9\\xff\"\n    \"\\x4f\\x00\\xf7\\x00\\x3b\\x01\\xbb\\x00\\x88\\x00\\x82\\x00\\x7c\\x00\\x44\\x00\"\n    \"\\x8f\\xff\\x24\\xff\\x18\\xff\\x1a\\xff\\x5b\\xff\\xb6\\xff\\x8b\\xff\\xf6\\xfe\"\n    \"\\x75\\xfe\\xea\\xfe\\xdd\\xfd\\x28\\xfc\\xdc\\xfa\\xc9\\xfb\\x38\\xfc\\xc2\\xfb\"\n    \"\\xd9\\xfb\\x0a\\xfd\\x76\\xfe\\x13\\xff\\x77\\x00\\xbb\\x01\\x11\\x02\\x65\\x02\"\n    \"\\xbc\\x03\\x7e\\x04\\x94\\x04\\x1b\\x04\\x4d\\x04\\x72\\x04\\x3f\\x04\\xbd\\x03\"\n    \"\\x80\\x03\\x54\\x03\\xc6\\x02\\x72\\x02\\x19\\x02\\x72\\x01\\xb7\\x00\\x62\\x00\"\n    \"\\x3d\\x00\\x49\\xff\\x3e\\xfe\\xc2\\xfd\\xcf\\xfd\\xdc\\xfd\\x97\\xfd\\xab\\xfd\"\n    \"\\xf1\\xfd\\x7e\\xfe\\x0c\\xff\\x2c\\xff\\x7e\\xfe\\x2f\\xfe\\x12\\xff\\xa0\\xff\"\n    \"\\xf3\\xfe\\x9b\\xfe\\x39\\xff\\x44\\x00\\x92\\x00\\x72\\x00\\x9e\\x00\\xd1\\x00\"\n    \"\\x07\\x01\\x8c\\x01\\xd0\\x01\\xa1\\x01\\x55\\x01\\x5d\\x01\\x45\\x01\\xae\\x00\"\n    \"\\x15\\x00\\xf6\\xff\\xbf\\xff\\x5a\\xff\\x59\\xff\\xb5\\xff\\xdd\\xff\\xae\\xff\"\n    \"\\x20\\x00\\xd4\\xff\\x90\\xfe\\xd1\\xfd\\xa0\\xfd\\xaf\\xfc\\x4f\\xfb\\xf0\\xfa\"\n    \"\\x28\\xfb\\xfc\\xfa\\x2b\\xfb\\x30\\xfc\\xf8\\xfc\\x37\\xfd\\x2e\\xfe\\xfc\\xff\"\n    \"\\x2b\\x01\\xb7\\x01\\x93\\x02\\x87\\x03\\x27\\x04\\x9a\\x04\\x08\\x05\\x47\\x05\"\n    \"\\x2b\\x05\\x1a\\x05\\xd2\\x04\\x6d\\x04\\xec\\x03\\x99\\x03\\x26\\x03\\x52\\x02\"\n    \"\\xe1\\x01\\x82\\x01\\xfc\\x00\\x16\\x00\\xa6\\xff\\x72\\xff\\x35\\xff\\x89\\xfe\"\n    \"\\x29\\xfe\\xf8\\xfd\\xf3\\xfd\\xd8\\xfd\\x8a\\xfd\\x98\\xfd\\x70\\xfd\\x87\\xfd\"\n    \"\\xbe\\xfd\\x7d\\xfe\\xeb\\xfe\\x2c\\xff\\x66\\xff\\xc5\\xff\\x09\\x00\\x2d\\x00\"\n    \"\\x42\\x00\\x73\\x00\\xb2\\x00\\xd0\\x00\\x89\\x00\\x41\\x00\\x54\\x00\\x3a\\x00\"\n    \"\\xc8\\xff\\x9c\\xff\\x78\\xff\\x75\\xff\\x9b\\xff\\xdd\\xff\\x68\\x00\\x1a\\x00\"\n    \"\\xaf\\xff\\x90\\xfe\\xb2\\xfe\\x6d\\xfe\\x0c\\xfd\\xc9\\xfb\\xf0\\xfb\\x98\\xfc\"\n    \"\\x1e\\xfc\\x34\\xfc\\xe8\\xfc\\xc9\\xfd\\x54\\xfe\\x67\\xff\\x84\\x00\\x66\\x01\"\n    \"\\x48\\x02\\x79\\x03\\xf5\\x03\\x28\\x04\\x80\\x04\\xfb\\x04\\xf4\\x04\\x9e\\x04\"\n    \"\\x55\\x04\\xf7\\x03\\x9d\\x03\\x65\\x03\\xfc\\x02\\x2f\\x02\\xa4\\x01\\x4a\\x01\"\n    \"\\xc8\\x00\\xf7\\xff\\x2f\\xff\\x99\\xfe\\x15\\xfe\\x9d\\xfd\\x3d\\xfd\\xe3\\xfc\"\n    \"\\xb2\\xfc\\x82\\xfc\\xdf\\xfc\\x5b\\xfd\\xd3\\xfd\\xef\\xfd\\x31\\xfe\\x02\\xff\"\n    \"\\x0f\\x00\\xb2\\x00\\x1c\\x01\\x5d\\x01\\x96\\x01\\xc7\\x01\\x25\\x02\\x3f\\x02\"\n    \"\\xbd\\x01\\x7e\\x01\\x78\\x01\\x81\\x01\\x0b\\x01\\x9b\\x00\\xf9\\xff\\x99\\xff\"\n    \"\\x4f\\xff\\x1a\\xff\\x5a\\xfe\\x0a\\xfe\\x71\\xfe\\xa1\\xfe\\xb4\\xfe\\x90\\xfe\"\n    \"\\x72\\xfe\\x7a\\xfd\\x80\\xfd\\xcf\\xfd\\x00\\xfd\\xcd\\xfb\\xdc\\xfb\\xbd\\xfc\"\n    \"\\x6b\\xfc\\x33\\xfc\\x0a\\xfd\\x11\\xfe\\x7a\\xfe\\x52\\xff\\xb6\\x00\\x9e\\x01\"\n    \"\\x6b\\x02\\x97\\x03\\x77\\x04\\xa6\\x04\\x11\\x05\\xa7\\x05\\x8d\\x05\\x48\\x05\"\n    \"\\x44\\x05\\x52\\x05\\xad\\x04\\x19\\x04\\xac\\x03\\xcf\\x02\\xdf\\x01\\x5b\\x01\"\n    \"\\xc1\\x00\\x6f\\xff\\x83\\xfe\\x34\\xfe\\x97\\xfd\\xec\\xfc\\x82\\xfc\\x30\\xfc\"\n    \"\\xfe\\xfb\\xf7\\xfb\\x52\\xfc\\x75\\xfc\\xe1\\xfc\\x70\\xfd\\x27\\xfe\\xda\\xfe\"\n    \"\\xa1\\xff\\x5a\\x00\\xc6\\x00\\x39\\x01\\x89\\x01\\xaf\\x01\\xca\\x01\\xfb\\x01\"\n    \"\\xf7\\x01\\x9c\\x01\\x51\\x01\\x4f\\x01\\x1c\\x01\\xad\\x00\\x19\\x00\\xae\\xff\"\n    \"\\x7a\\xff\\x66\\xff\\x08\\xff\\xc8\\xfe\\xa5\\xfe\\x36\\xff\\x1a\\xff\\x2e\\xff\"\n    \"\\x60\\xff\\x6c\\xff\\x30\\xff\\x83\\xfe\\xf3\\xfe\\x7e\\xfe\\x91\\xfd\\xcb\\xfc\"\n    \"\\x0c\\xfd\\xcd\\xfc\\x61\\xfc\\xb6\\xfc\\x2e\\xfd\\x62\\xfd\\xeb\\xfd\\x3f\\xff\"\n    \"\\x01\\x00\\x67\\x00\\x7f\\x01\\x08\\x03\\x80\\x03\\x94\\x03\\x38\\x04\\xfb\\x04\"\n    \"\\x0e\\x05\\xf8\\x04\\xfa\\x04\\xbf\\x04\\x6b\\x04\\x56\\x04\\xd3\\x03\\x0f\\x03\"\n    \"\\x80\\x02\\xfb\\x01\\x25\\x01\\x34\\x00\\x6c\\xff\\xb7\\xfe\\x19\\xfe\\x86\\xfd\"\n    \"\\xf1\\xfc\\x63\\xfc\\x3a\\xfc\\x45\\xfc\\x4b\\xfc\\x6b\\xfc\\xef\\xfc\\x7b\\xfd\"\n    \"\\xe8\\xfd\\x76\\xfe\\x0e\\xff\\xaa\\xff\\x31\\x00\\x90\\x00\\xb1\\x00\\xe7\\x00\"\n    \"\\x3c\\x01\\x5a\\x01\\x2d\\x01\\xfb\\x00\\x0e\\x01\\xff\\x00\\xb6\\x00\\x4d\\x00\"\n    \"\\xff\\xff\\xd3\\xff\\xab\\xff\\x92\\xff\\x7a\\xff\\x52\\xff\\x60\\xff\\x7b\\xff\"\n    \"\\xbb\\xff\\xca\\xff\\xe3\\xff\\x27\\x00\\x6f\\x00\\xb5\\x00\\xaa\\x00\\xd3\\x00\"\n    \"\\x79\\x00\\xf8\\xff\\x45\\xff\\x96\\xfe\\xfc\\xfd\\x48\\xfd\\xae\\xfc\\x39\\xfc\"\n    \"\\x52\\xfc\\x78\\xfc\\xc4\\xfc\\x32\\xfd\\xeb\\xfd\\xa6\\xfe\\x75\\xff\\x73\\x00\"\n    \"\\x7c\\x01\\x46\\x02\\xd8\\x02\\x7f\\x03\\x33\\x04\\xc0\\x04\\x03\\x05\\x23\\x05\"\n    \"\\x23\\x05\\x21\\x05\\x0a\\x05\\xc8\\x04\\x2f\\x04\\x6a\\x03\\xa2\\x02\\x05\\x02\"\n    \"\\x40\\x01\\x3e\\x00\\x22\\xff\\x54\\xfe\\xaa\\xfd\\xf3\\xfc\\x52\\xfc\\xd5\\xfb\"\n    \"\\x7e\\xfb\\x6e\\xfb\\xb3\\xfb\\xf2\\xfb\\x33\\xfc\\xad\\xfc\\x68\\xfd\\xf6\\xfd\"\n    \"\\x7e\\xfe\\x29\\xff\\xcf\\xff\\x50\\x00\\xb6\\x00\\x14\\x01\\x6b\\x01\\x97\\x01\"\n    \"\\xad\\x01\\xab\\x01\\xaf\\x01\\x92\\x01\\x62\\x01\\x29\\x01\\xe4\\x00\\x97\\x00\"\n    \"\\x4b\\x00\\x2a\\x00\\xea\\xff\\xd6\\xff\\xc7\\xff\\xd0\\xff\\xe8\\xff\\xff\\xff\"\n    \"\\x0c\\x00\\x00\\x00\\x1d\\x00\\x20\\x00\\x14\\x00\\xf2\\xff\\xc5\\xff\\x8e\\xff\"\n    \"\\x47\\xff\\x12\\xff\\xb7\\xfe\\x63\\xfe\\x11\\xfe\\xbc\\xfd\\x69\\xfd\\x39\\xfd\"\n    \"\\x4c\\xfd\\x5a\\xfd\\x78\\xfd\\xd8\\xfd\\x80\\xfe\\x1b\\xff\\xb2\\xff\\x7d\\x00\"\n    \"\\x6d\\x01\\x3f\\x02\\xe7\\x02\\x8c\\x03\\x26\\x04\\x85\\x04\\xd6\\x04\\x04\\x05\"\n    \"\\xf8\\x04\\xc3\\x04\\x78\\x04\\x23\\x04\\x90\\x03\\xec\\x02\\x4f\\x02\\x95\\x01\"\n    \"\\xb6\\x00\\xe5\\xff\\x1c\\xff\\x25\\xfe\\x33\\xfd\\x77\\xfc\\xe6\\xfb\\x68\\xfb\"\n    \"\\x0d\\xfb\\x01\\xfb\\x1e\\xfb\\x61\\xfb\\xd4\\xfb\\x6e\\xfc\\xfe\\xfc\\xad\\xfd\"\n    \"\\x85\\xfe\\x55\\xff\\x09\\x00\\xab\\x00\\x30\\x01\\x90\\x01\\xe8\\x01\\x19\\x02\"\n    \"\\x20\\x02\\x0c\\x02\\x0a\\x02\\xff\\x01\\xe8\\x01\\xd2\\x01\\x9c\\x01\\x5f\\x01\"\n    \"\\x26\\x01\\xe6\\x00\\x86\\x00\\x1c\\x00\\xdc\\xff\\xb1\\xff\\x78\\xff\\x4b\\xff\"\n    \"\\x37\\xff\\x44\\xff\\x5d\\xff\\x7a\\xff\\x96\\xff\\xac\\xff\\xca\\xff\\xe1\\xff\"\n    \"\\xe7\\xff\\xdb\\xff\\xcf\\xff\\xb0\\xff\\x8a\\xff\\x67\\xff\\x34\\xff\\x00\\xff\"\n    \"\\xd5\\xfe\\xb9\\xfe\\xa0\\xfe\\x7e\\xfe\\x7f\\xfe\\xaa\\xfe\\xe6\\xfe\\x31\\xff\"\n    \"\\x90\\xff\\xfe\\xff\\x68\\x00\\xd4\\x00\\x4e\\x01\\xbe\\x01\\x01\\x02\\x41\\x02\"\n    \"\\x68\\x02\\x87\\x02\\x86\\x02\\x7f\\x02\\x61\\x02\\x1b\\x02\\xe7\\x01\\xbd\\x01\"\n    \"\\x85\\x01\\x26\\x01\\xcf\\x00\\x74\\x00\\x0f\\x00\\xb6\\xff\\x5e\\xff\\xf1\\xfe\"\n    \"\\x99\\xfe\\x5a\\xfe\\x27\\xfe\\xf8\\xfd\\xd2\\xfd\\xc4\\xfd\\xc8\\xfd\\xe7\\xfd\"\n    \"\\x22\\xfe\\x5c\\xfe\\x93\\xfe\\xdd\\xfe\\x43\\xff\\x94\\xff\\xcd\\xff\\x07\\x00\"\n    \"\\x47\\x00\\x7c\\x00\\x8b\\x00\\xa5\\x00\\xbe\\x00\\xd3\\x00\\xdc\\x00\\xdc\\x00\"\n    \"\\xd7\\x00\\xc6\\x00\\xba\\x00\\xa8\\x00\\x85\\x00\\x4c\\x00\\x1c\\x00\\xf8\\xff\"\n    \"\\xd5\\xff\\xb8\\xff\\x9c\\xff\\x8a\\xff\\x8c\\xff\\xa9\\xff\\xc9\\xff\\xe5\\xff\"\n    \"\\x0b\\x00\\x2a\\x00\\x50\\x00\\x78\\x00\\x95\\x00\\x98\\x00\\x9c\\x00\\x9e\\x00\"\n    \"\\x8f\\x00\\x82\\x00\\x74\\x00\\x52\\x00\\x13\\x00\\xf8\\xff\\xdd\\xff\\xa8\\xff\"\n    \"\\x55\\xff\\xff\\xfe\\xc4\\xfe\\x8b\\xfe\\x61\\xfe\\x31\\xfe\\x10\\xfe\\x0f\\xfe\"\n    \"\\x40\\xfe\\x7e\\xfe\\xb8\\xfe\\xfe\\xfe\\x62\\xff\\xe5\\xff\\x62\\x00\\xc6\\x00\"\n    \"\\x22\\x01\\x93\\x01\\xfa\\x01\\x44\\x02\\x64\\x02\\x84\\x02\\xa3\\x02\\xaa\\x02\"\n    \"\\x97\\x02\\x77\\x02\\x49\\x02\\x0f\\x02\\xd3\\x01\\x90\\x01\\x26\\x01\\xa8\\x00\"\n    \"\\x3d\\x00\\xd2\\xff\\x5a\\xff\\xd1\\xfe\\x5c\\xfe\\xf9\\xfd\\xb7\\xfd\\x92\\xfd\"\n    \"\\x6c\\xfd\\x59\\xfd\\x6e\\xfd\\xa2\\xfd\\xd5\\xfd\\x05\\xfe\\x4d\\xfe\\xa0\\xfe\"\n    \"\\xf0\\xfe\\x3a\\xff\\x84\\xff\\xd6\\xff\\x1c\\x00\\x63\\x00\\xa8\\x00\\xdc\\x00\"\n    \"\\x01\\x01\\x20\\x01\\x40\\x01\\x56\\x01\\x4d\\x01\\x3b\\x01\\x2d\\x01\\x1c\\x01\"\n    \"\\xff\\x00\\xe4\\x00\\xcb\\x00\\xa2\\x00\\x86\\x00\\x6d\\x00\\x65\\x00\\x5b\\x00\"\n    \"\\x47\\x00\\x2b\\x00\\x00\\x00\\xd3\\xff\\xb8\\xff\\xc2\\xff\\xb6\\xff\\x69\\xff\"\n    \"\\xfc\\xfe\\x40\\xff\\x1c\\x00\\x8a\\x00\\x23\\x00\\xbc\\xff\\xbe\\xff\\xec\\xff\"\n    \"\\xfa\\xff\\x81\\xff\\xe6\\xfe\\x68\\xfe\\x23\\xfe\\x38\\xfe\\x9c\\xfe\\xe5\\xfe\"\n    \"\\xd0\\xfe\\x7c\\xfe\\x79\\xfe\\x17\\xff\\xcd\\xff\\x12\\x00\\xfe\\xff\\xed\\xff\"\n    \"\\x33\\x00\\xb2\\x00\\x3b\\x01\\x76\\x01\\x89\\x01\\xb6\\x01\\x97\\x01\\xfe\\x01\"\n    \"\\xb2\\x02\\xe2\\x02\\xa6\\x02\\x81\\x02\\xb0\\x02\\x80\\x02\\xf5\\x01\\x07\\x01\"\n    \"\\xa3\\x00\\xf0\\x00\\x34\\x00\\x14\\xff\\x63\\xfe\\x8e\\xfe\\x85\\xfe\\x0a\\xfe\"\n    \"\\x26\\xfd\\xab\\xfc\\xda\\xfc\\xde\\xfc\\x4c\\xfd\\xc1\\xfd\\x59\\xfe\\x69\\xfe\"\n    \"\\xb1\\xfe\\xe2\\xfe\\x1c\\xff\\xf2\\xff\\xae\\x00\\x90\\x00\\x96\\x00\\x9c\\x00\"\n    \"\\x41\\x01\\x3a\\x02\\xae\\x02\\x87\\x02\\x69\\x02\\xd9\\x01\\x3d\\x01\\x5b\\x02\"\n    \"\\x48\\x02\\x08\\x01\\x7b\\x00\\x88\\x00\\xbf\\xff\\xe9\\xff\\x9f\\xff\\xca\\xfe\"\n    \"\\xca\\xfe\\xfb\\xfe\\xa9\\xfe\\x80\\xfe\\x16\\xfe\\x7c\\xfe\\xc3\\xfe\\xd1\\xfe\"\n    \"\\xc5\\xfe\\x8f\\xfe\\x4c\\xff\\xc2\\xfe\\x47\\xff\\x1f\\x00\\xe9\\xff\\x1c\\x00\"\n    \"\\xaf\\x00\\x4c\\x00\\x84\\x00\\xed\\x00\\xdf\\x00\\xbc\\x00\\xba\\x00\\x89\\x00\"\n    \"\\x7a\\x00\\xca\\x00\\x1b\\x01\\x6e\\x00\\x69\\x00\\x20\\x00\\xe0\\xff\\xbf\\x00\"\n    \"\\x75\\x00\\x9a\\xff\\x54\\xff\\xbe\\xff\\xdf\\xff\\x8f\\x00\\x22\\xff\\xa2\\xfe\"\n    \"\\x09\\x00\\x40\\x00\\x5d\\xff\\x48\\xff\\xd9\\xff\\x38\\x00\\xb4\\xff\\xdb\\xff\"\n    \"\\xba\\x00\\x8c\\x00\\xea\\xff\\x63\\xff\\x23\\x01\\x38\\x01\\x4a\\x01\\x8e\\x00\"\n    \"\\x63\\x00\\x5c\\x00\\x4c\\x01\\x8f\\x01\\x1c\\x00\\x98\\xfe\\xf3\\xfe\\x13\\x01\"\n    \"\\xea\\xff\\x84\\xfe\\xc8\\xfd\\x3f\\x00\\x19\\x00\\xe9\\xfe\\x4d\\xff\\xcd\\xfe\"\n    \"\\x99\\xff\\x57\\x00\\x92\\xff\\xf2\\xff\\x4a\\xff\\x83\\x00\\x0f\\x00\\xe3\\x00\"\n    \"\\x94\\x00\\xdc\\xff\\x07\\x01\\xd8\\x00\\x28\\x01\\xfa\\xff\\xdd\\x00\\x7c\\x00\"\n    \"\\x57\\x01\\x72\\x00\\x85\\xff\\xde\\xff\\xfe\\x00\\x48\\x00\\xf4\\xfe\\x81\\xfe\"\n    \"\\x16\\x00\\xc1\\xff\\x76\\xff\\x13\\xfe\\x7d\\xfe\\x66\\x00\\x02\\xff\\x57\\xfe\"\n    \"\\x41\\xfe\\xcf\\x00\\x81\\xff\\xf8\\xfe\\xa1\\xff\\xe8\\xff\\x90\\x00\\x47\\x00\"\n    \"\\xf5\\xff\\x48\\x00\\x0e\\x01\\x09\\x01\\xad\\xff\\x8f\\x00\\x25\\x01\\xaf\\x01\"\n    \"\\xa0\\x00\\xe0\\xff\\x9d\\x00\\x49\\x00\\xd0\\x01\\x9f\\x00\\x16\\xff\\x5e\\x00\"\n    \"\\x51\\x00\\xf0\\xff\\xe1\\xfe\\x66\\xff\\x9e\\xff\\x1d\\xff\\x06\\xff\\xef\\xfd\"\n    \"\\x75\\xff\\xeb\\xff\\xdb\\xff\\xcd\\xfe\\x5f\\xff\\xfc\\xff\\x28\\x00\\xcc\\x00\"\n    \"\\x42\\x00\\x27\\x00\\xfb\\x00\\x43\\x01\\xb5\\x00\\x25\\x01\\x0c\\x01\\x82\\x01\"\n    \"\\x1d\\x01\\x76\\x00\\x8c\\x00\\x8a\\x00\\xe5\\x00\\x8f\\xff\\xfe\\xff\\x2a\\x00\"\n    \"\\x3d\\xff\\xbe\\xfe\\x16\\xff\\x4b\\xff\\xaa\\xff\\x2b\\xff\\x31\\xfe\\x50\\xff\"\n    \"\\x80\\xff\\x42\\x00\\xc4\\xff\\x66\\x00\\xa6\\xff\\x92\\xff\\xc8\\x00\\x93\\x00\"\n    \"\\x7b\\x01\\xb3\\x00\\x6d\\xff\\xbc\\x00\\x54\\x01\\xc8\\x00\\x80\\x00\\x4f\\xff\"\n    \"\\xc8\\xff\\x3c\\x00\\x96\\xff\\x85\\x00\\x62\\xfe\\xc6\\xfe\\x6b\\xff\\x6d\\xff\"\n    \"\\xfb\\xff\\x3b\\xfe\\xe9\\xfe\\x67\\xfe\\xcc\\xff\\xa0\\xff\\xad\\xff\\x12\\x00\"\n    \"\\x13\\xff\\xad\\xff\\x9a\\x01\\x5e\\x00\\x6e\\x00\\x0b\\x01\\xba\\x00\\x5d\\x00\"\n    \"\\xbd\\x00\\x70\\x01\\x45\\x01\\x5b\\x01\\xe8\\xfe\\x7f\\x01\\x5a\\x00\\x2b\\x00\"\n    \"\\x5c\\x00\\x57\\xff\\x22\\x00\\xcf\\xfe\\xf0\\xfe\\x7a\\xff\\xc7\\xff\\x8d\\xfe\"\n    \"\\x7d\\xfe\\x91\\xfe\\x6a\\xff\\xc1\\xff\\xc1\\xfe\\x13\\xff\\x15\\xff\\xa8\\x00\"\n    \"\\x7d\\x00\\x9f\\xff\\x60\\x00\\x86\\x00\\x28\\x02\\xd6\\x00\\x19\\x01\\x08\\x01\"\n    \"\\x53\\x01\\x54\\x02\\x46\\x01\\xb7\\x00\\xa3\\x00\\xfc\\x01\\x0e\\x00\\xda\\x00\"\n    \"\\x63\\x00\\x04\\xff\\x07\\x00\\x9e\\x00\\xe4\\xff\\x3a\\xfe\\x22\\xff\\x57\\xff\"\n    \"\\x88\\x00\\x98\\xff\\x13\\xfe\\x0d\\xff\\x35\\x00\\x4d\\xff\\xb5\\xff\\xfa\\xfe\"\n    \"\\x53\\xff\\x36\\x00\\x55\\xff\\xc7\\xff\\x36\\x00\\xeb\\x00\\xbd\\xfe\\x19\\x01\"\n    \"\\xc4\\xff\\x71\\x00\\x23\\x01\\xe4\\xff\\x93\\x00\\xc1\\xfe\\xd5\\x00\\xe7\\x00\"\n    \"\\x66\\xff\\x7c\\xff\\xa6\\xff\\x96\\xff\\xb6\\x00\\x5b\\xff\\xfd\\xfe\\x71\\xff\"\n    \"\\x43\\x00\\xd1\\x00\\x1e\\xff\\x5e\\xfe\\xb5\\xff\\x2a\\x01\\xb0\\xff\\x6b\\xff\"\n    \"\\xed\\x00\\x03\\xff\\xa6\\xff\\x02\\x01\\xbd\\x00\\x7b\\x01\\xc0\\xff\\x56\\xff\"\n    \"\\x46\\x00\\x06\\x00\\x5d\\xff\\x84\\x00\\x13\\xff\\xb8\\xfd\\xba\\xfe\\x5a\\xff\"\n    \"\\x3a\\xff\\x02\\xff\\x5f\\xff\\x19\\xff\\xb3\\xff\\x58\\x00\\xa0\\x00\\x8d\\x00\"\n    \"\\x07\\x01\\xb3\\x01\\xcd\\x01\\x37\\x02\\x38\\x01\\xcb\\x01\\xca\\x02\\xe9\\x01\"\n    \"\\x04\\x02\\x36\\x01\\xc0\\x00\\xab\\x00\\xda\\x00\\x08\\x01\\xfe\\xfe\\xe9\\xfe\"\n    \"\\xfc\\xfe\\x2a\\xff\\x5f\\xff\\xa9\\xfd\\xab\\xfe\\x95\\xff\\xa8\\xfe\\x16\\xfe\"\n    \"\\xb7\\xff\\x37\\xff\\x74\\xff\\xbb\\xff\\xc1\\xff\\x90\\xff\\xc3\\xff\\xda\\xff\"\n    \"\\x40\\x00\\xfc\\x01\\x49\\xff\\x72\\xff\\x4f\\x00\\xa9\\x00\\x5e\\x01\\x8f\\x00\"\n    \"\\xda\\xfe\\xf3\\xfe\\x5b\\x00\\xa1\\x01\\x41\\xff\\xed\\xfe\\xa1\\xff\\xaf\\xff\"\n    \"\\xc0\\x00\\xeb\\xfe\\x06\\x00\\xdf\\x00\\x8e\\xff\\xab\\xff\\x1e\\x00\\x27\\x00\"\n    \"\\xc7\\x00\\x92\\x00\\xec\\xff\\x88\\xfe\\x3d\\x00\\x4c\\x01\\x9c\\xff\\x15\\xff\"\n    \"\\x5f\\xff\\xcd\\xff\\x72\\xff\\x38\\xff\\x18\\xff\\x72\\xfe\\x38\\xfe\\xb7\\xfe\"\n    \"\\xda\\xfe\\xdc\\xfd\\xa1\\xfd\\x40\\xff\\xb7\\xff\\xe8\\xff\\x57\\x00\\xa0\\x00\"\n    \"\\xb2\\x01\\x3e\\x02\\xbd\\x02\\x05\\x03\\xe9\\x02\\x09\\x03\\x2b\\x03\\x1b\\x03\"\n    \"\\x5b\\x01\\x1a\\x02\\xad\\x03\\xf2\\x00\\x2a\\x00\\xaf\\x00\\x02\\x00\\x29\\xff\"\n    \"\\xb5\\xff\\xdf\\xff\\x71\\xfd\\x5d\\xfd\\xd5\\xfd\\x5a\\xfe\\xdf\\xfe\\x5d\\xfe\"\n    \"\\xc6\\xfd\\x46\\xfe\\x1a\\xff\\xe4\\xff\\x11\\x00\\x0b\\x00\\x12\\x00\\x8d\\xff\"\n    \"\\xb3\\x00\\xc4\\x00\\xca\\xff\\x94\\x00\\xe9\\x00\\xea\\xff\\xa7\\xff\\xa9\\xff\"\n    \"\\x10\\x00\\xf3\\x00\\x42\\x00\\x4f\\xff\\x1a\\xff\\xe0\\xff\\xed\\xff\\x6b\\xff\"\n    \"\\xbd\\xff\\xd5\\xfe\\x97\\xff\\xea\\xff\\x1e\\xff\\x5e\\xff\\x13\\x00\\xd8\\x00\"\n    \"\\x2f\\x00\\x8d\\xff\\xb9\\xff\\x9b\\x00\\xf8\\x00\\xb6\\x00\\x88\\x00\\x87\\x00\"\n    \"\\x83\\x00\\x13\\x00\\x2a\\x00\\xf6\\xff\\xc8\\xff\\xd1\\xfe\\x2a\\xfe\\xdb\\xfd\"\n    \"\\x93\\xfd\\xfa\\xfd\\x27\\xfe\\x72\\xfe\\xad\\xfe\\xd1\\xfe\\x6c\\xff\\xed\\x00\"\n    \"\\x96\\x01\\x11\\x02\\x17\\x02\\x3b\\x02\\x6e\\x02\\xf2\\x02\\xbc\\x03\\x4b\\x03\"\n    \"\\x82\\x02\\x0e\\x02\\xf0\\x01\\x6d\\x01\\x98\\x01\\x4b\\x01\\x36\\x00\\x51\\xff\"\n    \"\\x1d\\xff\\x22\\xff\\x97\\xfe\\x5c\\xfe\\x63\\xfe\\x6e\\xfe\\xaa\\xfd\\xba\\xfd\"\n    \"\\x74\\xfe\\x5f\\xff\\x43\\xff\\x0f\\xff\\x72\\xff\\xf6\\xff\\x2f\\x00\\xb0\\xff\"\n    \"\\xae\\x00\\x86\\x01\\x39\\x00\\x6e\\xff\\x58\\x00\\x8c\\x00\\x0c\\x01\\xd3\\x00\"\n    \"\\x47\\x00\\xc3\\xff\\xfb\\xff\\xf5\\xff\\x0c\\x00\\x64\\x00\\xcb\\xff\\xbc\\xfe\"\n    \"\\x3c\\xff\\xe4\\xff\\xc6\\xfe\\xab\\xff\\x50\\x00\\xa3\\xff\\x11\\xff\\x93\\xff\"\n    \"\\x96\\xff\\x56\\x00\\x6d\\x00\\xc1\\xff\\xf8\\xff\\x27\\x00\\xed\\x00\\x39\\x00\"\n    \"\\xc8\\xff\\xeb\\xff\\x70\\xff\\xd3\\xfe\\xb3\\xfd\\x17\\xfd\\xee\\xfc\\x15\\xfd\"\n    \"\\xa5\\xfd\\xbb\\xfd\\x6d\\xfe\\x51\\xff\\x6a\\x00\\x96\\x01\\x97\\x02\\x51\\x03\"\n    \"\\x88\\x03\\xa5\\x03\\xc0\\x03\\xdb\\x03\\xa8\\x03\\x4f\\x03\\x92\\x02\\x47\\x02\"\n    \"\\x68\\x01\\xbd\\x00\\xcf\\x00\\x4c\\x00\\x5b\\xff\\xc2\\xfe\\x81\\xfe\\x59\\xfe\"\n    \"\\x62\\xfe\\x44\\xfe\\x80\\xfe\\x6a\\xfe\\x48\\xfe\\x33\\xfe\\xaa\\xfe\\x40\\xff\"\n    \"\\x54\\xff\\x11\\xff\\x9c\\xfe\\xd5\\xfe\\x2f\\xff\\xbd\\xff\\xb2\\xff\\xdc\\xff\"\n    \"\\x3d\\x00\\x32\\x00\\x16\\x01\\x6c\\x01\\xe5\\x00\\x26\\x01\\x33\\x01\\xcf\\x00\"\n    \"\\x5e\\x00\\xb7\\x00\\xe8\\x00\\x23\\x00\\x82\\x00\\x61\\x00\\x93\\x00\\x5a\\x00\"\n    \"\\x13\\x00\\x7c\\x00\\xb7\\xff\\xfe\\xfe\\x45\\xff\\x38\\xff\\x3f\\xff\\x37\\xff\"\n    \"\\x81\\xff\\x95\\xff\\x43\\xff\\x53\\x00\\xdf\\x00\\x23\\x01\\x27\\x00\\xee\\xff\"\n    \"\\x82\\x00\\x9d\\x00\\x73\\x00\\xcc\\xff\\xbd\\xfd\\x38\\xfb\\xb6\\xf9\\xb2\\xf9\"\n    \"\\x30\\xfb\\x5d\\xfc\\x3d\\xfd\\x5b\\xfd\\xcc\\xfe\\x90\\x01\\xf0\\x03\\x8a\\x05\"\n    \"\\x88\\x05\\x0b\\x05\\x0e\\x05\\x6a\\x05\\x70\\x05\\x95\\x04\\x40\\x03\\xbb\\x01\"\n    \"\\xff\\x00\\x92\\x00\\xcb\\xff\\x37\\xff\\xf4\\xfe\\xbc\\xfe\\xd2\\xfe\\xb9\\xfe\"\n    \"\\x91\\xfe\\xe7\\xfe\\x6a\\xff\\x9a\\xff\\x62\\xff\\x0c\\xff\\xb5\\xfe\\x89\\xfe\"\n    \"\\xa2\\xfe\\xd3\\xfe\\x30\\xff\\x7a\\xff\\xa7\\xff\\x7b\\xff\\x5c\\xff\\x36\\xff\"\n    \"\\xcd\\xfe\\x93\\xfe\\x49\\xfe\\xc1\\xfe\\x6a\\xff\\xf1\\xff\\x63\\x00\\xd1\\x00\"\n    \"\\x64\\x01\\x08\\x02\\x42\\x02\\x3b\\x02\\x7b\\x01\\xc2\\x00\\x9c\\x00\\x68\\x00\"\n    \"\\xd9\\x00\\xba\\x00\\xa2\\x00\\xb0\\x00\\x71\\x00\\xa4\\x00\\x5e\\x00\\xcd\\x00\"\n    \"\\xf9\\x00\\x02\\x00\\x0f\\xff\\x92\\xfe\\x45\\xff\\xc3\\xff\\xc9\\xff\\x93\\xff\"\n    \"\\x7b\\xff\\xf2\\xff\\x0e\\x00\\x18\\x00\\xff\\xff\\xce\\xff\\x8a\\xfe\\x55\\xfb\"\n    \"\\x70\\xf8\\x94\\xf6\\x06\\xf7\\xdd\\xf8\\xa0\\xfa\\x77\\xfc\\xab\\xfe\\xef\\x01\"\n    \"\\x9e\\x05\\x2f\\x08\\xc4\\x08\\xeb\\x07\\xfb\\x06\\xcc\\x06\\x76\\x06\\xbf\\x05\"\n    \"\\xea\\x03\\x07\\x01\\x9d\\xfe\\xb7\\xfd\\x42\\xfe\\xe0\\xfe\\xf6\\xfe\\xb5\\xfe\"\n    \"\\x5e\\xfe\\xe7\\xfe\\xae\\xff\\x38\\x00\\x95\\x00\\xaf\\x00\\xf5\\x00\\xdc\\x00\"\n    \"\\x38\\x00\\x4c\\xff\\x69\\xfe\\x3b\\xfe\\xb4\\xfe\\x51\\xff\\x80\\xff\\x11\\xff\"\n    \"\\x86\\xfe\\x3f\\xfe\\x45\\xfe\\x24\\xfe\\xe7\\xfd\\xde\\xfd\\x4c\\xfe\\x59\\xff\"\n    \"\\x43\\x00\\xc6\\x00\\xee\\x00\\x1d\\x01\\x7a\\x01\\xd8\\x01\\xee\\x01\\x51\\x01\"\n    \"\\xa4\\x00\\x64\\x00\\xa2\\x00\\x05\\x01\\x46\\x01\\x4a\\x01\\x19\\x01\\xd0\\x00\"\n    \"\\xa6\\x00\\x6f\\x00\\x9d\\x00\\xf8\\x00\\xca\\x00\\x40\\x00\\xa9\\xff\\x80\\xff\"\n    \"\\xbc\\xff\\x12\\x00\\x3f\\x00\\x7c\\x00\\x72\\x00\\x5f\\x00\\xdf\\xff\\xb2\\xfe\"\n    \"\\x15\\xfc\\x66\\xf8\\x88\\xf5\\x37\\xf4\\xaa\\xf5\\x82\\xf8\\x3f\\xfb\\xf5\\xfd\"\n    \"\\x0d\\x01\\x56\\x05\\x30\\x09\\xef\\x0a\\x5f\\x0a\\x0a\\x08\\x54\\x06\\xa6\\x05\"\n    \"\\x46\\x05\\x26\\x04\\x5c\\x01\\x7e\\xfe\\xca\\xfc\\x8b\\xfc\\x60\\xfd\\x90\\xfe\"\n    \"\\x9b\\xff\\x43\\x00\\xea\\x00\\x8c\\x01\\xc6\\x01\\xb3\\x01\\x86\\x01\\x5b\\x01\"\n    \"\\x37\\x01\\x92\\x00\\x36\\xff\\x96\\xfd\\x69\\xfc\\x4f\\xfc\\x11\\xfd\\x38\\xfe\"\n    \"\\x27\\xff\\x69\\xff\\x34\\xff\\xf5\\xfe\\xe0\\xfe\\xb5\\xfe\\x6a\\xfe\\x68\\xfe\"\n    \"\\xc2\\xfe\\x5b\\xff\\xe1\\xff\\xfa\\xff\\xf4\\xff\\x3d\\x00\\xd6\\x00\\x55\\x01\"\n    \"\\x7f\\x01\\x6f\\x01\\x36\\x01\\x43\\x01\\x66\\x01\\x8d\\x01\\xcc\\x01\\xda\\x01\"\n    \"\\x9d\\x01\\x3f\\x01\\x15\\x01\\xda\\x00\\xa3\\x00\\x70\\x00\\x3d\\x00\\x09\\x00\"\n    \"\\xdd\\xff\\xe3\\xff\\xf4\\xff\\xef\\xff\\xe5\\xff\\x02\\x00\\x9f\\x00\\x50\\x01\"\n    \"\\x9a\\x00\\x88\\xfd\\x5f\\xf8\\xd3\\xf3\\x57\\xf2\\x27\\xf4\\x85\\xf7\\x5b\\xfa\"\n    \"\\xd2\\xfc\\x46\\x00\\x4b\\x05\\x3c\\x0a\\x8f\\x0c\\x76\\x0b\\x61\\x08\\xd0\\x05\"\n    \"\\xec\\x04\\x62\\x04\\xe8\\x02\\xea\\xff\\x9f\\xfc\\xd3\\xfa\\x16\\xfb\\xd9\\xfc\"\n    \"\\xee\\xfe\\xd9\\x00\\xa5\\x02\\x4f\\x04\\x5e\\x05\\x3d\\x05\\x10\\x04\\xae\\x02\"\n    \"\\x8a\\x01\\xaa\\x00\\x79\\xff\\xa9\\xfd\\xbb\\xfb\\xa8\\xfa\\x04\\xfb\\x56\\xfc\"\n    \"\\xe8\\xfd\\x3a\\xff\\x30\\x00\\xd3\\x00\\xe7\\x00\\x35\\x00\\xb8\\xfe\\x22\\xfd\"\n    \"\\x94\\xfc\\x2c\\xfd\\x5d\\xfe\\x20\\xff\\x0e\\xff\\xde\\xfe\\x50\\xff\\x9a\\x00\"\n    \"\\xd8\\x01\\x45\\x02\\x0c\\x02\\xec\\x01\\x2d\\x02\\x99\\x02\\xc8\\x02\\x91\\x02\"\n    \"\\x10\\x02\\xa3\\x01\\x3a\\x01\\xaf\\x00\\x22\\x00\\xc0\\xff\\xb1\\xff\\xd8\\xff\"\n    \"\\x1a\\x00\\x0b\\x00\\xe9\\xff\\xda\\xff\\x0b\\x00\\x85\\x00\\xf5\\x00\\x19\\x01\"\n    \"\\x31\\x00\\x75\\xfd\\x4d\\xf9\\x44\\xf5\\x69\\xf3\\x7b\\xf4\\x70\\xf7\\xcd\\xfa\"\n    \"\\x00\\xfe\\xbf\\x01\\x32\\x06\\x53\\x0a\\x48\\x0c\\x48\\x0b\\x4d\\x08\\x0f\\x05\"\n    \"\\x9c\\x02\\xc0\\x00\\xe9\\xfe\\xce\\xfc\\x0f\\xfb\\x98\\xfa\\x94\\xfb\\xa5\\xfd\"\n    \"\\x34\\x00\\xe7\\x02\\x7a\\x05\\x64\\x07\\xdf\\x07\\x81\\x06\\xc7\\x03\\xe4\\x00\"\n    \"\\xb8\\xfe\\x39\\xfd\\xf0\\xfb\\x98\\xfa\\xa9\\xf9\\xc4\\xf9\\x07\\xfb\\x26\\xfd\"\n    \"\\x99\\xff\\x13\\x02\\x70\\x04\\x2b\\x06\\x88\\x06\\xff\\x04\\x6b\\x01\\x39\\xfd\"\n    \"\\x25\\xfa\\x07\\xf9\\xa8\\xf9\\xcb\\xfa\\xfc\\xfb\\x75\\xfd\\xc8\\xff\\x9f\\x02\"\n    \"\\xc3\\x04\\x68\\x05\\xc1\\x04\\x96\\x03\\x60\\x02\\x08\\x01\\x89\\xff\\x5a\\xfe\"\n    \"\\xef\\xfd\\x5a\\xfe\\x1b\\xff\\xde\\xff\\x8f\\x00\\x1f\\x01\\x8e\\x01\\x5a\\x01\"\n    \"\\xc4\\x00\\x5f\\x00\\xa7\\x00\\x7b\\x01\\x2d\\x02\\x3b\\x02\\xe3\\x01\\x30\\x01\"\n    \"\\x0d\\x00\\x31\\xfd\\xd9\\xf7\\x0a\\xf3\\xe9\\xf0\\x54\\xf3\\x44\\xf8\\xd6\\xfc\"\n    \"\\xd3\\x00\\x95\\x04\\x39\\x09\\x0d\\x0d\\xb2\\x0d\\x0e\\x0b\\x98\\x06\\xb0\\x02\"\n    \"\\x0c\\x00\\x9a\\xfd\\x12\\xfb\\xda\\xf8\\x52\\xf8\\xcf\\xf9\\x91\\xfc\\xd7\\xff\"\n    \"\\x48\\x03\\xfa\\x06\\x08\\x0a\\x1e\\x0b\\xbe\\x09\\x46\\x06\\x2b\\x02\\x77\\xfe\"\n    \"\\x4f\\xfb\\xe2\\xf8\\x2a\\xf7\\xc1\\xf6\\xb9\\xf7\\xd0\\xf9\\xbd\\xfc\\x03\\x00\"\n    \"\\x78\\x03\\x82\\x06\\x6c\\x08\\xac\\x08\\xfe\\x06\\xd0\\x03\\xc3\\xff\\x96\\xfb\"\n    \"\\x8c\\xf8\\x66\\xf7\\x6d\\xf8\\xbe\\xfa\\x4e\\xfd\\xac\\xff\\xe4\\x01\\xf7\\x03\"\n    \"\\x4e\\x05\\x6d\\x05\\x50\\x04\\xaf\\x02\\x57\\x01\\x4a\\x00\\x3a\\xff\\x40\\xfe\"\n    \"\\x9c\\xfd\\xde\\xfd\\x89\\xfe\\x34\\xff\\x86\\xff\\xd1\\xff\\x68\\x00\\x1f\\x01\"\n    \"\\x59\\x01\\x38\\x01\\x53\\x01\\x00\\x02\\xd3\\x02\\x65\\x02\\xe3\\xff\\xf0\\xfa\"\n    \"\\xec\\xf5\\x8d\\xf2\\x34\\xf2\\x9c\\xf4\\xb1\\xf8\\x4e\\xfe\\x9d\\x04\\xad\\x0a\"\n    \"\\x9e\\x0e\\x37\\x0f\\x13\\x0d\\x50\\x09\\x12\\x05\\xd8\\x00\\xb9\\xfc\\xb3\\xf9\"\n    \"\\x42\\xf8\\x3a\\xf8\\xef\\xf8\\x46\\xfa\\x03\\xfd\\x6b\\x01\\x72\\x06\\x2a\\x0a\"\n    \"\\x3d\\x0b\\x0a\\x0a\\x5b\\x07\\xc8\\x03\\x70\\xff\\xa4\\xfa\\xbb\\xf6\\xcc\\xf4\"\n    \"\\x00\\xf5\\xb8\\xf6\\x38\\xf9\\x7c\\xfc\\x94\\x00\\xf6\\x04\\x8a\\x08\\x6e\\x0a\"\n    \"\\x84\\x0a\\x03\\x09\\x18\\x06\\xee\\x01\\x4d\\xfd\\x6b\\xf9\\x0a\\xf7\\xe6\\xf5\"\n    \"\\xb2\\xf5\\xf3\\xf6\\x34\\xfa\\x08\\xff\\xc0\\x03\\x2a\\x07\\x21\\x09\\xc1\\x09\"\n    \"\\xe5\\x08\\xe2\\x05\\x1d\\x01\\x36\\xfc\\x0f\\xf9\\x5b\\xf8\\x85\\xf9\\xd5\\xfb\"\n    \"\\x10\\xff\\xb2\\x02\\xa4\\x05\\xae\\x06\\x8c\\x05\\x98\\x03\\x10\\x02\\x32\\x01\"\n    \"\\x5e\\x00\\x83\\xff\\x40\\xff\\xa7\\xff\\xce\\xff\\xc4\\xfe\\xe2\\xfc\\x77\\xfb\"\n    \"\\x81\\xfa\\xa4\\xf8\\x72\\xf5\\x02\\xf3\\xed\\xf3\\x43\\xf8\\xcd\\xfd\\x8b\\x02\"\n    \"\\xba\\x06\\x00\\x0b\\x5c\\x0e\\xd6\\x0e\\xd8\\x0b\\x10\\x07\\x86\\x02\\xc0\\xfe\"\n    \"\\x6d\\xfb\\xd6\\xf8\\x0f\\xf8\\x52\\xf9\\x80\\xfb\\xb9\\xfd\\x64\\x00\\x7e\\x04\"\n    \"\\x63\\x09\\xef\\x0c\\x62\\x0d\\xd4\\x0a\\x96\\x06\\x5c\\x01\\x49\\xfb\\x33\\xf5\"\n    \"\\x05\\xf1\\x77\\xf0\\x56\\xf3\\xb5\\xf7\\x20\\xfc\\x48\\x00\\x85\\x04\\x56\\x08\"\n    \"\\x9a\\x0a\\xd1\\x0a\\x92\\x09\\x86\\x07\\x76\\x04\\x07\\x00\\xc9\\xfa\\xa4\\xf6\"\n    \"\\xe8\\xf4\\x1f\\xf5\\xd5\\xf5\\x30\\xf7\\xe0\\xfa\\xd4\\x00\\xe8\\x06\\x70\\x0a\"\n    \"\\x2e\\x0b\\x8e\\x0a\\xf2\\x08\\x97\\x05\\x31\\x00\\xab\\xfa\\x80\\xf7\\x38\\xf7\"\n    \"\\xb5\\xf8\\x10\\xfb\\x6e\\xfe\\xb8\\x02\\x1f\\x06\\x0b\\x07\\xb7\\x05\\x1b\\x04\"\n    \"\\x3d\\x03\\x4e\\x02\\x85\\x00\\xd3\\xfe\\x8f\\xfe\\x96\\xff\\xd6\\xff\\xd8\\xfe\"\n    \"\\x4e\\xfd\\xd6\\xfc\\xc8\\xfb\\x72\\xf8\\x82\\xf4\\xd2\\xf1\\xa7\\xf3\\xed\\xf7\"\n    \"\\xc4\\xfc\\xec\\x01\\x3e\\x07\\xca\\x0c\\x99\\x0f\\x7c\\x0e\\xe3\\x0a\\x62\\x06\"\n    \"\\x80\\x02\\x57\\xfe\\x49\\xfa\\x04\\xf8\\xdc\\xf7\\x4c\\xf9\\xb1\\xfa\\xa2\\xfc\"\n    \"\\x8b\\x00\\x19\\x06\\x87\\x0b\\x22\\x0e\\x89\\x0d\\xce\\x0a\\x4b\\x06\\x7c\\x00\"\n    \"\\xb8\\xf9\\x3e\\xf4\\xd8\\xf1\\x71\\xf2\\xe9\\xf4\\x06\\xf8\\xf8\\xfb\\xa7\\x00\"\n    \"\\x02\\x05\\x1d\\x08\\xb3\\x09\\x57\\x0a\\xe3\\x09\\xaf\\x07\\x97\\x03\\x8d\\xfe\"\n    \"\\x25\\xfa\\x0c\\xf7\\x78\\xf5\\xa2\\xf5\\x9e\\xf7\\xb3\\xfa\\x5b\\xfd\\x9f\\xff\"\n    \"\\xe7\\x01\\x8d\\x04\\xbf\\x06\\x56\\x07\\xa5\\x06\\x1e\\x05\\x07\\x03\\x25\\x00\"\n    \"\\x9b\\xfc\\xdc\\xf9\\x17\\xf9\\x5d\\xfa\\xfc\\xfc\\x40\\x00\\xff\\x03\\x05\\x07\"\n    \"\\x6a\\x08\\x96\\x07\\xdd\\x05\\x22\\x04\\xb9\\x02\\x31\\x01\\x60\\xff\\xf2\\xfd\"\n    \"\\x69\\xfd\\x44\\xfd\\x1b\\xfd\\x68\\xfc\\x93\\xfc\\xdf\\xfd\\x87\\xff\\x0c\\xff\"\n    \"\\x68\\xf9\\x35\\xf4\\xe6\\xf1\\xe2\\xf3\\x85\\xf7\\x5d\\xfa\\x3d\\xff\\xb4\\x05\"\n    \"\\x70\\x0b\\xcb\\x0d\\x50\\x0c\\x9c\\x0a\\xa8\\x08\\xef\\x04\\xbe\\xff\\xfb\\xfa\"\n    \"\\xdb\\xf9\\x47\\xfa\\xff\\xf9\\xa8\\xf9\\xf2\\xfb\\x0a\\x02\\x71\\x08\\xfe\\x0b\"\n    \"\\xdd\\x0c\\x2c\\x0c\\x64\\x0a\\xa9\\x05\\xb0\\xfe\\xaa\\xf8\\xb3\\xf5\\x2d\\xf5\"\n    \"\\xb8\\xf4\\x7d\\xf4\\x85\\xf6\\x16\\xfb\\x58\\x00\\x49\\x04\\x6b\\x07\\xd4\\x0a\"\n    \"\\x44\\x0d\\x52\\x0c\\x55\\x07\\xdf\\x00\\x41\\xfb\\x01\\xf7\\xbf\\xf3\\x3c\\xf2\"\n    \"\\xfc\\xf3\\x5a\\xf8\\x22\\xfd\\xa3\\x00\\xdd\\x02\\xd1\\x04\\x77\\x06\\xe7\\x06\"\n    \"\\xee\\x05\\x02\\x04\\xe5\\x01\\xb9\\xff\\x8f\\xfd\\x3d\\xfc\\xe7\\xfb\\x9e\\xfc\"\n    \"\\xb7\\xfd\\xfb\\xfe\\x96\\x00\\xb8\\x02\\xe0\\x04\\x72\\x06\\x24\\x07\\x50\\x07\"\n    \"\\xda\\x06\\x91\\x05\\x72\\x03\\xeb\\x00\\x83\\xfe\\x7a\\xfc\\xba\\xfa\\x6a\\xf9\"\n    \"\\x69\\xf9\\xde\\xfa\\x5a\\xfd\\x5b\\xff\\xe4\\x00\\xc4\\x01\\x0c\\x02\\x84\\xfe\"\n    \"\\x6b\\xf8\\xf6\\xf3\\xff\\xf2\\xfe\\xf4\\xff\\xf6\\xe9\\xf9\\x7a\\xff\\x36\\x06\"\n    \"\\x04\\x0b\\x7a\\x0c\\x53\\x0c\\x18\\x0c\\xc1\\x09\\x09\\x05\\x6e\\xff\\xed\\xfb\"\n    \"\\xaa\\xfa\\xad\\xf9\\xd9\\xf8\\x1c\\xfa\\xd2\\xfe\\xe2\\x04\\x41\\x09\\x4a\\x0b\"\n    \"\\xe5\\x0b\\x47\\x0b\\x68\\x08\\x37\\x03\\xe7\\xfd\\x26\\xfa\\xd0\\xf7\\xa5\\xf5\"\n    \"\\xe7\\xf3\\x52\\xf4\\x71\\xf7\\xea\\xfb\\x78\\x00\\xea\\x04\\x27\\x09\\xb6\\x0b\"\n    \"\\x08\\x0b\\x23\\x07\\xf0\\x01\\x01\\xfd\\x95\\xf8\\x20\\xf5\\x73\\xf3\\x88\\xf4\"\n    \"\\x97\\xf7\\x0f\\xfb\\x64\\xfe\\xd9\\x01\\xbf\\x05\\xc9\\x08\\xa2\\x09\\x52\\x08\"\n    \"\\x8f\\x05\\x06\\x02\\x22\\xfe\\x9b\\xfa\\xcf\\xf8\\x51\\xf9\\x92\\xfb\\x98\\xfe\"\n    \"\\xb5\\x01\\xae\\x04\\xdb\\x06\\x89\\x07\\xbd\\x06\\x29\\x05\\xc6\\x03\\xd3\\x02\"\n    \"\\x17\\x02\\x63\\x01\\xd8\\x00\\x50\\x00\\x8d\\xff\\x40\\xfe\\x9e\\xfc\\x57\\xfb\"\n    \"\\xc3\\xfa\\x0b\\xfb\\x06\\xfc\\xb1\\xfd\\xcd\\xff\\xb5\\x01\\xa1\\x02\\x58\\x02\"\n    \"\\xe6\\x00\\x8a\\xfe\\x9a\\xfa\\x6f\\xf6\\x13\\xf4\\x19\\xf4\\x0b\\xf6\\x64\\xf8\"\n    \"\\xc8\\xfb\\xf1\\x00\\xb2\\x06\\x1b\\x0b\\xd1\\x0c\\xb6\\x0c\\x5d\\x0b\\x6e\\x08\"\n    \"\\x62\\x04\\x7b\\x00\\x3b\\xfe\\x2b\\xfd\\x4e\\xfc\\xfb\\xfb\\x2c\\xfd\\xf9\\xff\"\n    \"\\x16\\x03\\x66\\x05\\xfe\\x06\\xed\\x07\\xad\\x07\\x99\\x05\\x22\\x02\\x77\\xfe\"\n    \"\\x2a\\xfb\\x64\\xf8\\x89\\xf6\\x32\\xf6\\x96\\xf7\\x17\\xfa\\xfe\\xfc\\xfc\\xff\"\n    \"\\x9f\\x02\\x43\\x04\\x5c\\x04\\x25\\x03\\x6d\\x01\\x6f\\xff\\x80\\xfd\\xf1\\xfb\"\n    \"\\x6c\\xfb\\x35\\xfc\\xb7\\xfd\\x2f\\xff\\x7d\\x00\\xd6\\x01\\x2e\\x03\\x2a\\x04\"\n    \"\\x86\\x04\\xaa\\x04\\xc3\\x04\\x37\\x04\\xb6\\x02\\x0c\\x01\\xe4\\xff\\xa0\\xff\"\n    \"\\x5e\\xff\\xdc\\xfe\\xbd\\xfe\\xa5\\xff\\x26\\x00\\xd6\\x00\\x11\\x01\\xf9\\x01\"\n    \"\\x2b\\x00\\xdf\\xf8\\x3f\\xf3\\x0c\\xf2\\xed\\xf5\\xc8\\xf9\\x7b\\xfb\\xa1\\xff\"\n    \"\\x5a\\x05\\x9d\\x09\\xae\\x0a\\xa1\\x09\\x98\\x09\\xb0\\x07\\x29\\x02\\xf0\\xfb\"\n    \"\\xa3\\xf8\\x10\\xf9\\x7f\\xf9\\xc3\\xf8\\x13\\xfa\\x01\\xff\\x0c\\x05\\xd1\\x08\"\n    \"\\x5e\\x0a\\x6b\\x0b\\xfd\\x0a\\x84\\x07\\xa4\\x01\\xc8\\xfc\\x52\\xfa\\x84\\xf8\"\n    \"\\x61\\xf6\\x2f\\xf5\\x9e\\xf6\\x1b\\xfa\\xd9\\xfd\\xe1\\x01\\x89\\x06\\x07\\x0b\"\n    \"\\x04\\x0d\\x69\\x0b\\x7c\\x07\\xa4\\x02\\xd5\\xfd\\x63\\xf9\\x8a\\xf6\\xf5\\xf5\"\n    \"\\x1f\\xf7\\x17\\xf9\\x2b\\xfb\\xcd\\xfd\\xc9\\x00\\xc1\\x03\\x2f\\x06\\x62\\x07\"\n    \"\\x3b\\x07\\x46\\x05\\xd2\\x01\\x42\\xfe\\x95\\xfb\\x68\\xfa\\x3e\\xfa\\x4c\\xfa\"\n    \"\\xe5\\xfa\\x47\\xfc\\x8f\\xfe\\xa6\\x01\\x04\\x05\\xbb\\x07\\x87\\x08\\x3d\\x07\"\n    \"\\x10\\x05\\x47\\x03\\xff\\x01\\xcb\\x00\\xe3\\xff\\x77\\xff\\x0a\\xff\\xb9\\xfd\"\n    \"\\xdb\\xfb\\x27\\xfb\\x54\\xfb\\x34\\xfb\\xb8\\xfa\\x56\\xfa\\x54\\xfb\\xb5\\xfc\"\n    \"\\x96\\xfd\\x9e\\xfe\\xb4\\x00\\xb4\\x03\\x44\\x05\\x9a\\x04\\xd7\\x02\\x05\\x01\"\n    \"\\x5a\\xff\\x97\\xfd\\xe2\\xfc\\xcc\\xfd\\xf4\\xfe\\x2b\\xff\\xee\\xfe\\xfe\\xff\"\n    \"\\xb5\\x02\\xad\\x05\\xb7\\x07\\x7e\\x08\\xde\\x07\\xcf\\x05\\xc0\\x02\\x1f\\x00\"\n    \"\\x90\\xfe\\xa1\\xfd\\x6e\\xfc\\xf8\\xfa\\x3d\\xfa\\xb8\\xfa\\x65\\xfc\\xe9\\xfe\"\n    \"\\xef\\x01\\xb1\\x04\\xf1\\x05\\x52\\x05\\x85\\x03\\x77\\x01\\xd3\\xff\\x55\\xfe\"\n    \"\\xb2\\xfc\\x46\\xfb\\x1f\\xfa\\xa3\\xf9\\x8d\\xf9\\x8b\\xf9\\xfb\\xfa\\xed\\xfd\"\n    \"\\x7f\\x01\\x27\\x04\\x23\\x05\\x94\\x05\\xb6\\x05\\x68\\x05\\x54\\x04\\x49\\x02\"\n    \"\\xb4\\xff\\x7f\\xfc\\xda\\xf9\\xab\\xf9\\x84\\xfc\\xcf\\x00\\xbb\\x03\\xbf\\x04\"\n    \"\\x11\\x05\\x55\\x05\\x07\\x05\\xde\\x03\\x6b\\x02\\xc3\\x00\\x4f\\xfe\\xd3\\xfb\"\n    \"\\xf2\\xfa\\xc4\\xfb\\x9a\\xfc\\x2b\\xfc\\x78\\xfb\\x20\\xfc\\xea\\xfc\\xd9\\xfb\"\n    \"\\xdc\\xfa\\x15\\xfc\\x17\\xff\\x17\\x01\\xa1\\x00\\x1c\\x01\\x45\\x03\\xf1\\x04\"\n    \"\\xcc\\x04\\x8c\\x03\\x8f\\x03\\x66\\x03\\x78\\x01\\x44\\xff\\x97\\xfe\\x95\\xff\"\n    \"\\xad\\xff\\x58\\xfe\\x0f\\xfe\\x95\\xff\\xdb\\x01\\x33\\x03\\xc2\\x03\\x9d\\x04\"\n    \"\\xb9\\x04\\x6e\\x03\\x87\\x01\\x16\\x00\\xfe\\xfe\\x03\\xfd\\xbe\\xfa\\xff\\xf9\"\n    \"\\x19\\xfb\\x0f\\xfd\\xf9\\xfe\\xec\\x00\\xae\\x02\\x47\\x03\\xcf\\x02\\x3e\\x02\"\n    \"\\x1a\\x02\\x80\\x01\\xf9\\xff\\x0a\\xfe\\x90\\xfc\\xa9\\xfb\\x6f\\xfb\\x73\\xfc\"\n    \"\\x8e\\xfe\\x92\\x00\\x68\\x01\\x8a\\x01\\x05\\x02\\xbf\\x02\\xf9\\x02\\x87\\x02\"\n    \"\\x9b\\x01\\xb5\\x00\\x56\\xff\\x57\\xfe\\x6a\\xfe\\x36\\xff\\xbd\\xff\\xc7\\xff\"\n    \"\\x72\\xff\\xd2\\xff\\xa7\\x00\\x20\\x01\\x52\\x01\\x6a\\x01\\x63\\x01\\x86\\x00\"\n    \"\\x4a\\xfe\\xd8\\xfb\\x0a\\xfb\\xce\\xf9\\x29\\xf9\\x16\\xf9\\xc4\\xfa\\xfc\\xfd\"\n    \"\\x69\\x00\\x66\\x03\\x52\\x06\\x7e\\x08\\x11\\x09\\x6b\\x07\\x8e\\x05\\x85\\x03\"\n    \"\\xbe\\x00\\xc3\\xfd\\x13\\xfb\\x31\\xfa\\x97\\xfa\\xd1\\xfb\\x4f\\xfe\\x6b\\x01\"\n    \"\\x1b\\x04\\x41\\x05\\x29\\x05\\x13\\x05\\x83\\x04\\x2b\\x03\\xdd\\x00\\x4a\\xfe\"\n    \"\\xed\\xfb\\xe4\\xf9\\xd5\\xf8\\x5d\\xf9\\x3c\\xfb\\x8a\\xfd\\xa9\\xff\\xe3\\x01\"\n    \"\\x41\\x04\\x4a\\x06\\x3d\\x07\\xc6\\x06\\x41\\x05\\x95\\x02\\x71\\xff\\x8f\\xfc\"\n    \"\\xd3\\xfa\\x17\\xfa\\x06\\xfa\\x31\\xfa\\x7a\\xfa\\x75\\xfb\\xa5\\xfd\\xbf\\x00\"\n    \"\\x39\\x03\\x15\\x04\\xf9\\x03\\x17\\x04\\x4e\\x04\\xc9\\x03\\x21\\x02\\xd9\\xff\"\n    \"\\xb3\\xfd\\x2a\\xfc\\xbe\\xfb\\x1b\\xfd\\x7b\\xff\\x89\\x01\\xc5\\x02\\xa5\\x03\"\n    \"\\xf5\\x04\\x20\\x06\\xc9\\x05\\xfc\\x03\\xa0\\x01\\x8b\\xff\\x14\\xfe\\x37\\xfd\"\n    \"\\x43\\xfd\\x3c\\xfd\\x50\\xfb\\xcf\\xf8\\x6b\\xf8\\x3a\\xfa\\xc1\\xfb\\xd9\\xfa\"\n    \"\\xdb\\xf9\\xf0\\xfa\\x1d\\xfe\\x0c\\x02\\xee\\x04\\xa2\\x06\\x41\\x06\\x29\\x04\"\n    \"\\x0b\\x03\\xe4\\x03\\xdd\\x04\\x4b\\x03\\x46\\xff\\x16\\xfc\\xad\\xfb\\x8e\\xfd\"\n    \"\\xe0\\xff\\x73\\x01\\x0e\\x02\\x01\\x02\\x85\\x02\\xa2\\x04\\xc9\\x06\\xad\\x06\"\n    \"\\x17\\x04\\x8b\\x00\\x7f\\xfe\\xb9\\xfd\\x97\\xfc\\x63\\xfa\\x58\\xf8\\xf7\\xf7\"\n    \"\\xde\\xf9\\x74\\xfd\\x08\\x01\\xe3\\x02\\xe5\\x02\\x73\\x02\\x04\\x03\\x8a\\x04\"\n    \"\\x56\\x04\\xac\\x01\\x6f\\xfe\\xd4\\xfc\\x13\\xfd\\xb0\\xfd\\x03\\xfe\\x2b\\xfe\"\n    \"\\x83\\xfe\\xe3\\xff\\x1c\\x02\\x63\\x04\\x42\\x05\\xa7\\x04\\xc6\\x03\\x6e\\x03\"\n    \"\\xa5\\x02\\x82\\x00\\x9d\\xfd\\xa4\\xfb\\x24\\xfb\\x27\\xfb\\xc4\\xfb\\x50\\xfc\"\n    \"\\x0d\\xfd\\xe8\\xfd\\xd8\\xfe\\xcf\\x00\\xed\\x01\\x30\\x01\\x1f\\xff\\x53\\xfa\"\n    \"\\x3d\\xf9\\xe1\\xfb\\x63\\xfd\\xba\\xfb\\x2a\\xf9\\x79\\xfd\\x91\\x04\\xe2\\x08\"\n    \"\\x54\\x09\\xe9\\x07\\xfd\\x07\\x02\\x08\\x57\\x07\\xd4\\x06\\x16\\x04\\xab\\xfe\"\n    \"\\xa0\\xf9\\x00\\xf9\\xfd\\xfb\\xfd\\xfd\\x9e\\xfd\\xea\\xfc\\xaf\\xfe\\x1c\\x02\"\n    \"\\x8a\\x04\\x73\\x05\\x98\\x04\\xff\\x01\\x57\\xff\\x2c\\xfe\\xd3\\xfd\\xf8\\xfb\"\n    \"\\xd0\\xf8\\x97\\xf7\\x0d\\xfa\\xe5\\xfd\\x0e\\x00\\xf1\\x00\\x1d\\x02\\x18\\x04\"\n    \"\\x45\\x06\\x16\\x07\\x96\\x06\\x45\\x04\\x02\\x01\\xd7\\xfe\\x1d\\xfe\\xbf\\xfd\"\n    \"\\x0e\\xfc\\x43\\xfa\\x71\\xfa\\x97\\xfc\\x35\\xff\\x92\\x00\\x2a\\x01\\xea\\x01\"\n    \"\\x98\\x02\\x20\\x03\\xd5\\x02\\xc5\\x01\\x67\\xff\\x4f\\xfc\\x3a\\xfb\\x19\\xfc\"\n    \"\\xd6\\xfc\\xe0\\xfb\\x7f\\xfb\\xbc\\xfd\\x39\\x01\\x05\\x04\\x40\\x05\\xda\\x05\"\n    \"\\x01\\x06\\xa8\\x05\\x2c\\x05\\xda\\x03\\x72\\x01\\xc7\\xfe\\x36\\xfd\\x38\\xfd\"\n    \"\\x72\\xfd\\xb6\\xfd\\x96\\xfe\\xee\\xff\\x3d\\x01\\x59\\x02\\xf8\\x02\\xa4\\x02\"\n    \"\\x5f\\x01\\x03\\x00\\x0c\\xff\\x5c\\xfe\\xe7\\xfd\\xe7\\xfc\\x62\\xfb\\x78\\xfa\"\n    \"\\x91\\xfa\\xc1\\xfa\\x38\\xfa\\xc3\\xf9\\x7c\\xfa\\xed\\xfb\\xa6\\xfd\\xc2\\xff\"\n    \"\\x50\\x02\\x9a\\x04\\xf3\\x05\\x12\\x07\\x1d\\x08\\x57\\x08\\x2a\\x07\\x16\\x05\"\n    \"\\x11\\x03\\x49\\x01\\xaf\\xff\\x49\\xfe\\x6a\\xfd\\xf4\\xfc\\xf4\\xfc\\xae\\xfd\"\n    \"\\xf5\\xfe\\x9d\\x00\\x11\\x02\\xf5\\x02\\x56\\x03\\x34\\x03\\x6a\\x02\\x18\\x01\"\n    \"\\x73\\xff\\xa6\\xfd\\x1f\\xfc\\x5b\\xfb\\x87\\xfb\\x71\\xfc\\xaf\\xfd\\x31\\xff\"\n    \"\\x32\\x01\\x60\\x03\\xc1\\x04\\xdb\\x04\\x74\\x04\\xa5\\x03\\xa2\\x02\\x08\\x01\"\n    \"\\x39\\xff\\xad\\xfd\\x6d\\xfc\\x72\\xfb\\x7b\\xfa\\x1d\\xfa\\x1f\\xfa\\x80\\xfa\"\n    \"\\xc3\\xfa\\x62\\xfb\\x95\\xfc\\xed\\xfd\\x44\\xff\\x68\\x00\\x6a\\x01\\x4a\\x02\"\n    \"\\x0a\\x03\\xaf\\x03\\xe3\\x03\\x77\\x03\\xc0\\x02\\x6b\\x02\\xaf\\x02\\xbb\\x02\"\n    \"\\x79\\x02\\x4b\\x02\\xbf\\x02\\x53\\x03\\x45\\x03\\xde\\x02\\x92\\x02\\x47\\x02\"\n    \"\\x94\\x01\\x65\\x00\\x2c\\xff\\x4e\\xfe\\xd4\\xfd\\x55\\xfd\\xc9\\xfc\\x98\\xfc\"\n    \"\\xd9\\xfc\\x32\\xfd\\x8a\\xfd\\xd4\\xfd\\x3f\\xfe\\xb8\\xfe\\x25\\xff\\x9b\\xff\"\n    \"\\x2c\\x00\\x7f\\x00\\x63\\x00\\xe5\\x00\\x81\\x01\\x90\\x01\\x4a\\xff\\x68\\xfd\"\n    \"\\x43\\xfe\\x31\\xff\\xbd\\xfd\\xd7\\xfb\\x29\\xfd\\x0e\\x00\\xe8\\x01\\x95\\x02\"\n    \"\\xa2\\x03\\xfb\\x04\\x5b\\x05\\x45\\x05\\xfc\\x04\\x99\\x03\\x9c\\x01\\x46\\x00\"\n    \"\\x50\\xff\\xb2\\xfd\\x98\\xfc\\xbc\\xfc\\x9a\\xfd\\xe3\\xfd\\x8c\\xfe\\x75\\xff\"\n    \"\\x4f\\x00\\x64\\x00\\x76\\x00\\x76\\x00\\xa6\\xff\\xab\\xfe\\x7b\\xfe\\x08\\xfe\"\n    \"\\xb1\\xfd\\x79\\xfd\\x54\\xfe\\x11\\x00\\xd9\\x00\\xd1\\x01\\x91\\x01\\x44\\xff\"\n    \"\\x19\\xfc\\x1a\\xff\\xbf\\x00\\x9f\\xfc\\x2d\\xf8\\x04\\xfb\\x94\\x01\\xc1\\x03\"\n    \"\\xb5\\x02\\x2c\\x02\\x0f\\x05\\x14\\x07\\x92\\x07\\x6d\\x06\\xd9\\x03\\xc2\\x00\"\n    \"\\xfa\\xff\\x4d\\x00\\x88\\xfe\\x84\\xfb\\x04\\xfb\\x11\\xfd\\xab\\xfe\\x78\\xfe\"\n    \"\\x67\\xfe\\xf5\\xff\\xa2\\x02\\x0c\\x04\\x82\\x03\\x72\\x02\\xea\\x01\\xbf\\x01\"\n    \"\\xb1\\x00\\xed\\xfe\\x01\\xfd\\x28\\xfc\\x54\\xfc\\xa2\\xfc\\x71\\xfc\\x92\\xfc\"\n    \"\\xa6\\xfd\\x76\\xff\\xcd\\x00\\x75\\x01\\x77\\x01\\x92\\x01\\x53\\x02\\x2a\\x03\"\n    \"\\x75\\x02\\xaa\\xff\\xf7\\xfd\\x64\\xfe\\xc1\\xfe\\x26\\xfd\\xc1\\xfb\\xca\\xfc\"\n    \"\\x3f\\xff\\x4a\\x01\\xe6\\x01\\x53\\x02\\x36\\x03\\x23\\x04\\x52\\x04\\x73\\x03\"\n    \"\\xe7\\x01\\x93\\x00\\x74\\x00\\x9d\\x00\\xf3\\xff\\x2a\\xff\\xa1\\xff\\xfa\\x00\"\n    \"\\xa9\\x01\\x0c\\x01\\x87\\x00\\xbf\\x00\\x1a\\x01\\x46\\x00\\xa6\\xfe\\x9e\\xfd\"\n    \"\\x48\\xfd\\x67\\xfd\\xfb\\xfb\\x09\\xfa\\x00\\xf9\\x7b\\xf9\\xed\\xf9\\xaf\\xf9\"\n    \"\\x0a\\xfa\\x57\\xfb\\x50\\xfd\\x47\\xff\\xbd\\x01\\xaf\\x03\\x17\\x05\\x8e\\x06\"\n    \"\\x32\\x08\\xd0\\x08\\xf4\\x07\\x93\\x06\\x9c\\x05\\xe4\\x04\\x96\\x03\\xc3\\x01\"\n    \"\\x35\\x00\\x84\\xff\\x50\\xff\\xfb\\xfe\\xd1\\xfe\\x13\\xff\\x39\\xff\\x06\\xff\"\n    \"\\xda\\xfe\\xdd\\xfe\\x8c\\xfe\\x1b\\xfe\\xcd\\xfd\\xcd\\xfd\\xd7\\xfd\\x17\\xfe\"\n    \"\\x93\\xfe\\x39\\xff\\x68\\xff\\xa6\\xff\\x71\\x00\\x5c\\x01\\x89\\x01\\xfd\\x00\"\n    \"\\x30\\x01\\x6d\\x01\\x9b\\x01\\x9a\\x00\\x24\\xff\\x6d\\xfe\\xaa\\xfd\\x61\\xfc\"\n    \"\\x52\\xfb\\xa7\\xfa\\x3e\\xfa\\xbb\\xfa\\xb2\\xfb\\xc8\\xfc\\xf9\\xfd\\xaa\\xff\"\n    \"\\xa3\\x01\\x41\\x03\\x47\\x04\\x0b\\x05\\x7d\\x05\\xaa\\x05\\x51\\x05\\xc9\\x04\"\n    \"\\xfe\\x03\\x15\\x03\\x92\\x02\\x2c\\x02\\x77\\x01\\xd0\\x00\\xab\\x00\\x8b\\x00\"\n    \"\\x28\\x00\\x80\\xff\\x0b\\xff\\xb0\\xfe\\x4a\\xfe\\xf5\\xfd\\xa8\\xfd\\x58\\xfd\"\n    \"\\x2f\\xfd\\x71\\xfd\\xe5\\xfd\\x6c\\xfe\\x02\\xff\\x6d\\xff\\xa2\\xff\\x16\\x00\"\n    \"\\x9a\\x00\\xf7\\x00\\xcd\\x00\\xae\\x00\\xa3\\x00\\xa1\\x00\\xa1\\x00\\xa2\\x00\"\n    \"\\x6f\\x00\\x4d\\xff\\x20\\xfe\\x29\\xfc\\xb2\\xfb\\x70\\xfc\\xcb\\xfb\\x42\\xfa\"\n    \"\\x1e\\xfb\\x2c\\xfe\\x8d\\x00\\xff\\x01\\x13\\x03\\xb0\\x04\\x55\\x06\\x5f\\x07\"\n    \"\\xc7\\x06\\xad\\x05\\xd0\\x04\\x11\\x04\\x01\\x03\\x73\\x01\\x31\\x00\\xf6\\xff\"\n    \"\\xeb\\xff\\x74\\xff\\x8a\\xfe\\x2a\\xfe\\x9a\\xfe\\xd4\\xfe\\x10\\xfe\\x92\\xfc\"\n    \"\\x00\\xfc\\xb5\\xfc\\xce\\xfc\\xaf\\xfb\\x43\\xfb\\x21\\xfc\\x73\\xfd\\x33\\xfe\"\n    \"\\x95\\xfe\\x32\\xff\\x3b\\x00\\x7d\\x01\\x37\\x02\\xfe\\x01\\x0a\\x02\\x83\\x02\"\n    \"\\xbb\\x02\\x8b\\x02\\x13\\x02\\xf4\\x01\\x1f\\x02\\x15\\x02\\xb4\\x01\\x0f\\x01\"\n    \"\\xc3\\x00\\xfa\\x00\\xef\\x00\\xf9\\xff\\x2a\\xff\\x10\\xff\\x69\\xff\\xf7\\xfe\"\n    \"\\x34\\xfe\\xa6\\xfd\\x10\\xfe\\xd4\\xfe\\x51\\xff\\x61\\xff\\xbb\\xff\\x7e\\x00\"\n    \"\\x4f\\x01\\xde\\x01\\xcc\\x01\\xae\\x01\\x8f\\x01\\x92\\x01\\x33\\x01\\x98\\x00\"\n    \"\\x8d\\xff\\x6d\\xff\\xd5\\xfe\\xaf\\xfe\\x0b\\xfe\\x6f\\xfe\\x2d\\xfe\\x67\\xfe\"\n    \"\\x82\\xfe\\x83\\xff\\x86\\xff\\x0e\\x00\\x73\\xff\\x01\\x00\\xeb\\xfe\\x29\\xfb\"\n    \"\\x60\\xfe\\x3d\\xff\\xfd\\xfc\\x4c\\xfa\\x08\\xfd\\xb8\\xff\\xdb\\x00\\x6e\\x00\"\n    \"\\xa2\\x01\\x1f\\x02\\x63\\x04\\xef\\x05\\xac\\x05\\x0b\\x05\\x2d\\x04\\xfe\\x05\"\n    \"\\xeb\\x05\\xf1\\x03\\xf4\\x01\\x35\\x02\\xbc\\x01\\x93\\x00\\x72\\xfe\\xcc\\xfd\"\n    \"\\x04\\xfc\\x9c\\xfc\\xaf\\xfc\\x71\\xfb\\x40\\xfa\\x20\\xfb\\x84\\xfc\\x88\\xfc\"\n    \"\\x6f\\xfc\\x7b\\xfd\\xb2\\xfe\\xa1\\xff\\xd1\\x00\\x2a\\x01\\xc8\\x01\\x3a\\x02\"\n    \"\\x30\\x03\\x21\\x03\\xcc\\x02\\x0d\\x02\\xf5\\x01\\xc2\\x01\\x65\\x01\\x71\\x00\"\n    \"\\xb9\\xff\\x75\\xff\\x6c\\xff\\x40\\xff\\x1c\\xff\\xd0\\xfe\\x37\\xff\\xda\\xff\"\n    \"\\xdf\\xff\\x0d\\x00\\x1c\\x00\\x85\\x00\\x82\\x00\\x29\\x00\\xcb\\xff\\xbd\\xff\"\n    \"\\xad\\xff\\xb6\\xff\\xa1\\xff\\x7a\\xff\\x94\\xff\\x01\\x00\\x87\\x00\\x60\\x00\"\n    \"\\x1b\\x00\\x56\\x00\\x79\\x00\\x5a\\x00\\xd2\\xff\\x86\\xff\\x6f\\xff\\x60\\xff\"\n    \"\\x4f\\xff\\xf6\\xfe\\xb3\\xfe\\xc4\\xfe\\x57\\xff\\x73\\xff\\x60\\xff\\x75\\xff\"\n    \"\\xfe\\xff\\x3b\\x00\\x19\\x00\\x4a\\x00\\x4d\\x00\\xf3\\xff\\xd8\\xff\\xdd\\xff\"\n    \"\\xae\\xff\\xcd\\xff\\xd5\\xff\\x09\\x00\\x30\\x00\\x68\\x00\\x80\\x00\\x9d\\x00\"\n    \"\\xae\\x00\\xcd\\x00\\xba\\x00\\xa5\\x00\\xa6\\x00\\xb0\\x00\\xa1\\x00\\x9d\\x00\"\n    \"\\xcb\\x00\\x06\\x01\\x20\\x01\\x12\\x01\\x4b\\x01\\x45\\x01\\x3b\\x01\\x18\\x01\"\n    \"\\xd2\\x00\\x77\\x00\\x35\\x00\\xb5\\xff\\x7c\\xff\\x2c\\xff\\xe7\\xfe\\xb1\\xfe\"\n    \"\\x92\\xfe\\x7c\\xfe\\x74\\xfe\\x7a\\xfe\\x9e\\xfe\\xc4\\xfe\\xc8\\xfe\\xfa\\xfe\"\n    \"\\x56\\xff\\xc2\\xff\\xd8\\xff\\x2f\\x00\\x71\\x00\\xba\\x00\\xdc\\x00\\x13\\x01\"\n    \"\\x2e\\x01\\x45\\x01\\x1c\\x01\\x04\\x01\\xf4\\x00\\xc0\\x00\\x86\\x00\\x16\\x00\"\n    \"\\xb6\\xff\\x51\\xff\\x1b\\xff\\xc3\\xfe\\x69\\xfe\\x16\\xfe\\x2b\\xfe\\x46\\xfe\"\n    \"\\x31\\xfe\\x3c\\xfe\\x7f\\xfe\\xc1\\xfe\\xe9\\xfe\\x28\\xff\\x7a\\xff\\xab\\xff\"\n    \"\\xea\\xff\\x3d\\x00\\x63\\x00\\xa2\\x00\\xe3\\x00\\x1c\\x01\\x57\\x01\\x8b\\x01\"\n    \"\\xbc\\x01\\x02\\x02\\x50\\x02\\x60\\x02\\x59\\x02\\x55\\x02\\x4f\\x02\\x3f\\x02\"\n    \"\\xe7\\x01\\x82\\x01\\x26\\x01\\xc0\\x00\\x67\\x00\\x16\\x00\\xa6\\xff\\x35\\xff\"\n    \"\\xeb\\xfe\\xdb\\xfe\\x9c\\xfe\\x67\\xfe\\x59\\xfe\\x59\\xfe\\x5d\\xfe\\x63\\xfe\"\n    \"\\x72\\xfe\\x7e\\xfe\\x87\\xfe\\xc3\\xfe\\x20\\xff\\x37\\xff\\x3f\\xff\\x52\\xff\"\n    \"\\xb6\\xff\\xd9\\xff\\xd6\\xff\\xd0\\xff\\xe0\\xff\\xee\\xff\\x12\\x00\\x10\\x00\"\n    \"\\x15\\x00\\x31\\x00\\x61\\x00\\x7d\\x00\\x7c\\x00\\xa7\\x00\\xbc\\x00\\xc4\\x00\"\n    \"\\xcf\\x00\\xe7\\x00\\xcc\\x00\\xd8\\x00\\xdd\\x00\\x03\\x01\\xe8\\x00\\xd4\\x00\"\n    \"\\xf3\\x00\\x03\\x01\\xe9\\x00\\xf0\\x00\\xfb\\x00\\xc3\\x00\\x96\\x00\\x84\\x00\"\n    \"\\x6a\\x00\\x07\\x00\\xa4\\xff\\x61\\xff\\x24\\xff\\xe5\\xfe\\xa5\\xfe\\x60\\xfe\"\n    \"\\x2c\\xfe\\x11\\xfe\\x0e\\xfe\\xe8\\xfd\\xc1\\xfd\\xbc\\xfd\\xbe\\xfd\\xc0\\xfd\"\n    \"\\xec\\xfd\\x1f\\xfe\\x52\\xfe\\xa2\\xfe\\x39\\xff\\xd3\\xff\\x2d\\x00\\xa7\\x00\"\n    \"\\x3e\\x01\\xce\\x01\\x36\\x02\\x79\\x02\\xb0\\x02\\xc4\\x02\\xe0\\x02\\xea\\x02\"\n    \"\\xc0\\x02\\x7b\\x02\\x3c\\x02\\x10\\x02\\xca\\x01\\x77\\x01\\x31\\x01\\xf5\\x00\"\n    \"\\xb7\\x00\\x81\\x00\\x44\\x00\\xf6\\xff\\xb8\\xff\\x9d\\xff\\x69\\xff\\x0c\\xff\"\n    \"\\xc0\\xfe\\x92\\xfe\\x60\\xfe\\x27\\xfe\\xf3\\xfd\\xcb\\xfd\\xc4\\xfd\\xe8\\xfd\"\n    \"\\x04\\xfe\\x1a\\xfe\\x39\\xfe\\x71\\xfe\\xcb\\xfe\\x11\\xff\\x45\\xff\\x6f\\xff\"\n    \"\\xbb\\xff\\x18\\x00\\x5c\\x00\\x71\\x00\\x81\\x00\\x9d\\x00\\xb1\\x00\\xb4\\x00\"\n    \"\\xa5\\x00\\xa4\\x00\\x8d\\x00\\x8c\\x00\\xae\\x00\\xc6\\x00\\xc3\\x00\\xd2\\x00\"\n    \"\\x00\\x01\\x38\\x01\\x49\\x01\\x54\\x01\\x6d\\x01\\x76\\x01\\x89\\x01\\x83\\x01\"\n    \"\\x64\\x01\\x2a\\x01\\xfb\\x00\\xd1\\x00\\x82\\x00\\x19\\x00\\xd0\\xff\\x82\\xff\"\n    \"\\x41\\xff\\xf4\\xfe\\xad\\xfe\\x72\\xfe\\x3f\\xfe\\x2e\\xfe\\x20\\xfe\\x18\\xfe\"\n    \"\\x0b\\xfe\\x24\\xfe\\x57\\xfe\\x96\\xfe\\xb3\\xfe\\xef\\xfe\\x40\\xff\\x85\\xff\"\n    \"\\xc2\\xff\\xf6\\xff\\x1b\\x00\\x4a\\x00\\x6c\\x00\\x82\\x00\\x94\\x00\\x89\\x00\"\n    \"\\x73\\x00\\x72\\x00\\x7b\\x00\\x7e\\x00\\x7f\\x00\\x7f\\x00\\x93\\x00\\xb0\\x00\"\n    \"\\xe2\\x00\\x03\\x01\\x0f\\x01\\x2c\\x01\\x50\\x01\\x55\\x01\\x4d\\x01\\x42\\x01\"\n    \"\\x29\\x01\\xfc\\x00\\xcc\\x00\\x9a\\x00\\x62\\x00\\x1c\\x00\\xdc\\xff\\xb8\\xff\"\n    \"\\x88\\xff\\x5b\\xff\\x36\\xff\\x19\\xff\\x09\\xff\\xe3\\xfe\\xdc\\xfe\\xe1\\xfe\"\n    \"\\xf1\\xfe\\xd4\\xfe\\xda\\xfe\\xe7\\xfe\\x0b\\xff\\x19\\xff\\x45\\xff\\x77\\xff\"\n    \"\\xa7\\xff\\xdc\\xff\\x2d\\x00\\x77\\x00\\xae\\x00\\xcc\\x00\\xf3\\x00\\x19\\x01\"\n    \"\\xf8\\x00\\x0b\\x01\\xa4\\x00\\x13\\x01\\xa7\\x00\\x4b\\x00\\x80\\x00\\xf9\\xff\"\n    \"\\x0b\\x00\\x9f\\xff\\xdc\\xff\\x4a\\xff\\x4c\\xfd\\x29\\x00\\x8e\\xff\\x45\\xff\"\n    \"\\xee\\xff\\x91\\x00\\x21\\x01\\xb2\\xff\\x6d\\x02\\x77\\x00\\x59\\x00\\x44\\x00\"\n    \"\\xdb\\xff\\x60\\xfe\\xd7\\xfe\\x44\\x00\\xd0\\xfe\\x5f\\xff\\x4a\\xff\\x2f\\x00\"\n    \"\\x5d\\x00\\xbb\\x00\\xfe\\x00\\x52\\x00\\xd4\\xff\\x11\\x00\\xd0\\xff\\xb6\\xff\"\n    \"\\xfe\\xfe\\xcc\\xff\\x9a\\xff\\x09\\xff\\x85\\xff\\xc8\\xff\\xed\\xff\\xa2\\xff\"\n    \"\\x8f\\x00\\x14\\x00\\x80\\xff\\x0b\\x00\\x2e\\x00\\x93\\xff\\xaa\\xff\\x67\\x00\"\n    \"\\xe6\\xff\\xf9\\xff\\xb1\\x00\\xd4\\x00\\xc4\\x00\\xed\\x00\\xd2\\x01\\x04\\x01\"\n    \"\\x0a\\x01\\x59\\x01\\xbb\\x00\\x94\\x00\\x99\\x00\\x94\\x00\\xd0\\xff\\x9d\\xff\"\n    \"\\x08\\x00\\x4a\\xff\\x2d\\xff\\xbe\\xff\\x34\\xff\\x51\\xff\\x4a\\xff\\xbb\\xff\"\n    \"\\x48\\xff\\xad\\xff\\x97\\xff\\xcc\\xfe\\xca\\xff\\x44\\xff\\xc7\\xff\\xbd\\xff\"\n    \"\\xfc\\xff\\x81\\x00\\xd3\\x00\\x34\\x01\\xaf\\x00\\x67\\x01\\xc9\\x00\\x6c\\x00\"\n    \"\\x10\\x00\\x95\\xff\\x13\\xff\\x0a\\xff\\x18\\xff\\x55\\xfe\\x68\\xfe\\xad\\xfe\"\n    \"\\xbf\\xfe\\xb6\\xfe\\xa0\\xfe\\xa9\\xfe\\x5c\\xff\\xc5\\xfe\\x33\\xfe\\x07\\xff\"\n    \"\\x14\\x00\\xd6\\xff\\x8e\\xff\\xa3\\x00\\xb1\\x01\\x26\\x02\\x73\\x02\\x90\\x02\"\n    \"\\xc9\\x02\\x72\\x03\\x9a\\x03\\xbf\\x02\\xd6\\x01\\x09\\x02\\xea\\x01\\xe6\\x00\"\n    \"\\x01\\x00\\xb0\\xff\\x8d\\xff\\x2d\\xff\\xbe\\xfe\\x4f\\xfe\\x23\\xfe\\x9b\\xfe\"\n    \"\\xd4\\xfe\\xa2\\xfe\\x5e\\xfe\\x0a\\xff\\xa5\\xff\\x9b\\xff\\x75\\xff\\x82\\xff\"\n    \"\\x0d\\x00\\x25\\x00\\x00\\x00\\xb6\\xff\\xe5\\xff\\x14\\x00\\x23\\x00\\xdb\\xff\"\n    \"\\x9d\\xff\\xe4\\xff\\x1f\\x00\\x0e\\x00\\xb5\\xff\\xbb\\xff\\xe2\\xff\\xd9\\xff\"\n    \"\\xd1\\xff\\xc1\\xff\\x94\\xff\\xcd\\xff\\x02\\x00\\xfc\\xff\\xfc\\xff\\x11\\x00\"\n    \"\\x4e\\x00\\x4b\\x00\\x5e\\x00\\x45\\x00\\x1c\\x00\\x3a\\x00\\x3b\\x00\\xcd\\xff\"\n    \"\\xa7\\xff\\xb8\\xff\\x95\\xff\\x60\\xff\\x50\\xff\\x5a\\xff\\x38\\xff\\x85\\xff\"\n    \"\\x9c\\xff\\xa7\\xff\\xbe\\xff\\x2a\\x00\\x61\\x00\\x6b\\x00\\xab\\x00\\xdb\\x00\"\n    \"\\x16\\x01\\x17\\x01\\x21\\x01\\x0d\\x01\\xf5\\x00\\xe8\\x00\\xd6\\x00\\x96\\x00\"\n    \"\\x48\\x00\\x45\\x00\\x5f\\x00\\x27\\x00\\xf0\\xff\\x01\\x00\\x04\\x00\\xdf\\xff\"\n    \"\\xde\\xff\\xdc\\xff\\xbd\\xff\\xdb\\xff\\xc9\\xff\\xad\\xff\\xc9\\xff\\xee\\xff\"\n    \"\\xf0\\xff\\xcd\\xff\\x09\\x00\\x36\\x00\\x28\\x00\\x00\\x00\\xe2\\xff\\xec\\xff\"\n    \"\\xe9\\xff\\xa7\\xff\\x6c\\xff\\x49\\xff\\x43\\xff\\x4a\\xff\\x33\\xff\\x23\\xff\"\n    \"\\x42\\xff\\x61\\xff\\x68\\xff\\x5f\\xff\\x68\\xff\\x73\\xff\\xb5\\xff\\xc1\\xff\"\n    \"\\x4d\\xff\\x48\\xff\\x94\\xff\\x98\\xff\\x3d\\xff\\x6c\\xff\\x81\\xff\\x8e\\xff\"\n    \"\\x51\\x00\\xbe\\x00\\x92\\x00\\xe7\\x00\\xb6\\x01\\x2f\\x02\\xcb\\x01\\xb3\\x01\"\n    \"\\xe0\\x01\\xbc\\x01\\xb2\\x01\\x11\\x01\\xa0\\x00\\x85\\x00\\x81\\x00\\x20\\x00\"\n    \"\\x67\\xff\\x56\\xff\\x89\\xff\\x78\\xff\\x14\\xff\\x00\\xff\\x3f\\xff\\x65\\xff\"\n    \"\\xc1\\xff\\xca\\xff\\xaa\\xff\\xe2\\xff\\x66\\x00\\x76\\x00\\x13\\x00\\x23\\x00\"\n    \"\\x47\\x00\\x34\\x00\\x32\\x00\\x22\\x00\\xe5\\xff\\xee\\xff\\x35\\x00\\x2c\\x00\"\n    \"\\xe1\\xff\\xf5\\xff\\x49\\x00\\x32\\x00\\x1a\\x00\\x23\\x00\\xe9\\xff\\xd0\\xff\"\n    \"\\xd9\\xff\\xcb\\xff\\x4f\\xff\\x14\\xff\\x31\\xff\\x20\\xff\\x2e\\xff\\x13\\xff\"\n    \"\\xef\\xfe\\x2d\\xff\\xc1\\xff\\xde\\xff\\x65\\xff\\x9a\\xff\\x44\\x00\\x35\\x00\"\n    \"\\xc6\\xff\\xb0\\xff\\xfc\\xff\\x1e\\x00\\xf1\\xff\\xad\\xff\\xaf\\xff\\xd4\\xff\"\n    \"\\xb0\\xff\\xa4\\xff\\xa1\\xff\\x93\\xff\\xd3\\xff\\x1b\\x00\\x2c\\x00\\x6e\\x00\"\n    \"\\xc2\\x00\\xd6\\x00\\x02\\x01\\x48\\x01\\x2a\\x01\\x0d\\x01\\x2a\\x01\\x29\\x01\"\n    \"\\xf5\\x00\\xc6\\x00\\x9d\\x00\\xa8\\x00\\xb9\\x00\\x5c\\x00\\x2d\\x00\\x5f\\x00\"\n    \"\\x45\\x00\\xed\\xff\\x18\\x00\\x26\\x00\\xc6\\xff\\xd3\\xff\\x0d\\x00\\xda\\xff\"\n    \"\\x9c\\xff\\xc6\\xff\\xd6\\xff\\x83\\xff\\x7f\\xff\\x62\\xff\\x3a\\xff\\x3e\\xff\"\n    \"\\x52\\xff\\x5b\\xff\\x42\\xff\\x67\\xff\\xac\\xff\\xc7\\xff\\xa5\\xff\\xbd\\xff\"\n    \"\\xf3\\xff\\xef\\xff\\xf3\\xff\\x0a\\x00\\x0d\\x00\\x0f\\x00\\x24\\x00\\x3f\\x00\"\n    \"\\x15\\x00\\x1e\\x00\\x35\\x00\\x20\\x00\\x1e\\x00\\x0f\\x00\\xf3\\xff\\x01\\x00\"\n    \"\\x18\\x00\\xde\\xff\\xc2\\xff\\xdb\\xff\\xdd\\xff\\xb2\\xff\\xc9\\xff\\xd8\\xff\"\n    \"\\xbb\\xff\\xd0\\xff\\xf5\\xff\\x02\\x00\\xe5\\xff\\x0a\\x00\\x2b\\x00\\x01\\x00\"\n    \"\\xf3\\xff\\x06\\x00\\x0f\\x00\\xf4\\xff\\xee\\xff\\xf0\\xff\\xdf\\xff\\x01\\x00\"\n    \"\\x0d\\x00\\xd4\\xff\\xc4\\xff\\xfa\\xff\\x0c\\x00\\xdd\\xff\\xe4\\xff\\x16\\x00\"\n    \"\\x14\\x00\\x37\\x00\\x6a\\x00\\x7b\\x00\\x7b\\x00\\x91\\x00\\xe7\\x00\\xf7\\x00\"\n    \"\\xc4\\x00\\xbc\\x00\\xea\\x00\\xe6\\x00\\x86\\x00\\x69\\x00\\x67\\x00\\x31\\x00\"\n    \"\\x06\\x00\\xed\\xff\\xaa\\xff\\x57\\xff\\xa3\\xff\\xe3\\xff\\x6f\\xff\\x1d\\xff\"\n    \"\\x73\\xff\\xe3\\xff\\x8e\\xff\\x35\\xff\\x5f\\xff\\x98\\xff\\xa4\\xff\\x7e\\xff\"\n    \"\\x60\\xff\\x69\\xff\\xcb\\xff\\x17\\x00\\xd4\\xff\\x8e\\xff\\xf3\\xff\\x6c\\x00\"\n    \"\\x45\\x00\\xe9\\xff\\x13\\x00\\x7a\\x00\\x86\\x00\\x61\\x00\\x4a\\x00\\x5e\\x00\"\n    \"\\x89\\x00\\x8b\\x00\\x42\\x00\\xf2\\xff\\x0c\\x00\\x4a\\x00\\x24\\x00\\xc9\\xff\"\n    \"\\xbf\\xff\\x1b\\x00\\x33\\x00\\xf1\\xff\\xaf\\xff\\xdc\\xff\\x31\\x00\\x2a\\x00\"\n    \"\\xe6\\xff\\xbb\\xff\\xf3\\xff\\x3c\\x00\\x2b\\x00\\xc2\\xff\\x9c\\xff\\xd1\\xff\"\n    \"\\x02\\x00\\xc7\\xff\\x6c\\xff\\x7b\\xff\\xc0\\xff\\xe5\\xff\\xb6\\xff\\x8e\\xff\"\n    \"\\xa8\\xff\\xe3\\xff\\xfb\\xff\\xca\\xff\\xab\\xff\\xe9\\xff\\x28\\x00\\x1a\\x00\"\n    \"\\xf1\\xff\\xfc\\xff\\x2c\\x00\\x39\\x00\\x22\\x00\\xed\\xff\\xfd\\xff\\x1b\\x00\"\n    \"\\x11\\x00\\x02\\x00\\x02\\x00\\x0c\\x00\\x21\\x00\\x34\\x00\\x37\\x00\\x1b\\x00\"\n    \"\\x1c\\x00\\x34\\x00\\x30\\x00\\x2a\\x00\\x1a\\x00\\x2d\\x00\\x3e\\x00\\x44\\x00\"\n    \"\\x27\\x00\\x2b\\x00\\x4e\\x00\\x39\\x00\\x17\\x00\\x19\\x00\\x1b\\x00\\x12\\x00\"\n    \"\\x10\\x00\\x04\\x00\\xfe\\xff\\xf7\\xff\\xeb\\xff\\xf3\\xff\\xf4\\xff\\xf1\\xff\"\n    \"\\xe8\\xff\\xf8\\xff\\x0f\\x00\\x13\\x00\\x23\\x00\\x22\\x00\\x31\\x00\\x3a\\x00\"\n    \"\\x42\\x00\\x33\\x00\\x23\\x00\\x2c\\x00\\x1d\\x00\\x09\\x00\\x03\\x00\\xff\\xff\"\n    \"\\xfe\\xff\\xee\\xff\\xe9\\xff\\xdc\\xff\\xdc\\xff\\xe7\\xff\\xd0\\xff\\xc4\\xff\"\n    \"\\xaf\\xff\\xaa\\xff\\xb8\\xff\\xaf\\xff\\xa2\\xff\\x9e\\xff\\xb5\\xff\\xc5\\xff\"\n    \"\\xb1\\xff\\xb7\\xff\\xc5\\xff\\xd3\\xff\\xd4\\xff\\xc4\\xff\\xc9\\xff\\xe2\\xff\"\n    \"\\xff\\xff\\x00\\x00\\xf8\\xff\\x12\\x00\\x2b\\x00\\x29\\x00\\x2f\\x00\\x30\\x00\"\n    \"\\x3a\\x00\\x3e\\x00\\x43\\x00\\x40\\x00\\x3b\\x00\\x3d\\x00\\x42\\x00\\x35\\x00\"\n    \"\\x26\\x00\\x39\\x00\\x43\\x00\\x35\\x00\\x1b\\x00\\x21\\x00\\x30\\x00\\x31\\x00\"\n    \"\\x15\\x00\\x00\\x00\\xef\\xff\\xfb\\xff\\xf0\\xff\\xc9\\xff\\xbf\\xff\\xc2\\xff\"\n    \"\\xdc\\xff\\xc7\\xff\\xc0\\xff\\xcd\\xff\\xe0\\xff\\xf7\\xff\\xe3\\xff\\xe2\\xff\"\n    \"\\xf1\\xff\\x00\\x00\\x0f\\x00\\x01\\x00\\xfd\\xff\\x08\\x00\\x1b\\x00\\x0e\\x00\"\n    \"\\xf6\\xff\\xf6\\xff\\xfa\\xff\\x04\\x00\\xf9\\xff\\xef\\xff\\xf0\\xff\\xfc\\xff\"\n    \"\\x0a\\x00\\xf9\\xff\\xf6\\xff\\x02\\x00\\x07\\x00\\x0a\\x00\\x01\\x00\\xfa\\xff\"\n    \"\\x0b\\x00\\x22\\x00\\x1c\\x00\\x07\\x00\\x0f\\x00\\x20\\x00\\x21\\x00\\x17\\x00\"\n    \"\\x06\\x00\\x01\\x00\\x06\\x00\\x02\\x00\\xef\\xff\\xe6\\xff\\xf2\\xff\\x00\\x00\"\n    \"\\xf9\\xff\\xec\\xff\\xec\\xff\\xfe\\xff\\xfe\\xff\\xef\\xff\\xe5\\xff\\xf4\\xff\"\n    \"\\xff\\xff\\x01\\x00\\x04\\x00\\xff\\xff\\x04\\x00\\x10\\x00\\x17\\x00\\x0f\\x00\"\n    \"\\x0b\\x00\\x17\\x00\\x24\\x00\\x23\\x00\\x19\\x00\\x1a\\x00\\x2d\\x00\\x1f\\x00\"\n    \"\\x18\\x00\\x10\\x00\\x06\\x00\\x02\\x00\\xff\\xff\\xf7\\xff\\xef\\xff\\xe8\\xff\"\n    \"\\xf6\\xff\\xf9\\xff\\xe6\\xff\\xdb\\xff\\xdc\\xff\\xe8\\xff\\xdb\\xff\\xdb\\xff\"\n    \"\\xe2\\xff\\xf1\\xff\\xf0\\xff\\xf8\\xff\\xf7\\xff\\xee\\xff\\xf8\\xff\\xfb\\xff\"\n    \"\\xf7\\xff\\xf1\\xff\\xf9\\xff\\x02\\x00\\xfe\\xff\\x09\\x00\\x15\\x00\\x0f\\x00\"\n    \"\\x10\\x00\\x0d\\x00\\x08\\x00\\x05\\x00\\x0c\\x00\\x0f\\x00\\x08\\x00\\x0b\\x00\"\n    \"\\x04\\x00\\x08\\x00\\x18\\x00\\x10\\x00\\x04\\x00\\x0a\\x00\\x17\\x00\\x15\\x00\"\n    \"\\x11\\x00\\x0f\\x00\\x13\\x00\\x14\\x00\\x0e\\x00\\x0c\\x00\\x01\\x00\\xf7\\xff\"\n    \"\\xfa\\xff\\xf5\\xff\\xef\\xff\\xef\\xff\\xec\\xff\\xee\\xff\\xe9\\xff\\xe1\\xff\"\n    \"\\xe4\\xff\\xf0\\xff\\xed\\xff\\xed\\xff\\xf4\\xff\\xf6\\xff\\xf4\\xff\\xfe\\xff\"\n    \"\\x06\\x00\\x03\\x00\\x0a\\x00\\x12\\x00\\x14\\x00\\x13\\x00\\x19\\x00\\x15\\x00\"\n    \"\\x0a\\x00\\x03\\x00\\x00\\x00\\xf9\\xff\\xed\\xff\\xe3\\xff\\xe9\\xff\\xe5\\xff\";\n"
  },
  {
    "path": "native-audio/app/src/main/cpp/hello_clip.h",
    "content": "\"\\x00\\x00\\xfd\\xff\\x01\\x00\\x01\\x00\\xf9\\xff\\xfb\\xff\\x02\\x00\\x05\\x00\"\n    \"\\x01\\x00\\x03\\x00\\x06\\x00\\x0a\\x00\\x0a\\x00\\x09\\x00\\x04\\x00\\x04\\x00\"\n    \"\\x06\\x00\\x06\\x00\\x00\\x00\\xff\\xff\\x05\\x00\\x08\\x00\\x01\\x00\\xfe\\xff\"\n    \"\\xff\\xff\\x03\\x00\\x04\\x00\\xfe\\xff\\xf9\\xff\\xfd\\xff\\x04\\x00\\xfe\\xff\"\n    \"\\x03\\x00\\x04\\x00\\x01\\x00\\xfb\\xff\\xfb\\xff\\xfc\\xff\\xfb\\xff\\x03\\x00\"\n    \"\\xfc\\xff\\xf9\\xff\\xfc\\xff\\x01\\x00\\x06\\x00\\x00\\x00\\xf9\\xff\\xfa\\xff\"\n    \"\\x04\\x00\\x06\\x00\\xfe\\xff\\xfa\\xff\\xfd\\xff\\x01\\x00\\xfe\\xff\\xfe\\xff\"\n    \"\\xfe\\xff\\xfd\\xff\\xfd\\xff\\xfd\\xff\\xfe\\xff\\xff\\xff\\xfd\\xff\\xfa\\xff\"\n    \"\\xfe\\xff\\x00\\x00\\x03\\x00\\xfe\\xff\\xfc\\xff\\xfb\\xff\\xfe\\xff\\x01\\x00\"\n    \"\\x02\\x00\\x01\\x00\\xff\\xff\\x09\\x00\\x0c\\x00\\x10\\x00\\x07\\x00\\x07\\x00\"\n    \"\\x04\\x00\\x00\\x00\\x02\\x00\\xf5\\xff\\xf7\\xff\\x02\\x00\\x08\\x00\\xfe\\xff\"\n    \"\\xfe\\xff\\x05\\x00\\x06\\x00\\x05\\x00\\x00\\x00\\xfb\\xff\\xf9\\xff\\xf6\\xff\"\n    \"\\xf7\\xff\\xfd\\xff\\x02\\x00\\xff\\xff\\xff\\xff\\x08\\x00\\x07\\x00\\x08\\x00\"\n    \"\\x04\\x00\\xfe\\xff\\x02\\x00\\x0b\\x00\\x0c\\x00\\x05\\x00\\x04\\x00\\x03\\x00\"\n    \"\\xfe\\xff\\xfe\\xff\\xfb\\xff\\xf3\\xff\\xe8\\xff\\xee\\xff\\xfd\\xff\\x04\\x00\"\n    \"\\xfc\\xff\\x00\\x00\\x01\\x00\\xff\\xff\\xfe\\xff\\xf2\\xff\\xf3\\xff\\xfa\\xff\"\n    \"\\x04\\x00\\xf7\\xff\\xfe\\xff\\x09\\x00\\x0d\\x00\\x0b\\x00\\x08\\x00\\x01\\x00\"\n    \"\\xff\\xff\\x0c\\x00\\x0b\\x00\\x07\\x00\\x01\\x00\\x05\\x00\\x08\\x00\\x0b\\x00\"\n    \"\\x05\\x00\\xfe\\xff\\xf6\\xff\\xf9\\xff\\xfb\\xff\\xfa\\xff\\xf8\\xff\\x02\\x00\"\n    \"\\x05\\x00\\x06\\x00\\x01\\x00\\x00\\x00\\x0c\\x00\\x0b\\x00\\x02\\x00\\xf8\\xff\"\n    \"\\x01\\x00\\xfb\\xff\\xfa\\xff\\x06\\x00\\x07\\x00\\xfb\\xff\\x02\\x00\\x06\\x00\"\n    \"\\x00\\x00\\x01\\x00\\x04\\x00\\xf4\\xff\\xfa\\xff\\x00\\x00\\xf8\\xff\\xf6\\xff\"\n    \"\\x02\\x00\\xfd\\xff\\xf0\\xff\\xfe\\xff\\x00\\x00\\xff\\xff\\xfc\\xff\\x00\\x00\"\n    \"\\xf6\\xff\\x01\\x00\\x08\\x00\\x03\\x00\\xfc\\xff\\x06\\x00\\x0d\\x00\\x01\\x00\"\n    \"\\x04\\x00\\x05\\x00\\x01\\x00\\xf7\\xff\\xff\\xff\\xfc\\xff\\xff\\xff\\x03\\x00\"\n    \"\\x00\\x00\\xfc\\xff\\x06\\x00\\x07\\x00\\xff\\xff\\xfa\\xff\\xfa\\xff\\x02\\x00\"\n    \"\\x00\\x00\\x00\\x00\\xf5\\xff\\xfa\\xff\\xff\\xff\\x06\\x00\\xfc\\xff\\xf9\\xff\"\n    \"\\xff\\xff\\x04\\x00\\x08\\x00\\x06\\x00\\x01\\x00\\xf7\\xff\\xfe\\xff\\xfc\\xff\"\n    \"\\xfe\\xff\\x02\\x00\\x07\\x00\\xfb\\xff\\xfc\\xff\\x08\\x00\\x0b\\x00\\x05\\x00\"\n    \"\\x0a\\x00\\x08\\x00\\x00\\x00\\x08\\x00\\x11\\x00\\x0e\\x00\\xfd\\xff\\xf1\\xff\"\n    \"\\xef\\xff\\xfe\\xff\\x02\\x00\\xf8\\xff\\xf2\\xff\\xfb\\xff\\xfe\\xff\\x0a\\x00\"\n    \"\\xfd\\xff\\xfa\\xff\\xf9\\xff\\xee\\xff\\xf7\\xff\\xff\\xff\\x05\\x00\\xfc\\xff\"\n    \"\\xf6\\xff\\xfd\\xff\\x0f\\x00\\x0a\\x00\\x05\\x00\\xf7\\xff\\xf5\\xff\\xf8\\xff\"\n    \"\\x09\\x00\\x10\\x00\\xff\\xff\\xfd\\xff\\xf4\\xff\\xff\\xff\\xfe\\xff\\xff\\xff\"\n    \"\\xfe\\xff\\xef\\xff\\xfa\\xff\\x06\\x00\\x17\\x00\\x11\\x00\\x13\\x00\\x11\\x00\"\n    \"\\xfe\\xff\\x05\\x00\\x0b\\x00\\xfe\\xff\\xee\\xff\\x07\\x00\\x0b\\x00\\xff\\xff\"\n    \"\\x01\\x00\\x0b\\x00\\x0a\\x00\\x08\\x00\\x0b\\x00\\x02\\x00\\xf4\\xff\\xfa\\xff\"\n    \"\\x0c\\x00\\x00\\x00\\x03\\x00\\x09\\x00\\xf5\\xff\\xf6\\xff\\x06\\x00\\xfc\\xff\"\n    \"\\xf0\\xff\\xff\\xff\\x05\\x00\\xf0\\xff\\x0a\\x00\\x23\\x00\\x08\\x00\\xfd\\xff\"\n    \"\\x03\\x00\\xf7\\xff\\xee\\xff\\x03\\x00\\xfc\\xff\\xe2\\xff\\xf4\\xff\\xfe\\xff\"\n    \"\\xff\\xff\\x10\\x00\\x19\\x00\\xf6\\xff\\xe7\\xff\\xf6\\xff\\xf3\\xff\\xe5\\xff\"\n    \"\\xee\\xff\\xea\\xff\\xdc\\xff\\xf3\\xff\\xf9\\xff\\x02\\x00\\x02\\x00\\x00\\x00\"\n    \"\\xe6\\xff\\xef\\xff\\x02\\x00\\x09\\x00\\x09\\x00\\x0b\\x00\\x09\\x00\\x00\\x00\"\n    \"\\x08\\x00\\x07\\x00\\x11\\x00\\x12\\x00\\x1a\\x00\\x17\\x00\\x2f\\x00\\x35\\x00\"\n    \"\\x2c\\x00\\x2d\\x00\\x20\\x00\\x03\\x00\\x02\\x00\\x12\\x00\\x0e\\x00\\x11\\x00\"\n    \"\\x21\\x00\\x1d\\x00\\x13\\x00\\x25\\x00\\x1c\\x00\\x05\\x00\\xf9\\xff\\xf4\\xff\"\n    \"\\xdd\\xff\\xf1\\xff\\x0c\\x00\\x15\\x00\\x1d\\x00\\x32\\x00\\x2a\\x00\\x1a\\x00\"\n    \"\\x1f\\x00\\xfe\\xff\\xcf\\xff\\xcf\\xff\\xeb\\xff\\xde\\xff\\xf4\\xff\\x03\\x00\"\n    \"\\x00\\x00\\x10\\x00\\x17\\x00\\xf0\\xff\\xcc\\xff\\xc7\\xff\\x8c\\xff\\x58\\xff\"\n    \"\\x5c\\xff\\x4e\\xff\\x0f\\xff\\xf6\\xfe\\xd6\\xfe\\xb5\\xfe\\xc5\\xfe\\xd6\\xfe\"\n    \"\\xe1\\xfe\\x08\\xff\\x5e\\xff\\x9a\\xff\\xe2\\xff\\x43\\x00\\x92\\x00\\xca\\x00\"\n    \"\\x10\\x01\\x32\\x01\\x42\\x01\\x6c\\x01\\x7e\\x01\\x72\\x01\\x6e\\x01\\x71\\x01\"\n    \"\\x56\\x01\\x53\\x01\\x53\\x01\\x30\\x01\\x05\\x01\\xfb\\x00\\xca\\x00\\x8c\\x00\"\n    \"\\x62\\x00\\x1b\\x00\\xbe\\xff\\x8e\\xff\\x67\\xff\\x40\\xff\\x44\\xff\\x61\\xff\"\n    \"\\x6a\\xff\\x80\\xff\\xab\\xff\\xb4\\xff\\xc6\\xff\\xca\\xff\\xb2\\xff\\x80\\xff\"\n    \"\\x79\\xff\\x6f\\xff\\x7d\\xff\\xa1\\xff\\xb5\\xff\\xb4\\xff\\xe1\\xff\\xfb\\xff\"\n    \"\\x0c\\x00\\x1e\\x00\\x30\\x00\\x16\\x00\\xfe\\xff\\xf4\\xff\\xe8\\xff\\xef\\xff\"\n    \"\\xbf\\xff\\x85\\xff\\xf1\\xfe\\x8a\\xfe\\x08\\xfe\\xca\\xfd\\x68\\xfd\\x26\\xfd\"\n    \"\\xd2\\xfc\\xe2\\xfc\\x88\\xfd\\xb4\\xfe\\x28\\x00\\x6c\\x01\\xa8\\x02\\x51\\x03\"\n    \"\\xb6\\x03\\x8a\\x03\\x0f\\x03\\x00\\x02\\x11\\x01\\x34\\x00\\xed\\xff\\x2d\\x00\"\n    \"\\x01\\x01\\xdc\\x01\\xb0\\x02\\x38\\x03\\x22\\x03\\xbb\\x02\\xf8\\x01\\x1e\\x01\"\n    \"\\xfb\\xff\\x1f\\xff\\x2d\\xfe\\xb0\\xfd\\x80\\xfd\\xbb\\xfd\\x0e\\xfe\\xac\\xfe\"\n    \"\\x3b\\xff\\xb0\\xff\\x13\\x00\\x58\\x00\\x82\\x00\\x81\\x00\\x73\\x00\\x01\\x00\"\n    \"\\xa3\\xff\\x2f\\xff\\xf6\\xfe\\xc5\\xfe\\x12\\xff\\x5d\\xff\\xee\\xff\\x7a\\x00\"\n    \"\\xff\\x00\\x56\\x01\\xa1\\x01\\x90\\x01\\x17\\x01\\x8f\\x00\\xc5\\xff\\xf5\\xfe\"\n    \"\\x20\\xfe\\xa3\\xfd\\x1a\\xfd\\xe4\\xfc\\xe0\\xfc\\xfe\\xfc\\x3c\\xfd\\xca\\xfd\"\n    \"\\x1b\\xfe\\xa0\\xfe\\x0b\\xff\\xbf\\xff\\xfc\\xff\\xbb\\x00\\x01\\x01\\x7d\\x01\"\n    \"\\xed\\x01\\x5c\\x02\\xa0\\x02\\xac\\x02\\xd3\\x02\\x5c\\x02\\x42\\x02\\xc1\\x01\"\n    \"\\xb7\\x01\\x4b\\x01\\x9e\\x01\\x4c\\x01\\x60\\x01\\xf1\\x00\\xbc\\x00\\xff\\xff\"\n    \"\\x89\\xff\\xf7\\xfe\\x72\\xfe\\x21\\xfe\\xe5\\xfd\\xf6\\xfd\\xfe\\xfd\\xcb\\xfe\"\n    \"\\x3f\\xff\\x10\\x00\\x65\\x00\\xec\\x00\\xc1\\x00\\xe9\\x00\\xa9\\x00\\xa0\\x00\"\n    \"\\x86\\x00\\xb3\\x00\\xc7\\x00\\xf4\\x00\\x27\\x01\\x42\\x01\\x41\\x01\\x22\\x01\"\n    \"\\xfb\\x00\\xac\\x00\\x7a\\x00\\x49\\x00\\x19\\x00\\xf6\\xff\\xd6\\xff\\x82\\xff\"\n    \"\\x20\\xff\\xdc\\xfe\\x7d\\xfe\\xec\\xfd\\x8f\\xfd\\x31\\xfd\\x05\\xfd\\x8c\\xfc\"\n    \"\\x7a\\xfc\\xcb\\xfb\\x94\\xfb\\x71\\xfb\\xe9\\xfb\\xb7\\xfc\\x67\\xfe\\x20\\x00\"\n    \"\\xd7\\x01\\x78\\x03\\x76\\x04\\xb6\\x04\\x40\\x04\\x97\\x03\\x32\\x02\\x2c\\x01\"\n    \"\\x57\\x00\\x49\\x00\\x87\\x00\\xb4\\x01\\xa1\\x02\\x84\\x03\\xea\\x03\\xe3\\x03\"\n    \"\\x11\\x03\\x15\\x02\\xc9\\x00\\x49\\xff\\xfd\\xfd\\xde\\xfc\\x50\\xfc\\x49\\xfc\"\n    \"\\x22\\xfd\\x0a\\xfe\\x55\\xff\\x29\\x00\\xb0\\x00\\x9b\\x00\\xa6\\x00\\x5a\\x00\"\n    \"\\x51\\x00\\x30\\x00\\x18\\x00\\xe5\\xff\\xdc\\xff\\xe5\\xff\\x29\\x00\\xa3\\x00\"\n    \"\\x27\\x01\\xaa\\x01\\xfa\\x01\\xec\\x01\\xa2\\x01\\x39\\x01\\xb5\\x00\\x3a\\x00\"\n    \"\\xc2\\xff\\x35\\xff\\x9f\\xfe\\x6e\\xfe\\x27\\xfe\\x54\\xfe\\x7b\\xfe\\x0e\\xff\"\n    \"\\x29\\xff\\x62\\xff\\x4d\\xff\\xc7\\xff\\x29\\xff\\xe1\\xff\\xb6\\xff\\x6d\\x00\"\n    \"\\xe0\\xff\\xd8\\x00\\x1a\\x00\\x92\\x00\\xce\\xfe\\x16\\xfe\\x8c\\xfb\\x76\\xf5\"\n    \"\\x4e\\xf5\\xf5\\xf3\\x3a\\xf8\\x59\\xfc\\x7e\\x04\\xd5\\x07\\x35\\x0d\\x3e\\x0e\"\n    \"\\x34\\x0d\\xcf\\x09\\xe1\\x04\\xe2\\xfe\\x5e\\xf9\\xb5\\xf6\\x01\\xf5\\x0f\\xf8\"\n    \"\\x37\\xfb\\x42\\x01\\x82\\x05\\x2a\\x0b\\x35\\x0d\\xcb\\x0e\\x1b\\x0c\\x3c\\x08\"\n    \"\\x47\\x01\\x1c\\xfb\\x82\\xf5\\x95\\xf2\\xab\\xf2\\x76\\xf5\\x3c\\xfa\\x42\\xff\"\n    \"\\x72\\x04\\xd0\\x07\\x77\\x0a\\xb7\\x0a\\x00\\x0a\\x88\\x06\\x30\\x02\\x0d\\xfc\"\n    \"\\x7a\\xf6\\xef\\xf1\\x1d\\xf1\\xad\\xf2\\xb5\\xf7\\x05\\xfe\\x5c\\x04\\xed\\x08\"\n    \"\\x41\\x0b\\xe1\\x0a\\x16\\x08\\x89\\x04\\x10\\x00\\x2b\\xfc\\x78\\xf9\\x94\\xf8\"\n    \"\\x18\\xf9\\xa9\\xfb\\x51\\xfe\\x6d\\x01\\x74\\x03\\x95\\x04\\x83\\x04\\xd8\\x03\"\n    \"\\x70\\x02\\x75\\x01\\x98\\x00\\xe5\\xff\\x52\\xff\\xee\\xfe\\x27\\xfe\\x2e\\xfe\"\n    \"\\x21\\xfe\\x80\\xfe\\xef\\xff\\xbf\\x00\\xea\\x00\\x2b\\x01\\xf6\\xff\\x99\\xfd\"\n    \"\\xd9\\xfc\\x1c\\xfb\\xc9\\xf9\\xb5\\xf8\\xb9\\xf9\\x1b\\xf8\\xf1\\xfa\\x93\\xfd\"\n    \"\\xf1\\x00\\xdf\\x04\\xc5\\x07\\xaf\\x08\\x27\\x08\\xb0\\x07\\xbf\\x04\\x9c\\x03\"\n    \"\\x48\\x01\\xfa\\xff\\x48\\xfe\\x8c\\xfe\\x4d\\xfe\\x46\\x00\\x2a\\x02\\x76\\x04\"\n    \"\\xf0\\x05\\x0b\\x07\\x82\\x06\\x3f\\x05\\x56\\x03\\x85\\x00\\xb2\\xfd\\xb0\\xfa\"\n    \"\\x90\\xf8\\x06\\xf7\\x71\\xf7\\xc5\\xf8\\xda\\xfb\\xea\\xfe\\x36\\x02\\x40\\x04\"\n    \"\\xbd\\x04\\x9c\\x03\\x88\\x01\\xb2\\xfe\\x03\\xfc\\x27\\xfa\\x8c\\xf9\\xaf\\xf9\"\n    \"\\xaf\\xfb\\xde\\xfd\\x7a\\x00\\x01\\x03\\xcf\\x04\\xa4\\x05\\xcd\\x05\\xfd\\x04\"\n    \"\\x7f\\x03\\x2b\\x02\\xb3\\x00\\x8f\\xff\\x29\\xff\\xdd\\xfe\\x91\\xfe\\xd1\\xfe\"\n    \"\\xc4\\xfe\\x0e\\xff\\xcd\\xff\\x94\\x00\\xdd\\x00\\x9e\\x01\\xb5\\x01\\xbc\\x01\"\n    \"\\x82\\x01\\x62\\x01\\x5a\\x00\\x44\\x00\\x39\\x00\\x00\\x00\\x95\\x00\\x74\\xff\"\n    \"\\x9f\\xfd\\x1c\\xfb\\x77\\xf7\\xc7\\xf4\\x18\\xf3\\xf3\\xf3\\x37\\xf7\\x8f\\xfc\"\n    \"\\x4c\\x03\\x54\\x09\\x4a\\x0e\\x10\\x10\\x74\\x0f\\x65\\x0b\\x13\\x06\\xe6\\xff\"\n    \"\\x85\\xfa\\x9e\\xf6\\x44\\xf5\\xea\\xf5\\xcd\\xf8\\x5d\\xfd\\x67\\x02\\xd1\\x07\"\n    \"\\xe7\\x0b\\x63\\x0e\\x35\\x0e\\xb0\\x0b\\x99\\x06\\xa4\\x00\\x6c\\xfa\\x6c\\xf5\"\n    \"\\x39\\xf2\\x78\\xf1\\xcb\\xf2\\x2c\\xf6\\xc8\\xfa\\x10\\x00\\x4d\\x05\\x44\\x09\"\n    \"\\xcb\\x0b\\x89\\x0b\\xf6\\x08\\x34\\x04\\xa3\\xfe\\x95\\xf8\\x44\\xf4\\x03\\xf2\"\n    \"\\xc6\\xf2\\x3e\\xf6\\xcf\\xfb\\xe2\\x01\\x9b\\x07\\x56\\x0b\\xc5\\x0c\\xd9\\x0b\"\n    \"\\xb3\\x08\\xd2\\x04\\x9d\\x00\\xc2\\xfd\\x75\\xfb\\x53\\xfb\\x26\\xfb\\xa8\\xfc\"\n    \"\\x60\\xfd\\x7e\\xff\\x0a\\x00\\x15\\x02\\x18\\x02\\x2c\\x04\\xae\\x03\\xa3\\x04\"\n    \"\\xdd\\x03\\x79\\x03\\xe7\\x02\\x16\\x02\\xe4\\x00\\x5b\\xfa\\x81\\xf6\\xee\\xed\"\n    \"\\x55\\xec\\x7b\\xe9\\xb9\\xee\\x75\\xf3\\x4b\\xfe\\x09\\x07\\x51\\x10\\xee\\x15\"\n    \"\\x6b\\x17\\xf3\\x14\\x31\\x0e\\xdb\\x06\\x06\\xfe\\x1b\\xf9\\xeb\\xf3\\x15\\xf3\"\n    \"\\xad\\xf1\\xcf\\xf4\\x85\\xf7\\x8d\\xfe\\x4e\\x04\\xd2\\x0b\\xc8\\x0f\\xb9\\x12\"\n    \"\\xe9\\x10\\x08\\x0d\\x2c\\x06\\xbe\\xfe\\xa1\\xf7\\x30\\xf2\\x3e\\xef\\xc7\\xee\"\n    \"\\x5f\\xf1\\x5f\\xf5\\x6a\\xfb\\x14\\x01\\x4e\\x07\\x53\\x0b\\xbf\\x0e\\x91\\x0e\"\n    \"\\x65\\x0d\\x91\\x08\\x8a\\x03\\xb1\\xfc\\x6b\\xf7\\xcb\\xf2\\xe7\\xf0\\x70\\xf1\"\n    \"\\x42\\xf4\\x05\\xf9\\x74\\xfe\\x43\\x04\\x93\\x08\\xdf\\x0b\\xb1\\x0c\\x47\\x0c\"\n    \"\\x3c\\x09\\xac\\x05\\x88\\x00\\x2f\\xfc\\x7e\\xf8\\xdf\\xf6\\xb7\\xf6\\x1b\\xf9\"\n    \"\\x3b\\xfc\\x81\\x00\\xd5\\x03\\x88\\x06\\x2c\\x07\\x31\\x07\\xe3\\x05\\x08\\x04\"\n    \"\\x9c\\x02\\x3c\\x01\\x38\\x01\\x63\\xff\\x95\\xff\\x88\\xf8\\x92\\xf5\\x15\\xf0\"\n    \"\\xac\\xed\\xd6\\xed\\x0c\\xf1\\x8e\\xf5\\x16\\xfc\\x34\\x04\\x7c\\x09\\xd3\\x0f\"\n    \"\\x26\\x11\\xf4\\x10\\x3a\\x0d\\x97\\x09\\xa7\\x03\\xda\\x00\\x90\\xfd\\xed\\xfb\"\n    \"\\xbb\\xfa\\x8b\\xfa\\x0a\\xfa\\xab\\xfb\\x4e\\xfd\\xdd\\xff\\x10\\x03\\xca\\x05\"\n    \"\\xd7\\x07\\x8c\\x08\\xf2\\x07\\x94\\x05\\x18\\x03\\x85\\xff\\x95\\xfc\\x1d\\xfa\"\n    \"\\xec\\xf8\\xa6\\xf8\\x37\\xfa\\xd7\\xfb\\x3c\\xfe\\x40\\x00\\x0a\\x02\\xa0\\x02\"\n    \"\\x18\\x03\\xdc\\x01\\x04\\x01\\xc1\\xff\\xb4\\xfe\\x5b\\xfe\\x5e\\xfe\\x53\\xfe\"\n    \"\\xc1\\xfe\\xc8\\xfe\\xd2\\xfe\\xf2\\xfe\\x63\\xff\\xd8\\xff\\xe5\\x00\\x07\\x02\"\n    \"\\xd3\\x02\\xa8\\x03\\xe4\\x03\\x43\\x03\\x40\\x02\\xac\\x00\\xea\\xfe\\xc1\\xfd\"\n    \"\\x24\\xfd\\x50\\xfd\\xc2\\xfd\\xe4\\xfe\\x48\\xff\\x5c\\x00\\x61\\x00\\x1c\\x01\"\n    \"\\xf9\\x00\\x41\\x02\\x5d\\x02\\xcf\\x03\\x4a\\x03\\x22\\x04\\xd5\\xff\\x6f\\xfc\"\n    \"\\xef\\xf8\\xbd\\xf3\\x17\\xf3\\xb0\\xf1\\x4e\\xf3\\x59\\xf5\\xbb\\xfb\\x9b\\xff\"\n    \"\\x34\\x06\\xf1\\x09\\x15\\x0c\\x50\\x0c\\xbe\\x0b\\x33\\x09\\x98\\x07\\x1e\\x06\"\n    \"\\xa0\\x03\\x45\\x02\\x4a\\x00\\x3d\\xfe\\xb8\\xfc\\x5b\\xfc\\x73\\xfb\\xb3\\xfc\"\n    \"\\x76\\xfd\\x05\\xff\\x30\\x00\\xc0\\x01\\xc4\\x01\\x85\\x02\\xee\\x01\\x6f\\x01\"\n    \"\\xd6\\x00\\x27\\x00\\x67\\xff\\x83\\xff\\x59\\xff\\x59\\xff\\x7d\\xff\\xb6\\xfe\"\n    \"\\xaa\\xfd\\xed\\xfc\\x0f\\xfc\\x8e\\xfb\\x75\\xfc\\x3c\\xfd\\x51\\xff\\x5b\\x01\"\n    \"\\x23\\x03\\xf9\\x03\\x4e\\x04\\x61\\x03\\x36\\x02\\xd5\\x00\\x85\\xff\\xb6\\xfe\"\n    \"\\xfb\\xfe\\x36\\xff\\x2d\\x00\\x2f\\x01\\x70\\x01\\x38\\x01\\xc1\\x00\\x3b\\xff\"\n    \"\\xc2\\xfe\\x44\\xfe\\x26\\xfe\\xb0\\xfe\\xb2\\xff\\x10\\x00\\x01\\x01\\x54\\x01\"\n    \"\\xae\\x01\\xfd\\x01\\x52\\x02\\x92\\x02\\x12\\x00\\x75\\xff\\xa0\\xfb\\xcf\\xf9\"\n    \"\\x69\\xf7\\x49\\xf6\\x3a\\xf5\\xae\\xf6\\x12\\xf9\\x4b\\xfc\\x10\\x01\\x2f\\x04\"\n    \"\\x17\\x07\\x55\\x08\\x3b\\x09\\x7e\\x08\\xab\\x08\\x54\\x07\\x68\\x06\\x0a\\x05\"\n    \"\\xf6\\x03\\x81\\x02\\xa3\\x01\\x4c\\x00\\x0a\\xff\\xbc\\xfd\\x95\\xfc\\xd4\\xfb\"\n    \"\\x7a\\xfb\\xb0\\xfb\\x12\\xfc\\xef\\xfc\\xcd\\xfd\\xdc\\xfe\\xce\\xff\\xbd\\x00\"\n    \"\\x80\\x01\\x5d\\x02\\xec\\x02\\x20\\x03\\x02\\x03\\x30\\x02\\xee\\x00\\xb3\\xff\"\n    \"\\xdf\\xfd\\x78\\xfc\\x6c\\xfb\\x25\\xfb\\xd8\\xfb\\x6d\\xfd\\x78\\xff\\x7e\\x01\"\n    \"\\x4f\\x03\\x5e\\x04\\x6d\\x04\\xd5\\x03\\x70\\x02\\x45\\x01\\x24\\x00\\x2e\\x00\"\n    \"\\xc4\\xff\\xe5\\xff\\x04\\x00\\x72\\xff\\x3f\\xff\\x69\\xfe\\xe4\\xfd\\x66\\xfd\"\n    \"\\xe2\\xfd\\x36\\xfe\\xf0\\xff\\xe1\\x00\\x3e\\x02\\xe6\\x02\\x82\\x00\\xd0\\xfe\"\n    \"\\xc0\\xfb\\x30\\xf9\\xf5\\xf7\\x84\\xf7\\x4c\\xf7\\x19\\xf9\\xaf\\xfb\\x27\\xfe\"\n    \"\\xeb\\x01\\x57\\x04\\xc9\\x05\\x11\\x07\\x5f\\x07\\x1c\\x07\\x9e\\x07\\x4c\\x07\"\n    \"\\xc0\\x06\\x27\\x06\\xae\\x04\\xff\\x02\\x9f\\x01\\xdd\\xff\\x8f\\xfe\\xbd\\xfd\"\n    \"\\xfa\\xfc\\xce\\xfc\\xed\\xfc\\xf9\\xfc\\x47\\xfd\\x90\\xfd\\x94\\xfd\\x9d\\xfd\"\n    \"\\xa6\\xfd\\x93\\xfd\\x02\\xfe\\xae\\xfe\\xa1\\xff\\x18\\x01\\x75\\x02\\x67\\x03\"\n    \"\\xf5\\x03\\x88\\x03\\x4f\\x02\\x01\\x01\\x64\\xff\\x2b\\xfe\\xac\\xfd\\x85\\xfd\"\n    \"\\x0a\\xfe\\xde\\xfe\\x7b\\xff\\x2f\\x00\\xa1\\x00\\xe8\\x00\\x0a\\x01\\x58\\x01\"\n    \"\\x5f\\x01\\xb8\\x01\\x85\\x01\\x78\\x01\\x85\\x00\\x3e\\x00\\x50\\xff\\x95\\xfe\"\n    \"\\xcc\\xfe\\x90\\xfe\\x0b\\x00\\x64\\x00\\x52\\x01\\x5b\\x01\\x09\\x01\\xd4\\x00\"\n    \"\\x1f\\x00\\xd0\\x00\\x5b\\x00\\x96\\x01\\x3e\\x00\\x47\\xfe\\x69\\xfc\\xff\\xf8\"\n    \"\\x48\\xf7\\x7a\\xf5\\x2e\\xf5\\x7d\\xf5\\x8b\\xf8\\x28\\xfb\\x39\\xff\\xc4\\x02\"\n    \"\\x08\\x05\\xb3\\x06\\x95\\x07\\x9f\\x07\\xa2\\x07\\x3d\\x08\\xee\\x07\\x26\\x08\"\n    \"\\xd8\\x07\\xb6\\x06\\x67\\x05\\x00\\x04\\xad\\x01\\x07\\x00\\x54\\xfe\\x05\\xfd\"\n    \"\\x1a\\xfc\\xe5\\xfb\\x40\\xfb\\x90\\xfb\\xe5\\xfb\\x18\\xfc\\xc1\\xfc\\x58\\xfd\"\n    \"\\xb5\\xfd\\x98\\xfe\\x54\\xff\\x1f\\x00\\x35\\x01\\xeb\\x01\\x2c\\x02\\x2a\\x02\"\n    \"\\xcd\\x01\\x95\\x00\\xce\\xff\\x96\\xfe\\xaa\\xfd\\x98\\xfd\\xf6\\xfd\\xa4\\xfe\"\n    \"\\xd8\\xff\\xb3\\x00\\x37\\x01\\xad\\x01\\xce\\x01\\xc1\\x01\\x0f\\x02\\x34\\x02\"\n    \"\\x39\\x02\\x6f\\x02\\x48\\x02\\xf3\\x01\\x48\\x01\\x53\\x00\\x90\\xff\\xb5\\xfe\"\n    \"\\xdc\\xfe\\xb1\\xfe\\x8a\\xff\\xbc\\xff\\x6d\\x00\\x48\\x00\\x79\\x00\\xf5\\xff\"\n    \"\\x7e\\xff\\x4d\\xfe\\x9b\\xfb\\xd4\\xfa\\xf5\\xf7\\x2d\\xf7\\x38\\xf6\\x68\\xf6\"\n    \"\\x12\\xf7\\xa9\\xf9\\xfd\\xfb\\x26\\xff\\x77\\x02\\x9a\\x04\\xb5\\x06\\xf5\\x07\"\n    \"\\x95\\x08\\xc9\\x08\\x62\\x09\\xd3\\x08\\xbc\\x08\\xe1\\x07\\xa3\\x06\\x16\\x05\"\n    \"\\xbe\\x03\\xcf\\x01\\x81\\x00\\x0f\\xff\\xbb\\xfd\\x9f\\xfc\\xe8\\xfb\\x0e\\xfb\"\n    \"\\xd4\\xfa\\xe1\\xfa\\x07\\xfb\\x9d\\xfb\\x5c\\xfc\\x16\\xfd\\x19\\xfe\\x53\\xff\"\n    \"\\x52\\x00\\x62\\x01\\x1f\\x02\\x36\\x02\\x06\\x02\\xe2\\x01\\x05\\x01\\xbf\\x00\"\n    \"\\x05\\x00\\x8b\\xff\\x45\\xff\\x48\\xff\\x3d\\xff\\x98\\xff\\xe1\\xff\\x07\\x00\"\n    \"\\x6b\\x00\\xd4\\x00\\x2a\\x01\\xbe\\x01\\x1a\\x02\\x2a\\x02\\x3d\\x02\\xf2\\x01\"\n    \"\\x62\\x01\\xe4\\x00\\x6a\\x00\\xb6\\xff\\x06\\x00\\x65\\xff\\xb6\\xff\\x81\\xff\"\n    \"\\x56\\xff\\x40\\xff\\x42\\xff\\x16\\xff\\xc4\\xfe\\xdc\\xfd\\x06\\xfc\\xf8\\xfa\"\n    \"\\xdd\\xf8\\xe0\\xf7\\x59\\xf7\\x79\\xf7\\x53\\xf8\\x79\\xfa\\xb0\\xfc\\x62\\xff\"\n    \"\\x27\\x02\\xf9\\x03\\x88\\x05\\xbe\\x06\\x3f\\x07\\xe9\\x07\\xa1\\x08\\x92\\x08\"\n    \"\\x74\\x08\\xde\\x07\\x9f\\x06\\x6b\\x05\\x3d\\x04\\x85\\x02\\x49\\x01\\xc0\\xff\"\n    \"\\x16\\xfe\\xc9\\xfc\\xbc\\xfb\\xb9\\xfa\\x8b\\xfa\\xb9\\xfa\\xd1\\xfa\\xb0\\xfb\"\n    \"\\x7d\\xfc\\x1c\\xfd\\x5d\\xfe\\x6b\\xff\\x2e\\x00\\x33\\x01\\xb7\\x01\\x86\\x01\"\n    \"\\x8c\\x01\\x2e\\x01\\x6f\\x00\\x61\\x00\\x01\\x00\\xd1\\xff\\x53\\x00\\xb8\\x00\"\n    \"\\x29\\x01\\xb8\\x01\\xd2\\x01\\x80\\x01\\x73\\x01\\xf4\\x00\\xc3\\x00\\xcb\\x00\"\n    \"\\xde\\x00\\xbe\\x00\\xbc\\x00\\x36\\x00\\xba\\xff\\x6d\\xff\\xce\\xfe\\xc6\\xfe\"\n    \"\\xde\\xfe\\x59\\xff\\x08\\x00\\x46\\x00\\x7e\\x00\\x29\\xff\\x76\\xfd\\xbc\\xfb\"\n    \"\\x37\\xf9\\x54\\xf8\\xa1\\xf7\\xe5\\xf7\\x62\\xf8\\x07\\xfa\\x66\\xfb\\x8e\\xfd\"\n    \"\\xe8\\xff\\xaa\\x01\\xd6\\x03\\xac\\x05\\xeb\\x06\\x1f\\x08\\x2f\\x09\\x1d\\x09\"\n    \"\\x21\\x09\\x5f\\x08\\x17\\x07\\xc3\\x05\\x99\\x04\\x01\\x03\\xfb\\x01\\xb9\\x00\"\n    \"\\x40\\xff\\xed\\xfd\\xc4\\xfc\\x6a\\xfb\\xbd\\xfa\\x4c\\xfa\\x14\\xfa\\x66\\xfa\"\n    \"\\x08\\xfb\\xba\\xfb\\xe7\\xfc\\x55\\xfe\\x7b\\xff\\x08\\x01\\x39\\x02\\xe5\\x02\"\n    \"\\x7a\\x03\\xa8\\x03\\xa1\\x02\\x09\\x02\\x37\\x01\\x26\\x00\\xdb\\xff\\x9e\\xff\"\n    \"\\x5b\\xff\\x50\\xff\\x73\\xff\\x04\\xff\\x59\\xff\\x84\\xff\\x7d\\xff\\x18\\x00\"\n    \"\\x8f\\x00\\x9f\\x00\\x2b\\x01\\x3a\\x01\\xb0\\x00\\xea\\x00\\x82\\x00\\x76\\x00\"\n    \"\\x75\\x00\\x62\\x01\\xce\\x00\\x41\\x02\\x6f\\x01\\xbc\\x01\\x45\\x01\\x18\\x01\"\n    \"\\xbd\\x00\\x99\\x00\\x3b\\x00\\xac\\xfc\\xb1\\xfc\\x1a\\xf8\\xa1\\xf6\\x15\\xf4\"\n    \"\\x11\\xf4\\xbd\\xf3\\x32\\xf6\\x76\\xf8\\x0a\\xfb\\x35\\xff\\x1d\\x01\\xe3\\x03\"\n    \"\\xcf\\x05\\xc2\\x07\\x5a\\x08\\x70\\x0a\\x91\\x0a\\x47\\x0b\\x22\\x0b\\x86\\x0a\"\n    \"\\xb1\\x08\\xae\\x07\\x39\\x05\\x6c\\x03\\xb3\\x01\\xfd\\xff\\x24\\xfe\\x02\\xfd\"\n    \"\\x7d\\xfb\\x2e\\xfa\\xbe\\xf9\\xfa\\xf8\\x15\\xf9\\xa6\\xf9\\x85\\xfa\\x82\\xfb\"\n    \"\\x5d\\xfd\\x7e\\xfe\\x20\\x00\\x95\\x01\\x79\\x02\\xf8\\x02\\x81\\x03\\x94\\x02\"\n    \"\\x92\\x01\\x81\\x00\\x17\\xff\\x34\\xfe\\xf8\\xfd\\xc3\\xfd\\x3e\\xfe\\x0d\\xff\"\n    \"\\x19\\xff\\x76\\xff\\x4a\\x00\\xcf\\x00\\x7a\\x01\\x13\\x02\\x91\\x02\\xe4\\x02\"\n    \"\\x2d\\x03\\x76\\x02\\x36\\x02\\x67\\x01\\x1a\\x01\\xa7\\x00\\x58\\x01\\x26\\x01\"\n    \"\\x91\\x01\\xd6\\x01\\x8c\\x01\\xf8\\x00\\x1c\\x00\\xd1\\xff\\x99\\xff\\xd3\\xff\"\n    \"\\xed\\xfb\\x4d\\xfa\\x9e\\xf7\\x94\\xf5\\x8b\\xf3\\x58\\xf3\\x42\\xf3\\x35\\xf6\"\n    \"\\x86\\xf9\\x37\\xfc\\x40\\x00\\x35\\x03\\x22\\x05\\x9e\\x06\\x5a\\x08\\x82\\x08\"\n    \"\\x7c\\x0a\\xd8\\x0a\\xc4\\x0a\\x43\\x0a\\xad\\x09\\xa2\\x07\\x8e\\x06\\xa4\\x04\"\n    \"\\xc8\\x02\\x57\\x01\\xf3\\xff\\x2c\\xfe\\x2f\\xfd\\xeb\\xfb\\x75\\xfa\\x09\\xfa\"\n    \"\\xa6\\xf9\\x8d\\xf9\\x55\\xfa\\x56\\xfb\\x44\\xfc\\xea\\xfd\\x00\\xff\\x1a\\x00\"\n    \"\\x86\\x01\\x45\\x02\\x7e\\x02\\xca\\x02\\x18\\x01\\xef\\xff\\x86\\xfe\\x57\\xfd\"\n    \"\\xde\\xfc\\x6a\\xfd\\xf7\\xfd\\x8a\\xff\\x25\\x01\\x74\\x01\\x1a\\x02\\x0b\\x03\"\n    \"\\x10\\x03\\x3d\\x03\\x18\\x03\\xb5\\x02\\x8d\\x02\\x6d\\x02\\x44\\x01\\xcc\\x00\"\n    \"\\xb8\\x00\\x9c\\xff\\xf9\\xff\\xee\\xff\\x82\\x00\\xd6\\x00\\x37\\x01\\x6a\\x00\"\n    \"\\x05\\x00\\xa7\\xff\\x41\\xfe\\x56\\xfb\\x33\\xf8\\xfa\\xf5\\x71\\xf4\\xfe\\xf3\"\n    \"\\x7b\\xf3\\xe9\\xf4\\xdf\\xf7\\x43\\xfc\\x13\\x00\\xd9\\x03\\xe7\\x06\\xa0\\x08\"\n    \"\\xce\\x09\\x62\\x0a\\xa1\\x0a\\x98\\x0a\\x24\\x0a\\xca\\x08\\x2a\\x07\\x3c\\x05\"\n    \"\\x52\\x03\\xb6\\x01\\x95\\x00\\x23\\xff\\x09\\xfe\\x27\\xfd\\x55\\xfc\\x82\\xfb\"\n    \"\\x4b\\xfb\\x16\\xfb\\x62\\xfb\\x1c\\xfc\\x8b\\xfc\\x43\\xfd\\x2b\\xfe\\x0b\\xff\"\n    \"\\xdc\\xff\\x10\\x01\\xa3\\x01\\x74\\x02\\x90\\x02\\x47\\x02\\xfb\\x00\\x71\\xff\"\n    \"\\x5c\\xfd\\x91\\xfc\\xdc\\xfb\\x34\\xfd\\xba\\xfc\\x4e\\xff\\x7c\\x03\\x04\\x04\"\n    \"\\x96\\x06\\x97\\x04\\x4c\\x05\\xb0\\x04\\xb6\\x03\\x5d\\x01\\xc3\\x00\\x1b\\xff\"\n    \"\\xde\\xfe\\x59\\xfe\\x16\\xfe\\xc2\\xfe\\x6b\\xff\\x92\\xff\\x55\\x00\\xd0\\x01\"\n    \"\\xd6\\x01\\x22\\x03\\x2c\\x01\\xc5\\x00\\x7a\\xf9\\x7c\\xf7\\x3c\\xf1\\x2e\\xf0\"\n    \"\\xb3\\xef\\x2b\\xf1\\x74\\xf4\\x8c\\xf9\\xc3\\xff\\xd8\\x04\\x7b\\x0b\\x63\\x0d\"\n    \"\\x80\\x0f\\x11\\x0e\\xa8\\x0c\\x01\\x09\\xed\\x07\\xe9\\x03\\x9f\\x01\\x8a\\xfe\"\n    \"\\x9a\\xfc\\x67\\xfb\\x21\\xfd\\x32\\xfe\\x22\\x01\\x39\\x03\\x27\\x04\\x59\\x04\"\n    \"\\xc4\\x03\\x6a\\x02\\xc1\\x00\\xa8\\xff\\xc2\\xfd\\x99\\xfc\\xfb\\xfa\\x63\\xf9\"\n    \"\\x55\\xf8\\xcd\\xf8\\x4a\\xf9\\xe1\\xfb\\x76\\xfe\\x23\\x01\\x01\\x03\\xbc\\x03\"\n    \"\\x65\\x02\\xf2\\x01\\xb6\\x00\\x2b\\x00\\xcc\\x00\\x1f\\x01\\x59\\x01\\x7c\\x02\"\n    \"\\x2e\\x02\\x97\\x02\\x49\\x02\\xe5\\x01\\x0c\\x01\\x83\\x01\\xff\\x00\\xcd\\x01\"\n    \"\\x80\\x01\\xfd\\x01\\x65\\x01\\xa1\\x01\\xd4\\x00\\x17\\x01\\x68\\x00\\x8e\\x00\"\n    \"\\x12\\x00\\x42\\x00\\x70\\x00\\xf2\\xff\\xe8\\xfe\\x27\\xf5\\x29\\xf3\\x24\\xeb\"\n    \"\\x8c\\xeb\\xb9\\xec\\xb8\\xf2\\x25\\xf8\\x0d\\x01\\x64\\x07\\xfe\\x0c\\xf4\\x12\"\n    \"\\xa9\\x12\\xde\\x11\\xf8\\x0c\\x7b\\x07\\x10\\x00\\x5e\\xfd\\xc7\\xf7\\xe0\\xf6\"\n    \"\\xda\\xf5\\xa6\\xf7\\x5b\\xfb\\xb1\\x02\\x3c\\x08\\xbb\\x0e\\xbe\\x11\\xa8\\x11\"\n    \"\\xef\\x0e\\xc4\\x09\\xb5\\x02\\x38\\xfc\\x87\\xf6\\x21\\xf1\\xc0\\xee\\x68\\xed\"\n    \"\\xcf\\xee\\x28\\xf3\\xef\\xf9\\x56\\x01\\x89\\x09\\xe6\\x0e\\xd9\\x11\\x03\\x11\"\n    \"\\xfb\\x0c\\x84\\x05\\xa5\\xfd\\x53\\xf5\\x98\\xef\\xf5\\xec\\xc3\\xed\\xe9\\xf1\"\n    \"\\x78\\xf8\\x03\\x00\\x86\\x07\\xa3\\x0d\\x3b\\x11\\xce\\x11\\x28\\x0f\\x57\\x0a\"\n    \"\\x61\\x04\\xf8\\xfe\\xe2\\xfa\\x80\\xf8\\xc8\\xf7\\xfd\\xf7\\x2a\\xfa\\x9e\\xfd\"\n    \"\\x03\\x01\\xc3\\x04\\xf7\\x07\\xbf\\x08\\xb8\\x08\\x49\\x08\\xf2\\x06\\x2c\\xff\"\n    \"\\x4b\\xf4\\x35\\xec\\x81\\xe5\\x5d\\xe4\\xdf\\xe7\\x3c\\xee\\xbd\\xf6\\xd2\\x00\"\n    \"\\xa6\\x09\\xcc\\x11\\x11\\x17\\x51\\x17\\xdc\\x13\\x20\\x0d\\x29\\x04\\xcc\\xfc\"\n    \"\\x69\\xf7\\x3f\\xf3\\xce\\xf1\\x2a\\xf3\\x8c\\xf7\\x19\\xff\\x40\\x08\\x84\\x10\"\n    \"\\x1f\\x16\\x4b\\x17\\x67\\x14\\x0c\\x0e\\xba\\x05\\x70\\xfd\\x9d\\xf6\\xb2\\xf1\"\n    \"\\x84\\xee\\x59\\xed\\xcd\\xee\\x7d\\xf2\\xd6\\xf8\\x29\\x00\\xe7\\x07\\xb3\\x0d\"\n    \"\\x74\\x10\\xa1\\x0e\\xc9\\x09\\x74\\x02\\xfa\\xfa\\x69\\xf5\\x11\\xf2\\xe9\\xf1\"\n    \"\\x4e\\xf4\\x29\\xf8\\xdb\\xfc\\x28\\x02\\x3e\\x06\\x32\\x0a\\xa5\\x0b\\x05\\x0c\"\n    \"\\xce\\x09\\x7b\\x07\\x02\\x03\\xb4\\xff\\x96\\xfb\\x57\\xfa\\x26\\xf9\\x7c\\xfa\"\n    \"\\x39\\xfb\\x27\\xfd\\x27\\xff\\xce\\x02\\xf4\\x04\\xdc\\x08\\x60\\x07\\x58\\xfc\"\n    \"\\x16\\xf9\\xaa\\xed\\xcb\\xec\\xcc\\xec\\x29\\xf3\\xf5\\xf7\\x1a\\x01\\x6d\\x05\"\n    \"\\x1b\\x0b\\xb5\\x0e\\xbf\\x0e\\x3b\\x0e\\xd8\\x09\\xe4\\x06\\x39\\xfe\\x91\\xfc\"\n    \"\\x9b\\xf5\\x24\\xf6\\x05\\xf5\\xad\\xf9\\xba\\xfd\\x50\\x05\\x7d\\x0a\\xa0\\x0f\"\n    \"\\xc6\\x10\\x92\\x0f\\xfc\\x0b\\xbc\\x05\\x82\\xff\\x9c\\xf8\\x5e\\xf4\\xe4\\xef\"\n    \"\\x12\\xf0\\x49\\xf0\\xae\\xf5\\xf4\\xfa\\xd5\\x03\\xa7\\x0a\\x36\\x11\\x62\\x12\"\n    \"\\xf3\\x11\\x4f\\x0b\\xb7\\x04\\xe3\\xf9\\x88\\xf1\\x85\\xeb\\x7f\\xe9\\x88\\xed\"\n    \"\\x90\\xf3\\x3f\\xfd\\x6e\\x04\\x82\\x0c\\xe9\\x0f\\x27\\x12\\x4d\\x0f\\xba\\x0b\"\n    \"\\x11\\x03\\x89\\xfd\\x65\\xf6\\x6e\\xf5\\xa7\\xf4\\x36\\xf9\\x9c\\xfb\\x1e\\x01\"\n    \"\\x5e\\x02\\x8b\\x05\\x82\\x06\\xca\\x09\\x61\\x0b\\x50\\x0c\\xfb\\x09\\x08\\x08\"\n    \"\\x32\\x07\\x2e\\xee\\x76\\xeb\\x66\\xdc\\xef\\xdc\\x5e\\xdd\\x84\\xea\\x21\\xf3\"\n    \"\\x2c\\x02\\xb2\\x0f\\xfa\\x19\\xf8\\x21\\x2c\\x20\\x77\\x1d\\x5a\\x0f\\xd9\\x03\"\n    \"\\xb5\\xf4\\xe1\\xef\\x25\\xe7\\xe6\\xea\\x7e\\xeb\\x51\\xf5\\x3f\\xfe\\x63\\x0c\"\n    \"\\xd6\\x15\\x88\\x1f\\x22\\x1f\\x1a\\x1c\\x36\\x12\\x05\\x06\\xdb\\xf9\\x2d\\xef\"\n    \"\\xa6\\xe8\\x0f\\xe4\\x33\\xe5\\x22\\xe8\\x03\\xf2\\xa7\\xfb\\xb9\\x09\\x2b\\x14\"\n    \"\\xb4\\x1c\\xa6\\x1d\\xc8\\x1a\\xec\\x0e\\x1e\\x03\\xe3\\xf3\\x11\\xe8\\xb6\\xe0\"\n    \"\\x87\\xdf\\x38\\xe4\\xe6\\xed\\x7a\\xfa\\xfd\\x05\\x97\\x10\\x1c\\x18\\x58\\x1a\"\n    \"\\x1e\\x18\\xc7\\x11\\xef\\x06\\x48\\xfc\\xad\\xf2\\x69\\xee\\xf7\\xee\\x31\\xf3\"\n    \"\\x77\\xf9\\x5b\\x00\\xab\\x04\\x0b\\x09\\xb0\\x0b\\x3b\\x0f\\xf0\\x0f\\xe6\\x0f\"\n    \"\\x16\\x0b\\xef\\x04\\x0e\\xfe\\xe4\\xf9\\x99\\xf2\\xbb\\xe3\\x6d\\xe2\\x11\\xde\"\n    \"\\xa6\\xe1\\xeb\\xe8\\x53\\xf6\\x51\\x01\\xbc\\x0e\\x47\\x19\\xcd\\x1e\\xb8\\x1f\"\n    \"\\xe0\\x19\\x59\\x11\\xc6\\x02\\x8e\\xf7\\x26\\xed\\xbc\\xe9\\x8d\\xe7\\x26\\xed\"\n    \"\\x7a\\xf3\\x70\\xff\\x57\\x0b\\xd4\\x18\\xf3\\x1f\\xf5\\x22\\x82\\x1d\\x0f\\x14\"\n    \"\\x28\\x06\\x7a\\xf9\\x41\\xee\\x69\\xe7\\xb0\\xe4\\xc4\\xe4\\x1c\\xea\\xe5\\xf1\"\n    \"\\x29\\xfd\\x7c\\x08\\x9d\\x14\\x59\\x1a\\xcf\\x1c\\xd6\\x16\\x8c\\x0e\\x43\\xfd\"\n    \"\\x59\\xf1\\xd8\\xe4\\x54\\xe0\\xc1\\xe1\\x4c\\xea\\x8a\\xf5\\x6d\\x02\\x82\\x0d\"\n    \"\\x6d\\x15\\x48\\x18\\xbf\\x16\\x82\\x10\\xcd\\x07\\x01\\xff\\xaa\\xf7\\x28\\xf4\"\n    \"\\xba\\xf2\\x56\\xf6\\x02\\xf9\\x63\\xfe\\xe2\\xff\\x10\\x05\\xb4\\x05\\x7e\\x0c\"\n    \"\\x1f\\x0c\\x8d\\x10\\x6e\\x09\\x6b\\x0d\\x84\\xf8\\xe4\\xe9\\x78\\xe1\\xb8\\xd9\"\n    \"\\xd1\\xde\\xa9\\xe5\\x4b\\xf8\\xfa\\xfd\\xbe\\x0f\\xdd\\x14\\xad\\x1e\\xc2\\x1a\"\n    \"\\xaa\\x1d\\xf9\\x10\\xa8\\x06\\xdd\\xf8\\x75\\xf0\\xb0\\xe8\\xaf\\xe8\\x37\\xed\"\n    \"\\xd9\\xf3\\xe5\\x00\\x24\\x0b\\xa9\\x16\\x4b\\x1a\\x16\\x1d\\x27\\x16\\xee\\x10\"\n    \"\\xf7\\x03\\x67\\xfc\\xc9\\xef\\x34\\xeb\\x3b\\xe5\\x90\\xe6\\x42\\xe9\\xdb\\xf2\"\n    \"\\x96\\xfc\\x6e\\x09\\x94\\x14\\x54\\x1b\\x2d\\x1d\\xca\\x18\\x2d\\x0f\\x86\\x01\"\n    \"\\xf9\\xf5\\xd5\\xe8\\xd6\\xe3\\xac\\xe0\\xa5\\xe5\\x0b\\xef\\xdf\\xfb\\xad\\x08\"\n    \"\\x1a\\x12\\x94\\x18\\x79\\x19\\x90\\x15\\xe1\\x0e\\xb8\\x04\\x94\\xfa\\x9f\\xf2\"\n    \"\\x22\\xef\\x8b\\xee\\x4a\\xf3\\x1d\\xf8\\x32\\xff\\x7d\\x02\\x3c\\x08\\x1a\\x0a\"\n    \"\\x6b\\x0e\\xe3\\x0e\\x74\\x0f\\x94\\x0b\\xdf\\x06\\xba\\xfe\\x76\\xfc\\x3f\\xf1\"\n    \"\\x16\\xe2\\x54\\xe2\\x9a\\xdd\\x25\\xe4\\xe6\\xe9\\x12\\xfc\\xc8\\x03\\x4d\\x13\"\n    \"\\x27\\x1c\\x40\\x21\\xac\\x1d\\x4f\\x19\\x0e\\x0e\\x72\\xfe\\xbb\\xf4\\x9e\\xeb\"\n    \"\\x25\\xe9\\xc3\\xe7\\xe9\\xee\\x3c\\xf4\\xe8\\x01\\x57\\x0c\\x0d\\x1a\\x03\\x1f\"\n    \"\\xcb\\x21\\xe5\\x1a\\x83\\x11\\x62\\x02\\x9f\\xf6\\x45\\xeb\\x72\\xe5\\x25\\xe4\"\n    \"\\xa0\\xe5\\xb6\\xeb\\x07\\xf4\\x15\\x00\\x06\\x0b\\x2e\\x17\\xd3\\x1c\\xbd\\x1e\"\n    \"\\x1e\\x19\\xad\\x0c\\xae\\xfa\\x02\\xed\\x8a\\xe1\\x2e\\xdf\\xa5\\xe2\\x9b\\xee\"\n    \"\\x7e\\xf9\\xdf\\x06\\x5c\\x0f\\x35\\x15\\x87\\x15\\x8a\\x14\\xcd\\x0d\\x19\\x07\"\n    \"\\x8a\\xfe\\x1b\\xf8\\x6f\\xf3\\x7e\\xf2\\x13\\xf5\\x88\\xf8\\x20\\xfe\\x2c\\x01\"\n    \"\\x81\\x05\\x69\\x06\\x6a\\x0b\\x10\\x0b\\x59\\x0f\\xa8\\x0a\\xba\\x0e\\x8f\\xf4\"\n    \"\\xa9\\xeb\\x26\\xde\\xe4\\xdb\\x95\\xde\\x47\\xeb\\x10\\xfd\\x3a\\x02\\xe3\\x11\"\n    \"\\xcc\\x13\\x8a\\x1b\\x81\\x15\\x0a\\x1b\\xc2\\x0b\\x57\\x05\\x7d\\xf6\\xc8\\xf1\"\n    \"\\x15\\xe8\\x09\\xeb\\x40\\xef\\x2c\\xf8\\x8b\\x03\\x47\\x0d\\x89\\x16\\x94\\x17\"\n    \"\\xd7\\x19\\xbb\\x12\\x1d\\x0f\\x6c\\x03\\x48\\xfe\\xbc\\xf1\\x9e\\xed\\x72\\xe5\"\n    \"\\xb0\\xe7\\xfe\\xe8\\x3e\\xf4\\x7d\\xfe\\x76\\x0b\\x03\\x15\\xd6\\x19\\xbb\\x19\"\n    \"\\x8c\\x14\\x50\\x0c\\x73\\x00\\x7c\\xf5\\xde\\xe9\\x0c\\xe4\\x3e\\xe1\\x0c\\xe9\"\n    \"\\x00\\xf2\\x88\\x00\\x17\\x0b\\x40\\x14\\x66\\x17\\xd4\\x16\\x5f\\x11\\xa1\\x0a\"\n    \"\\x51\\x00\\x65\\xf8\\xfe\\xf2\\x99\\xf1\\xd5\\xf2\\xd7\\xf7\\xff\\xfb\\x54\\x00\"\n    \"\\x52\\x03\\xbc\\x07\\xfa\\x09\\xb7\\x0d\\xd0\\x0d\\xd5\\x0b\\xf9\\x06\\xf8\\x05\"\n    \"\\x96\\xf8\\xcd\\xe6\\x18\\xe5\\xa6\\xdd\\x61\\xe3\\x01\\xe8\\x87\\xfa\\x9c\\xff\"\n    \"\\x18\\x0d\\xdc\\x15\\x02\\x1c\\x67\\x1a\\x57\\x18\\x7d\\x10\\x9b\\x00\\x0c\\xf8\"\n    \"\\x7b\\xee\\xa5\\xed\\xce\\xea\\x12\\xf4\\x3c\\xf7\\xe2\\x01\\x5c\\x08\\xb7\\x13\"\n    \"\\xa4\\x16\\x20\\x1a\\xa2\\x16\\xba\\x0f\\x25\\x05\\x41\\xfb\\xe8\\xf1\\x8f\\xea\"\n    \"\\x97\\xe9\\xeb\\xe8\\xb2\\xee\\x1a\\xf3\\x0a\\xfe\\x13\\x05\\x73\\x10\\x5e\\x15\"\n    \"\\x5a\\x1a\\x5a\\x16\\xc8\\x10\\x53\\x01\\xf8\\xf2\\x49\\xe7\\x7e\\xe1\\xb1\\xe4\"\n    \"\\xe0\\xec\\xd6\\xfb\\x3b\\x05\\x77\\x10\\x20\\x13\\x5d\\x16\\x3d\\x11\\xce\\x0d\"\n    \"\\x63\\x05\\x75\\xff\\x92\\xf7\\xf9\\xf4\\x97\\xf2\\x3e\\xf5\\x1a\\xf8\\x39\\xfc\"\n    \"\\xe5\\xff\\x3e\\x03\\x2f\\x06\\x52\\x08\\x67\\x0b\\x19\\x0d\\xfe\\x0a\\x4e\\xf8\"\n    \"\\xcf\\xf3\\x37\\xe4\\x02\\xe4\\x6e\\xe0\\x29\\xef\\x9e\\xf6\\x8c\\x04\\x66\\x11\"\n    \"\\xf7\\x17\\x3e\\x1c\\x79\\x18\\x3d\\x17\\x9b\\x07\\x7a\\x01\\xe8\\xf3\\xf2\\xf0\"\n    \"\\x72\\xe7\\x65\\xec\\xfc\\xee\\x16\\xfa\\xdd\\x03\\x72\\x10\\x6f\\x17\\xc1\\x18\"\n    \"\\x3f\\x17\\xf2\\x0e\\xa3\\x07\\xe9\\xfd\\x6b\\xf9\\xf1\\xf0\\x6c\\xef\\x5b\\xeb\"\n    \"\\xf8\\xec\\x86\\xee\\x76\\xf7\\x9c\\x00\\xf9\\x0a\\xea\\x13\\xc7\\x18\\xdd\\x18\"\n    \"\\x44\\x12\\x00\\x0a\\x56\\xfd\\x98\\xf2\\x5f\\xe8\\xd2\\xe4\\x9f\\xe6\\x56\\xee\"\n    \"\\x40\\xf9\\x10\\x05\\x8c\\x0e\\xfa\\x13\\x76\\x16\\x3c\\x13\\x41\\x0e\\x6a\\x05\"\n    \"\\x91\\xfe\\xc4\\xf6\\x12\\xf4\\xe7\\xf2\\xed\\xf5\\x3c\\xf8\\x35\\xfb\\x8b\\xfe\"\n    \"\\x4f\\x00\\xfb\\x03\\x8f\\x06\\x7f\\x0c\\x4c\\x0a\\x03\\x11\\x6b\\x02\\x1a\\xf7\"\n    \"\\x16\\xeb\\xea\\xe5\\x41\\xe3\\x2c\\xe6\\xd5\\xf4\\x58\\xf9\\x5e\\x06\\xde\\x0c\"\n    \"\\xad\\x18\\xfb\\x17\\x48\\x1d\\x0e\\x16\\xec\\x0c\\x61\\xff\\x3f\\xf5\\xef\\xec\"\n    \"\\x8b\\xe7\\x98\\xeb\\xd4\\xef\\x5a\\xfb\\xbe\\x03\\x1f\\x10\\xba\\x13\\x72\\x17\"\n    \"\\x22\\x14\\xd4\\x10\\xed\\x08\\x30\\x02\\xfa\\xf9\\x08\\xf2\\x16\\xec\\x4b\\xe8\"\n    \"\\xb7\\xe9\\x33\\xee\\x8b\\xf8\\x6b\\x02\\x34\\x0e\\x50\\x15\\x06\\x1a\\x03\\x18\"\n    \"\\x0a\\x13\\x28\\x08\\x8b\\xfc\\x8d\\xf0\\x3c\\xe8\\xbe\\xe5\\x79\\xe8\\x2f\\xf2\"\n    \"\\xc0\\xfb\\x43\\x08\\x97\\x0e\\x2f\\x15\\xce\\x12\\x39\\x10\\x7f\\x08\\x4e\\x03\"\n    \"\\xab\\xfc\\x68\\xf9\\x6d\\xf7\\x64\\xf6\\x1c\\xf7\\x39\\xf6\\xb4\\xf9\\x70\\xfb\"\n    \"\\x62\\x01\\xec\\x03\\x3e\\x0a\\xfd\\x0a\\x38\\x0f\\x79\\xfd\\x67\\xf8\\xad\\xed\"\n    \"\\x57\\xea\\x5b\\xe8\\xa7\\xed\\x27\\xf8\\xad\\xf9\\x14\\x08\\x6b\\x0b\\x8c\\x16\"\n    \"\\x3c\\x14\\x19\\x1b\\xde\\x10\\x4a\\x0a\\xb2\\xfe\\x0a\\xf7\\x36\\xef\\xaa\\xea\"\n    \"\\x37\\xef\\x81\\xf1\\x13\\xfd\\x02\\x04\\xed\\x0f\\x35\\x11\\x6a\\x15\\x8c\\x10\"\n    \"\\xfe\\x0c\\xb7\\x05\\x11\\x00\\xaa\\xf9\\x14\\xf4\\x1a\\xf0\\x1f\\xec\\x2b\\xed\"\n    \"\\x63\\xef\\xa3\\xf8\\x70\\x00\\x56\\x0c\\x4f\\x13\\xcb\\x18\\x78\\x17\\x8b\\x12\"\n    \"\\x73\\x07\\xba\\xfc\\xec\\xf0\\x29\\xea\\x04\\xe8\\x0b\\xec\\xa1\\xf4\\x02\\xfe\"\n    \"\\xd7\\x08\\x15\\x0e\\x0d\\x13\\x11\\x10\\x86\\x0d\\x16\\x06\\xd9\\x01\\x73\\xfb\"\n    \"\\x53\\xfa\\x21\\xf8\\x63\\xf9\\x05\\xf8\\xb5\\xf9\\x50\\xf9\\x7a\\xfb\\x22\\xfe\"\n    \"\\x80\\x03\\x36\\x06\\x58\\x0b\\x5b\\x09\\x91\\xf9\\xea\\xf6\\x4f\\xeb\\x62\\xed\"\n    \"\\x1f\\xe9\\x0a\\xf7\\x02\\xfa\\xc8\\x01\\x65\\x09\\x42\\x0f\\x5d\\x14\\x87\\x13\"\n    \"\\x8b\\x17\\x5e\\x0c\\x07\\x08\\x97\\xfb\\xc1\\xf7\\x33\\xee\\xf5\\xee\\x24\\xf1\"\n    \"\\xf1\\xf6\\xb3\\xff\\x58\\x07\\x8d\\x0f\\xb3\\x0f\\xf9\\x11\\xf2\\x0c\\x9b\\x09\"\n    \"\\x78\\x02\\xff\\xfd\\xe6\\xf7\\x68\\xf3\\x0b\\xf0\\x71\\xed\\x21\\xef\\x81\\xf2\"\n    \"\\x71\\xfa\\x95\\x01\\xef\\x0b\\xd2\\x11\\xf5\\x16\\xa0\\x15\\x0b\\x10\\x85\\x06\"\n    \"\\xf3\\xfb\\x63\\xf2\\xfc\\xec\\x4c\\xec\\xde\\xf0\\xe0\\xf7\\xb5\\x00\\x7d\\x07\"\n    \"\\x12\\x0d\\xe6\\x0e\\x65\\x0d\\xf8\\x09\\x81\\x05\\x29\\x01\\x03\\xfd\\x78\\xfb\"\n    \"\\x9f\\xf9\\xe0\\xf9\\xb2\\xf8\\x10\\xf9\\x53\\xf8\\xef\\xfb\\xc3\\xfc\\x5f\\x02\"\n    \"\\x92\\x04\\x6f\\x0d\\xd7\\xfd\\x92\\xf9\\x22\\xf3\\xb1\\xed\\x5d\\xed\\x12\\xf0\"\n    \"\\x2d\\xfe\\xd3\\xfb\\x57\\x0a\\x50\\x0b\\xa7\\x13\\x79\\x0f\\x11\\x14\\x5a\\x0e\"\n    \"\\xf5\\x05\\xdd\\x00\\x9f\\xf8\\xa6\\xf5\\x56\\xed\\x5a\\xf3\\x33\\xf4\\xac\\xfd\"\n    \"\\x86\\x04\\x32\\x0e\\x19\\x11\\xf3\\x0f\\x09\\x0f\\x6f\\x08\\xb6\\x04\\xe1\\xfd\"\n    \"\\x53\\xfb\\x63\\xf5\\xd7\\xf2\\xb7\\xef\\x2c\\xef\\xcb\\xf1\\x53\\xf7\\xee\\xff\"\n    \"\\x71\\x07\\xc0\\x0f\\x8e\\x13\\x04\\x15\\x6a\\x0f\\x09\\x09\\xd3\\xff\\x89\\xf7\"\n    \"\\x68\\xf1\\x2b\\xef\\x99\\xf0\\xc5\\xf4\\xec\\xfb\\xaf\\x02\\x7e\\x08\\x44\\x0d\"\n    \"\\x07\\x0e\\x43\\x0c\\x45\\x08\\xf1\\x03\\xec\\xfe\\xaa\\xfb\\xdd\\xf9\\x34\\xfa\"\n    \"\\x37\\xf9\\xc5\\xf8\\x0d\\xf9\\xe6\\xf9\\x69\\xfb\\x86\\xff\\x6b\\x04\\xa6\\x09\"\n    \"\\x0a\\x0a\\xf9\\xfd\\xe7\\xf9\\x3b\\xf0\\x96\\xed\\x67\\xeb\\xe7\\xf2\\x9c\\xf9\"\n    \"\\x8a\\xfe\\x63\\x08\\x42\\x0c\\x00\\x12\\xe8\\x11\\x28\\x15\\x5d\\x0e\\xce\\x08\"\n    \"\\x88\\x01\\x3c\\xfa\\x6d\\xf3\\xdd\\xee\\xb3\\xf1\\xe7\\xf3\\x1a\\xfc\\xd5\\x03\"\n    \"\\xf5\\x0b\\xbb\\x0e\\xb6\\x0f\\x1f\\x0f\\xc0\\x0a\\xa4\\x07\\xe2\\x01\\x03\\xfe\"\n    \"\\x74\\xf7\\x6e\\xf3\\xb7\\xee\\x5b\\xed\\x6d\\xef\\xbc\\xf4\\x49\\xfc\\xaf\\x04\"\n    \"\\x65\\x0d\\x96\\x12\\x86\\x13\\x35\\x10\\xe3\\x0a\\x75\\x02\\x42\\xfb\\x05\\xf5\"\n    \"\\xd0\\xf2\\xda\\xf1\\xb0\\xf5\\x11\\xfa\\x0b\\x00\\x8b\\x04\\x76\\x09\\xe6\\x09\"\n    \"\\x20\\x0a\\xb7\\x07\\xac\\x05\\xd8\\x01\\x3b\\xff\\x89\\xfc\\xe8\\xfa\\xc7\\xf9\"\n    \"\\xbe\\xf8\\xf7\\xf8\\x11\\xf9\\x2c\\xfb\\x7a\\xfd\\xa6\\x02\\x75\\x05\\x13\\x0f\"\n    \"\\xdf\\xfc\\xca\\xfd\\x6d\\xf3\\xfe\\xef\\x26\\xec\\x8b\\xef\\xf6\\xfb\\x8f\\xf7\"\n    \"\\xda\\x07\\xf4\\x07\\x76\\x12\\xac\\x0e\\x0c\\x15\\x6e\\x0f\\x21\\x08\\xaa\\x04\"\n    \"\\x65\\xfc\\xde\\xf9\\xbe\\xf0\\x84\\xf4\\xb2\\xf2\\x98\\xf8\\xda\\xfe\\x2f\\x06\"\n    \"\\x94\\x0c\\xa6\\x0c\\x86\\x10\\xdd\\x0b\\x50\\x0a\\x3e\\x04\\xcb\\x00\\x4f\\xfc\"\n    \"\\x01\\xf6\\xd4\\xf3\\xb8\\xee\\xd4\\xf0\\x9e\\xf0\\x57\\xf8\\x13\\xff\\x1a\\x07\"\n    \"\\x18\\x0d\\x07\\x10\\xc3\\x10\\x30\\x0c\\x48\\x08\\xd4\\x00\\xac\\xfc\\x5b\\xf7\"\n    \"\\x58\\xf7\\x03\\xf7\\x50\\xf9\\xbf\\xfb\\x6c\\xfe\\x5c\\x02\\x64\\x03\\x38\\x06\"\n    \"\\xb3\\x06\\x87\\x06\\x6a\\x05\\x2b\\x03\\x3f\\x01\\x71\\xfe\\xec\\xfc\\xe0\\xf9\"\n    \"\\x3d\\xf9\\xe2\\xf8\\xa6\\xf9\\x8c\\xfb\\x3e\\xff\\x8b\\x07\\x61\\xf8\\xfa\\xfb\"\n    \"\\x27\\xf5\\xce\\xf3\\x74\\xf0\\x16\\xf5\\x63\\xff\\xf1\\xfb\\x6e\\x0b\\x2b\\x0b\"\n    \"\\x79\\x12\\xfe\\x0c\\x79\\x10\\x79\\x0a\\xe8\\x02\\x98\\x01\\x03\\xfc\\x8f\\xfa\"\n    \"\\xfe\\xf2\\x4b\\xf6\\x0c\\xf6\\xb5\\xf9\\x88\\x01\\xf5\\x07\\x20\\x0e\\xce\\x0c\"\n    \"\\x22\\x10\\x82\\x0a\\x5e\\x07\\xa9\\x02\\x73\\xfe\\x22\\xfb\\x84\\xf5\\x9d\\xf4\"\n    \"\\x71\\xef\\x37\\xf1\\xe6\\xf1\\x06\\xf9\\x4a\\xfe\\x4f\\x05\\xcd\\x0b\\x08\\x0f\"\n    \"\\x24\\x0f\\x34\\x0d\\x50\\x09\\x7a\\x03\\xab\\xfe\\x4f\\xfb\\x1e\\xf9\\xd2\\xf7\"\n    \"\\x1a\\xf8\\x9e\\xf9\\x45\\xfb\\x4d\\x00\\xd8\\x02\\xc8\\x06\\x01\\x08\\x21\\x08\"\n    \"\\xb5\\x06\\x6a\\x03\\xfd\\x01\\x69\\xfe\\xbd\\xfd\\xf3\\xf8\\x84\\xf9\\xa5\\xf6\"\n    \"\\xfb\\xf8\\x02\\xf8\\xae\\x03\\x83\\xf7\\x95\\xf6\\x9c\\xf7\\x7d\\xf2\\xa5\\xf5\"\n    \"\\x86\\xf3\\x2e\\x04\\x76\\xfd\\x7c\\x0a\\xbd\\x0d\\xfd\\x10\\xeb\\x0e\\x1c\\x0d\"\n    \"\\x54\\x0d\\xba\\x01\\xb9\\x01\\xa7\\xfc\\x7b\\xfb\\x5f\\xf5\\x97\\xf4\\x25\\xf7\"\n    \"\\x85\\xf6\\xe7\\xfe\\x92\\x04\\x88\\x0c\\x91\\x0c\\x8c\\x0e\\x59\\x0d\\xe3\\x06\"\n    \"\\x59\\x05\\x6c\\xff\\x83\\xfe\\x24\\xf7\\x76\\xf6\\xee\\xf1\\x7a\\xf0\\x9d\\xf1\"\n    \"\\xc3\\xf5\\x33\\xfc\\x8f\\x00\\xd2\\x08\\xd8\\x0c\\xfa\\x0e\\x67\\x0d\\x6d\\x0c\"\n    \"\\xac\\x07\\xa3\\x02\\x4b\\xff\\xfa\\xfb\\x11\\xfa\\x43\\xf7\\x03\\xf9\\x1e\\xf8\"\n    \"\\x9a\\xfc\\xef\\xfe\\xee\\x03\\xb2\\x06\\x98\\x07\\x40\\x08\\xdc\\x05\\x0e\\x04\"\n    \"\\xf6\\x00\\x38\\xff\\x8f\\xfc\\x7e\\xfa\\x58\\xf9\\x92\\xf8\\x71\\xfa\\x4d\\xfb\"\n    \"\\x2a\\xef\\xa8\\xf2\\x50\\xed\\x53\\xf0\\x88\\xf0\\x13\\xfa\\x5c\\x03\\x6e\\x05\"\n    \"\\xe2\\x12\\xf3\\x13\\x14\\x18\\xcd\\x11\\x02\\x11\\xc2\\x08\\x6a\\x01\\xb7\\xfe\"\n    \"\\xfc\\xf9\\xb1\\xf7\\x60\\xf2\\x63\\xf3\\x9b\\xf3\\xfc\\xf6\\x82\\xff\\x7a\\x06\"\n    \"\\x03\\x0e\\xe2\\x0e\\x79\\x11\\xaf\\x0c\\x7a\\x07\\x62\\x03\\xc5\\xfe\\xb2\\xfb\"\n    \"\\xf7\\xf5\\x9d\\xf4\\xd3\\xef\\x87\\xef\\x1f\\xf1\\xcd\\xf5\\xde\\xfb\\xd3\\x02\"\n    \"\\x00\\x0b\\x30\\x0f\\xa1\\x10\\x9e\\x0f\\xe2\\x0c\\x83\\x07\\xc9\\x03\\x21\\x00\"\n    \"\\xdf\\xfc\\x17\\xf9\\xa5\\xf7\\x8c\\xf6\\x7e\\xf7\\x2f\\xfb\\x19\\xff\\x9b\\x03\"\n    \"\\x0f\\x07\\x8b\\x08\\x72\\x08\\x51\\x06\\x3a\\x04\\x7f\\x01\\x84\\xfe\\x66\\xfc\"\n    \"\\xb7\\xfa\\x76\\xf9\\x99\\xf9\\x36\\xfa\\x48\\xed\\x03\\xef\\x59\\xea\\x05\\xeb\"\n    \"\\x87\\xed\\xab\\xf5\\xb4\\x01\\x91\\x04\\x0a\\x13\\xb3\\x16\\x09\\x1b\\x15\\x17\"\n    \"\\xf5\\x14\\x79\\x0d\\x4c\\x04\\x4e\\x00\\xe4\\xfa\\x51\\xf7\\xa3\\xf2\\xc0\\xf1\"\n    \"\\x16\\xf2\\x48\\xf3\\x26\\xfb\\x30\\x02\\xbf\\x09\\x78\\x0d\\xe1\\x10\\xd7\\x0f\"\n    \"\\xd9\\x0a\\xff\\x06\\x21\\x01\\x66\\xfd\\x1d\\xf7\\x2d\\xf5\\x5b\\xf1\\x8c\\xef\"\n    \"\\x2f\\xf0\\xa3\\xf3\\x54\\xf8\\xac\\xfe\\x54\\x07\\x66\\x0d\\xeb\\x10\\x2e\\x12\"\n    \"\\xf1\\x0f\\x89\\x0b\\x53\\x06\\x7b\\x02\\xbf\\xfe\\xa6\\xfa\\xac\\xf8\\x44\\xf6\"\n    \"\\x4d\\xf6\\xc4\\xf7\\x03\\xfc\\x19\\x00\\xfc\\x04\\x01\\x08\\x63\\x09\\x32\\x08\"\n    \"\\xd5\\x05\\x4c\\x03\\xbd\\xff\\x0d\\xfd\\xc0\\xfb\\x4a\\xf9\\xeb\\xf9\\x02\\xf8\"\n    \"\\x02\\xed\\x97\\xed\\x3d\\xe9\\xd9\\xea\\x2b\\xed\\x5a\\xf6\\xb4\\x00\\x74\\x05\"\n    \"\\x16\\x12\\x0e\\x16\\x8d\\x19\\xee\\x16\\xd3\\x14\\x8d\\x0e\\x5e\\x06\\xd8\\x02\"\n    \"\\x44\\xfd\\x9b\\xf8\\x34\\xf4\\x64\\xf2\\xa1\\xf2\\x05\\xf3\\x2b\\xfa\\x87\\xff\"\n    \"\\x4c\\x06\\xc1\\x09\\x78\\x0d\\x81\\x0d\\x02\\x0a\\x6a\\x08\\xe8\\x03\\x3b\\x00\"\n    \"\\x27\\xfa\\x47\\xf7\\x5d\\xf3\\x9d\\xf0\\xaa\\xf1\\xc6\\xf3\\x1f\\xf7\\x8f\\xfc\"\n    \"\\xbc\\x03\\xb0\\x09\\x55\\x0d\\x27\\x11\\xb1\\x10\\x84\\x0e\\x81\\x0a\\xc3\\x06\"\n    \"\\xb6\\x01\\x78\\xfc\\x1e\\xf9\\x23\\xf6\\x1b\\xf5\\xcf\\xf6\\x86\\xf9\\x46\\xfe\"\n    \"\\xe2\\x01\\x6b\\x06\\x02\\x08\\x30\\x08\\xf2\\x05\\x6a\\x04\\x73\\x01\\x48\\xfe\"\n    \"\\x77\\xfc\\x26\\xfc\\xc2\\xfa\\x90\\xec\\x57\\xee\\x2c\\xe7\\x65\\xe7\\xd0\\xe8\"\n    \"\\x96\\xf1\\xfd\\xfb\\x40\\x00\\x14\\x10\\x38\\x14\\x61\\x19\\x90\\x18\\x10\\x18\"\n    \"\\xd9\\x11\\xb1\\x09\\xab\\x06\\x80\\x01\\xa0\\xfb\\x60\\xf7\\x6a\\xf4\\xec\\xf2\"\n    \"\\xe9\\xf0\\xf1\\xf6\\x76\\xfb\\x01\\x01\\x8f\\x05\\x2e\\x0a\\x35\\x0b\\x56\\x09\"\n    \"\\x68\\x09\\xa0\\x05\\x08\\x03\\x7d\\xfe\\xe6\\xfb\\xd6\\xf6\\x95\\xf3\\xf2\\xf1\"\n    \"\\x20\\xf3\\x8e\\xf4\\xf3\\xf8\\xc6\\xff\\x67\\x05\\xb6\\x09\\xe3\\x0d\\xa2\\x0f\"\n    \"\\xb3\\x0e\\x46\\x0d\\x51\\x0b\\xab\\x07\\xdd\\x02\\xa0\\xfe\\x03\\xfa\\x04\\xf6\"\n    \"\\x98\\xf5\\xe1\\xf5\\x95\\xf9\\x7b\\xfd\\xdc\\x01\\x4d\\x05\\x66\\x06\\x0f\\x07\"\n    \"\\xc7\\x04\\xd9\\x02\\xf8\\xfe\\x0e\\xfe\\xf7\\xfb\\x88\\xfd\\x40\\xf2\\x44\\xef\"\n    \"\\x60\\xeb\\x4a\\xe6\\x76\\xe9\\xb1\\xec\\x57\\xf9\\x8d\\xfd\\xce\\x0a\\xe7\\x12\"\n    \"\\x4a\\x16\\x71\\x18\\x2b\\x16\\x59\\x13\\xac\\x0b\\x47\\x08\\x3e\\x05\\x37\\xff\"\n    \"\\xc5\\xfb\\x0d\\xf7\\x43\\xf5\\x61\\xf2\\x89\\xf5\\x10\\xfa\\x73\\xfd\\x69\\x02\"\n    \"\\x0a\\x05\\xd0\\x07\\x3a\\x06\\x18\\x07\\x6f\\x05\\xd7\\x03\\x5f\\x01\\x70\\xfe\"\n    \"\\xee\\xfa\\x5f\\xf7\\x1e\\xf5\\x7c\\xf5\\xd2\\xf4\\x31\\xf8\\x0a\\xfd\\xdb\\x01\"\n    \"\\xc0\\x06\\xa1\\x0a\\xe8\\x0d\\x23\\x0d\\xc1\\x0d\\x36\\x0c\\xbc\\x09\\x2a\\x06\"\n    \"\\x08\\x02\\xd9\\xfd\\x17\\xf9\\x27\\xf8\\xad\\xf6\\x4d\\xf8\\xa2\\xfa\\xaa\\xfd\"\n    \"\\xbe\\x00\\x26\\x02\\xa6\\x04\\xd6\\x03\\x75\\x03\\xa7\\x00\\x92\\xff\\x56\\xfe\"\n    \"\\xbf\\xfe\\xe2\\xf3\\x9a\\xf2\\xf5\\xed\\xb2\\xe8\\x01\\xea\\xcd\\xeb\\xf3\\xf5\"\n    \"\\xdf\\xf8\\x38\\x07\\x48\\x0f\\xaa\\x14\\xd3\\x17\\x4f\\x17\\x9a\\x13\\xb4\\x0c\"\n    \"\\xab\\x09\\x6e\\x06\\x75\\x01\\x37\\xfe\\x7a\\xfa\\x22\\xf7\\x5e\\xf3\\x95\\xf4\"\n    \"\\x93\\xf7\\x8b\\xfa\\xb1\\xff\\x63\\x03\\x35\\x06\\x8b\\x05\\x90\\x06\\xf3\\x04\"\n    \"\\xc2\\x03\\xf1\\x01\\x37\\x00\\x14\\xfd\\xfb\\xf9\\xb1\\xf7\\x58\\xf6\\x85\\xf4\"\n    \"\\x8d\\xf7\\xca\\xfb\\x50\\x00\\xee\\x05\\x6a\\x0a\\x81\\x0d\\xf2\\x0c\\xc1\\x0d\"\n    \"\\xd4\\x0b\\x7a\\x09\\x9c\\x06\\x5d\\x03\\x5b\\xff\\xd2\\xfa\\x0f\\xfa\\x84\\xf7\"\n    \"\\x1c\\xf8\\xaf\\xf9\\x60\\xfc\\xee\\xfe\\x4c\\x00\\xe0\\x02\\x93\\x02\\xf6\\x01\"\n    \"\\x8c\\x00\\x4f\\xff\\x65\\xff\\xfb\\xfd\\xa4\\xf4\\x98\\xf4\\xcb\\xee\\xef\\xea\"\n    \"\\xd1\\xeb\\x71\\xee\\x47\\xf5\\x2e\\xf9\\x47\\x06\\x65\\x0d\\xd4\\x12\\xed\\x16\"\n    \"\\xf5\\x16\\x0c\\x13\\xd2\\x0d\\xb0\\x0a\\xd1\\x06\\xb7\\x01\\xd7\\xfe\\x6e\\xfb\"\n    \"\\xef\\xf7\\x25\\xf5\\x12\\xf6\\x46\\xf7\\x20\\xf9\\x3b\\xfd\\x97\\x00\\x3e\\x03\"\n    \"\\x0b\\x04\\xf8\\x05\\xdc\\x04\\x06\\x04\\x5c\\x02\\x87\\x00\\x77\\xfd\\x38\\xfb\"\n    \"\\x05\\xf9\\x9d\\xf6\\x72\\xf6\\x23\\xf8\\xc7\\xfb\\x8f\\xff\\xc6\\x05\\xab\\x0a\"\n    \"\\x71\\x0d\\x7d\\x0e\\xc1\\x0e\\x2e\\x0c\\x11\\x09\\xac\\x05\\x6a\\x02\\xc8\\xfe\"\n    \"\\xf3\\xfb\\x6f\\xfb\\x4f\\xf9\\x82\\xf9\\xf5\\xf9\\x2a\\xfb\\x6e\\xfc\\x2f\\xfe\"\n    \"\\xbc\\x00\\x45\\x01\\x3e\\x01\\xb0\\x00\\xc9\\xff\\xfc\\xff\\x1d\\xf7\\xa2\\xf4\"\n    \"\\x31\\xf2\\xe3\\xec\\xfc\\xec\\x58\\xee\\x6b\\xf4\\x7c\\xf6\\xff\\xff\\xcf\\x08\"\n    \"\\x2e\\x0e\\x4f\\x13\\x74\\x16\\xda\\x14\\x35\\x10\\xf1\\x0c\\xa0\\x09\\x93\\x04\"\n    \"\\xdc\\x00\\x3a\\xfe\\xd3\\xfa\\xc8\\xf7\\x3f\\xf7\\x62\\xf8\\x1d\\xf8\\xb6\\xfa\"\n    \"\\xc7\\xfd\\x1e\\x00\\xfa\\x00\\x3b\\x03\\xb5\\x03\\x37\\x03\\xaa\\x02\\xe2\\x01\"\n    \"\\xd2\\xff\\x82\\xfd\\x31\\xfb\\x6a\\xf8\\x45\\xf7\\x99\\xf7\\xb8\\xfa\\x64\\xfe\"\n    \"\\xde\\x02\\x33\\x08\\x8a\\x0b\\x1f\\x0d\\x59\\x0d\\x86\\x0c\\x6b\\x0a\\x37\\x07\"\n    \"\\x83\\x04\\xa9\\x01\\xcd\\xfe\\xea\\xfc\\xe2\\xfb\\xba\\xfa\\x92\\xfa\\x53\\xfa\"\n    \"\\x5e\\xfb\\xea\\xfb\\x9a\\xfd\\xc7\\xfe\\xed\\xff\\xf3\\xff\\x8e\\x02\\x8d\\xfd\"\n    \"\\x86\\xf6\\xe0\\xf5\\x8a\\xef\\x12\\xee\\x3a\\xed\\x17\\xf2\\x7d\\xf5\\x1e\\xfa\"\n    \"\\x96\\x03\\xbc\\x08\\x13\\x0d\\x89\\x11\\x43\\x13\\x73\\x11\\x1d\\x0f\\xac\\x0d\"\n    \"\\x26\\x0a\\xd8\\x04\\x5a\\x01\\xa5\\xfd\\x15\\xfa\\x95\\xf7\\xde\\xf8\\x3a\\xf9\"\n    \"\\xc9\\xfa\\x48\\xfc\\x80\\xfe\\xf3\\xfe\\x91\\xff\\xd5\\x00\\x3a\\x01\\x63\\x01\"\n    \"\\x3e\\x01\\x19\\x01\\x21\\xff\\x9c\\xfd\\x3a\\xfb\\x03\\xfa\\x17\\xf9\\x59\\xfa\"\n    \"\\x23\\xfd\\x77\\x00\\xb5\\x03\\x7a\\x07\\xe8\\x09\\x40\\x0b\\x25\\x0b\\x2d\\x0b\"\n    \"\\x8b\\x09\\x65\\x07\\x7d\\x05\\x76\\x02\\x9f\\x00\\x54\\xfe\\x1f\\xfd\\x8d\\xfc\"\n    \"\\xbd\\xfb\\x5d\\xfb\\x6a\\xfb\\x44\\xfb\\xae\\xfb\\xee\\xfb\\xd6\\xfc\\xc7\\xfd\"\n    \"\\x44\\xff\\x8f\\xf8\\xe3\\xf7\\x36\\xf5\\x1d\\xf1\\x74\\xf1\\xac\\xf1\\x48\\xf6\"\n    \"\\x42\\xf7\\x0b\\xff\\xfc\\x04\\xfd\\x08\\x4f\\x0d\\x43\\x10\\xb2\\x0f\\x73\\x0d\"\n    \"\\x2d\\x0c\\xa5\\x0a\\x25\\x07\\xc0\\x04\\x43\\x02\\x50\\xff\\x59\\xfc\\x06\\xfb\"\n    \"\\xf3\\xfa\\xf2\\xf9\\x8e\\xfb\\xab\\xfc\\xe4\\xfd\\xe2\\xfd\\x51\\xff\\x71\\xff\"\n    \"\\xef\\xfe\\x1f\\xff\\x48\\xff\\xc0\\xfe\\xbe\\xfd\\x6a\\xfd\\xcf\\xfc\\xa2\\xfb\"\n    \"\\x32\\xfc\\x86\\xfd\\x9c\\xff\\x09\\x02\\x63\\x05\\xee\\x07\\x07\\x09\\xed\\x09\"\n    \"\\x5d\\x09\\x3a\\x08\\xa8\\x06\\x9f\\x05\\x4d\\x04\\x97\\x02\\xc8\\x01\\xfe\\xff\"\n    \"\\xa3\\xfe\\xab\\xfd\\xb6\\xfc\\x5a\\xfc\\xba\\xfb\\x13\\xfc\\xee\\xfb\\xd2\\xfb\"\n    \"\\x2f\\xfc\\x03\\xfd\\xa1\\xf6\\x04\\xf6\\xeb\\xf3\\xf4\\xf0\\xbf\\xf1\\x29\\xf3\"\n    \"\\xc2\\xf7\\x83\\xf9\\x3f\\x00\\xb6\\x05\\x72\\x09\\xa6\\x0c\\x47\\x0f\\xb8\\x0e\"\n    \"\\xa7\\x0c\\xbd\\x0a\\x37\\x09\\xc5\\x05\\x66\\x03\\x1d\\x01\\xcd\\xfe\\x7e\\xfc\"\n    \"\\x9d\\xfb\\xe3\\xfb\\x82\\xfb\\xd6\\xfc\\xcc\\xfd\\x08\\xff\\xae\\xfe\\x71\\xff\"\n    \"\\x3d\\xff\\x19\\xff\\x8d\\xfe\\xcd\\xfe\\xe6\\xfd\\xdf\\xfc\\xa0\\xfc\\x00\\xfc\"\n    \"\\x32\\xfc\\xdf\\xfc\\x0a\\xff\\x46\\x01\\x88\\x03\\xd2\\x05\\x3d\\x07\\xb8\\x07\"\n    \"\\xdf\\x07\\x78\\x07\\x2a\\x07\\x4d\\x06\\x85\\x05\\xa1\\x04\\x2e\\x03\\x4a\\x02\"\n    \"\\x83\\x00\\x6e\\xff\\x65\\xfe\\x83\\xfd\\x36\\xfd\\xe7\\xfc\\x80\\xfc\\xad\\xfc\"\n    \"\\x10\\xfc\\x03\\xfd\\x10\\xf9\\x00\\xf5\\x7c\\xf4\\xc9\\xef\\x5d\\xf0\\xbe\\xf0\"\n    \"\\xdf\\xf4\\x34\\xf8\\x25\\xfd\\x57\\x04\\xda\\x07\\xf7\\x0b\\xc9\\x0e\\x88\\x0f\"\n    \"\\x30\\x0e\\xde\\x0c\\xdc\\x0a\\x2a\\x08\\x80\\x04\\x3a\\x02\\x8a\\xfe\\x22\\xfc\"\n    \"\\x81\\xfa\\x30\\xfa\\x09\\xfa\\x1c\\xfb\\x1c\\xfd\\x10\\xfe\\x54\\xff\\x35\\x00\"\n    \"\\x8a\\x00\\x0b\\x00\\xe4\\xff\\x46\\xff\\x62\\xfe\\x70\\xfd\\xdf\\xfc\\xc9\\xfb\"\n    \"\\xcc\\xfb\\x2d\\xfc\\xca\\xfd\\xde\\xff\\x66\\x02\\xb6\\x04\\x3b\\x06\\x28\\x07\"\n    \"\\x49\\x07\\x02\\x07\\x6d\\x06\\x1a\\x06\\xaf\\x05\\x4b\\x05\\x34\\x04\\x7b\\x03\"\n    \"\\xca\\x01\\x70\\x00\\x55\\xff\\x3a\\xfe\\xae\\xfd\\xa3\\xfd\\x53\\xfd\\x99\\xfd\"\n    \"\\x91\\xfd\\xe3\\xfd\\xd4\\xf8\\xc7\\xf5\\x76\\xf3\\x61\\xee\\xce\\xee\\x27\\xef\"\n    \"\\x7d\\xf3\\x27\\xf7\\xb6\\xfd\\x50\\x04\\x36\\x08\\x4f\\x0c\\x8c\\x0e\\xbf\\x0e\"\n    \"\\x1c\\x0e\\x62\\x0d\\xdc\\x0b\\x5b\\x09\\x6d\\x06\\x75\\x03\\x88\\xff\\x45\\xfc\"\n    \"\\xf0\\xf9\\xed\\xf8\\xfb\\xf7\\x72\\xf9\\xa8\\xfa\\x5c\\xfc\\xed\\xfd\\x81\\xff\"\n    \"\\x64\\x00\\xa6\\x00\\xba\\x00\\x1f\\x00\\xa0\\xff\\x1f\\xff\\xaa\\xfe\\x11\\xfe\"\n    \"\\xfe\\xfd\\xf0\\xfd\\x9e\\xfe\\xd3\\xff\\x58\\x01\\xb4\\x02\\x05\\x04\\xd8\\x04\"\n    \"\\x93\\x05\\x71\\x05\\xa0\\x05\\xac\\x05\\xa9\\x05\\x94\\x05\\x3b\\x05\\xb8\\x04\"\n    \"\\x3d\\x03\\x7c\\x01\\x2f\\x00\\x30\\xfe\\x70\\xfd\\xd4\\xfc\\x94\\xfc\\xcd\\xfc\"\n    \"\\x71\\xfd\\x5b\\xfc\\xba\\xf7\\xb4\\xf6\\x88\\xf2\\x0b\\xf0\\xe9\\xef\\x64\\xf1\"\n    \"\\x1b\\xf5\\x16\\xf9\\x29\\x00\\x1a\\x05\\x44\\x09\\x86\\x0c\\xad\\x0d\\x39\\x0d\"\n    \"\\xa0\\x0c\\xca\\x0b\\x80\\x0a\\x54\\x08\\x55\\x06\\x71\\x03\\x0e\\x00\\xdd\\xfc\"\n    \"\\xc3\\xfa\\x26\\xf9\\x67\\xf8\\x1c\\xf9\\x2e\\xfa\\x8d\\xfb\\xbb\\xfc\\x2f\\xfe\"\n    \"\\xb8\\xfe\\x28\\xff\\x4b\\xff\\x85\\xff\\x68\\xff\\x9f\\xff\\xb8\\xff\\xe3\\xff\"\n    \"\\x0d\\x00\\x45\\x00\\xaa\\x00\\x05\\x01\\xc0\\x01\\x7e\\x02\\xf4\\x02\\xad\\x03\"\n    \"\\x45\\x04\\x59\\x04\\x94\\x04\\x97\\x04\\x8c\\x04\\x95\\x04\\xbf\\x04\\x67\\x04\"\n    \"\\x71\\x03\\x8e\\x02\\x4d\\x01\\xab\\xff\\x50\\xfe\\x55\\xfd\\x6c\\xfc\\x27\\xfc\"\n    \"\\x79\\xfb\\x85\\xf7\\x5f\\xf6\\xaf\\xf3\\x48\\xf1\\x7b\\xf1\\x4b\\xf2\\x66\\xf5\"\n    \"\\xa1\\xf8\\xa7\\xfe\\xa8\\x03\\xba\\x07\\x70\\x0b\\x1f\\x0d\\xcd\\x0c\\x54\\x0c\"\n    \"\\x5a\\x0b\\xe1\\x09\\x01\\x08\\x19\\x06\\xe7\\x03\\x33\\x01\\x81\\xfe\\x5a\\xfc\"\n    \"\\x97\\xfa\\x50\\xf9\\x5c\\xf9\\xf3\\xf9\\x1d\\xfb\\x36\\xfc\\x9f\\xfd\\x28\\xfe\"\n    \"\\x35\\xfe\\x7a\\xfe\\x67\\xfe\\x64\\xfe\\xfb\\xfe\\xb2\\xff\\x49\\x00\\xd8\\x00\"\n    \"\\x4a\\x01\\x7f\\x01\\x98\\x01\\xa4\\x01\\x16\\x02\\x3c\\x02\\xa0\\x02\\x8f\\x03\"\n    \"\\xe3\\x03\\x70\\x04\\x85\\x04\\x88\\x04\\x0e\\x04\\xac\\x03\\xac\\x03\\xdd\\x02\"\n    \"\\xa7\\x02\\xe3\\x01\\x34\\x01\\x09\\x00\\xf1\\xfe\\xc3\\xfd\\x11\\xfd\\x1d\\xfa\"\n    \"\\x20\\xf7\\xc0\\xf5\\x2c\\xf2\\x69\\xf1\\x8e\\xf1\\x88\\xf3\\x51\\xf6\\x91\\xfa\"\n    \"\\x11\\x00\\x0e\\x04\\xc2\\x07\\xe5\\x0a\\x21\\x0c\\x07\\x0c\\xfa\\x0b\\x29\\x0b\"\n    \"\\xb8\\x09\\xd4\\x07\\x17\\x06\\x64\\x03\\xb6\\x00\\x3e\\xfe\\x33\\xfc\\x10\\xfa\"\n    \"\\x18\\xf9\\x40\\xf9\\xa5\\xf9\\xa4\\xfa\\x14\\xfc\\x39\\xfd\\xd2\\xfd\\x6a\\xfe\"\n    \"\\xc1\\xfe\\xfb\\xfe\\x22\\xff\\xf1\\xff\\x72\\x00\\x30\\x01\\xb0\\x01\\x2f\\x02\"\n    \"\\xea\\x01\\x95\\x01\\x32\\x01\\xc5\\x00\\xd2\\x00\\x1a\\x01\\x13\\x02\\xfb\\x02\"\n    \"\\xea\\x03\\x96\\x04\\x1a\\x05\\xc9\\x04\\x87\\x04\\xd6\\x03\\x26\\x03\\x6c\\x02\"\n    \"\\xd3\\x01\\x10\\x01\\x1d\\x00\\xef\\xfe\\xa4\\xfd\\x41\\xfa\\x94\\xf7\\x40\\xf5\"\n    \"\\x5c\\xf2\\xea\\xf1\\xfb\\xf1\\x61\\xf4\\x22\\xf7\\x4a\\xfb\\xef\\xff\\x9d\\x03\"\n    \"\\x1d\\x07\\x71\\x09\\x62\\x0a\\xfa\\x0a\\xc5\\x0a\\x75\\x0a\\x85\\x09\\x1d\\x08\"\n    \"\\xb6\\x06\\x40\\x04\\x00\\x02\\x6f\\xff\\x21\\xfd\\x2e\\xfb\\xdc\\xf9\\x6d\\xf9\"\n    \"\\x8d\\xf9\\x23\\xfa\\x19\\xfb\\xf0\\xfb\\xb6\\xfc\\x42\\xfd\\xd9\\xfd\\x45\\xfe\"\n    \"\\x08\\xff\\xed\\xff\\x0c\\x01\\xfc\\x01\\xd2\\x02\\x61\\x03\\x22\\x03\\x9c\\x02\"\n    \"\\xab\\x01\\xcf\\x00\\x19\\x00\\xd4\\xff\\x13\\x00\\xc6\\x00\\xb5\\x01\\xba\\x02\"\n    \"\\x65\\x03\\xf6\\x03\\x06\\x04\\xc4\\x03\\x4b\\x03\\x16\\x03\\x8e\\x02\\x3d\\x02\"\n    \"\\xb2\\x01\\x0b\\x01\\x0d\\xff\\x92\\xfb\\x4f\\xf9\\x9a\\xf5\\x13\\xf3\\x12\\xf2\"\n    \"\\x8b\\xf2\\x78\\xf4\\x6a\\xf7\\x04\\xfc\\x02\\x00\\x75\\x03\\x8a\\x06\\x58\\x08\"\n    \"\\xd2\\x08\\x5b\\x09\\x87\\x09\\x44\\x09\\xb7\\x08\\xfe\\x07\\x98\\x06\\x79\\x04\"\n    \"\\x36\\x02\\xf7\\xff\\x88\\xfd\\xc5\\xfb\\xe2\\xfa\\x3d\\xfa\\x81\\xfa\\x05\\xfb\"\n    \"\\xcb\\xfb\\x58\\xfc\\xda\\xfc\\x63\\xfd\\x8c\\xfd\\xfe\\xfd\\xa4\\xfe\\x82\\xff\"\n    \"\\x7c\\x00\\x7b\\x01\\x5e\\x02\\xe7\\x02\\xea\\x02\\x99\\x02\\xfb\\x01\\x31\\x01\"\n    \"\\x91\\x00\\x17\\x00\\x44\\x00\\xb2\\x00\\x64\\x01\\x39\\x02\\xad\\x02\\xf9\\x02\"\n    \"\\xd1\\x02\\x4d\\x02\\xef\\x01\\xae\\x01\\x80\\x01\\xad\\x01\\xc0\\x01\\x91\\x01\"\n    \"\\x65\\xff\\x5c\\xfd\\xa2\\xfa\\xf6\\xf6\\x2a\\xf5\\xcf\\xf3\\x53\\xf4\\xff\\xf5\"\n    \"\\x37\\xf9\\x08\\xfd\\x2f\\x00\\x71\\x03\\x99\\x05\\xa0\\x06\\x79\\x07\\x14\\x08\"\n    \"\\x8a\\x08\\xd6\\x08\\xd8\\x08\\x52\\x08\\xe9\\x06\\xee\\x04\\x74\\x02\\x9b\\xff\"\n    \"\\xff\\xfc\\x2e\\xfb\\xfa\\xf9\\xc6\\xf9\\x3f\\xfa\\x20\\xfb\\xef\\xfb\\xa0\\xfc\"\n    \"\\x12\\xfd\\x63\\xfd\\xb5\\xfd\\x41\\xfe\\x08\\xff\\x09\\x00\\x32\\x01\\x16\\x02\"\n    \"\\xaf\\x02\\xd1\\x02\\x75\\x02\\xb8\\x01\\xf9\\x00\\x60\\x00\\x24\\x00\\x52\\x00\"\n    \"\\xe0\\x00\\x98\\x01\\x3b\\x02\\xa1\\x02\\xdc\\x02\\xad\\x02\\x3f\\x02\\xfb\\x01\"\n    \"\\xba\\x01\\x88\\x01\\x8e\\x01\\x92\\x01\\xe5\\x00\\xb0\\xfe\\xae\\xfc\\xf2\\xf9\"\n    \"\\xae\\xf6\\xd0\\xf4\\xca\\xf3\\x57\\xf4\\x1b\\xf6\\xad\\xf9\\xcd\\xfd\\x67\\x01\"\n    \"\\xc5\\x04\\xe2\\x06\\x98\\x07\\xd0\\x07\\xcb\\x07\\xbe\\x07\\xc7\\x07\\xe2\\x07\"\n    \"\\xf3\\x07\\x44\\x07\\xfd\\x05\\x28\\x04\\x7d\\x01\\x9e\\xfe\\x2c\\xfc\\x47\\xfa\"\n    \"\\x71\\xf9\\x68\\xf9\\x33\\xfa\\x1e\\xfb\\xee\\xfb\\x91\\xfc\\xc0\\xfc\\xff\\xfc\"\n    \"\\x58\\xfd\\x39\\xfe\\x90\\xff\\x2b\\x01\\xb8\\x02\\xe0\\x03\\x28\\x04\\x93\\x03\"\n    \"\\x72\\x02\\xe5\\x00\\x91\\xff\\xd2\\xfe\\xbe\\xfe\\x51\\xff\\x33\\x00\\x50\\x01\"\n    \"\\x3e\\x02\\x8f\\x02\\x92\\x02\\x29\\x02\\x8e\\x01\\x1b\\x01\\xcd\\x00\\xe7\\x00\"\n    \"\\x15\\x01\\x28\\x01\\xf0\\x00\\x0f\\xff\\x50\\xfd\\x2b\\xfb\\x83\\xf8\\x24\\xf7\"\n    \"\\x66\\xf6\\x17\\xf7\\x8f\\xf8\\x2b\\xfb\\x47\\xfe\\xcd\\x00\\x2e\\x03\\xf6\\x04\"\n    \"\\xb5\\x05\\x2e\\x06\\x9a\\x06\\xd7\\x06\\xf2\\x06\\xe5\\x06\\xa0\\x06\\xa7\\x05\"\n    \"\\x38\\x04\\x8f\\x02\\x9e\\x00\\x9c\\xfe\\x28\\xfd\\x3b\\xfc\\xbf\\xfb\\xce\\xfb\"\n    \"\\x24\\xfc\\x71\\xfc\\xa9\\xfc\\xd9\\xfc\\x15\\xfd\\x5c\\xfd\\x09\\xfe\\x20\\xff\"\n    \"\\x54\\x00\\x8c\\x01\\x81\\x02\\xed\\x02\\xa2\\x02\\xfa\\x01\\x1d\\x01\\x1e\\x00\"\n    \"\\x69\\xff\\x3c\\xff\\x9c\\xff\\x1b\\x00\\xd6\\x00\\xa1\\x01\\xd4\\x01\\xdd\\x01\"\n    \"\\x02\\x02\\xa8\\x01\\x89\\x01\\x56\\x01\\x8f\\x01\\x71\\x00\\xc9\\xfe\\xc3\\xfd\"\n    \"\\xeb\\xfa\\xf4\\xf8\\x60\\xf7\\xbc\\xf6\\x0a\\xf7\\x7e\\xf8\\x9b\\xfb\\x6f\\xfe\"\n    \"\\x63\\x01\\x20\\x04\\x8f\\x05\\x16\\x06\\x54\\x06\\x46\\x06\\x2f\\x06\\x42\\x06\"\n    \"\\xa2\\x06\\xa7\\x06\\x3a\\x06\\x5f\\x05\\xc4\\x03\\x68\\x01\\x13\\xff\\xde\\xfc\"\n    \"\\x2f\\xfb\\x56\\xfa\\x6a\\xfa\\x28\\xfb\\x24\\xfc\\x39\\xfd\\x02\\xfe\\x55\\xfe\"\n    \"\\x63\\xfe\\x71\\xfe\\xa3\\xfe\\x3c\\xff\\x38\\x00\\x65\\x01\\x7e\\x02\\x11\\x03\"\n    \"\\x19\\x03\\x64\\x02\\x1b\\x01\\xdc\\xff\\xb4\\xfe\\x2b\\xfe\\x4d\\xfe\\xf2\\xfe\"\n    \"\\x15\\x00\\xf9\\x00\\xb4\\x01\\x07\\x02\\xda\\x01\\x8f\\x01\\x3b\\x01\\x1d\\x01\"\n    \"\\x1d\\x01\\x4e\\x01\\xa6\\x01\\x20\\x01\\x21\\xff\\xb6\\xfd\\x31\\xfb\\x84\\xf8\"\n    \"\\x37\\xf7\\xa3\\xf6\\x80\\xf7\\x2d\\xf9\\x5f\\xfc\\x8b\\xff\\x0e\\x02\\x75\\x04\"\n    \"\\xb8\\x05\\xcf\\x05\\xe0\\x05\\xdc\\x05\\xc0\\x05\\xb8\\x05\\xed\\x05\\xda\\x05\"\n    \"\\x1d\\x05\\x0a\\x04\\x77\\x02\\x4c\\x00\\x38\\xfe\\xa2\\xfc\\x71\\xfb\\x07\\xfb\"\n    \"\\x55\\xfb\\x10\\xfc\\xc6\\xfc\\x8e\\xfd\\x29\\xfe\\x74\\xfe\\xb6\\xfe\\x3f\\xff\"\n    \"\\xdb\\xff\\x9f\\x00\\xa3\\x01\\x78\\x02\\xdb\\x02\\xb2\\x02\\x1b\\x02\\x07\\x01\"\n    \"\\xcb\\xff\\xb2\\xfe\\x15\\xfe\\xfa\\xfd\\x77\\xfe\\x73\\xff\\x66\\x00\\x38\\x01\"\n    \"\\xc0\\x01\\xf3\\x01\\xc8\\x01\\xc5\\x01\\xc1\\x01\\xcb\\x01\\x04\\x02\\x4a\\x02\"\n    \"\\xbc\\x01\\x0d\\x00\\x6e\\xfe\\xdc\\xfb\\x38\\xf9\\x79\\xf7\\xa9\\xf6\\x15\\xf7\"\n    \"\\xa2\\xf8\\x6f\\xfb\\x58\\xfe\\xf1\\x00\\x23\\x03\\x52\\x04\\xa1\\x04\\xda\\x04\"\n    \"\\x0f\\x05\\x62\\x05\\xe5\\x05\\x71\\x06\\xa5\\x06\\x1b\\x06\\xfa\\x04\\x3a\\x03\"\n    \"\\xdf\\x00\\xa3\\xfe\\xf3\\xfc\\xbf\\xfb\\x73\\xfb\\xd9\\xfb\\x8d\\xfc\\x41\\xfd\"\n    \"\\xca\\xfd\\x1f\\xfe\\x21\\xfe\\x26\\xfe\\x7b\\xfe\\x1b\\xff\\x13\\x00\\x4e\\x01\"\n    \"\\x62\\x02\\x1e\\x03\\x48\\x03\\xc5\\x02\\xbd\\x01\\x5e\\x00\\x26\\xff\\x4f\\xfe\"\n    \"\\xf4\\xfd\\x49\\xfe\\xfb\\xfe\\xbc\\xff\\x75\\x00\\x03\\x01\\x23\\x01\\xed\\x00\"\n    \"\\xee\\x00\\xd8\\x00\\xf5\\x00\\x56\\x01\\xda\\x01\\xa2\\x01\\xa5\\x00\\x9e\\xff\"\n    \"\\x77\\xfd\\x53\\xfb\\xb2\\xf9\\xc6\\xf8\\xe7\\xf8\\x0e\\xfa\\x49\\xfc\\x8e\\xfe\"\n    \"\\x9c\\x00\\x4a\\x02\\x0d\\x03\\x1e\\x03\\x32\\x03\\x41\\x03\\x9f\\x03\\x23\\x04\"\n    \"\\xd2\\x04\\x39\\x05\\xf4\\x04\\x44\\x04\\xd8\\x02\\x0e\\x01\\x61\\xff\\x20\\xfe\"\n    \"\\x61\\xfd\\x35\\xfd\\xa0\\xfd\\x2b\\xfe\\x73\\xfe\\x9d\\xfe\\x77\\xfe\\x28\\xfe\"\n    \"\\x07\\xfe\\x36\\xfe\\xc6\\xfe\\xa4\\xff\\xa8\\x00\\x9a\\x01\\x23\\x02\\x28\\x02\"\n    \"\\xa6\\x01\\xcc\\x00\\xd6\\xff\\x14\\xff\\xac\\xfe\\xab\\xfe\\x11\\xff\\xa0\\xff\"\n    \"\\x3f\\x00\\xad\\x00\\x02\\x01\\x16\\x01\\x14\\x01\\x2b\\x01\\x50\\x01\\xa3\\x01\"\n    \"\\x15\\x02\\x44\\x02\\xe6\\x01\\xb3\\x00\\x26\\xff\\x0a\\xfd\\xde\\xfa\\x6d\\xf9\"\n    \"\\x9d\\xf8\\xeb\\xf8\\x3f\\xfa\\x5e\\xfc\\x9e\\xfe\\x92\\x00\\x15\\x02\\xc6\\x02\"\n    \"\\xe7\\x02\\xfc\\x02\\x0b\\x03\\x6c\\x03\\x00\\x04\\x9d\\x04\\xf1\\x04\\xbf\\x04\"\n    \"\\x10\\x04\\xbc\\x02\\x17\\x01\\x81\\xff\\x3e\\xfe\\x8d\\xfd\\x7e\\xfd\\xdc\\xfd\"\n    \"\\x59\\xfe\\xbd\\xfe\\xe8\\xfe\\xc2\\xfe\\x78\\xfe\\x3a\\xfe\\x40\\xfe\\xa7\\xfe\"\n    \"\\x66\\xff\\x54\\x00\\x40\\x01\\xf5\\x01\\x21\\x02\\xc5\\x01\\x20\\x01\\x44\\x00\"\n    \"\\x80\\xff\\xfc\\xfe\\xe1\\xfe\\x16\\xff\\x7c\\xff\\x04\\x00\\x64\\x00\\x87\\x00\"\n    \"\\x81\\x00\\x61\\x00\\x45\\x00\\x65\\x00\\xb4\\x00\\x43\\x01\\xb3\\x01\\xaf\\x01\"\n    \"\\x01\\x01\\xd9\\xff\\x4a\\xfe\\x7c\\xfc\\x25\\xfb\\x66\\xfa\\x7d\\xfa\\x78\\xfb\"\n    \"\\x0b\\xfd\\xd2\\xfe\\x58\\x00\\x75\\x01\\x02\\x02\\x23\\x02\\x34\\x02\\x67\\x02\"\n    \"\\xcb\\x02\\x41\\x03\\xbd\\x03\\xf0\\x03\\xbb\\x03\\x28\\x03\\x3e\\x02\\x24\\x01\"\n    \"\\x1b\\x00\\x50\\xff\\xc7\\xfe\\x85\\xfe\\x7c\\xfe\\x80\\xfe\\x72\\xfe\\x60\\xfe\"\n    \"\\x3d\\xfe\\x2c\\xfe\\x35\\xfe\\x74\\xfe\\xf2\\xfe\\x8f\\xff\\x3f\\x00\\xd8\\x00\"\n    \"\\x3f\\x01\\x49\\x01\\x1c\\x01\\xc7\\x00\\x51\\x00\\xf4\\xff\\xb6\\xff\\xae\\xff\"\n    \"\\xeb\\xff\\x3b\\x00\\x83\\x00\\xc0\\x00\\xc5\\x00\\xb5\\x00\\x77\\x00\\x22\\x00\"\n    \"\\x11\\x00\\x19\\x00\\x50\\x00\\x94\\x00\\x77\\x00\\xf6\\xff\\x1f\\xff\\x02\\xfe\"\n    \"\\xd3\\xfc\\xf6\\xfb\\xb7\\xfb\\x1c\\xfc\\x19\\xfd\\x7a\\xfe\\xdd\\xff\\xf1\\x00\"\n    \"\\x95\\x01\\xbc\\x01\\x9a\\x01\\x73\\x01\\x7f\\x01\\xc0\\x01\\x33\\x02\\xad\\x02\"\n    \"\\xf4\\x02\\xf2\\x02\\x9c\\x02\\xf2\\x01\\x20\\x01\\x61\\x00\\xc8\\xff\\x63\\xff\"\n    \"\\x36\\xff\\x2f\\xff\\x21\\xff\\x0c\\xff\\xe1\\xfe\\xa6\\xfe\\x78\\xfe\\x6c\\xfe\"\n    \"\\x8b\\xfe\\xe3\\xfe\\x6a\\xff\\xf6\\xff\\x72\\x00\\xca\\x00\\xeb\\x00\\xca\\x00\"\n    \"\\x7c\\x00\\x2d\\x00\\xd8\\xff\\xaf\\xff\\xba\\xff\\xf0\\xff\\x40\\x00\\x88\\x00\"\n    \"\\xcd\\x00\\xd5\\x00\\xc7\\x00\\xa8\\x00\\x79\\x00\\x63\\x00\\x65\\x00\\x3b\\x00\"\n    \"\\xf0\\xff\\x7b\\xff\\xb2\\xfe\\xd8\\xfd\\xfe\\xfc\\x77\\xfc\\x55\\xfc\\xc1\\xfc\"\n    \"\\xa5\\xfd\\xb9\\xfe\\xe6\\xff\\xe3\\x00\\x8b\\x01\\xdd\\x01\\xea\\x01\\xe2\\x01\"\n    \"\\xe2\\x01\\xf5\\x01\\x37\\x02\\x68\\x02\\x90\\x02\\x80\\x02\\x30\\x02\\xa7\\x01\"\n    \"\\x02\\x01\\x60\\x00\\xca\\xff\\x5f\\xff\\x15\\xff\\xe4\\xfe\\xcb\\xfe\\xcc\\xfe\"\n    \"\\xc5\\xfe\\xcf\\xfe\\xd0\\xfe\\xdb\\xfe\\xee\\xfe\\x1e\\xff\\x53\\xff\\xa6\\xff\"\n    \"\\x03\\x00\\x55\\x00\\x8f\\x00\\x9b\\x00\\x80\\x00\\x35\\x00\\xf1\\xff\\xa8\\xff\"\n    \"\\x81\\xff\\x89\\xff\\xb4\\xff\\xf2\\xff\\x3b\\x00\\x5c\\x00\\x60\\x00\\x44\\x00\"\n    \"\\x2a\\x00\\x19\\x00\\x28\\x00\\x56\\x00\\x53\\x00\\x37\\x00\\xed\\xff\\x70\\xff\"\n    \"\\xe3\\xfe\\x65\\xfe\\x18\\xfe\\x19\\xfe\\x66\\xfe\\xf0\\xfe\\x8b\\xff\\x20\\x00\"\n    \"\\x92\\x00\\xd2\\x00\\xf0\\x00\\xfe\\x00\\x12\\x01\\x37\\x01\\x69\\x01\\xa3\\x01\"\n    \"\\xc8\\x01\\xce\\x01\\xb6\\x01\\x78\\x01\\x1a\\x01\\xb7\\x00\\x50\\x00\\xe4\\xff\"\n    \"\\x93\\xff\\x51\\xff\\x25\\xff\\x0d\\xff\\x0d\\xff\\x00\\xff\\xfa\\xfe\\x07\\xff\"\n    \"\\x09\\xff\\x1d\\xff\\x3f\\xff\\x6c\\xff\\xbf\\xff\\x0a\\x00\\x3f\\x00\\x74\\x00\"\n    \"\\x9c\\x00\\x90\\x00\\x4c\\x00\\x09\\x00\\xd9\\xff\\xc7\\xff\\xc4\\xff\\xd7\\xff\"\n    \"\\xf7\\xff\\x1f\\x00\\x25\\x00\\x16\\x00\\xfd\\xff\\xeb\\xff\\xea\\xff\\xc9\\xff\"\n    \"\\xb6\\xff\\xa0\\xff\\x86\\xff\\x6c\\xff\\x44\\xff\\x28\\xff\\x1b\\xff\\x39\\xff\"\n    \"\\x81\\xff\\xc8\\xff\\x1f\\x00\\x6b\\x00\\x90\\x00\\xa8\\x00\\xb2\\x00\\xbc\\x00\"\n    \"\\xd5\\x00\\xf4\\x00\\x09\\x01\\x1b\\x01\\x22\\x01\\x1f\\x01\\x06\\x01\\xdd\\x00\"\n    \"\\xb0\\x00\\x74\\x00\\x3b\\x00\\xfc\\xff\\xb6\\xff\\x86\\xff\\x69\\xff\\x58\\xff\"\n    \"\\x56\\xff\\x52\\xff\\x5a\\xff\\x57\\xff\\x4e\\xff\\x52\\xff\\x4f\\xff\\x64\\xff\"\n    \"\\x82\\xff\\xb2\\xff\\xfa\\xff\\x2b\\x00\\x53\\x00\\x5f\\x00\\x4a\\x00\\x3d\\x00\"\n    \"\\x2a\\x00\\x10\\x00\\x08\\x00\\x00\\x00\\x06\\x00\\xff\\xff\\xea\\xff\\xdc\\xff\"\n    \"\\xce\\xff\\xc3\\xff\\xbd\\xff\\xaf\\xff\\x95\\xff\\x81\\xff\\x6c\\xff\\x64\\xff\"\n    \"\\x5b\\xff\\x6f\\xff\\x93\\xff\\xc5\\xff\\x10\\x00\\x5a\\x00\\x8a\\x00\\xb0\\x00\"\n    \"\\xbf\\x00\\xc1\\x00\\xc3\\x00\\xc2\\x00\\xc9\\x00\\xcf\\x00\\xd1\\x00\\xbb\\x00\"\n    \"\\xaa\\x00\\x9b\\x00\\x86\\x00\\x6e\\x00\\x5a\\x00\\x38\\x00\\x0d\\x00\\xdd\\xff\"\n    \"\\xaf\\xff\\x84\\xff\\x6b\\xff\\x62\\xff\\x61\\xff\\x6a\\xff\\x75\\xff\\x86\\xff\"\n    \"\\x8a\\xff\\x93\\xff\\xa2\\xff\\xa8\\xff\\xba\\xff\\xd4\\xff\\xee\\xff\\x06\\x00\"\n    \"\\x13\\x00\\x1a\\x00\\x18\\x00\\x0f\\x00\\x0a\\x00\\x01\\x00\\xfc\\xff\\xfa\\xff\"\n    \"\\xeb\\xff\\xe0\\xff\\xc2\\xff\\xb4\\xff\\xbd\\xff\\xbd\\xff\\xc6\\xff\\xde\\xff\"\n    \"\\xf8\\xff\\x05\\x00\\x09\\x00\\x11\\x00\\x15\\x00\\x14\\x00\\x1a\\x00\\x1f\\x00\"\n    \"\\x27\\x00\\x29\\x00\\x31\\x00\\x2e\\x00\\x27\\x00\\x1f\\x00\\x1c\\x00\\x25\\x00\"\n    \"\\x30\\x00\\x44\\x00\\x4b\\x00\\x43\\x00\\x35\\x00\\x25\\x00\\x28\\x00\\x2e\\x00\"\n    \"\\x39\\x00\\x47\\x00\\x4a\\x00\\x47\\x00\\x33\\x00\\x1c\\x00\\xf9\\xff\\xdd\\xff\"\n    \"\\xc8\\xff\\xc4\\xff\\xc3\\xff\\xc3\\xff\\xca\\xff\\xc5\\xff\\xc3\\xff\\xbd\\xff\"\n    \"\\xc2\\xff\\xce\\xff\\xd2\\xff\\xdf\\xff\\xf2\\xff\\x08\\x00\\x1d\\x00\\x29\\x00\"\n    \"\\x2c\\x00\\x26\\x00\\x19\\x00\\x07\\x00\\xf6\\xff\\xe3\\xff\\xd9\\xff\\xc7\\xff\"\n    \"\\xc8\\xff\\xcd\\xff\\xd3\\xff\\xe0\\xff\\xdc\\xff\\xd0\\xff\\xd3\\xff\\xd4\\xff\"\n    \"\\xd2\\xff\\xdb\\xff\\xe0\\xff\\xfa\\xff\\x11\\x00\\x27\\x00\\x2f\\x00\\x32\\x00\"\n    \"\\x35\\x00\\x2f\\x00\\x2e\\x00\\x37\\x00\\x37\\x00\\x3f\\x00\\x44\\x00\\x41\\x00\"\n    \"\\x42\\x00\\x40\\x00\\x36\\x00\\x31\\x00\\x34\\x00\\x2e\\x00\\x35\\x00\\x37\\x00\"\n    \"\\x2e\\x00\\x2b\\x00\\x18\\x00\\x08\\x00\\xf8\\xff\\xe2\\xff\\xd4\\xff\\xc0\\xff\"\n    \"\\xb5\\xff\\xa6\\xff\\xa9\\xff\\xb1\\xff\\xbe\\xff\\xcf\\xff\\xe2\\xff\\xee\\xff\"\n    \"\\xf4\\xff\\xec\\xff\\xdb\\xff\\xe9\\xff\\xe7\\xff\\xf1\\xff\\xfb\\xff\\xfd\\xff\"\n    \"\\x01\\x00\\x01\\x00\\xff\\xff\\xf3\\xff\\xe9\\xff\\xe6\\xff\\xed\\xff\\xf4\\xff\"\n    \"\\xf9\\xff\\x05\\x00\\x06\\x00\\x05\\x00\\xfa\\xff\\xea\\xff\\xe9\\xff\\xe6\\xff\"\n    \"\\xed\\xff\\xe9\\xff\\xec\\xff\\xf7\\xff\\xfe\\xff\\x05\\x00\\x0c\\x00\\x13\\x00\"\n    \"\\x19\\x00\\x1a\\x00\\x25\\x00\\x2d\\x00\\x2f\\x00\\x31\\x00\\x26\\x00\\x2a\\x00\"\n    \"\\x29\\x00\\x1f\\x00\\x1a\\x00\\x15\\x00\\x0f\\x00\\x06\\x00\\x06\\x00\\xfe\\xff\"\n    \"\\xef\\xff\\xe5\\xff\\xde\\xff\\xe1\\xff\\xe4\\xff\\xeb\\xff\\xf3\\xff\\x03\\x00\"\n    \"\\x16\\x00\\x23\\x00\\x35\\x00\\x3f\\x00\\x44\\x00\\x42\\x00\\x3f\\x00\\x34\\x00\"\n    \"\\x22\\x00\\x11\\x00\\x05\\x00\\xfc\\xff\\xea\\xff\\xda\\xff\\xd3\\xff\\xca\\xff\"\n    \"\\xc9\\xff\\xc8\\xff\\xc0\\xff\\xc8\\xff\\xd2\\xff\\xde\\xff\\xf2\\xff\\xf4\\xff\"\n    \"\\xff\\xff\\x0a\\x00\\x0e\\x00\\x17\\x00\\x12\\x00\\x1f\\x00\\x1b\\x00\\x14\\x00\"\n    \"\\x13\\x00\\x0b\\x00\\x05\\x00\\xfa\\xff\\xf0\\xff\\xe4\\xff\\xde\\xff\\xd8\\xff\"\n    \"\\xdb\\xff\\xea\\xff\\xf8\\xff\\xf8\\xff\\xff\\xff\\x01\\x00\\xfa\\xff\\xfd\\xff\"\n    \"\\x02\\x00\\x01\\x00\\xff\\xff\\x04\\x00\\x05\\x00\\x02\\x00\\xf1\\xff\\xe6\\xff\"\n    \"\\xdc\\xff\\xcc\\xff\\xd4\\xff\\xde\\xff\\xec\\xff\\x06\\x00\\x15\\x00\\x28\\x00\"\n    \"\\x38\\x00\\x40\\x00\\x43\\x00\\x44\\x00\\x46\\x00\\x41\\x00\\x3d\\x00\\x32\\x00\"\n    \"\\x30\\x00\\x21\\x00\\x0f\\x00\\x05\\x00\\xf3\\xff\\xe2\\xff\\xd4\\xff\\xcf\\xff\"\n    \"\\xca\\xff\\xcd\\xff\\xd7\\xff\\xdf\\xff\\xdf\\xff\\xe5\\xff\\xeb\\xff\\xec\\xff\"\n    \"\\xf3\\xff\\xfc\\xff\\x0d\\x00\\x18\\x00\\x13\\x00\\x1d\\x00\\x21\\x00\\x1f\\x00\"\n    \"\\x1f\\x00\\x17\\x00\\x0e\\x00\\x07\\x00\\xfe\\xff\\xf5\\xff\\xf1\\xff\\xf2\\xff\"\n    \"\\xf0\\xff\\xec\\xff\\xe9\\xff\\xe1\\xff\\xe3\\xff\\xe1\\xff\\xda\\xff\\xd9\\xff\"\n"
  },
  {
    "path": "native-audio/app/src/main/cpp/libnative-audio-jni.map.txt",
    "content": "LIBNATIVEAUDIOJNI {\n  global:\n    JNI_OnLoad;\n  local:\n    *;\n};\n"
  },
  {
    "path": "native-audio/app/src/main/cpp/native-audio-jni.cpp",
    "content": "/*\n * Copyright (C) 2010 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\n/* This is a JNI example where we use native methods to play sounds\n * using OpenSL ES. See the corresponding Java source file located at:\n *\n *   src/com/example/nativeaudio/NativeAudio/NativeAudio.java\n */\n\n#include <assert.h>\n#include <base/macros.h>\n#include <jni.h>\n#include <pthread.h>\n#include <stdlib.h>\n#include <string.h>\n\n// for __android_log_print(ANDROID_LOG_INFO, \"YourApp\", \"formatted message\");\n// #include <android/log.h>\n\n// for native audio\n#include <SLES/OpenSLES.h>\n#include <SLES/OpenSLES_Android.h>\n\n// for native asset manager\n#include <android/asset_manager.h>\n#include <android/asset_manager_jni.h>\n#include <sys/types.h>\n\n// pre-recorded sound clips, both are 8 kHz mono 16-bit signed little endian\nstatic const char hello[] =\n#include \"hello_clip.h\"\n    ;\n\nstatic const char android[] =\n#include \"android_clip.h\"\n    ;\n\n// engine interfaces\nstatic SLObjectItf engineObject = NULL;\nstatic SLEngineItf engineEngine;\n\n// output mix interfaces\nstatic SLObjectItf outputMixObject = NULL;\nstatic SLEnvironmentalReverbItf outputMixEnvironmentalReverb = NULL;\n\n// buffer queue player interfaces\nstatic SLObjectItf bqPlayerObject = NULL;\nstatic SLPlayItf bqPlayerPlay;\nstatic SLAndroidSimpleBufferQueueItf bqPlayerBufferQueue;\nstatic SLEffectSendItf bqPlayerEffectSend;\nstatic SLMuteSoloItf bqPlayerMuteSolo;\nstatic SLVolumeItf bqPlayerVolume;\nstatic SLmilliHertz bqPlayerSampleRate = 0;\nstatic jint bqPlayerBufSize = 0;\nstatic short* resampleBuf = NULL;\n// a mutext to guard against re-entrance to record & playback\n// as well as make recording and playing back to be mutually exclusive\n// this is to avoid crash at situations like:\n//    recording is in session [not finished]\n//    user presses record button and another recording coming in\n// The action: when recording/playing back is not finished, ignore the new\n// request\nstatic pthread_mutex_t audioEngineLock = PTHREAD_MUTEX_INITIALIZER;\n\n// aux effect on the output mix, used by the buffer queue player\nstatic const SLEnvironmentalReverbSettings reverbSettings =\n    SL_I3DL2_ENVIRONMENT_PRESET_STONECORRIDOR;\n\n// URI player interfaces\nstatic SLObjectItf uriPlayerObject = NULL;\nstatic SLPlayItf uriPlayerPlay;\nstatic SLSeekItf uriPlayerSeek;\nstatic SLMuteSoloItf uriPlayerMuteSolo;\nstatic SLVolumeItf uriPlayerVolume;\n\n// file descriptor player interfaces\nstatic SLObjectItf fdPlayerObject = NULL;\nstatic SLPlayItf fdPlayerPlay;\nstatic SLSeekItf fdPlayerSeek;\nstatic SLMuteSoloItf fdPlayerMuteSolo;\nstatic SLVolumeItf fdPlayerVolume;\n\n// recorder interfaces\nstatic SLObjectItf recorderObject = NULL;\nstatic SLRecordItf recorderRecord;\nstatic SLAndroidSimpleBufferQueueItf recorderBufferQueue;\n\n// synthesized sawtooth clip\n#define SAWTOOTH_FRAMES 8000\nstatic short sawtoothBuffer[SAWTOOTH_FRAMES];\n\n// 5 seconds of recorded audio at 16 kHz mono, 16-bit signed little endian\n#define RECORDER_FRAMES (16000 * 5)\nstatic short recorderBuffer[RECORDER_FRAMES];\nstatic unsigned recorderSize = 0;\n\n// pointer and size of the next player buffer to enqueue, and number of\n// remaining buffers\nstatic short* nextBuffer;\nstatic unsigned nextSize;\nstatic int nextCount;\n\n// synthesize a mono sawtooth wave and place it into a buffer (called\n// automatically on load)\n__attribute__((constructor)) static void onDlOpen(void) {\n  unsigned i;\n  for (i = 0; i < SAWTOOTH_FRAMES; ++i) {\n    sawtoothBuffer[i] = 32768 - ((i % 100) * 660);\n  }\n}\n\nvoid releaseResampleBuf(void) {\n  if (0 == bqPlayerSampleRate) {\n    /*\n     * we are not using fast path, so we were not creating buffers, nothing to\n     * do\n     */\n    return;\n  }\n\n  free(resampleBuf);\n  resampleBuf = NULL;\n}\n\n/*\n * Only support up-sampling\n */\nshort* createResampledBuf(uint32_t idx, uint32_t srcRate, unsigned* size) {\n  short* src = NULL;\n  short* workBuf;\n  int upSampleRate;\n  int32_t srcSampleCount = 0;\n\n  if (0 == bqPlayerSampleRate) {\n    return NULL;\n  }\n  if (bqPlayerSampleRate % srcRate) {\n    /*\n     * simple up-sampling, must be divisible\n     */\n    return NULL;\n  }\n  upSampleRate = bqPlayerSampleRate / srcRate;\n\n  switch (idx) {\n    case 0:\n      return NULL;\n    case 1:  // HELLO_CLIP\n      srcSampleCount = sizeof(hello) >> 1;\n      src = (short*)hello;\n      break;\n    case 2:  // ANDROID_CLIP\n      srcSampleCount = sizeof(android) >> 1;\n      src = (short*)android;\n      break;\n    case 3:  // SAWTOOTH_CLIP\n      srcSampleCount = SAWTOOTH_FRAMES;\n      src = sawtoothBuffer;\n      break;\n    case 4:  // captured frames\n      srcSampleCount = recorderSize / sizeof(short);\n      src = recorderBuffer;\n      break;\n    default:\n      assert(0);\n      return NULL;\n  }\n\n  resampleBuf = (short*)malloc((srcSampleCount * upSampleRate) << 1);\n  if (resampleBuf == NULL) {\n    return resampleBuf;\n  }\n  workBuf = resampleBuf;\n  for (int sample = 0; sample < srcSampleCount; sample++) {\n    for (int dup = 0; dup < upSampleRate; dup++) {\n      *workBuf++ = src[sample];\n    }\n  }\n\n  *size = (srcSampleCount * upSampleRate) << 1;  // sample format is 16 bit\n  return resampleBuf;\n}\n\n// this callback handler is called every time a buffer finishes playing\nvoid bqPlayerCallback([[maybe_unused]] SLAndroidSimpleBufferQueueItf bq,\n                      void*) {\n  assert(bq == bqPlayerBufferQueue);\n  // for streaming playback, replace this test by logic to find and fill the\n  // next buffer\n  if (--nextCount > 0 && NULL != nextBuffer && 0 != nextSize) {\n    SLresult result;\n    // enqueue another buffer\n    result = (*bqPlayerBufferQueue)\n                 ->Enqueue(bqPlayerBufferQueue, nextBuffer, nextSize);\n    // the most likely other result is SL_RESULT_BUFFER_INSUFFICIENT,\n    // which for this code example would indicate a programming error\n    if (SL_RESULT_SUCCESS != result) {\n      pthread_mutex_unlock(&audioEngineLock);\n    }\n    (void)result;\n  } else {\n    releaseResampleBuf();\n    pthread_mutex_unlock(&audioEngineLock);\n  }\n}\n\n// this callback handler is called every time a buffer finishes recording\nvoid bqRecorderCallback([[maybe_unused]] SLAndroidSimpleBufferQueueItf bq,\n                        void*) {\n  assert(bq == recorderBufferQueue);\n  // for streaming recording, here we would call Enqueue to give recorder the\n  // next buffer to fill but instead, this is a one-time buffer so we stop\n  // recording\n  SLresult result;\n  result =\n      (*recorderRecord)->SetRecordState(recorderRecord, SL_RECORDSTATE_STOPPED);\n  if (SL_RESULT_SUCCESS == result) {\n    recorderSize = RECORDER_FRAMES * sizeof(short);\n  }\n  pthread_mutex_unlock(&audioEngineLock);\n}\n\n// create the engine and output mix objects\nvoid CreateEngine(JNIEnv*, jclass) {\n  SLresult result;\n\n  // create engine\n  result = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL);\n  assert(SL_RESULT_SUCCESS == result);\n  (void)result;\n\n  // realize the engine\n  result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE);\n  assert(SL_RESULT_SUCCESS == result);\n  (void)result;\n\n  // get the engine interface, which is needed in order to create other objects\n  result =\n      (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine);\n  assert(SL_RESULT_SUCCESS == result);\n  (void)result;\n\n  // create output mix, with environmental reverb specified as a non-required\n  // interface\n  const SLInterfaceID ids[1] = {SL_IID_ENVIRONMENTALREVERB};\n  const SLboolean req[1] = {SL_BOOLEAN_FALSE};\n  result = (*engineEngine)\n               ->CreateOutputMix(engineEngine, &outputMixObject, 1, ids, req);\n  assert(SL_RESULT_SUCCESS == result);\n  (void)result;\n\n  // realize the output mix\n  result = (*outputMixObject)->Realize(outputMixObject, SL_BOOLEAN_FALSE);\n  assert(SL_RESULT_SUCCESS == result);\n  (void)result;\n\n  // get the environmental reverb interface\n  // this could fail if the environmental reverb effect is not available,\n  // either because the feature is not present, excessive CPU load, or\n  // the required MODIFY_AUDIO_SETTINGS permission was not requested and granted\n  result = (*outputMixObject)\n               ->GetInterface(outputMixObject, SL_IID_ENVIRONMENTALREVERB,\n                              &outputMixEnvironmentalReverb);\n  if (SL_RESULT_SUCCESS == result) {\n    result = (*outputMixEnvironmentalReverb)\n                 ->SetEnvironmentalReverbProperties(\n                     outputMixEnvironmentalReverb, &reverbSettings);\n    (void)result;\n  }\n  // ignore unsuccessful result codes for environmental reverb, as it is\n  // optional for this example\n}\n\n// create buffer queue audio player\nvoid CreateBufferQueueAudioPlayer(JNIEnv*, jclass, jint sampleRate,\n                                  jint bufSize) {\n  SLresult result;\n  if (sampleRate >= 0 && bufSize >= 0) {\n    bqPlayerSampleRate = sampleRate * 1000;\n    /*\n     * device native buffer size is another factor to minimize audio latency,\n     * not used in this sample: we only play one giant buffer here\n     */\n    bqPlayerBufSize = bufSize;\n  }\n\n  // configure audio source\n  SLDataLocator_AndroidSimpleBufferQueue loc_bufq = {\n      SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 2};\n  SLDataFormat_PCM format_pcm = {\n      SL_DATAFORMAT_PCM,           1,\n      SL_SAMPLINGRATE_8,           SL_PCMSAMPLEFORMAT_FIXED_16,\n      SL_PCMSAMPLEFORMAT_FIXED_16, SL_SPEAKER_FRONT_CENTER,\n      SL_BYTEORDER_LITTLEENDIAN};\n  /*\n   * Enable Fast Audio when possible:  once we set the same rate to be the\n   * native, fast audio path will be triggered\n   */\n  if (bqPlayerSampleRate) {\n    format_pcm.samplesPerSec = bqPlayerSampleRate;  // sample rate in mili\n                                                    // second\n  }\n  SLDataSource audioSrc = {&loc_bufq, &format_pcm};\n\n  // configure audio sink\n  SLDataLocator_OutputMix loc_outmix = {SL_DATALOCATOR_OUTPUTMIX,\n                                        outputMixObject};\n  SLDataSink audioSnk = {&loc_outmix, NULL};\n\n  /*\n   * create audio player:\n   *     fast audio does not support when SL_IID_EFFECTSEND is required, skip it\n   *     for fast audio case\n   */\n  const SLInterfaceID ids[3] = {\n      SL_IID_BUFFERQUEUE, SL_IID_VOLUME, SL_IID_EFFECTSEND,\n      /*SL_IID_MUTESOLO,*/};\n  const SLboolean req[3] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE,\n                            /*SL_BOOLEAN_TRUE,*/};\n\n  result =\n      (*engineEngine)\n          ->CreateAudioPlayer(engineEngine, &bqPlayerObject, &audioSrc,\n                              &audioSnk, bqPlayerSampleRate ? 2 : 3, ids, req);\n  assert(SL_RESULT_SUCCESS == result);\n  (void)result;\n\n  // realize the player\n  result = (*bqPlayerObject)->Realize(bqPlayerObject, SL_BOOLEAN_FALSE);\n  assert(SL_RESULT_SUCCESS == result);\n  (void)result;\n\n  // get the play interface\n  result = (*bqPlayerObject)\n               ->GetInterface(bqPlayerObject, SL_IID_PLAY, &bqPlayerPlay);\n  assert(SL_RESULT_SUCCESS == result);\n  (void)result;\n\n  // get the buffer queue interface\n  result = (*bqPlayerObject)\n               ->GetInterface(bqPlayerObject, SL_IID_BUFFERQUEUE,\n                              &bqPlayerBufferQueue);\n  assert(SL_RESULT_SUCCESS == result);\n  (void)result;\n\n  // register callback on the buffer queue\n  result = (*bqPlayerBufferQueue)\n               ->RegisterCallback(bqPlayerBufferQueue, bqPlayerCallback, NULL);\n  assert(SL_RESULT_SUCCESS == result);\n  (void)result;\n\n  // get the effect send interface\n  bqPlayerEffectSend = NULL;\n  if (0 == bqPlayerSampleRate) {\n    result = (*bqPlayerObject)\n                 ->GetInterface(bqPlayerObject, SL_IID_EFFECTSEND,\n                                &bqPlayerEffectSend);\n    assert(SL_RESULT_SUCCESS == result);\n    (void)result;\n  }\n\n#if 0  // mute/solo is not supported for sources that are known to be mono, as\n       // this is\n    // get the mute/solo interface\n    result = (*bqPlayerObject)->GetInterface(bqPlayerObject, SL_IID_MUTESOLO, &bqPlayerMuteSolo);\n    assert(SL_RESULT_SUCCESS == result);\n    (void)result;\n#endif\n\n  // get the volume interface\n  result = (*bqPlayerObject)\n               ->GetInterface(bqPlayerObject, SL_IID_VOLUME, &bqPlayerVolume);\n  assert(SL_RESULT_SUCCESS == result);\n  (void)result;\n\n  // set the player's state to playing\n  result = (*bqPlayerPlay)->SetPlayState(bqPlayerPlay, SL_PLAYSTATE_PLAYING);\n  assert(SL_RESULT_SUCCESS == result);\n  (void)result;\n}\n\n// create URI audio player\njboolean CreateUriAudioPlayer(JNIEnv* env, jclass, jstring uri) {\n  SLresult result;\n\n  // convert Java string to UTF-8\n  const char* utf8 = env->GetStringUTFChars(uri, NULL);\n  assert(NULL != utf8);\n\n  // configure audio source\n  // (requires the INTERNET permission depending on the uri parameter)\n  SLDataLocator_URI loc_uri = {SL_DATALOCATOR_URI, (SLchar*)utf8};\n  SLDataFormat_MIME format_mime = {SL_DATAFORMAT_MIME, NULL,\n                                   SL_CONTAINERTYPE_UNSPECIFIED};\n  SLDataSource audioSrc = {&loc_uri, &format_mime};\n\n  // configure audio sink\n  SLDataLocator_OutputMix loc_outmix = {SL_DATALOCATOR_OUTPUTMIX,\n                                        outputMixObject};\n  SLDataSink audioSnk = {&loc_outmix, NULL};\n\n  // create audio player\n  const SLInterfaceID ids[3] = {SL_IID_SEEK, SL_IID_MUTESOLO, SL_IID_VOLUME};\n  const SLboolean req[3] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE};\n  result = (*engineEngine)\n               ->CreateAudioPlayer(engineEngine, &uriPlayerObject, &audioSrc,\n                                   &audioSnk, 3, ids, req);\n  // note that an invalid URI is not detected here, but during prepare/prefetch\n  // on Android, or possibly during Realize on other platforms\n  assert(SL_RESULT_SUCCESS == result);\n  (void)result;\n\n  // release the Java string and UTF-8\n  env->ReleaseStringUTFChars(uri, utf8);\n\n  // realize the player\n  result = (*uriPlayerObject)->Realize(uriPlayerObject, SL_BOOLEAN_FALSE);\n  // this will always succeed on Android, but we check result for portability to\n  // other platforms\n  if (SL_RESULT_SUCCESS != result) {\n    (*uriPlayerObject)->Destroy(uriPlayerObject);\n    uriPlayerObject = NULL;\n    return JNI_FALSE;\n  }\n\n  // get the play interface\n  result = (*uriPlayerObject)\n               ->GetInterface(uriPlayerObject, SL_IID_PLAY, &uriPlayerPlay);\n  assert(SL_RESULT_SUCCESS == result);\n  (void)result;\n\n  // get the seek interface\n  result = (*uriPlayerObject)\n               ->GetInterface(uriPlayerObject, SL_IID_SEEK, &uriPlayerSeek);\n  assert(SL_RESULT_SUCCESS == result);\n  (void)result;\n\n  // get the mute/solo interface\n  result =\n      (*uriPlayerObject)\n          ->GetInterface(uriPlayerObject, SL_IID_MUTESOLO, &uriPlayerMuteSolo);\n  assert(SL_RESULT_SUCCESS == result);\n  (void)result;\n\n  // get the volume interface\n  result = (*uriPlayerObject)\n               ->GetInterface(uriPlayerObject, SL_IID_VOLUME, &uriPlayerVolume);\n  assert(SL_RESULT_SUCCESS == result);\n  (void)result;\n\n  return JNI_TRUE;\n}\n\n// set the playing state for the URI audio player\n// to PLAYING (true) or PAUSED (false)\nvoid SetPlayingUriAudioPlayer(JNIEnv*, jclass, jboolean isPlaying) {\n  SLresult result;\n\n  // make sure the URI audio player was created\n  if (NULL != uriPlayerPlay) {\n    // set the player's state\n    result = (*uriPlayerPlay)\n                 ->SetPlayState(uriPlayerPlay, isPlaying ? SL_PLAYSTATE_PLAYING\n                                                         : SL_PLAYSTATE_PAUSED);\n    assert(SL_RESULT_SUCCESS == result);\n    (void)result;\n  }\n}\n\n// set the whole file looping state for the URI audio player\nvoid SetLoopingUriAudioPlayer(JNIEnv*, jclass, jboolean isLooping) {\n  SLresult result;\n\n  // make sure the URI audio player was created\n  if (NULL != uriPlayerSeek) {\n    // set the looping state\n    result =\n        (*uriPlayerSeek)\n            ->SetLoop(uriPlayerSeek, (SLboolean)isLooping, 0, SL_TIME_UNKNOWN);\n    assert(SL_RESULT_SUCCESS == result);\n    (void)result;\n  }\n}\n\n// expose the mute/solo APIs to Java for one of the 3 players\n\nstatic SLMuteSoloItf getMuteSolo() {\n  if (uriPlayerMuteSolo != NULL)\n    return uriPlayerMuteSolo;\n  else if (fdPlayerMuteSolo != NULL)\n    return fdPlayerMuteSolo;\n  else\n    return bqPlayerMuteSolo;\n}\n\nvoid SetChannelMuteUriAudioPlayer(JNIEnv*, jclass, jint chan, jboolean mute) {\n  SLresult result;\n  SLMuteSoloItf muteSoloItf = getMuteSolo();\n  if (NULL != muteSoloItf) {\n    result = (*muteSoloItf)->SetChannelMute(muteSoloItf, chan, mute);\n    assert(SL_RESULT_SUCCESS == result);\n    (void)result;\n  }\n}\n\nvoid SetChannelSoloUriAudioPlayer(JNIEnv*, jclass, jint chan, jboolean solo) {\n  SLresult result;\n  SLMuteSoloItf muteSoloItf = getMuteSolo();\n  if (NULL != muteSoloItf) {\n    result = (*muteSoloItf)->SetChannelSolo(muteSoloItf, chan, solo);\n    assert(SL_RESULT_SUCCESS == result);\n    (void)result;\n  }\n}\n\njint GetNumChannelsUriAudioPlayer(JNIEnv*, jclass) {\n  SLuint8 numChannels;\n  SLresult result;\n  SLMuteSoloItf muteSoloItf = getMuteSolo();\n  if (NULL != muteSoloItf) {\n    result = (*muteSoloItf)->GetNumChannels(muteSoloItf, &numChannels);\n    if (SL_RESULT_PRECONDITIONS_VIOLATED == result) {\n      // channel count is not yet known\n      numChannels = 0;\n    } else {\n      assert(SL_RESULT_SUCCESS == result);\n    }\n  } else {\n    numChannels = 0;\n  }\n  return numChannels;\n}\n\n// expose the volume APIs to Java for one of the 3 players\n\nstatic SLVolumeItf getVolume() {\n  if (uriPlayerVolume != NULL)\n    return uriPlayerVolume;\n  else if (fdPlayerVolume != NULL)\n    return fdPlayerVolume;\n  else\n    return bqPlayerVolume;\n}\n\nvoid SetVolumeUriAudioPlayer(JNIEnv*, jclass, jint millibel) {\n  SLresult result;\n  SLVolumeItf volumeItf = getVolume();\n  if (NULL != volumeItf) {\n    result = (*volumeItf)->SetVolumeLevel(volumeItf, millibel);\n    assert(SL_RESULT_SUCCESS == result);\n    (void)result;\n  }\n}\n\nvoid SetMuteUriAudioPlayer(JNIEnv*, jclass, jboolean mute) {\n  SLresult result;\n  SLVolumeItf volumeItf = getVolume();\n  if (NULL != volumeItf) {\n    result = (*volumeItf)->SetMute(volumeItf, mute);\n    assert(SL_RESULT_SUCCESS == result);\n    (void)result;\n  }\n}\n\nvoid EnableStereoPositionUriAudioPlayer(JNIEnv*, jclass, jboolean enable) {\n  SLresult result;\n  SLVolumeItf volumeItf = getVolume();\n  if (NULL != volumeItf) {\n    result = (*volumeItf)->EnableStereoPosition(volumeItf, enable);\n    assert(SL_RESULT_SUCCESS == result);\n    (void)result;\n  }\n}\n\nvoid SetStereoPositionUriAudioPlayer(JNIEnv*, jclass, jint permille) {\n  SLresult result;\n  SLVolumeItf volumeItf = getVolume();\n  if (NULL != volumeItf) {\n    result = (*volumeItf)->SetStereoPosition(volumeItf, permille);\n    assert(SL_RESULT_SUCCESS == result);\n    (void)result;\n  }\n}\n\n// enable reverb on the buffer queue player\njboolean EnableReverb(JNIEnv*, jclass, jboolean enabled) {\n  SLresult result;\n\n  // we might not have been able to add environmental reverb to the output mix\n  if (NULL == outputMixEnvironmentalReverb) {\n    return JNI_FALSE;\n  }\n\n  if (bqPlayerSampleRate) {\n    /*\n     * we are in fast audio, reverb is not supported.\n     */\n    return JNI_FALSE;\n  }\n  result =\n      (*bqPlayerEffectSend)\n          ->EnableEffectSend(bqPlayerEffectSend, outputMixEnvironmentalReverb,\n                             (SLboolean)enabled, (SLmillibel)0);\n  // and even if environmental reverb was present, it might no longer be\n  // available\n  if (SL_RESULT_SUCCESS != result) {\n    return JNI_FALSE;\n  }\n\n  return JNI_TRUE;\n}\n\n// select the desired clip and play count, and enqueue the first buffer if idle\njboolean SelectClip(JNIEnv*, jclass, jint which, jint count) {\n  if (pthread_mutex_trylock(&audioEngineLock)) {\n    // If we could not acquire audio engine lock, reject this request and client\n    // should re-try\n    return JNI_FALSE;\n  }\n  switch (which) {\n    case 0:  // CLIP_NONE\n      nextBuffer = (short*)NULL;\n      nextSize = 0;\n      break;\n    case 1:  // CLIP_HELLO\n      nextBuffer = createResampledBuf(1, SL_SAMPLINGRATE_8, &nextSize);\n      if (!nextBuffer) {\n        nextBuffer = (short*)hello;\n        nextSize = sizeof(hello);\n      }\n      break;\n    case 2:  // CLIP_ANDROID\n      nextBuffer = createResampledBuf(2, SL_SAMPLINGRATE_8, &nextSize);\n      if (!nextBuffer) {\n        nextBuffer = (short*)android;\n        nextSize = sizeof(android);\n      }\n      break;\n    case 3:  // CLIP_SAWTOOTH\n      nextBuffer = createResampledBuf(3, SL_SAMPLINGRATE_8, &nextSize);\n      if (!nextBuffer) {\n        nextBuffer = (short*)sawtoothBuffer;\n        nextSize = sizeof(sawtoothBuffer);\n      }\n      break;\n    case 4:  // CLIP_PLAYBACK\n      nextBuffer = createResampledBuf(4, SL_SAMPLINGRATE_16, &nextSize);\n      // we recorded at 16 kHz, but are playing buffers at 8 Khz, so do a\n      // primitive down-sample\n      if (!nextBuffer) {\n        unsigned i;\n        for (i = 0; i < recorderSize; i += 2 * sizeof(short)) {\n          recorderBuffer[i >> 2] = recorderBuffer[i >> 1];\n        }\n        recorderSize >>= 1;\n        nextBuffer = recorderBuffer;\n        nextSize = recorderSize;\n      }\n      break;\n    default:\n      nextBuffer = NULL;\n      nextSize = 0;\n      break;\n  }\n  nextCount = count;\n  if (nextSize > 0) {\n    // here we only enqueue one buffer because it is a long clip,\n    // but for streaming playback we would typically enqueue at least 2 buffers\n    // to start\n    SLresult result;\n    result = (*bqPlayerBufferQueue)\n                 ->Enqueue(bqPlayerBufferQueue, nextBuffer, nextSize);\n    if (SL_RESULT_SUCCESS != result) {\n      pthread_mutex_unlock(&audioEngineLock);\n      return JNI_FALSE;\n    }\n  } else {\n    pthread_mutex_unlock(&audioEngineLock);\n  }\n\n  return JNI_TRUE;\n}\n\n// create asset audio player\njboolean CreateAssetAudioPlayer(JNIEnv* env, jclass, jobject assetManager,\n                                jstring filename) {\n  SLresult result;\n\n  // convert Java string to UTF-8\n  const char* utf8 = env->GetStringUTFChars(filename, NULL);\n  assert(NULL != utf8);\n\n  // use asset manager to open asset by filename\n  AAssetManager* mgr = AAssetManager_fromJava(env, assetManager);\n  assert(NULL != mgr);\n  AAsset* asset = AAssetManager_open(mgr, utf8, AASSET_MODE_UNKNOWN);\n\n  // release the Java string and UTF-8\n  env->ReleaseStringUTFChars(filename, utf8);\n\n  // the asset might not be found\n  if (NULL == asset) {\n    return JNI_FALSE;\n  }\n\n  // open asset as file descriptor\n  off_t start, length;\n  int fd = AAsset_openFileDescriptor(asset, &start, &length);\n  assert(0 <= fd);\n  AAsset_close(asset);\n\n  // configure audio source\n  SLDataLocator_AndroidFD loc_fd = {SL_DATALOCATOR_ANDROIDFD, fd, start,\n                                    length};\n  SLDataFormat_MIME format_mime = {SL_DATAFORMAT_MIME, NULL,\n                                   SL_CONTAINERTYPE_UNSPECIFIED};\n  SLDataSource audioSrc = {&loc_fd, &format_mime};\n\n  // configure audio sink\n  SLDataLocator_OutputMix loc_outmix = {SL_DATALOCATOR_OUTPUTMIX,\n                                        outputMixObject};\n  SLDataSink audioSnk = {&loc_outmix, NULL};\n\n  // create audio player\n  const SLInterfaceID ids[3] = {SL_IID_SEEK, SL_IID_MUTESOLO, SL_IID_VOLUME};\n  const SLboolean req[3] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE};\n  result = (*engineEngine)\n               ->CreateAudioPlayer(engineEngine, &fdPlayerObject, &audioSrc,\n                                   &audioSnk, 3, ids, req);\n  assert(SL_RESULT_SUCCESS == result);\n  (void)result;\n\n  // realize the player\n  result = (*fdPlayerObject)->Realize(fdPlayerObject, SL_BOOLEAN_FALSE);\n  assert(SL_RESULT_SUCCESS == result);\n  (void)result;\n\n  // get the play interface\n  result = (*fdPlayerObject)\n               ->GetInterface(fdPlayerObject, SL_IID_PLAY, &fdPlayerPlay);\n  assert(SL_RESULT_SUCCESS == result);\n  (void)result;\n\n  // get the seek interface\n  result = (*fdPlayerObject)\n               ->GetInterface(fdPlayerObject, SL_IID_SEEK, &fdPlayerSeek);\n  assert(SL_RESULT_SUCCESS == result);\n  (void)result;\n\n  // get the mute/solo interface\n  result =\n      (*fdPlayerObject)\n          ->GetInterface(fdPlayerObject, SL_IID_MUTESOLO, &fdPlayerMuteSolo);\n  assert(SL_RESULT_SUCCESS == result);\n  (void)result;\n\n  // get the volume interface\n  result = (*fdPlayerObject)\n               ->GetInterface(fdPlayerObject, SL_IID_VOLUME, &fdPlayerVolume);\n  assert(SL_RESULT_SUCCESS == result);\n  (void)result;\n\n  // enable whole file looping\n  result = (*fdPlayerSeek)\n               ->SetLoop(fdPlayerSeek, SL_BOOLEAN_TRUE, 0, SL_TIME_UNKNOWN);\n  assert(SL_RESULT_SUCCESS == result);\n  (void)result;\n\n  return JNI_TRUE;\n}\n\n// set the playing state for the asset audio player\nvoid SetPlayingAssetAudioPlayer(JNIEnv*, jclass, jboolean isPlaying) {\n  SLresult result;\n\n  // make sure the asset audio player was created\n  if (NULL != fdPlayerPlay) {\n    // set the player's state\n    result = (*fdPlayerPlay)\n                 ->SetPlayState(fdPlayerPlay, isPlaying ? SL_PLAYSTATE_PLAYING\n                                                        : SL_PLAYSTATE_PAUSED);\n    assert(SL_RESULT_SUCCESS == result);\n    (void)result;\n  }\n}\n\n// create audio recorder: recorder is not in fast path\n//    like to avoid excessive re-sampling while playing back from Hello &\n//    Android clip\njboolean CreateAudioRecorder(JNIEnv*, jclass) {\n  SLresult result;\n\n  // configure audio source\n  SLDataLocator_IODevice loc_dev = {SL_DATALOCATOR_IODEVICE,\n                                    SL_IODEVICE_AUDIOINPUT,\n                                    SL_DEFAULTDEVICEID_AUDIOINPUT, NULL};\n  SLDataSource audioSrc = {&loc_dev, NULL};\n\n  // configure audio sink\n  SLDataLocator_AndroidSimpleBufferQueue loc_bq = {\n      SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 2};\n  SLDataFormat_PCM format_pcm = {\n      SL_DATAFORMAT_PCM,           1,\n      SL_SAMPLINGRATE_16,          SL_PCMSAMPLEFORMAT_FIXED_16,\n      SL_PCMSAMPLEFORMAT_FIXED_16, SL_SPEAKER_FRONT_CENTER,\n      SL_BYTEORDER_LITTLEENDIAN};\n  SLDataSink audioSnk = {&loc_bq, &format_pcm};\n\n  // create audio recorder\n  // (requires the RECORD_AUDIO permission)\n  const SLInterfaceID id[1] = {SL_IID_ANDROIDSIMPLEBUFFERQUEUE};\n  const SLboolean req[1] = {SL_BOOLEAN_TRUE};\n  result = (*engineEngine)\n               ->CreateAudioRecorder(engineEngine, &recorderObject, &audioSrc,\n                                     &audioSnk, 1, id, req);\n  if (SL_RESULT_SUCCESS != result) {\n    return JNI_FALSE;\n  }\n\n  // realize the audio recorder\n  result = (*recorderObject)->Realize(recorderObject, SL_BOOLEAN_FALSE);\n  if (SL_RESULT_SUCCESS != result) {\n    return JNI_FALSE;\n  }\n\n  // get the record interface\n  result = (*recorderObject)\n               ->GetInterface(recorderObject, SL_IID_RECORD, &recorderRecord);\n  assert(SL_RESULT_SUCCESS == result);\n  (void)result;\n\n  // get the buffer queue interface\n  result = (*recorderObject)\n               ->GetInterface(recorderObject, SL_IID_ANDROIDSIMPLEBUFFERQUEUE,\n                              &recorderBufferQueue);\n  assert(SL_RESULT_SUCCESS == result);\n  (void)result;\n\n  // register callback on the buffer queue\n  result =\n      (*recorderBufferQueue)\n          ->RegisterCallback(recorderBufferQueue, bqRecorderCallback, NULL);\n  assert(SL_RESULT_SUCCESS == result);\n  (void)result;\n\n  return JNI_TRUE;\n}\n\n// set the recording state for the audio recorder\nvoid StartRecording(JNIEnv*, jclass) {\n  SLresult result;\n\n  if (pthread_mutex_trylock(&audioEngineLock)) {\n    return;\n  }\n  // in case already recording, stop recording and clear buffer queue\n  result =\n      (*recorderRecord)->SetRecordState(recorderRecord, SL_RECORDSTATE_STOPPED);\n  assert(SL_RESULT_SUCCESS == result);\n  (void)result;\n  result = (*recorderBufferQueue)->Clear(recorderBufferQueue);\n  assert(SL_RESULT_SUCCESS == result);\n  (void)result;\n\n  // the buffer is not valid for playback yet\n  recorderSize = 0;\n\n  // enqueue an empty buffer to be filled by the recorder\n  // (for streaming recording, we would enqueue at least 2 empty buffers to\n  // start things off)\n  result = (*recorderBufferQueue)\n               ->Enqueue(recorderBufferQueue, recorderBuffer,\n                         RECORDER_FRAMES * sizeof(short));\n  // the most likely other result is SL_RESULT_BUFFER_INSUFFICIENT,\n  // which for this code example would indicate a programming error\n  assert(SL_RESULT_SUCCESS == result);\n  (void)result;\n\n  // start recording\n  result = (*recorderRecord)\n               ->SetRecordState(recorderRecord, SL_RECORDSTATE_RECORDING);\n  assert(SL_RESULT_SUCCESS == result);\n  (void)result;\n}\n\n// shut down the native audio system\nvoid Shutdown(JNIEnv*, jclass) {\n  // destroy buffer queue audio player object, and invalidate all associated\n  // interfaces\n  if (bqPlayerObject != NULL) {\n    (*bqPlayerObject)->Destroy(bqPlayerObject);\n    bqPlayerObject = NULL;\n    bqPlayerPlay = NULL;\n    bqPlayerBufferQueue = NULL;\n    bqPlayerEffectSend = NULL;\n    bqPlayerMuteSolo = NULL;\n    bqPlayerVolume = NULL;\n  }\n\n  // destroy file descriptor audio player object, and invalidate all associated\n  // interfaces\n  if (fdPlayerObject != NULL) {\n    (*fdPlayerObject)->Destroy(fdPlayerObject);\n    fdPlayerObject = NULL;\n    fdPlayerPlay = NULL;\n    fdPlayerSeek = NULL;\n    fdPlayerMuteSolo = NULL;\n    fdPlayerVolume = NULL;\n  }\n\n  // destroy URI audio player object, and invalidate all associated interfaces\n  if (uriPlayerObject != NULL) {\n    (*uriPlayerObject)->Destroy(uriPlayerObject);\n    uriPlayerObject = NULL;\n    uriPlayerPlay = NULL;\n    uriPlayerSeek = NULL;\n    uriPlayerMuteSolo = NULL;\n    uriPlayerVolume = NULL;\n  }\n\n  // destroy audio recorder object, and invalidate all associated interfaces\n  if (recorderObject != NULL) {\n    (*recorderObject)->Destroy(recorderObject);\n    recorderObject = NULL;\n    recorderRecord = NULL;\n    recorderBufferQueue = NULL;\n  }\n\n  // destroy output mix object, and invalidate all associated interfaces\n  if (outputMixObject != NULL) {\n    (*outputMixObject)->Destroy(outputMixObject);\n    outputMixObject = NULL;\n    outputMixEnvironmentalReverb = NULL;\n  }\n\n  // destroy engine object, and invalidate all associated interfaces\n  if (engineObject != NULL) {\n    (*engineObject)->Destroy(engineObject);\n    engineObject = NULL;\n    engineEngine = NULL;\n  }\n\n  pthread_mutex_destroy(&audioEngineLock);\n}\n\nextern \"C\" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* _Nonnull vm,\n                                             void* _Nullable) {\n  JNIEnv* env;\n  if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {\n    return JNI_ERR;\n  }\n\n  jclass c = env->FindClass(\"com/example/nativeaudio/NativeAudio\");\n  if (c == nullptr) return JNI_ERR;\n\n  static const JNINativeMethod methods[] = {\n      {\"createEngine\", \"()V\", reinterpret_cast<void*>(CreateEngine)},\n      {\"createBufferQueueAudioPlayer\", \"(II)V\",\n       reinterpret_cast<void*>(CreateBufferQueueAudioPlayer)},\n      {\"createUriAudioPlayer\", \"(Ljava/lang/String;)Z\",\n       reinterpret_cast<void*>(CreateUriAudioPlayer)},\n      {\"setPlayingUriAudioPlayer\", \"(Z)V\",\n       reinterpret_cast<void*>(SetPlayingUriAudioPlayer)},\n      {\"setLoopingUriAudioPlayer\", \"(Z)V\",\n       reinterpret_cast<void*>(SetLoopingUriAudioPlayer)},\n      {\"setChannelMuteUriAudioPlayer\", \"(IZ)V\",\n       reinterpret_cast<void*>(SetChannelMuteUriAudioPlayer)},\n      {\"setChannelSoloUriAudioPlayer\", \"(IZ)V\",\n       reinterpret_cast<void*>(SetChannelSoloUriAudioPlayer)},\n      {\"getNumChannelsUriAudioPlayer\", \"()I\",\n       reinterpret_cast<void*>(GetNumChannelsUriAudioPlayer)},\n      {\"setVolumeUriAudioPlayer\", \"(I)V\",\n       reinterpret_cast<void*>(SetVolumeUriAudioPlayer)},\n      {\"setMuteUriAudioPlayer\", \"(Z)V\",\n       reinterpret_cast<void*>(SetMuteUriAudioPlayer)},\n      {\"enableStereoPositionUriAudioPlayer\", \"(Z)V\",\n       reinterpret_cast<void*>(EnableStereoPositionUriAudioPlayer)},\n      {\"setStereoPositionUriAudioPlayer\", \"(I)V\",\n       reinterpret_cast<void*>(SetStereoPositionUriAudioPlayer)},\n      {\"enableReverb\", \"(Z)Z\", reinterpret_cast<void*>(EnableReverb)},\n      {\"selectClip\", \"(II)Z\", reinterpret_cast<void*>(SelectClip)},\n      {\"createAssetAudioPlayer\",\n       \"(Landroid/content/res/AssetManager;Ljava/lang/String;)Z\",\n       reinterpret_cast<void*>(CreateAssetAudioPlayer)},\n      {\"setPlayingAssetAudioPlayer\", \"(Z)V\",\n       reinterpret_cast<void*>(SetPlayingAssetAudioPlayer)},\n      {\"createAudioRecorder\", \"()Z\",\n       reinterpret_cast<void*>(CreateAudioRecorder)},\n      {\"startRecording\", \"()V\", reinterpret_cast<void*>(StartRecording)},\n      {\"shutdown\", \"()V\", reinterpret_cast<void*>(Shutdown)},\n  };\n  int rc = env->RegisterNatives(c, methods, arraysize(methods));\n  if (rc != JNI_OK) return rc;\n\n  return JNI_VERSION_1_6;\n}\n"
  },
  {
    "path": "native-audio/app/src/main/java/com/example/nativeaudio/NativeAudio.java",
    "content": "/*\n * Copyright (C) 2010 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.example.nativeaudio;\n\nimport android.Manifest;\nimport android.annotation.TargetApi;\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.pm.PackageManager;\nimport android.content.res.AssetManager;\nimport android.media.AudioManager;\nimport android.os.Build;\nimport android.os.Bundle;\nimport androidx.annotation.NonNull;\nimport androidx.core.app.ActivityCompat;\nimport android.view.View;\nimport android.view.View.OnClickListener;\nimport android.widget.AdapterView;\nimport android.widget.ArrayAdapter;\nimport android.widget.Button;\nimport android.widget.SeekBar;\nimport android.widget.SeekBar.OnSeekBarChangeListener;\nimport android.widget.Spinner;\nimport android.widget.Toast;\n\npublic class NativeAudio extends Activity\n        implements ActivityCompat.OnRequestPermissionsResultCallback {\n\n\n    //static final String TAG = \"NativeAudio\";\n    private static final int AUDIO_ECHO_REQUEST = 0;\n\n    static final int CLIP_NONE = 0;\n    static final int CLIP_HELLO = 1;\n    static final int CLIP_ANDROID = 2;\n    static final int CLIP_SAWTOOTH = 3;\n    static final int CLIP_PLAYBACK = 4;\n\n    static String URI;\n    static AssetManager assetManager;\n\n    static boolean isPlayingAsset = false;\n    static boolean isPlayingUri = false;\n\n    static int numChannelsUri = 0;\n\n    /** Called when the activity is first created. */\n    @Override\n    @TargetApi(17)\n    protected void onCreate(Bundle icicle) {\n        super.onCreate(icicle);\n        setContentView(R.layout.main);\n\n        assetManager = getAssets();\n\n        // initialize native audio system\n        createEngine();\n\n        int sampleRate = 0;\n        int bufSize = 0;\n        /*\n         * retrieve fast audio path sample rate and buf size; if we have it, we pass to native\n         * side to create a player with fast audio enabled [ fast audio == low latency audio ];\n         * IF we do not have a fast audio path, we pass 0 for sampleRate, which will force native\n         * side to pick up the 8Khz sample rate.\n         */\n        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {\n            AudioManager myAudioMgr = (AudioManager) getSystemService(Context.AUDIO_SERVICE);\n            String nativeParam = myAudioMgr.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE);\n            sampleRate = Integer.parseInt(nativeParam);\n            nativeParam = myAudioMgr.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);\n            bufSize = Integer.parseInt(nativeParam);\n        }\n        createBufferQueueAudioPlayer(sampleRate, bufSize);\n\n        // initialize URI spinner\n        Spinner uriSpinner = (Spinner) findViewById(R.id.uri_spinner);\n        ArrayAdapter<CharSequence> uriAdapter = ArrayAdapter.createFromResource(\n                this, R.array.uri_spinner_array, android.R.layout.simple_spinner_item);\n        uriAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);\n        uriSpinner.setAdapter(uriAdapter);\n        uriSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {\n\n            public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {\n                URI = parent.getItemAtPosition(pos).toString();\n            }\n\n            public void onNothingSelected(AdapterView parent) {\n                URI = null;\n            }\n\n        });\n\n        // initialize button click handlers\n\n        ((Button) findViewById(R.id.hello)).setOnClickListener(new OnClickListener() {\n            public void onClick(View view) {\n                // ignore the return value\n                selectClip(CLIP_HELLO, 5);\n            }\n        });\n\n        ((Button) findViewById(R.id.android)).setOnClickListener(new OnClickListener() {\n            public void onClick(View view) {\n                // ignore the return value\n                selectClip(CLIP_ANDROID, 7);\n            }\n        });\n\n        ((Button) findViewById(R.id.sawtooth)).setOnClickListener(new OnClickListener() {\n            public void onClick(View view) {\n                // ignore the return value\n                selectClip(CLIP_SAWTOOTH, 1);\n            }\n        });\n\n        ((Button) findViewById(R.id.reverb)).setOnClickListener(new OnClickListener() {\n            boolean enabled = false;\n            public void onClick(View view) {\n                enabled = !enabled;\n                if (!enableReverb(enabled)) {\n                    enabled = !enabled;\n                }\n            }\n        });\n\n        ((Button) findViewById(R.id.embedded_soundtrack)).setOnClickListener(new OnClickListener() {\n            boolean created = false;\n            public void onClick(View view) {\n                if (!created) {\n                    created = createAssetAudioPlayer(assetManager, \"background.mp3\");\n                }\n                if (created) {\n                    isPlayingAsset = !isPlayingAsset;\n                    setPlayingAssetAudioPlayer(isPlayingAsset);\n                }\n            }\n        });\n\n        // native uriPlayer is broken in android 21 and over, internal bug id: b/29321867\n        // will re-open after it is fixed in later OSes\n        ((Button) findViewById(R.id.uri_soundtrack)).setOnClickListener(new OnClickListener() {\n            boolean created = false;\n            public void onClick(View view) {\n                if (!created && URI != null) {\n                    created = createUriAudioPlayer(URI);\n                }\n            }\n        });\n\n        ((Button) findViewById(R.id.pause_uri)).setOnClickListener(new OnClickListener() {\n            public void onClick(View view) {\n                setPlayingUriAudioPlayer(false);\n            }\n        });\n\n        ((Button) findViewById(R.id.play_uri)).setOnClickListener(new OnClickListener() {\n            public void onClick(View view) {\n                setPlayingUriAudioPlayer(true);\n            }\n        });\n\n        ((Button) findViewById(R.id.loop_uri)).setOnClickListener(new OnClickListener() {\n            boolean isLooping = false;\n            public void onClick(View view) {\n                isLooping = !isLooping;\n                setLoopingUriAudioPlayer(isLooping);\n            }\n        });\n\n        ((Button) findViewById(R.id.mute_left_uri)).setOnClickListener(new OnClickListener() {\n            boolean muted = false;\n            public void onClick(View view) {\n                muted = !muted;\n                setChannelMuteUriAudioPlayer(0, muted);\n            }\n        });\n\n        ((Button) findViewById(R.id.mute_right_uri)).setOnClickListener(new OnClickListener() {\n            boolean muted = false;\n            public void onClick(View view) {\n                muted = !muted;\n                setChannelMuteUriAudioPlayer(1, muted);\n            }\n        });\n\n        ((Button) findViewById(R.id.solo_left_uri)).setOnClickListener(new OnClickListener() {\n            boolean soloed = false;\n            public void onClick(View view) {\n                soloed = !soloed;\n                setChannelSoloUriAudioPlayer(0, soloed);\n            }\n        });\n\n        ((Button) findViewById(R.id.solo_right_uri)).setOnClickListener(new OnClickListener() {\n            boolean soloed = false;\n            public void onClick(View view) {\n                soloed = !soloed;\n                setChannelSoloUriAudioPlayer(1, soloed);\n            }\n        });\n\n        ((Button) findViewById(R.id.mute_uri)).setOnClickListener(new OnClickListener() {\n            boolean muted = false;\n            public void onClick(View view) {\n                muted = !muted;\n                setMuteUriAudioPlayer(muted);\n            }\n        });\n\n        ((Button) findViewById(R.id.enable_stereo_position_uri)).setOnClickListener(\n                new OnClickListener() {\n                    boolean enabled = false;\n                    public void onClick(View view) {\n                        enabled = !enabled;\n                        enableStereoPositionUriAudioPlayer(enabled);\n                    }\n                });\n\n        ((Button) findViewById(R.id.channels_uri)).setOnClickListener(new OnClickListener() {\n            public void onClick(View view) {\n                if (numChannelsUri == 0) {\n                    numChannelsUri = getNumChannelsUriAudioPlayer();\n                }\n                Toast.makeText(NativeAudio.this, \"Channels: \" + numChannelsUri,\n                        Toast.LENGTH_SHORT).show();\n            }\n        });\n\n        ((SeekBar) findViewById(R.id.volume_uri)).setOnSeekBarChangeListener(\n                new OnSeekBarChangeListener() {\n                    int lastProgress = 100;\n                    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {\n                        if (BuildConfig.DEBUG && !(progress >= 0 && progress <= 100)) {\n                            throw new AssertionError();\n                        }\n                        lastProgress = progress;\n                    }\n                    public void onStartTrackingTouch(SeekBar seekBar) {\n                    }\n                    public void onStopTrackingTouch(SeekBar seekBar) {\n                        int attenuation = 100 - lastProgress;\n                        int millibel = attenuation * -50;\n                        setVolumeUriAudioPlayer(millibel);\n                    }\n                });\n\n        ((SeekBar) findViewById(R.id.pan_uri)).setOnSeekBarChangeListener(\n                new OnSeekBarChangeListener() {\n                    int lastProgress = 100;\n                    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {\n                        if (BuildConfig.DEBUG && !(progress >= 0 && progress <= 100)) {\n                            throw new AssertionError();\n                        }\n                        lastProgress = progress;\n                    }\n                    public void onStartTrackingTouch(SeekBar seekBar) {\n                    }\n                    public void onStopTrackingTouch(SeekBar seekBar) {\n                        int permille = (lastProgress - 50) * 20;\n                        setStereoPositionUriAudioPlayer(permille);\n                    }\n                });\n        if (Build.VERSION.SDK_INT > 19) {\n            int[]  uriIds = { R.id.uri_soundtrack, R.id.pause_uri,\n                              R.id.play_uri,       R.id.loop_uri,\n                              R.id.mute_left_uri,  R.id.mute_right_uri,\n                              R.id.solo_left_uri,  R.id.solo_right_uri,\n                              R.id.mute_uri,       R.id.enable_stereo_position_uri,\n                              R.id.channels_uri,   R.id.volume_uri,\n                              R.id.pan_uri,        R.id.uri_spinner,};\n            for(int id : uriIds)\n                findViewById(id).setEnabled(false);\n        }\n\n        ((Button) findViewById(R.id.record)).setOnClickListener(new OnClickListener() {\n            public void onClick(View view) {\n                int status = ActivityCompat.checkSelfPermission(NativeAudio.this,\n                        Manifest.permission.RECORD_AUDIO);\n                if (status != PackageManager.PERMISSION_GRANTED) {\n                    ActivityCompat.requestPermissions(\n                            NativeAudio.this,\n                            new String[]{Manifest.permission.RECORD_AUDIO},\n                            AUDIO_ECHO_REQUEST);\n                    return;\n                }\n                recordAudio();\n            }\n        });\n\n        ((Button) findViewById(R.id.playback)).setOnClickListener(new OnClickListener() {\n            public void onClick(View view) {\n                // ignore the return value\n                selectClip(CLIP_PLAYBACK, 3);\n            }\n        });\n\n    }\n\n    // Single out recording for run-permission needs\n    static boolean created = false;\n    private void recordAudio() {\n        if (!created) {\n            created = createAudioRecorder();\n        }\n        if (created) {\n            startRecording();\n        }\n    }\n\n   /** Called when the activity is about to be destroyed. */\n    @Override\n    protected void onPause()\n    {\n        // turn off all audio\n        selectClip(CLIP_NONE, 0);\n        isPlayingAsset = false;\n        setPlayingAssetAudioPlayer(false);\n        isPlayingUri = false;\n        setPlayingUriAudioPlayer(false);\n        super.onPause();\n    }\n\n    /** Called when the activity is about to be destroyed. */\n    @Override\n    protected void onDestroy()\n    {\n        shutdown();\n        super.onDestroy();\n    }\n    @Override\n    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,\n                                           @NonNull int[] grantResults) {\n        /*\n         * if any permission failed, the sample could not play\n         */\n        if (AUDIO_ECHO_REQUEST != requestCode) {\n            super.onRequestPermissionsResult(requestCode, permissions, grantResults);\n            return;\n        }\n\n        if (grantResults.length != 1  ||\n                grantResults[0] != PackageManager.PERMISSION_GRANTED) {\n            /*\n             * When user denied the permission, throw a Toast to prompt that RECORD_AUDIO\n             * is necessary; on UI, we display the current status as permission was denied so\n             * user know what is going on.\n             * This application go back to the original state: it behaves as if the button\n             * was not clicked. The assumption is that user will re-click the \"start\" button\n             * (to retry), or shutdown the app in normal way.\n             */\n            Toast.makeText(getApplicationContext(),\n                    getString(R.string.NeedRecordAudioPermission),\n                    Toast.LENGTH_SHORT)\n                    .show();\n            return;\n        }\n\n        // The callback runs on app's thread, so we are safe to resume the action\n        recordAudio();\n    }\n\n    /** Native methods, implemented in jni folder */\n    public static native void createEngine();\n    public static native void createBufferQueueAudioPlayer(int sampleRate, int samplesPerBuf);\n    public static native boolean createAssetAudioPlayer(AssetManager assetManager, String filename);\n    // true == PLAYING, false == PAUSED\n    public static native void setPlayingAssetAudioPlayer(boolean isPlaying);\n    public static native boolean createUriAudioPlayer(String uri);\n    public static native void setPlayingUriAudioPlayer(boolean isPlaying);\n    public static native void setLoopingUriAudioPlayer(boolean isLooping);\n    public static native void setChannelMuteUriAudioPlayer(int chan, boolean mute);\n    public static native void setChannelSoloUriAudioPlayer(int chan, boolean solo);\n    public static native int getNumChannelsUriAudioPlayer();\n    public static native void setVolumeUriAudioPlayer(int millibel);\n    public static native void setMuteUriAudioPlayer(boolean mute);\n    public static native void enableStereoPositionUriAudioPlayer(boolean enable);\n    public static native void setStereoPositionUriAudioPlayer(int permille);\n    public static native boolean selectClip(int which, int count);\n    public static native boolean enableReverb(boolean enabled);\n    public static native boolean createAudioRecorder();\n    public static native void startRecording();\n    public static native void shutdown();\n\n    /** Load jni .so on initialization */\n    static {\n         System.loadLibrary(\"native-audio-jni\");\n    }\n\n}\n"
  },
  {
    "path": "native-audio/app/src/main/res/layout/main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n/*\n * Copyright (C) 2010 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n-->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:orientation=\"vertical\"\n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"fill_parent\"\n    >\n<TextView\n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"@string/hello\"\n    />\n<LinearLayout\n    android:orientation=\"horizontal\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    >\n<Button\n    android:id=\"@+id/hello\"\n    android:text=\"@string/hello_short\"\n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"wrap_content\"\n    />\n<Button\n    android:id=\"@+id/android\"\n    android:text=\"@string/android\"\n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"wrap_content\"\n    />\n<Button\n    android:id=\"@+id/sawtooth\"\n    android:text=\"@string/sawtooth\"\n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"wrap_content\"\n    />\n<Button\n    android:id=\"@+id/embedded_soundtrack\"\n    android:text=\"@string/embedded_soundtrack\"\n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"wrap_content\"\n    />\n</LinearLayout>\n<LinearLayout\n    android:orientation=\"horizontal\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    >\n<Button\n    android:id=\"@+id/reverb\"\n    android:text=\"@string/reverb\"    \n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"wrap_content\"\n    />\n<Button\n    android:id=\"@+id/mute_uri\"\n    android:text=\"@string/mute_uri\"    \n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"wrap_content\"\n    />\n<Button\n    android:id=\"@+id/enable_stereo_position_uri\"\n    android:text=\"@string/enable_stereo_position_uri\"    \n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"wrap_content\"\n    />\n</LinearLayout>\n<LinearLayout\n    android:orientation=\"horizontal\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    >\n<Spinner\n    android:id=\"@+id/uri_spinner\"\n    android:text=\"@string/uri_spinner\"\n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"wrap_content\"\n    />\n</LinearLayout>\n<LinearLayout\n    android:orientation=\"horizontal\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    >\n<Button\n    android:id=\"@+id/uri_soundtrack\"\n    android:text=\"@string/uri_soundtrack\"\n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"wrap_content\"\n    />\n<Button\n    android:id=\"@+id/pause_uri\"\n    android:text=\"@string/pause_uri\"\n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"wrap_content\"\n    />\n<Button\n    android:id=\"@+id/play_uri\"\n    android:text=\"@string/play_uri\"    \n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"wrap_content\"\n    />\n<Button\n    android:id=\"@+id/loop_uri\"\n    android:text=\"@string/loop_uri\"    \n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"wrap_content\"\n    />\n</LinearLayout>\n<LinearLayout\n    android:orientation=\"horizontal\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    >\n    <Button\n        android:id=\"@+id/mute_left_uri\"\n        android:text=\"@string/mute_left_uri\"\t\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"wrap_content\"\n        />\n    <Button\n        android:id=\"@+id/mute_right_uri\"\n        android:text=\"@string/mute_right_uri\"\t\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"wrap_content\"\n        />\n    <Button\n        android:id=\"@+id/solo_left_uri\"\n        android:text=\"@string/solo_left_uri\"\t\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"wrap_content\"\n        />\n    <Button\n        android:id=\"@+id/solo_right_uri\"\n        android:text=\"@string/solo_right_uri\"\t\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"wrap_content\"\n        />\n</LinearLayout>\n<Button\n    android:id=\"@+id/channels_uri\"\n    android:text=\"@string/channels_uri\"    \n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"wrap_content\"\n    />\n<SeekBar\n    android:id=\"@+id/volume_uri\"\n    android:text=\"@string/volume_uri\"    \n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"wrap_content\"\n    />\n<SeekBar\n    android:id=\"@+id/pan_uri\"\n    android:text=\"@string/pan_uri\"    \n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"wrap_content\"\n    />\n<Button\n    android:id=\"@+id/record\"\n    android:text=\"@string/record\"    \n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"wrap_content\"\n    />\n<Button\n    android:id=\"@+id/playback\"\n    android:text=\"@string/playback\"    \n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"wrap_content\"\n    />\n</LinearLayout>\n"
  },
  {
    "path": "native-audio/app/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n/*\n * Copyright (C) 2010 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n-->\n<resources>\n  <string name=\"hello\">Hello, Android using native audio!</string>\n  <string name=\"hello_short\">Hello</string>\n  <string name=\"android\">Android</string>\n  <string name=\"sawtooth\">Sawtooth</string>\n  <string name=\"embedded_soundtrack\">Embedded\\nsoundtrack</string>\n  <string name=\"reverb\">Reverb</string>\n  <string name=\"mute_uri\">Mute</string>\n  <string name=\"enable_stereo_position_uri\">Enable SP</string>\n  <string name=\"uri_spinner\">URI spinner</string>\n  <string name=\"uri_soundtrack\">URI\\nsoundtrack</string>\n  <string name=\"pause_uri\">Pause\\nURI</string>\n  <string name=\"play_uri\">Play\\nURI</string>\n  <string name=\"loop_uri\">Loop\\nURI</string>\n  <string name=\"mute_left_uri\">mute left</string>\n  <string name=\"mute_right_uri\">mute right</string>\n  <string name=\"solo_left_uri\">solo left</string>\n  <string name=\"solo_right_uri\">solo right</string>\n  <string name=\"channels_uri\">Get channels</string>\n  <string name=\"volume_uri\">Volume</string>\n  <string name=\"pan_uri\">Pan</string>\n  <string name=\"record\">Record</string>\n  <string name=\"playback\">Playback</string>\n  <string name=\"app_name\">NativeAudio</string>\n  <string-array name=\"uri_spinner_array\">\n    <item>http://www.freesound.org/data/previews/18/18765_18799-lq.mp3</item>\n  </string-array>\n  <string name=\"NeedRecordAudioPermission\">\"This sample needs RECORD_AUDIO permission\"</string>\n</resources>\n"
  },
  {
    "path": "native-codec/README.md",
    "content": "# Native Codec\n\nNative Codec is an Android C++ sample that uses the Native Media Codec API to\nplay a video.\n\nencoded stream files are under app/src/main/assets/clips one file testfile.mp4\nis provided as an example. To add your own files:\n\n- copy your stream file into app/src/main/assets/\n- add your file name to res/strings.xml, \"source_array\"\n- compile and run app\n- from android device, select your stream\n\n## Screenshots\n\n![screenshot](screenshot.png)\n"
  },
  {
    "path": "native-codec/app/build.gradle",
    "content": "plugins {\n    id \"ndksamples.android.application\"\n}\n\nandroid {\n    namespace 'com.example.nativecodec'\n\n    defaultConfig {\n        applicationId 'com.example.nativecodec'\n        externalNativeBuild {\n            cmake {\n                arguments '-DANDROID_STL=c++_static'\n            }\n        }\n    }\n\n    externalNativeBuild {\n        cmake {\n            path 'src/main/cpp/CMakeLists.txt'\n        }\n    }\n\n    buildFeatures {\n        prefab true\n    }\n}\n\ndependencies {\n    implementation project(\":base\")\n}\n"
  },
  {
    "path": "native-codec/app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n  <uses-feature android:glEsVersion=\"0x00020000\" />\n\n  <!-- INTERNET is needed to use a URI-based media player, depending on the URI -->\n  <uses-permission android:name=\"android.permission.INTERNET\"></uses-permission>\n\n  <application\n      android:allowBackup=\"false\"\n      android:fullBackupContent=\"false\"\n      android:icon=\"@mipmap/ic_launcher\"\n      android:label=\"@string/app_name\">\n    <activity android:name=\".NativeCodec\"\n              android:label=\"@string/app_name\"\n        android:exported=\"true\">\n      <intent-filter>\n        <action android:name=\"android.intent.action.MAIN\" />\n        <category android:name=\"android.intent.category.LAUNCHER\" />\n      </intent-filter>\n    </activity>\n  </application>\n</manifest>\n"
  },
  {
    "path": "native-codec/app/src/main/cpp/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.22.1)\nproject(NativeCodec LANGUAGES CXX)\n\ninclude(AppLibrary)\nfind_package(base CONFIG REQUIRED)\n\nadd_app_library(native-codec-jni SHARED\n    looper.cpp\n    native-codec-jni.cpp\n)\n\ntarget_link_libraries(native-codec-jni\n    PRIVATE\n    base::base\n    android\n    log\n    mediandk\n    OpenMAXAL\n)\n"
  },
  {
    "path": "native-codec/app/src/main/cpp/libnative-codec-jni.map.txt",
    "content": "LIBNATIVECODECJNI {\n  global:\n    JNI_OnLoad;\n  local:\n    *;\n};\n"
  },
  {
    "path": "native-codec/app/src/main/cpp/looper.cpp",
    "content": "/*\n * Copyright (C) 2014 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"looper.h\"\n\n#include <assert.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <jni.h>\n#include <limits.h>\n#include <pthread.h>\n#include <semaphore.h>\n#include <stdio.h>\n#include <string.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <unistd.h>\n\n// for __android_log_print(ANDROID_LOG_INFO, \"YourApp\", \"formatted message\");\n#include <android/log.h>\n#define TAG \"NativeCodec-looper\"\n#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)\n\nstruct loopermessage;\ntypedef struct loopermessage loopermessage;\n\nstruct loopermessage {\n  int what;\n  void* obj;\n  loopermessage* next;\n  bool quit;\n};\n\nvoid* looper::trampoline(void* p) {\n  ((looper*)p)->loop();\n  return NULL;\n}\n\nlooper::looper() {\n  sem_init(&headdataavailable, 0, 0);\n  sem_init(&headwriteprotect, 0, 1);\n  pthread_attr_t attr;\n  pthread_attr_init(&attr);\n\n  pthread_create(&worker, &attr, trampoline, this);\n  running = true;\n}\n\nlooper::~looper() {\n  if (running) {\n    LOGV(\n        \"Looper deleted while still running. Some messages will not be \"\n        \"processed\");\n    quit();\n  }\n}\n\nvoid looper::post(int what, void* data, bool flush) {\n  loopermessage* msg = new loopermessage();\n  msg->what = what;\n  msg->obj = data;\n  msg->next = NULL;\n  msg->quit = false;\n  addmsg(msg, flush);\n}\n\nvoid looper::addmsg(loopermessage* msg, bool flush) {\n  sem_wait(&headwriteprotect);\n  loopermessage* h = head;\n\n  if (flush) {\n    while (h) {\n      loopermessage* next = h->next;\n      delete h;\n      h = next;\n    }\n    h = NULL;\n  }\n  if (h) {\n    while (h->next) {\n      h = h->next;\n    }\n    h->next = msg;\n  } else {\n    head = msg;\n  }\n  LOGV(\"post msg %d\", msg->what);\n  sem_post(&headwriteprotect);\n  sem_post(&headdataavailable);\n}\n\nvoid looper::loop() {\n  while (true) {\n    // wait for available message\n    sem_wait(&headdataavailable);\n\n    // get next available message\n    sem_wait(&headwriteprotect);\n    loopermessage* msg = head;\n    if (msg == NULL) {\n      LOGV(\"no msg\");\n      sem_post(&headwriteprotect);\n      continue;\n    }\n    head = msg->next;\n    sem_post(&headwriteprotect);\n\n    if (msg->quit) {\n      LOGV(\"quitting\");\n      delete msg;\n      return;\n    }\n    LOGV(\"processing msg %d\", msg->what);\n    handle(msg->what, msg->obj);\n    delete msg;\n  }\n}\n\nvoid looper::quit() {\n  LOGV(\"quit\");\n  loopermessage* msg = new loopermessage();\n  msg->what = 0;\n  msg->obj = NULL;\n  msg->next = NULL;\n  msg->quit = true;\n  addmsg(msg, false);\n  void* retval;\n  pthread_join(worker, &retval);\n  sem_destroy(&headdataavailable);\n  sem_destroy(&headwriteprotect);\n  running = false;\n}\n\nvoid looper::handle(int what, void* obj) {\n  LOGV(\"dropping msg %d %p\", what, obj);\n}\n"
  },
  {
    "path": "native-codec/app/src/main/cpp/looper.h",
    "content": "/*\n * Copyright (C) 2014 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include <pthread.h>\n#include <semaphore.h>\n\nstruct loopermessage;\n\nclass looper {\n public:\n  looper();\n  looper& operator=(const looper&) = delete;\n  looper(looper&) = delete;\n  virtual ~looper();\n\n  void post(int what, void* data, bool flush = false);\n  void quit();\n\n  virtual void handle(int what, void* data);\n\n private:\n  void addmsg(loopermessage* msg, bool flush);\n  static void* trampoline(void* p);\n  void loop();\n  loopermessage* head;\n  pthread_t worker;\n  sem_t headwriteprotect;\n  sem_t headdataavailable;\n  bool running;\n};\n"
  },
  {
    "path": "native-codec/app/src/main/cpp/native-codec-jni.cpp",
    "content": "/*\n * Copyright (C) 2014 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/* This is a JNI example where we use native methods to play video\n * using the native AMedia* APIs.\n * See the corresponding Java source file located at:\n *\n *   src/com/example/nativecodec/NativeMedia.java\n *\n * In this example we use assert() for \"impossible\" error conditions,\n * and explicit handling and recovery for more likely error conditions.\n */\n\n#include <assert.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <jni.h>\n#include <limits.h>\n#include <stdio.h>\n#include <string.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <unistd.h>\n\n#include \"looper.h\"\n#include \"media/NdkMediaCodec.h\"\n#include \"media/NdkMediaExtractor.h\"\n\n// for __android_log_print(ANDROID_LOG_INFO, \"YourApp\", \"formatted message\");\n#include <android/log.h>\n#define TAG \"NativeCodec\"\n#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)\n#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)\n\n// for native window JNI\n#include <android/asset_manager.h>\n#include <android/asset_manager_jni.h>\n#include <android/native_window_jni.h>\n#include <base/macros.h>\n\ntypedef struct {\n  int fd;\n  ANativeWindow* window;\n  AMediaExtractor* ex;\n  AMediaCodec* codec;\n  int64_t renderstart;\n  bool sawInputEOS;\n  bool sawOutputEOS;\n  bool isPlaying;\n  bool renderonce;\n} workerdata;\n\nworkerdata data = {-1, NULL, NULL, NULL, 0, false, false, false, false};\n\nenum {\n  kMsgCodecBuffer,\n  kMsgPause,\n  kMsgResume,\n  kMsgPauseAck,\n  kMsgDecodeDone,\n  kMsgSeek,\n};\n\nclass mylooper : public looper {\n  virtual void handle(int what, void* obj);\n};\n\nstatic mylooper* mlooper = NULL;\n\nint64_t systemnanotime() {\n  timespec now;\n  clock_gettime(CLOCK_MONOTONIC, &now);\n  return now.tv_sec * 1000000000LL + now.tv_nsec;\n}\n\nvoid doCodecWork(workerdata* d) {\n  ssize_t bufidx = -1;\n  if (!d->sawInputEOS) {\n    bufidx = AMediaCodec_dequeueInputBuffer(d->codec, 2000);\n    LOGV(\"input buffer %zd\", bufidx);\n    if (bufidx >= 0) {\n      size_t bufsize;\n      auto buf = AMediaCodec_getInputBuffer(d->codec, bufidx, &bufsize);\n      auto sampleSize = AMediaExtractor_readSampleData(d->ex, buf, bufsize);\n      if (sampleSize < 0) {\n        sampleSize = 0;\n        d->sawInputEOS = true;\n        LOGV(\"EOS\");\n      }\n      auto presentationTimeUs = AMediaExtractor_getSampleTime(d->ex);\n\n      AMediaCodec_queueInputBuffer(\n          d->codec, bufidx, 0, sampleSize, presentationTimeUs,\n          d->sawInputEOS ? AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM : 0);\n      AMediaExtractor_advance(d->ex);\n    }\n  }\n\n  if (!d->sawOutputEOS) {\n    AMediaCodecBufferInfo info;\n    auto status = AMediaCodec_dequeueOutputBuffer(d->codec, &info, 0);\n    if (status >= 0) {\n      if (info.flags & AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM) {\n        LOGV(\"output EOS\");\n        d->sawOutputEOS = true;\n      }\n      int64_t presentationNano = info.presentationTimeUs * 1000;\n      if (d->renderstart < 0) {\n        d->renderstart = systemnanotime() - presentationNano;\n      }\n      int64_t delay = (d->renderstart + presentationNano) - systemnanotime();\n      if (delay > 0) {\n        usleep(delay / 1000);\n      }\n      AMediaCodec_releaseOutputBuffer(d->codec, status, info.size != 0);\n      if (d->renderonce) {\n        d->renderonce = false;\n        return;\n      }\n    } else if (status == AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED) {\n      LOGV(\"output buffers changed\");\n    } else if (status == AMEDIACODEC_INFO_OUTPUT_FORMAT_CHANGED) {\n      auto format = AMediaCodec_getOutputFormat(d->codec);\n      LOGV(\"format changed to: %s\", AMediaFormat_toString(format));\n      AMediaFormat_delete(format);\n    } else if (status == AMEDIACODEC_INFO_TRY_AGAIN_LATER) {\n      LOGV(\"no output buffer right now\");\n    } else {\n      LOGV(\"unexpected info code: %zd\", status);\n    }\n  }\n\n  if (!d->sawInputEOS || !d->sawOutputEOS) {\n    mlooper->post(kMsgCodecBuffer, d);\n  }\n}\n\nvoid mylooper::handle(int what, void* obj) {\n  switch (what) {\n    case kMsgCodecBuffer:\n      doCodecWork((workerdata*)obj);\n      break;\n\n    case kMsgDecodeDone: {\n      workerdata* d = (workerdata*)obj;\n      AMediaCodec_stop(d->codec);\n      AMediaCodec_delete(d->codec);\n      AMediaExtractor_delete(d->ex);\n      d->sawInputEOS = true;\n      d->sawOutputEOS = true;\n    } break;\n\n    case kMsgSeek: {\n      workerdata* d = (workerdata*)obj;\n      AMediaExtractor_seekTo(d->ex, 0, AMEDIAEXTRACTOR_SEEK_NEXT_SYNC);\n      AMediaCodec_flush(d->codec);\n      d->renderstart = -1;\n      d->sawInputEOS = false;\n      d->sawOutputEOS = false;\n      if (!d->isPlaying) {\n        d->renderonce = true;\n        post(kMsgCodecBuffer, d);\n      }\n      LOGV(\"seeked\");\n    } break;\n\n    case kMsgPause: {\n      workerdata* d = (workerdata*)obj;\n      if (d->isPlaying) {\n        // flush all outstanding codecbuffer messages with a no-op message\n        d->isPlaying = false;\n        post(kMsgPauseAck, NULL, true);\n      }\n    } break;\n\n    case kMsgResume: {\n      workerdata* d = (workerdata*)obj;\n      if (!d->isPlaying) {\n        d->renderstart = -1;\n        d->isPlaying = true;\n        post(kMsgCodecBuffer, d);\n      }\n    } break;\n  }\n}\n\njboolean CreateStreamingMediaPlayer(JNIEnv* env, jclass, jobject assetMgr,\n                                    jstring filename) {\n  LOGV(\"@@@ create\");\n\n  // convert Java string to UTF-8\n  const char* utf8 = env->GetStringUTFChars(filename, NULL);\n  LOGV(\"opening %s\", utf8);\n\n  off_t outStart, outLen;\n  int fd = AAsset_openFileDescriptor(\n      AAssetManager_open(AAssetManager_fromJava(env, assetMgr), utf8, 0),\n      &outStart, &outLen);\n\n  env->ReleaseStringUTFChars(filename, utf8);\n  if (fd < 0) {\n    LOGE(\"failed to open file: %s %d (%s)\", utf8, fd, strerror(errno));\n    return JNI_FALSE;\n  }\n\n  data.fd = fd;\n\n  workerdata* d = &data;\n\n  AMediaExtractor* ex = AMediaExtractor_new();\n  media_status_t err = AMediaExtractor_setDataSourceFd(\n      ex, d->fd, static_cast<off64_t>(outStart), static_cast<off64_t>(outLen));\n  close(d->fd);\n  if (err != AMEDIA_OK) {\n    LOGV(\"setDataSource error: %d\", err);\n    return JNI_FALSE;\n  }\n\n  int numtracks = AMediaExtractor_getTrackCount(ex);\n\n  AMediaCodec* codec = NULL;\n\n  LOGV(\"input has %d tracks\", numtracks);\n  for (int i = 0; i < numtracks; i++) {\n    AMediaFormat* format = AMediaExtractor_getTrackFormat(ex, i);\n    const char* s = AMediaFormat_toString(format);\n    LOGV(\"track %d format: %s\", i, s);\n    const char* mime;\n    if (!AMediaFormat_getString(format, AMEDIAFORMAT_KEY_MIME, &mime)) {\n      LOGV(\"no mime type\");\n      return JNI_FALSE;\n    } else if (!strncmp(mime, \"video/\", 6)) {\n      // Omitting most error handling for clarity.\n      // Production code should check for errors.\n      AMediaExtractor_selectTrack(ex, i);\n      codec = AMediaCodec_createDecoderByType(mime);\n      AMediaCodec_configure(codec, format, d->window, NULL, 0);\n      d->ex = ex;\n      d->codec = codec;\n      d->renderstart = -1;\n      d->sawInputEOS = false;\n      d->sawOutputEOS = false;\n      d->isPlaying = false;\n      d->renderonce = true;\n      AMediaCodec_start(codec);\n    }\n    AMediaFormat_delete(format);\n  }\n\n  mlooper = new mylooper();\n  mlooper->post(kMsgCodecBuffer, d);\n\n  return JNI_TRUE;\n}\n\n// set the playing state for the streaming media player\nvoid SetPlayingStreamingMediaPlayer(JNIEnv*, jclass, jboolean isPlaying) {\n  LOGV(\"@@@ playpause: %d\", isPlaying);\n  if (mlooper) {\n    if (isPlaying) {\n      mlooper->post(kMsgResume, &data);\n    } else {\n      mlooper->post(kMsgPause, &data);\n    }\n  }\n}\n\n// shut down the native media system\nvoid Shutdown(JNIEnv*, jclass) {\n  LOGV(\"@@@ shutdown\");\n  if (mlooper) {\n    mlooper->post(kMsgDecodeDone, &data, true /* flush */);\n    mlooper->quit();\n    delete mlooper;\n    mlooper = NULL;\n  }\n  if (data.window) {\n    ANativeWindow_release(data.window);\n    data.window = NULL;\n  }\n}\n\n// set the surface\nvoid SetSurface(JNIEnv* env, jclass, jobject surface) {\n  // obtain a native window from a Java surface\n  if (data.window) {\n    ANativeWindow_release(data.window);\n    data.window = NULL;\n  }\n  data.window = ANativeWindow_fromSurface(env, surface);\n  LOGV(\"@@@ setsurface %p\", data.window);\n}\n\n// rewind the streaming media player\nvoid RewindStreamingMediaPlayer(JNIEnv*, jclass) {\n  LOGV(\"@@@ rewind\");\n  if (mlooper) {\n    mlooper->post(kMsgSeek, &data);\n  }\n}\n\nextern \"C\" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* _Nonnull vm,\n                                             void* _Nullable) {\n  JNIEnv* env;\n  if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {\n    return JNI_ERR;\n  }\n\n  jclass c = env->FindClass(\"com/example/nativecodec/NativeCodec\");\n  if (c == nullptr) return JNI_ERR;\n\n  static const JNINativeMethod methods[] = {\n      {\"createStreamingMediaPlayer\",\n       \"(Landroid/content/res/AssetManager;Ljava/lang/String;)Z\",\n       reinterpret_cast<void*>(CreateStreamingMediaPlayer)},\n      {\"setPlayingStreamingMediaPlayer\", \"(Z)V\",\n       reinterpret_cast<void*>(SetPlayingStreamingMediaPlayer)},\n      {\"shutdown\", \"()V\", reinterpret_cast<void*>(Shutdown)},\n      {\"setSurface\", \"(Landroid/view/Surface;)V\",\n       reinterpret_cast<void*>(SetSurface)},\n      {\"rewindStreamingMediaPlayer\", \"()V\",\n       reinterpret_cast<void*>(RewindStreamingMediaPlayer)},\n  };\n  int rc = env->RegisterNatives(c, methods, arraysize(methods));\n  if (rc != JNI_OK) return rc;\n\n  return JNI_VERSION_1_6;\n}\n"
  },
  {
    "path": "native-codec/app/src/main/java/com/example/nativecodec/MyGLSurfaceView.java",
    "content": "/*\n * Copyright (C) 2014 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.example.nativecodec;\n\nimport android.graphics.SurfaceTexture;\nimport android.util.Log;\n\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\nimport java.nio.FloatBuffer;\n\nimport javax.microedition.khronos.egl.EGLConfig;\nimport javax.microedition.khronos.opengles.GL10;\n\nimport android.content.Context;\nimport android.opengl.GLES20;\nimport android.opengl.GLSurfaceView;\nimport android.opengl.Matrix;\nimport android.os.SystemClock;\nimport android.util.AttributeSet;\n\npublic class MyGLSurfaceView extends GLSurfaceView {\n\n    MyRenderer mRenderer;\n\n    public MyGLSurfaceView(Context context) {\n        this(context, null);\n    }\n\n    public MyGLSurfaceView(Context context, AttributeSet attributeSet) {\n        super(context, attributeSet);\n        init();\n    }\n\n    private void init() {\n        setEGLContextClientVersion(2);\n        mRenderer = new MyRenderer();\n        setRenderer(mRenderer);\n        Log.i(\"@@@\", \"setrenderer\");\n    }\n\n    @Override\n    public void onPause() {\n        mRenderer.onPause();\n        super.onPause();\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n        mRenderer.onResume();\n    }\n\n    public SurfaceTexture getSurfaceTexture() {\n        return mRenderer.getSurfaceTexture();\n    }\n}\n\nclass MyRenderer implements GLSurfaceView.Renderer, SurfaceTexture.OnFrameAvailableListener {\n\n    public MyRenderer() {\n        mVertices = ByteBuffer.allocateDirect(mVerticesData.length\n                * FLOAT_SIZE_BYTES).order(ByteOrder.nativeOrder()).asFloatBuffer();\n        mVertices.put(mVerticesData).position(0);\n\n        Matrix.setIdentityM(mSTMatrix, 0);\n    }\n    public void onPause() {\n    }\n\n    public void onResume() {\n        mLastTime = SystemClock.elapsedRealtimeNanos();\n    }\n\n    @Override\n    public void onDrawFrame(GL10 glUnused) {\n        synchronized(this) {\n            if (updateSurface) {\n                mSurface.updateTexImage();\n\n                mSurface.getTransformMatrix(mSTMatrix);\n                updateSurface = false;\n            }\n        }\n\n        // Ignore the passed-in GL10 interface, and use the GLES20\n        // class's static methods instead.\n        GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);\n        GLES20.glUseProgram(mProgram);\n        checkGlError(\"glUseProgram\");\n\n        GLES20.glActiveTexture(GLES20.GL_TEXTURE0);\n        GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTextureID);\n\n        mVertices.position(VERTICES_DATA_POS_OFFSET);\n        GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false,\n                VERTICES_DATA_STRIDE_BYTES, mVertices);\n        checkGlError(\"glVertexAttribPointer maPosition\");\n        GLES20.glEnableVertexAttribArray(maPositionHandle);\n        checkGlError(\"glEnableVertexAttribArray maPositionHandle\");\n\n        mVertices.position(VERTICES_DATA_UV_OFFSET);\n        GLES20.glVertexAttribPointer(maTextureHandle, 3, GLES20.GL_FLOAT, false,\n                VERTICES_DATA_STRIDE_BYTES, mVertices);\n        checkGlError(\"glVertexAttribPointer maTextureHandle\");\n        GLES20.glEnableVertexAttribArray(maTextureHandle);\n        checkGlError(\"glEnableVertexAttribArray maTextureHandle\");\n\n        long now = SystemClock.elapsedRealtimeNanos();\n        mRunTime += (now - mLastTime);\n        mLastTime = now;\n        double d = ((double)mRunTime) / 1000000000;\n        Matrix.setIdentityM(mMMatrix, 0);\n        Matrix.rotateM(mMMatrix, 0, 30, (float)Math.sin(d), (float)Math.cos(d), 0);\n        Matrix.multiplyMM(mMVPMatrix, 0, mVMatrix, 0, mMMatrix, 0);\n        Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mMVPMatrix, 0);\n\n        GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0);\n        GLES20.glUniformMatrix4fv(muSTMatrixHandle, 1, false, mSTMatrix, 0);\n\n        GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);\n        checkGlError(\"glDrawArrays\");\n    }\n\n    @Override\n    public void onSurfaceChanged(GL10 glUnused, int width, int height) {\n        // Ignore the passed-in GL10 interface, and use the GLES20\n        // class's static methods instead.\n        GLES20.glViewport(0, 0, width, height);\n        mRatio = (float) width / height;\n        Matrix.frustumM(mProjMatrix, 0, -mRatio, mRatio, -1, 1, 3, 7);\n    }\n\n    @Override\n    public void onSurfaceCreated(GL10 glUnused, EGLConfig config) {\n        // Ignore the passed-in GL10 interface, and use the GLES20\n        // class's static methods instead.\n\n        /* Set up alpha blending and an Android background color */\n        GLES20.glEnable(GLES20.GL_BLEND);\n        GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);\n        GLES20.glClearColor(0.643f, 0.776f, 0.223f, 1.0f);\n\n        /* Set up shaders and handles to their variables */\n        mProgram = createProgram(mVertexShader, mFragmentShader);\n        if (mProgram == 0) {\n            return;\n        }\n        maPositionHandle = GLES20.glGetAttribLocation(mProgram, \"aPosition\");\n        checkGlError(\"glGetAttribLocation aPosition\");\n        if (maPositionHandle == -1) {\n            throw new RuntimeException(\"Could not get attrib location for aPosition\");\n        }\n        maTextureHandle = GLES20.glGetAttribLocation(mProgram, \"aTextureCoord\");\n        checkGlError(\"glGetAttribLocation aTextureCoord\");\n        if (maTextureHandle == -1) {\n            throw new RuntimeException(\"Could not get attrib location for aTextureCoord\");\n        }\n\n        muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, \"uMVPMatrix\");\n        checkGlError(\"glGetUniformLocation uMVPMatrix\");\n        if (muMVPMatrixHandle == -1) {\n            throw new RuntimeException(\"Could not get attrib location for uMVPMatrix\");\n        }\n\n        muSTMatrixHandle = GLES20.glGetUniformLocation(mProgram, \"uSTMatrix\");\n        checkGlError(\"glGetUniformLocation uSTMatrix\");\n        if (muSTMatrixHandle == -1) {\n            throw new RuntimeException(\"Could not get attrib location for uSTMatrix\");\n        }\n\n        /*\n         * Create our texture. This has to be done each time the\n         * surface is created.\n         */\n\n        int[] textures = new int[1];\n        GLES20.glGenTextures(1, textures, 0);\n\n        mTextureID = textures[0];\n        GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTextureID);\n        checkGlError(\"glBindTexture mTextureID\");\n\n        // Can't do mipmapping with camera source\n        GLES20.glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER,\n                GLES20.GL_NEAREST);\n        GLES20.glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER,\n                GLES20.GL_LINEAR);\n        // Clamp to edge is the only option\n        GLES20.glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_S,\n                GLES20.GL_CLAMP_TO_EDGE);\n        GLES20.glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_T,\n                GLES20.GL_CLAMP_TO_EDGE);\n        checkGlError(\"glTexParameteri mTextureID\");\n\n        /*\n         * Create the SurfaceTexture that will feed this textureID, and pass it to the camera\n         */\n\n        mSurface = new SurfaceTexture(mTextureID);\n        mSurface.setOnFrameAvailableListener(this);\n\n        Matrix.setLookAtM(mVMatrix, 0, 0, 0, 4f, 0f, 0f, 0f, 0f, 1.0f, 0.0f);\n\n        synchronized(this) {\n            updateSurface = false;\n        }\n    }\n\n    @Override\n    synchronized public void onFrameAvailable(SurfaceTexture surface) {\n        /* For simplicity, SurfaceTexture calls here when it has new\n         * data available.  Call may come in from some random thread,\n         * so let's be safe and use synchronize. No OpenGL calls can be done here.\n         */\n        updateSurface = true;\n        //Log.v(TAG, \"onFrameAvailable \" + surface.getTimestamp());\n    }\n\n    private int loadShader(int shaderType, String source) {\n        int shader = GLES20.glCreateShader(shaderType);\n        if (shader != 0) {\n            GLES20.glShaderSource(shader, source);\n            GLES20.glCompileShader(shader);\n            int[] compiled = new int[1];\n            GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0);\n            if (compiled[0] == 0) {\n                Log.e(TAG, \"Could not compile shader \" + shaderType + \":\");\n                Log.e(TAG, GLES20.glGetShaderInfoLog(shader));\n                GLES20.glDeleteShader(shader);\n                shader = 0;\n            }\n        }\n        return shader;\n    }\n\n    private int createProgram(String vertexSource, String fragmentSource) {\n        int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexSource);\n        if (vertexShader == 0) {\n            return 0;\n        }\n        int pixelShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource);\n        if (pixelShader == 0) {\n            return 0;\n        }\n\n        int program = GLES20.glCreateProgram();\n        if (program != 0) {\n            GLES20.glAttachShader(program, vertexShader);\n            checkGlError(\"glAttachShader\");\n            GLES20.glAttachShader(program, pixelShader);\n            checkGlError(\"glAttachShader\");\n            GLES20.glLinkProgram(program);\n            int[] linkStatus = new int[1];\n            GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0);\n            if (linkStatus[0] != GLES20.GL_TRUE) {\n                Log.e(TAG, \"Could not link program: \");\n                Log.e(TAG, GLES20.glGetProgramInfoLog(program));\n                GLES20.glDeleteProgram(program);\n                program = 0;\n            }\n        }\n        return program;\n    }\n\n    private void checkGlError(String op) {\n        int error;\n        while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {\n            Log.e(TAG, op + \": glError \" + error);\n            throw new RuntimeException(op + \": glError \" + error);\n        }\n    }\n\n    private static final int FLOAT_SIZE_BYTES = 4;\n    private static final int VERTICES_DATA_STRIDE_BYTES = 5 * FLOAT_SIZE_BYTES;\n    private static final int VERTICES_DATA_POS_OFFSET = 0;\n    private static final int VERTICES_DATA_UV_OFFSET = 3;\n    private final float[] mVerticesData = {\n        // X, Y, Z, U, V\n        -1.25f, -1.0f, 0, 0.f, 0.f,\n         1.25f, -1.0f, 0, 1.f, 0.f,\n        -1.25f,  1.0f, 0, 0.f, 1.f,\n         1.25f,  1.0f, 0, 1.f, 1.f,\n    };\n\n    private FloatBuffer mVertices;\n\n    private final String mVertexShader =\n        \"uniform mat4 uMVPMatrix;\\n\" +\n        \"uniform mat4 uSTMatrix;\\n\" +\n        \"attribute vec4 aPosition;\\n\" +\n        \"attribute vec4 aTextureCoord;\\n\" +\n        \"varying vec2 vTextureCoord;\\n\" +\n        \"void main() {\\n\" +\n        \"  gl_Position = uMVPMatrix * aPosition;\\n\" +\n        \"  vTextureCoord = (uSTMatrix * aTextureCoord).xy;\\n\" +\n        \"}\\n\";\n\n    private final String mFragmentShader =\n        \"#extension GL_OES_EGL_image_external : require\\n\" +\n        \"precision mediump float;\\n\" +\n        \"varying vec2 vTextureCoord;\\n\" +\n        \"uniform samplerExternalOES sTexture;\\n\" +\n        \"void main() {\\n\" +\n        \"  gl_FragColor = texture2D(sTexture, vTextureCoord);\\n\" +\n        \"}\\n\";\n\n    private float[] mMVPMatrix = new float[16];\n    private float[] mProjMatrix = new float[16];\n    private float[] mMMatrix = new float[16];\n    private float[] mVMatrix = new float[16];\n    private float[] mSTMatrix = new float[16];\n\n    private int mProgram;\n    private int mTextureID;\n    private int muMVPMatrixHandle;\n    private int muSTMatrixHandle;\n    private int maPositionHandle;\n    private int maTextureHandle;\n\n    private float mRatio = 1.0f;\n    private SurfaceTexture mSurface;\n    private boolean updateSurface = false;\n    private long mLastTime = -1;\n    private long mRunTime = 0;\n\n    private static final String TAG = \"MyRenderer\";\n\n    // Magic key\n    private static final int GL_TEXTURE_EXTERNAL_OES = 0x8D65;\n\n    public SurfaceTexture getSurfaceTexture() {\n        return mSurface;\n    }\n}\n"
  },
  {
    "path": "native-codec/app/src/main/java/com/example/nativecodec/NativeCodec.java",
    "content": "/*\n * Copyright (C) 2014 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.example.nativecodec;\n\nimport android.app.Activity;\nimport android.content.res.AssetManager;\nimport android.graphics.SurfaceTexture;\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.view.Surface;\nimport android.view.SurfaceHolder;\nimport android.view.SurfaceView;\nimport android.view.View;\nimport android.widget.AdapterView;\nimport android.widget.ArrayAdapter;\nimport android.widget.Button;\nimport android.widget.CompoundButton;\nimport android.widget.CompoundButton.OnCheckedChangeListener;\nimport android.widget.RadioButton;\nimport android.widget.Spinner;\n\nimport java.io.IOException;\n\npublic class NativeCodec extends Activity {\n    static final String TAG = \"NativeCodec\";\n\n    String mSourceString = null;\n\n    SurfaceView mSurfaceView1;\n    SurfaceHolder mSurfaceHolder1;\n\n    VideoSink mSelectedVideoSink;\n    VideoSink mNativeCodecPlayerVideoSink;\n\n    SurfaceHolderVideoSink mSurfaceHolder1VideoSink;\n    GLViewVideoSink mGLView1VideoSink;\n\n    boolean mCreated = false;\n    boolean mIsPlaying = false;\n\n    /** Called when the activity is first created. */\n    @Override\n    public void onCreate(Bundle icicle) {\n        super.onCreate(icicle);\n        setContentView(R.layout.main);\n\n        mGLView1 = (MyGLSurfaceView) findViewById(R.id.glsurfaceview1);\n\n        // set up the Surface 1 video sink\n        mSurfaceView1 = (SurfaceView) findViewById(R.id.surfaceview1);\n        mSurfaceHolder1 = mSurfaceView1.getHolder();\n\n        mSurfaceHolder1.addCallback(new SurfaceHolder.Callback() {\n\n            @Override\n            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {\n                Log.v(TAG, \"surfaceChanged format=\" + format + \", width=\" + width + \", height=\"\n                        + height);\n            }\n\n            @Override\n            public void surfaceCreated(SurfaceHolder holder) {\n                Log.v(TAG, \"surfaceCreated\");\n                if (mRadio1.isChecked()) {\n                    setSurface(holder.getSurface());\n                }\n            }\n\n            @Override\n            public void surfaceDestroyed(SurfaceHolder holder) {\n                Log.v(TAG, \"surfaceDestroyed\");\n            }\n\n        });\n\n        // initialize content source spinner\n        Spinner sourceSpinner = (Spinner) findViewById(R.id.source_spinner);\n        ArrayAdapter<CharSequence> sourceAdapter = ArrayAdapter.createFromResource(\n                this, R.array.source_array, android.R.layout.simple_spinner_item);\n        sourceAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);\n        sourceSpinner.setAdapter(sourceAdapter);\n        sourceSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {\n\n            @Override\n            public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {\n                mSourceString = parent.getItemAtPosition(pos).toString();\n                Log.v(TAG, \"onItemSelected \" + mSourceString);\n            }\n\n            @Override\n            public void onNothingSelected(AdapterView parent) {\n                Log.v(TAG, \"onNothingSelected\");\n                mSourceString = null;\n            }\n\n        });\n\n        mRadio1 = (RadioButton) findViewById(R.id.radio1);\n        mRadio2 = (RadioButton) findViewById(R.id.radio2);\n\n        OnCheckedChangeListener checklistener = new CompoundButton.OnCheckedChangeListener() {\n\n          @Override\n          public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {\n              Log.i(\"@@@@\", \"oncheckedchanged\");\n              if (buttonView == mRadio1 && isChecked) {\n                  mRadio2.setChecked(false);\n              }\n              if (buttonView == mRadio2 && isChecked) {\n                  mRadio1.setChecked(false);\n              }\n              if (isChecked) {\n                  if (mRadio1.isChecked()) {\n                      if (mSurfaceHolder1VideoSink == null) {\n                          mSurfaceHolder1VideoSink = new SurfaceHolderVideoSink(mSurfaceHolder1);\n                      }\n                      mSelectedVideoSink = mSurfaceHolder1VideoSink;\n                      mGLView1.onPause();\n                      Log.i(\"@@@@\", \"glview pause\");\n                  } else {\n                      mGLView1.onResume();\n                      if (mGLView1VideoSink == null) {\n                          mGLView1VideoSink = new GLViewVideoSink(mGLView1);\n                      }\n                      mSelectedVideoSink = mGLView1VideoSink;\n                  }\n                  switchSurface();\n              }\n          }\n        };\n        mRadio1.setOnCheckedChangeListener(checklistener);\n        mRadio2.setOnCheckedChangeListener(checklistener);\n        mRadio2.toggle();\n\n        // the surfaces themselves are easier targets than the radio buttons\n        mSurfaceView1.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                mRadio1.toggle();\n            }\n        });\n        mGLView1.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                mRadio2.toggle();\n            }\n      });\n\n        // initialize button click handlers\n\n        // native MediaPlayer start/pause\n        ((Button) findViewById(R.id.start_native)).setOnClickListener(new View.OnClickListener() {\n\n            @Override\n            public void onClick(View view) {\n                if (!mCreated) {\n                    if (mNativeCodecPlayerVideoSink == null) {\n                        if (mSelectedVideoSink == null) {\n                            return;\n                        }\n                        mSelectedVideoSink.useAsSinkForNative();\n                        mNativeCodecPlayerVideoSink = mSelectedVideoSink;\n                    }\n                    if (mSourceString != null) {\n                        mCreated = createStreamingMediaPlayer(getResources().getAssets(),\n                                mSourceString);\n                    }\n                }\n                if (mCreated) {\n                    mIsPlaying = !mIsPlaying;\n                    setPlayingStreamingMediaPlayer(mIsPlaying);\n                }\n            }\n\n        });\n\n\n        // native MediaPlayer rewind\n        ((Button) findViewById(R.id.rewind_native)).setOnClickListener(new View.OnClickListener() {\n\n            @Override\n            public void onClick(View view) {\n                if (mNativeCodecPlayerVideoSink != null) {\n                    rewindStreamingMediaPlayer();\n                }\n            }\n\n        });\n    }\n\n    void switchSurface() {\n        if (mCreated && mNativeCodecPlayerVideoSink != mSelectedVideoSink) {\n            // shutdown and recreate on other surface\n          Log.i(\"@@@\", \"shutting down player\");\n            shutdown();\n            mCreated = false;\n            mSelectedVideoSink.useAsSinkForNative();\n            mNativeCodecPlayerVideoSink = mSelectedVideoSink;\n            if (mSourceString != null) {\n                Log.i(\"@@@\", \"recreating player\");\n                mCreated = createStreamingMediaPlayer(getResources().getAssets(),mSourceString);\n                mIsPlaying = false;\n            }\n        }\n    }\n\n    /** Called when the activity is about to be paused. */\n    @Override\n    protected void onPause()\n    {\n        mIsPlaying = false;\n        setPlayingStreamingMediaPlayer(false);\n        mGLView1.onPause();\n        super.onPause();\n    }\n\n    @Override\n    protected void onResume() {\n        super.onResume();\n        if (mRadio2.isChecked()) {\n            mGLView1.onResume();\n        }\n    }\n\n    /** Called when the activity is about to be destroyed. */\n    @Override\n    protected void onDestroy()\n    {\n        shutdown();\n        mCreated = false;\n        super.onDestroy();\n    }\n\n    private MyGLSurfaceView mGLView1;\n\n    private RadioButton mRadio1;\n\n    private RadioButton mRadio2;\n\n    /** Native methods, implemented in jni folder */\n    public static native void createEngine();\n    public static native boolean createStreamingMediaPlayer(AssetManager assetMgr, String filename);\n    public static native void setPlayingStreamingMediaPlayer(boolean isPlaying);\n    public static native void shutdown();\n    public static native void setSurface(Surface surface);\n    public static native void rewindStreamingMediaPlayer();\n\n    /** Load jni .so on initialization */\n    static {\n         System.loadLibrary(\"native-codec-jni\");\n    }\n\n    // VideoSink abstracts out the difference between Surface and SurfaceTexture\n    // aka SurfaceHolder and GLSurfaceView\n    static abstract class VideoSink {\n\n        abstract void setFixedSize(int width, int height);\n        abstract void useAsSinkForNative();\n\n    }\n\n    static class SurfaceHolderVideoSink extends VideoSink {\n\n        private final SurfaceHolder mSurfaceHolder;\n\n        SurfaceHolderVideoSink(SurfaceHolder surfaceHolder) {\n            mSurfaceHolder = surfaceHolder;\n        }\n\n        @Override\n        void setFixedSize(int width, int height) {\n            mSurfaceHolder.setFixedSize(width, height);\n        }\n\n        @Override\n        void useAsSinkForNative() {\n            Surface s = mSurfaceHolder.getSurface();\n            Log.i(\"@@@\", \"setting surface \" + s);\n            setSurface(s);\n        }\n\n    }\n\n    static class GLViewVideoSink extends VideoSink {\n\n        private final MyGLSurfaceView mMyGLSurfaceView;\n\n        GLViewVideoSink(MyGLSurfaceView myGLSurfaceView) {\n            mMyGLSurfaceView = myGLSurfaceView;\n        }\n\n        @Override\n        void setFixedSize(int width, int height) {\n        }\n\n        @Override\n        void useAsSinkForNative() {\n            SurfaceTexture st = mMyGLSurfaceView.getSurfaceTexture();\n            Surface s = new Surface(st);\n            setSurface(s);\n            s.release();\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "native-codec/app/src/main/res/layout/main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:orientation=\"vertical\"\n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"fill_parent\"\n    >\n    <LinearLayout\n        android:orientation=\"horizontal\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"8dip\"\n        >\n        <TextView\n            android:layout_width=\"fill_parent\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/source_select\"\n            />\n        <Spinner\n            android:id=\"@+id/source_spinner\"\n            android:layout_width=\"fill_parent\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/source_prompt\"\n            />\n    </LinearLayout>\n\n    <LinearLayout\n        android:orientation=\"horizontal\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"8dip\"\n        >\n        <Button\n            android:id=\"@+id/start_native\"\n            android:text=\"@string/start_native\"\n            android:layout_width=\"fill_parent\"\n            android:layout_height=\"wrap_content\"\n            />\n        <Button\n            android:id=\"@+id/rewind_native\"\n            android:text=\"@string/rewind_native\"\n            android:layout_width=\"fill_parent\"\n            android:layout_height=\"wrap_content\"\n            />\n    </LinearLayout>\n\n    <LinearLayout\n        android:orientation=\"horizontal\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"8dip\"\n        >\n        <RadioButton\n            android:id=\"@+id/radio1\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:padding=\"10dip\"\n        />\n        <SurfaceView\n            android:id=\"@+id/surfaceview1\"\n            android:layout_width=\"640px\"\n            android:layout_height=\"480px\"\n            />\n    </LinearLayout>\n\n    <LinearLayout\n        android:orientation=\"horizontal\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"8dip\"\n        >\n        <RadioButton\n            android:id=\"@+id/radio2\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:padding=\"10dip\"\n        />\n        <com.example.nativecodec.MyGLSurfaceView\n            android:id=\"@+id/glsurfaceview1\"\n            android:layout_width=\"640px\"\n            android:layout_height=\"480px\"\n            />\n    </LinearLayout>\n\n</LinearLayout>\n"
  },
  {
    "path": "native-codec/app/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"app_name\">NativeCodec</string>\n    <string name=\"start_java\">Start/Pause\\nJava MediaPlayer</string>\n    <string name=\"start_native\">Start/Pause</string>\n\n    <string name=\"rewind_native\">Rewind</string>\n\n    <string name=\"source_select\">Please select the media source</string>\n    <string name=\"source_prompt\">Media source</string>\n    <string-array name=\"source_array\">\n        <item>clips/testfile.mp4</item>\n    </string-array>\n\n    <string name=\"sink_select\">Please select the video sink</string>\n    <string name=\"sink_prompt\">Video sink</string>\n    <string-array name=\"sink_array\">\n        <item>Surface</item>\n        <item>Texture</item>\n    </string-array>\n\n</resources>\n"
  },
  {
    "path": "native-media/README.md",
    "content": "# Sample removed\n\nThis sample has been removed because we no longer recommend using OpenMAX AL in\nnew code. See the `native-codec` sample instead for an example of how to use the\nAndroid Media APIs.\n"
  },
  {
    "path": "native-midi/README.md",
    "content": "## Description\n\n### Introduction\n\nThe Native MIDI sample is a simple Android application which demonstrates how to\nuse\n[the Android Native MIDI API](http://developer.android.com/preview/features/midi),\na new feature in Android 29.\n\nNote that [AMidi](http://developer.android.com/preview/features/midi) is a\nsimple data transport mechanism. It works in terms of streams of bytes and does\nnot impose any MIDI semantics beyond that whole MIDI messages are transported as\na unit. Indeed, basic MIDI constructs such as message IDs, or message formatting\nare not represented in either API. However, since the sample does deal with MIDI\nsemantics, there are definitions and mechanism to support these semantics.\n\n### An Important Nomenclature Observation\n\nAMidi inherits most of its terminology from the existing Android Java MIDI API.\nThis can cause confusion regarding the naming of port types and their\ndirectionality. The Android Java MIDI API regards the directionality of the\nports from the perspective of the connected MIDI peripheral, not the perspective\nof the application. AMidi inherits this perspective so an application uses an\nAMidiOutputPort to receive MIDI data from the output port of a device and uses\nan AMidiInputPort to send data to the input port of a device. AMidi uses the\nverbs “send” and “receive” to make this more clear to the application\nprogrammer, and these conventions are used in the NMTb. Prerequisites By\ndefinition, the Android Native MIDI API requires the use of the Java Native\nInterface (JNI). It is assumed that anyone implementing a Native MIDI\napplication will be familiar with JNI.\n\n### Hardware Setup\n\nThis sample requires an input and an output MIDI device connected to Android\ndevices running Android Qt+. An example configure can be:\n\n![Configure](config.png)\n\n## Screenshots\n\n![screenshot](screenshot.png)\n"
  },
  {
    "path": "native-midi/app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "native-midi/app/build.gradle",
    "content": "plugins {\n    id \"ndksamples.android.application\"\n}\n\nandroid {\n    namespace 'com.example.nativemidi'\n\n    defaultConfig {\n        applicationId \"com.example.nativemidi\"\n        minSdkVersion 29\n        versionCode 1\n        versionName \"1.0\"\n        externalNativeBuild {\n            cmake {\n                arguments \"-DANDROID_STL=c++_static\"\n            }\n        }\n    }\n\n    externalNativeBuild {\n        cmake {\n            path \"src/main/cpp/CMakeLists.txt\"\n        }\n    }\n\n    buildFeatures {\n        prefab true\n    }\n}\n\ndependencies {\n    implementation project(\":base\")\n    implementation libs.appcompat\n    implementation libs.androidx.constraintlayout\n}\n"
  },
  {
    "path": "native-midi/app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile\n"
  },
  {
    "path": "native-midi/app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <application\n        android:allowBackup=\"true\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:extractNativeLibs=\"false\"\n\n        android:label=\"@string/app_name\"\n        android:roundIcon=\"@mipmap/ic_launcher_round\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme\">\n        <activity android:name=\".MainActivity\"\n            android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n    </application>\n\n</manifest>"
  },
  {
    "path": "native-midi/app/src/main/cpp/AndroidDebug.h",
    "content": "/*\n * Copyright (C) 2018 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n#ifndef NATIVE_AUDIO_ANDROID_DEBUG_H_H\n#define NATIVE_AUDIO_ANDROID_DEBUG_H_H\n#include <android/log.h>\n\n#if !defined(NDEBUG)\n\n#if !defined(LOG_TAG)\n#define LOG_TAG \"NATIVE-MIDI\"\n#endif\n\n#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)\n#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)\n#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)\n#define LOGW(...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)\n#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)\n#define LOGF(...) __android_log_print(ANDROID_LOG_FATAL, LOG_TAG, __VA_ARGS__)\n\n#else\n\n#define LOGV(...)\n#define LOGD(...)\n#define LOGI(...)\n#define LOGW(...)\n#define LOGE(...)\n#define LOGF(...)\n#endif\n\n#endif  // NATIVE_AUDIO_ANDROID_DEBUG_H_H\n"
  },
  {
    "path": "native-midi/app/src/main/cpp/AppMidiManager.cpp",
    "content": "/*\n * Copyright (C) 2019 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n#include <inttypes.h>\n#include <jni.h>\n#include <pthread.h>\n#include <stdio.h>\n#include <unistd.h>\n\n#include <atomic>\n#include <string>\n\n#define LOG_TAG \"AppMidiManager-JNI\"\n#include <amidi/AMidi.h>\n\n#include \"AndroidDebug.h\"\n#include \"MidiSpec.h\"\n\nstatic AMidiDevice* sNativeReceiveDevice = NULL;\n// The thread only reads this value, so no special protection is required.\nstatic AMidiOutputPort* sMidiOutputPort = NULL;\n\nstatic AMidiDevice* sNativeSendDevice = NULL;\nstatic AMidiInputPort* sMidiInputPort = NULL;\n\nstatic pthread_t sReadThread;\nstatic std::atomic<bool> sReading(false);\n\n// The Data Callback\nextern JavaVM* theJvm;           // Need this for allocating data buffer for...\nextern jobject dataCallbackObj;  // This is the (Java) object that implements...\nextern jmethodID midDataCallback;  // ...this callback routine\n\nstatic void SendTheReceivedData(uint8_t* data, int numBytes) {\n  JNIEnv* env;\n  theJvm->AttachCurrentThread(&env, NULL);\n  if (env == NULL) {\n    LOGE(\"Error retrieving JNI Env\");\n  }\n\n  // Allocate the Java array and fill with received data\n  jbyteArray ret = env->NewByteArray(numBytes);\n  env->SetByteArrayRegion(ret, 0, numBytes, (jbyte*)data);\n\n  // send it to the (Java) callback\n  env->CallVoidMethod(dataCallbackObj, midDataCallback, ret);\n}\n\n#if 0\n// unblock this method if logging of the midi messages is required.\n/**\n * Formats a midi message set and outputs to the log\n * @param   timestamp   The timestamp for when the message(s) was received\n * @param   dataBytes   The MIDI message bytes\n * @params  numDataBytew    The number of bytes in the MIDI message(s)\n */\nstatic void logMidiBuffer(int64_t timestamp, uint8_t* dataBytes, size_t numDataBytes) {\n#define DUMP_BUFFER_SIZE 1024\n    char midiDumpBuffer[DUMP_BUFFER_SIZE];\n    memset(midiDumpBuffer, 0, sizeof(midiDumpBuffer));\n    int pos = snprintf(midiDumpBuffer, DUMP_BUFFER_SIZE,\n            \"%\" PRIx64 \" \", timestamp);\n    for (uint8_t *b = dataBytes, *e = b + numDataBytes; b < e; ++b) {\n        pos += snprintf(midiDumpBuffer + pos, DUMP_BUFFER_SIZE - pos,\n                \"%02x \", *b);\n    }\n    LOGD(\"%s\", midiDumpBuffer);\n}\n#endif\n\n/*\n * Receiving API\n */\n/**\n * This routine polls the input port and dispatches received data to the\n * application-provided (Java) callback.\n */\nstatic void* readThreadRoutine(void* context) {\n  (void)context;  // unused\n\n  sReading = true;\n  // AMidiOutputPort* outputPort = sMidiOutputPort.load();\n  AMidiOutputPort* outputPort = sMidiOutputPort;\n\n  const size_t MAX_BYTES_TO_RECEIVE = 128;\n  uint8_t incomingMessage[MAX_BYTES_TO_RECEIVE];\n\n  while (sReading) {\n    // AMidiOutputPort_receive is non-blocking, so let's not burn up the CPU\n    // unnecessarily\n    usleep(2000);\n\n    int32_t opcode;\n    size_t numBytesReceived;\n    int64_t timestamp;\n    ssize_t numMessagesReceived = AMidiOutputPort_receive(\n        outputPort, &opcode, incomingMessage, MAX_BYTES_TO_RECEIVE,\n        &numBytesReceived, &timestamp);\n\n    if (numMessagesReceived < 0) {\n      LOGW(\"Failure receiving MIDI data %zd\", numMessagesReceived);\n      // Exit the thread\n      sReading = false;\n    }\n    if (numMessagesReceived > 0 && numBytesReceived >= 0) {\n      if (opcode == AMIDI_OPCODE_DATA &&\n          (incomingMessage[0] & kMIDISysCmdChan) != kMIDISysCmdChan) {\n        // (optionally) Dump to log\n        // logMidiBuffer(timestamp, incomingMessage, numBytesReceived);\n        SendTheReceivedData(incomingMessage, numBytesReceived);\n      } else if (opcode == AMIDI_OPCODE_FLUSH) {\n        // ignore\n      }\n    }\n  }  // end while(sReading)\n\n  return NULL;\n}\n\n//\n// JNI Functions\n//\nextern \"C\" {\n\n/**\n * Native implementation of TBMidiManager.startReadingMidi() method.\n * Opens the first \"output\" port from specified MIDI device for sReading.\n * @param   env  JNI Env pointer.\n * @param   (unnamed)   TBMidiManager (Java) object.\n * @param   midiDeviceObj   (Java) MidiDevice object.\n * @param   portNumber      The index of the \"output\" port to open.\n */\nvoid Java_com_example_nativemidi_AppMidiManager_startReadingMidi(\n    JNIEnv* env, jobject, jobject midiDeviceObj, jint portNumber) {\n  AMidiDevice_fromJava(env, midiDeviceObj, &sNativeReceiveDevice);\n  // int32_t deviceType = AMidiDevice_getType(sNativeReceiveDevice);\n  // ssize_t numPorts = AMidiDevice_getNumOutputPorts(sNativeReceiveDevice);\n\n  AMidiOutputPort* outputPort;\n  AMidiOutputPort_open(sNativeReceiveDevice, portNumber, &outputPort);\n\n  // sMidiOutputPort.store(outputPort);\n  sMidiOutputPort = outputPort;\n\n  // Start read thread\n  // pthread_init(true);\n  /*int pthread_result =*/pthread_create(&sReadThread, NULL, readThreadRoutine,\n                                         NULL);\n}\n\n/**\n * Native implementation of the (Java) TBMidiManager.stopReadingMidi() method.\n * @param   (unnamed)   JNI Env pointer.\n * @param   (unnamed)   TBMidiManager (Java) object.\n */\nvoid Java_com_example_nativemidi_AppMidiManager_stopReadingMidi(JNIEnv*,\n                                                                jobject) {\n  // need some synchronization here\n  sReading = false;\n  pthread_join(sReadThread, NULL);\n\n  /*media_status_t status =*/AMidiDevice_release(sNativeReceiveDevice);\n  sNativeReceiveDevice = NULL;\n}\n\n/*\n * Sending API\n */\n/**\n * Native implementation of TBMidiManager.startWritingMidi() method.\n * Opens the first \"input\" port from specified MIDI device for writing.\n * @param   env  JNI Env pointer.\n * @param   (unnamed)   TBMidiManager (Java) object.\n * @param   midiDeviceObj   (Java) MidiDevice object.\n * @param   portNumber      The index of the \"input\" port to open.\n */\nvoid Java_com_example_nativemidi_AppMidiManager_startWritingMidi(\n    JNIEnv* env, jobject, jobject midiDeviceObj, jint portNumber) {\n  AMidiDevice_fromJava(env, midiDeviceObj, &sNativeSendDevice);\n  // int32_t deviceType = AMidiDevice_getType(sNativeReceiveDevice);\n  // ssize_t numPorts = AMidiDevice_getNumInputPorts(sNativeSendDevice);\n\n  AMidiInputPort* inputPort;\n  AMidiInputPort_open(sNativeSendDevice, portNumber, &inputPort);\n  // sMidiInputPort.store(inputPort);\n  sMidiInputPort = inputPort;\n}\n\n/**\n * Native implementation of the (Java) TBMidiManager.stopWritingMidi\n * @param   (unnamed)   JNI Env pointer.\n * @param   (unnamed)   TBMidiManager (Java) object.\n */\nvoid Java_com_example_nativemidi_AppMidiManager_stopWritingMidi(JNIEnv*,\n                                                                jobject) {\n  if (sMidiInputPort != nullptr) {\n    AMidiInputPort_close(\n        sMidiInputPort);  // Close InputPort to make switching MidiDevices work!\n    sMidiInputPort = nullptr;\n  }\n  /*media_status_t status =*/AMidiDevice_release(sNativeSendDevice);\n  sNativeSendDevice = NULL;\n}\n\n/**\n * Native implementation of the (Java) TBMidiManager.writeMidi() method.\n * Writes a byte buffer to the (already open) \"input\" port.\n * @param   env  JNI Env pointer.\n * @param   (unnamed)   TBMidiManager (Java) object.\n * @param   data    The data buffer.\n * @param   numBytes    The number of bytes to send.\n */\nvoid Java_com_example_nativemidi_AppMidiManager_writeMidi(JNIEnv* env, jobject,\n                                                          jbyteArray data,\n                                                          jint numBytes) {\n  jbyte* bufferPtr = env->GetByteArrayElements(data, NULL);\n  /*ssize_t numSent =*/AMidiInputPort_send(sMidiInputPort, (uint8_t*)bufferPtr,\n                                           numBytes);\n  env->ReleaseByteArrayElements(data, bufferPtr, JNI_ABORT);\n}\n\n}  // extern \"C\"\n"
  },
  {
    "path": "native-midi/app/src/main/cpp/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.22.1)\nproject(native_midi LANGUAGES CXX)\n\ninclude(AppLibrary)\nfind_package(base CONFIG REQUIRED)\n\nadd_app_library(${PROJECT_NAME}\n    SHARED\n    AppMidiManager.cpp\n    MainActivity.cpp\n)\n\ntarget_link_libraries(${PROJECT_NAME}\n    PRIVATE\n    base::base\n    amidi\n    OpenSLES\n    android\n    log\n)\n"
  },
  {
    "path": "native-midi/app/src/main/cpp/MainActivity.cpp",
    "content": "/*\n * Copyright (C) 2019 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n#include <base/macros.h>\n#include <jni.h>\n\n// Data callback stuff\nJavaVM* theJvm;\njobject dataCallbackObj;\njmethodID midDataCallback;\n\n/**\n * Initializes JNI interface stuff, specifically the info needed to call back\n * into the Java layer when MIDI data is received.\n */\nvoid InitNative(JNIEnv* env, jobject instance) {\n  env->GetJavaVM(&theJvm);\n\n  // Setup the receive data callback (into Java)\n  jclass clsMainActivity =\n      env->FindClass(\"com/example/nativemidi/MainActivity\");\n  dataCallbackObj = env->NewGlobalRef(instance);\n  midDataCallback =\n      env->GetMethodID(clsMainActivity, \"onNativeMessageReceive\", \"([B)V\");\n}\n\nextern \"C\" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* _Nonnull vm,\n                                             void* _Nullable) {\n  JNIEnv* env;\n  if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {\n    return JNI_ERR;\n  }\n\n  jclass c = env->FindClass(\"com/example/nativemidi/MainActivity\");\n  if (c == nullptr) return JNI_ERR;\n\n  static const JNINativeMethod methods[] = {\n      {\"initNative\", \"()V\", reinterpret_cast<void*>(InitNative)},\n  };\n  int rc = env->RegisterNatives(c, methods, arraysize(methods));\n  if (rc != JNI_OK) return rc;\n\n  return JNI_VERSION_1_6;\n}\n"
  },
  {
    "path": "native-midi/app/src/main/cpp/MidiSpec.h",
    "content": "/*\n * Copyright (C) 2019 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\n#ifndef NATIVEMIDITESTBED_MIDISPEC_H\n\n//\n// MIDI Messages\n//\n// Channel Commands\nstatic const uint8_t kMIDIChanCmd_NoteOff = 8;\nstatic const uint8_t kMIDIChanCmd_NoteOn = 9;\nstatic const uint8_t kMIDIChanCmd_PolyPress = 10;\nstatic const uint8_t kMIDIChanCmd_Control = 11;\nstatic const uint8_t kMIDIChanCmd_ProgramChange = 12;\nstatic const uint8_t kMIDIChanCmd_ChannelPress = 13;\nstatic const uint8_t kMIDIChanCmd_PitchWheel = 14;\n// System Commands\nstatic const uint8_t kMIDISysCmdChan = 0xF0;\nstatic const uint8_t kMIDISysCmd_SysEx = 0xF0;\nstatic const uint8_t kMIDISysCmd_EndOfSysEx = 0xF7;\nstatic const uint8_t kMIDISysCmd_ActiveSensing = 0xFE;\nstatic const uint8_t kMIDISysCmd_Reset = 0xFF;\n\n#define NATIVEMIDITESTBED_MIDISPEC_H\n#endif\n"
  },
  {
    "path": "native-midi/app/src/main/cpp/libnative_midi.map.txt",
    "content": "LIBNATIVE_MIDI {\n  global:\n    JNI_OnLoad;\n  local:\n    *;\n};\n"
  },
  {
    "path": "native-midi/app/src/main/java/com/example/nativemidi/AppMidiManager.java",
    "content": "/*\n * Copyright (C) 2019 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.example.nativemidi;\n\nimport android.media.midi.MidiDevice;\nimport android.media.midi.MidiDeviceInfo;\nimport android.media.midi.MidiManager;\nimport android.media.midi.MidiInputPort;\n\nimport java.util.ArrayList;\n\npublic class AppMidiManager {\n    private static final String TAG = AppMidiManager.class.getName();\n\n    private MidiManager mMidiManager;\n\n    // Selected Device(s)\n    private MidiDevice mReceiveDevice; // an \"Output\" device is one we will RECEIVE data FROM\n\n    private MidiDevice mSendDevice; // an \"Input\" device is one we will SEND data TO\n    private MidiInputPort mSendPort;\n\n    private boolean mUseRunningStatus = true;\n\n    public AppMidiManager(MidiManager midiManager) {\n        mMidiManager = midiManager;\n    }\n\n    public MidiManager GetMidiManager() {\n        return mMidiManager;\n    }\n\n    /**\n     * Scan attached Midi devices forcefully from scratch\n     * @param sendDevices, container for send devices\n     * @param receiveDevices, container for receive devices\n     */\n    public void ScanMidiDevices(ArrayList<MidiDeviceInfo> sendDevices,\n                                 ArrayList<MidiDeviceInfo> receiveDevices) {\n        sendDevices.clear();\n        receiveDevices.clear();\n        MidiDeviceInfo[] devInfos = mMidiManager.getDevices();\n        for(MidiDeviceInfo devInfo : devInfos) {\n            int numInPorts = devInfo.getInputPortCount();\n            String deviceName =\n                    devInfo.getProperties().getString(MidiDeviceInfo.PROPERTY_NAME);\n            if (deviceName == null) {\n                continue;\n            }\n            if (numInPorts > 0) {\n                sendDevices.add(devInfo);\n            }\n\n            int numOutPorts = devInfo.getOutputPortCount();\n            if (numOutPorts > 0) {\n                receiveDevices.add(devInfo);\n            }\n        }\n    }\n\n    //\n    // Receive Device\n    //\n    public class OpenMidiReceiveDeviceListener implements MidiManager.OnDeviceOpenedListener {\n        @Override\n        public void onDeviceOpened(MidiDevice device) {\n            mReceiveDevice = device;\n            startReadingMidi(mReceiveDevice, 0/*mPortNumber*/);\n        }\n    }\n\n    public void openReceiveDevice(MidiDeviceInfo devInfo) {\n        mMidiManager.openDevice(devInfo, new OpenMidiReceiveDeviceListener(), null);\n    }\n\n    public void closeReceiveDevice() {\n        if (mReceiveDevice != null) {\n            // Native API\n            mReceiveDevice = null;\n        }\n    }\n\n    //\n    // Send Device\n    //\n    public class OpenMidiSendDeviceListener implements MidiManager.OnDeviceOpenedListener {\n        @Override\n        public void onDeviceOpened(MidiDevice device) {\n            mSendDevice = device;\n            startWritingMidi(mSendDevice, 0/*mPortNumber*/);\n        }\n    }\n\n    public void openSendDevice(MidiDeviceInfo devInfo) {\n        mMidiManager.openDevice(devInfo, new OpenMidiSendDeviceListener(), null);\n    }\n\n    public void closeSendDevice() {\n        if (mSendDevice != null) {\n            // Native API\n            mSendDevice = null;\n        }\n    }\n\n    private void sendMessages(byte[] msgBuff) {\n        writeMidi(msgBuff, msgBuff.length);\n    }\n\n    //\n    // Message Sending methods\n    //\n    public void sendNoteOn(byte chan, byte[] keys, byte[] velocities) {\n        byte[] keyMsgBuff = MidiDataHelper.make3ByteMsgBuff(\n                MidiSpec.MIDICODE_NOTEON, chan, keys, velocities, mUseRunningStatus);\n        sendMessages(keyMsgBuff);\n    }\n\n    public void sendNoteOff(byte chan, byte[] keys, byte[] velocities) {\n        byte[] keyMsgBuff = MidiDataHelper.make3ByteMsgBuff(\n                MidiSpec.MIDICODE_NOTEOFF, chan, keys, velocities, mUseRunningStatus);\n        sendMessages(keyMsgBuff);\n    }\n\n    public void sendController(byte chan, byte controller, byte value) {\n        byte[] controllers = {controller};\n        byte[] values = {value};\n        byte[] msgBuff = MidiDataHelper.make3ByteMsgBuff(\n                MidiSpec.MIDICODE_CONTROLLER, chan, controllers, values, mUseRunningStatus);\n        sendMessages(msgBuff);\n    }\n\n    public void sendPitchBend(byte chan, int value) {\n        byte[] lsbs = {(byte)(value & 0xEF)};\n        byte[] msbs = {(byte)((value >> 7) & 0xEF)};\n        byte[] msgBuff = MidiDataHelper.make3ByteMsgBuff(\n                MidiSpec.MIDICODE_PITCHBEND, chan, lsbs, msbs, mUseRunningStatus);\n        sendMessages(msgBuff);\n    }\n\n    public void sendProgramChange(byte chan, byte value) {\n        byte[] values = {value};\n        byte[] msgBuff = MidiDataHelper.make2ByteMsgBuff(\n                MidiSpec.MIDICODE_PROGCHANGE, chan, values, mUseRunningStatus);\n        sendMessages(msgBuff);\n    }\n\n    //\n    // Native API stuff\n    //\n    public static void loadNativeAPI() {\n        System.loadLibrary(\"native_midi\");\n    }\n\n    public native void startReadingMidi(MidiDevice receiveDevice, int portNumber);\n    public native void stopReadingMidi();\n\n    public native void startWritingMidi(MidiDevice sendDevice, int portNumber);\n    public native void stopWritingMidi();\n    public native void writeMidi(byte[] data, int length);\n}\n"
  },
  {
    "path": "native-midi/app/src/main/java/com/example/nativemidi/MainActivity.java",
    "content": "/*\n * Copyright (C) 2019 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.example.nativemidi;\n\nimport android.app.Activity;\nimport android.content.Context;\n\nimport android.media.midi.MidiDeviceInfo;\nimport android.media.midi.MidiManager;\n\nimport android.os.Bundle;\n\nimport android.view.View;\n\nimport android.widget.AdapterView;\nimport android.widget.ArrayAdapter;\nimport android.widget.Button;\nimport android.widget.EditText;\nimport android.widget.SeekBar;\nimport android.widget.Spinner;\nimport android.widget.TextView;\n\nimport android.os.Handler;\n\nimport java.util.ArrayList;\n\n/**\n * Application MainActivity handles UI and Midi device hotplug event from\n * native side.\n */\npublic class MainActivity extends Activity\n    implements View.OnClickListener,\n               SeekBar.OnSeekBarChangeListener,\n               AdapterView.OnItemSelectedListener {\n\n    private static final String TAG = MainActivity.class.getName();;\n\n    private AppMidiManager mAppMidiManager;\n\n    // Connected devices\n    private ArrayList<MidiDeviceInfo> mReceiveDevices = new ArrayList<MidiDeviceInfo>();\n    private ArrayList<MidiDeviceInfo> mSendDevices = new ArrayList<MidiDeviceInfo>();\n\n    // Send Widgets\n    Spinner mOutputDevicesSpinner;\n\n    SeekBar mControllerSB;\n    SeekBar mPitchBendSB;\n\n    EditText mProgNumberEdit;\n\n    // Receive Widgets\n    Spinner mInputDevicesSpinner;\n    TextView mReceiveMessageTx;\n\n    // Force to load the native library\n    static {\n        AppMidiManager.loadNativeAPI();\n    }\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n\n        //\n        // Init JNI for data receive callback\n        //\n        initNative();\n\n        //\n        // Setup UI\n        //\n        mOutputDevicesSpinner = (Spinner)findViewById(R.id.outputDevicesSpinner);\n        mOutputDevicesSpinner.setOnItemSelectedListener(this);\n\n        ((Button)findViewById(R.id.keyDownBtn)).setOnClickListener(this);\n        ((Button)findViewById(R.id.keyUpBtn)).setOnClickListener(this);\n        ((Button)findViewById(R.id.progChangeBtn)).setOnClickListener(this);\n\n        mControllerSB = (SeekBar)findViewById(R.id.controllerSeekBar);\n        mControllerSB.setMax(MidiSpec.MAX_CC_VALUE);\n        mControllerSB.setOnSeekBarChangeListener(this);\n\n        mPitchBendSB = (SeekBar)findViewById(R.id.pitchBendSeekBar);\n        mPitchBendSB.setMax(MidiSpec.MAX_PITCHBEND_VALUE);\n        mPitchBendSB.setProgress(MidiSpec.MID_PITCHBEND_VALUE);\n        mPitchBendSB.setOnSeekBarChangeListener(this);\n\n        mInputDevicesSpinner = (Spinner)findViewById(R.id.inputDevicesSpinner);\n        mInputDevicesSpinner.setOnItemSelectedListener(this);\n\n        mProgNumberEdit = (EditText)findViewById(R.id.progNumEdit);\n\n        mReceiveMessageTx = (TextView)findViewById(R.id.receiveMessageTx);\n\n        MidiManager midiManager = (MidiManager) getSystemService(Context.MIDI_SERVICE);\n        midiManager.registerDeviceCallback(new MidiDeviceCallback(), new Handler());\n\n        //\n        // Setup the MIDI interface\n        //\n        mAppMidiManager = new AppMidiManager(midiManager);\n\n        // Initial Scan\n        ScanMidiDevices();\n    }\n\n    /**\n     * Device Scanning\n     * Methods are called by the system whenever the set of attached devices changes.\n     */\n    private class MidiDeviceCallback extends MidiManager.DeviceCallback {\n        @Override\n        public void onDeviceAdded(MidiDeviceInfo device) {\n            ScanMidiDevices();\n        }\n\n        @Override\n        public void onDeviceRemoved(MidiDeviceInfo device) {\n            ScanMidiDevices();\n        }\n    }\n\n    /**\n     * Scans and gathers the list of connected physical devices,\n     * then calls onDeviceListChange() to update the UI. This has the\n     * side-effect of causing a list item to be selected, which then\n     * invokes the listener logic which connects the device(s).\n     */\n    private void ScanMidiDevices() {\n        mAppMidiManager.ScanMidiDevices(mSendDevices, mReceiveDevices);\n        onDeviceListChange();\n    }\n\n    //\n    // UI Helpers\n    //\n    /**\n     * Formats a set of MIDI message bytes into a user-readable form.\n     * @param message   The bytes comprising a Midi message.\n     */\n    private void showReceivedMessage(byte[] message) {\n        switch ((message[0] & 0xF0) >> 4) {\n            case MidiSpec.MIDICODE_NOTEON:\n                mReceiveMessageTx.setText(\n                        \"NOTE_ON [ch:\" + (message[0] & 0x0F) +\n                                \" key:\" + message[1] +\n                                \" vel:\" + message[2] + \"]\");\n                break;\n\n            case MidiSpec.MIDICODE_NOTEOFF:\n                mReceiveMessageTx.setText(\n                        \"NOTE_OFF [ch:\" + (message[0] & 0x0F) +\n                                \" key:\" + message[1] +\n                                \" vel:\" + message[2] + \"]\");\n                break;\n\n            // Potentially handle other messages here.\n        }\n    }\n\n    //\n    // View.OnClickListener overriden methods\n    //\n    @Override\n    public void onClick(View view) {\n        byte[] keys = {60, 64, 67};         // C Major chord\n        byte[] velocities = {60, 60, 60};   // Middling velocity\n        byte channel = 0;    // send on channel 0\n        switch (view.getId()) {\n            case R.id.keyDownBtn:\n                // Simulate a key-down\n                mAppMidiManager.sendNoteOn(channel, keys, velocities) ;\n                break;\n\n            case R.id.keyUpBtn:\n                // Simulate a key-up (converse of key-down above).\n                mAppMidiManager.sendNoteOff(channel, keys, velocities) ;\n                break;\n\n            case R.id.progChangeBtn: {\n                // Send a MIDI program change message\n                try {\n                    String progNumStr = mProgNumberEdit.getText().toString();\n                    int progNum = Integer.parseInt(progNumStr);\n\n                    mAppMidiManager.sendProgramChange(channel, (byte)progNum);\n                } catch (NumberFormatException ex) {\n                    // Maybe let the user know\n                }\n            }\n                break;\n        }\n    }\n\n    //\n    // SeekBar.OnSeekBarChangeListener overriden messages\n    //\n    @Override\n    public void onProgressChanged(SeekBar seekBar, int pos, boolean fromUser) {\n        switch (seekBar.getId()) {\n        case R.id.controllerSeekBar:\n            mAppMidiManager.sendController((byte)0, MidiSpec.MIDICC_MODWHEEL, (byte)pos);\n            break;\n\n        case R.id.pitchBendSeekBar:\n            mAppMidiManager.sendPitchBend((byte)0, pos);\n            break;\n        }\n    }\n\n    @Override\n    public void onStartTrackingTouch(SeekBar seekBar) {}\n\n    @Override\n    public void onStopTrackingTouch(SeekBar seekBar) {}\n\n    //\n    // AdapterView.OnItemSelectedListener overriden methods\n    //\n    @Override\n    public void onItemSelected(AdapterView<?> spinner, View view, int position, long id) {\n        switch (spinner.getId()) {\n        case R.id.outputDevicesSpinner: {\n                MidiDeviceListItem listItem = (MidiDeviceListItem) spinner.getItemAtPosition(position);\n                mAppMidiManager.openReceiveDevice(listItem.getDeviceInfo());\n            }\n            break;\n\n        case R.id.inputDevicesSpinner: {\n                MidiDeviceListItem listItem = (MidiDeviceListItem)spinner.getItemAtPosition(position);\n                mAppMidiManager.openSendDevice(listItem.getDeviceInfo());\n            }\n            break;\n        }\n    }\n\n    @Override\n    public void onNothingSelected(AdapterView<?> adapterView) {}\n\n    /**\n     * A class to hold MidiDevices in the list controls.\n     */\n    private class MidiDeviceListItem {\n        private MidiDeviceInfo mDeviceInfo;\n\n        public MidiDeviceListItem(MidiDeviceInfo deviceInfo) {\n            mDeviceInfo = deviceInfo;\n        }\n\n        public MidiDeviceInfo getDeviceInfo() { return mDeviceInfo; }\n\n        @Override\n        public String toString() {\n            return mDeviceInfo.getProperties().getString(MidiDeviceInfo.PROPERTY_NAME);\n        }\n    }\n\n    /**\n     * Fills the specified list control with a set of MidiDevices\n     * @param spinner   The list control.\n     * @param devices   The set of MidiDevices.\n     */\n    private void fillDeviceList(Spinner spinner, ArrayList<MidiDeviceInfo> devices) {\n        ArrayList<MidiDeviceListItem> listItems = new ArrayList<MidiDeviceListItem>();\n        for(MidiDeviceInfo devInfo : devices) {\n            listItems.add(new MidiDeviceListItem(devInfo));\n        }\n\n        // Creating adapter for spinner\n        ArrayAdapter<MidiDeviceListItem> dataAdapter =\n                new  ArrayAdapter<MidiDeviceListItem>(this,\n                        android.R.layout.simple_spinner_item,\n                        listItems);\n        // Drop down layout style - list view with radio button\n        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);\n\n        // attaching data adapter to spinner\n        spinner.setAdapter(dataAdapter);\n    }\n\n    /**\n     * Fills the Input & Output UI device list with the current set of MidiDevices for each type.\n     */\n    private void onDeviceListChange() {\n        fillDeviceList(mOutputDevicesSpinner, mReceiveDevices);\n        fillDeviceList(mInputDevicesSpinner, mSendDevices);\n    }\n\n    //\n    // Native Interface methods\n    //\n    private native void initNative();\n\n    /**\n     * Called from the native code when MIDI messages are received.\n     * @param message\n     */\n    private void onNativeMessageReceive(final byte[] message) {\n        // Messages are received on some other thread, so switch to the UI thread\n        // before attempting to access the UI\n        runOnUiThread(new Runnable() {\n            public void run() {\n                showReceivedMessage(message);\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "native-midi/app/src/main/java/com/example/nativemidi/MidiDataHelper.java",
    "content": "/*\n * Copyright (C) 2019 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\n// package com.nativemidiapp;\npackage com.example.nativemidi;\n\nclass MidiDataHelper {\n    /**\n     * Create a MIDI data stream, containing a set of 3-value messages (potentially using\n     * Running Status) each of the specific message-code/channel with associated 2-byte parameter\n     * pairs.\n     * For example, a set of 3, simultaneous key-down messages (a \"C major\" chord for example) can\n     * be formated with a call:\n     *    make3ByteMsgBuff(MIDICODE_KEYUP, 0, {60, 64, 67}, {60, 60, 60});\n     * Note that each of the key codes in the param_a has a corresponding velocity value in param_b.\n     *\n     * @param msgID The MIDI message ID.\n     * @param channel   The MIDI channel number for the message(s).\n     * @param param_a   The 1st parameter bytes.\n     * @param param_b   The 2nd parameter bytes.\n     * @param useRunningStatus  If true, specifies that message streams should use running-status.\n     * @return The MIDI data stream.\n     */\n    static byte[] make3ByteMsgBuff(\n            byte msgID, byte channel, byte[] param_a, byte[] param_b, boolean useRunningStatus) {\n        assert param_a.length == param_b.length;\n\n        int numMsgs = param_a.length;\n\n        byte[] msgBuff;\n        if (useRunningStatus) {\n            msgBuff = new byte[1 + (numMsgs * 2)];\n            int byteOffset = 0;\n            msgBuff[byteOffset++] =\n                    MidiSpec.makeChanMessageCode(msgID, channel);\n            for(int index = 0; index < numMsgs; index++) {\n                msgBuff[byteOffset++] = param_a[index];\n                msgBuff[byteOffset++] = param_b[index];\n            }\n        } else {\n            msgBuff = new byte[numMsgs * 3];\n            int byteOffset = 0;\n            for(int index = 0; index < numMsgs; index++) {\n                msgBuff[byteOffset++] =\n                        MidiSpec.makeChanMessageCode(msgID, channel);\n                msgBuff[byteOffset++] = param_a[index];\n                msgBuff[byteOffset++] = param_b[index];\n            }\n        }\n        return msgBuff;\n    }\n\n    /**\n     * Create a MIDI data stream, containing a set of 2-value messages (potentially using\n     * Running Status) each of the specific message-code/channel with associated 1-byte parameter\n     * pairs.\n     *\n     * @param msgID The MIDI message ID.\n     * @param channel   The MIDI channel number for the message(s).\n     * @param param_a   The parameter bytes.\n     * @param useRunningStatus  If true, specifies that message streams should use running-status.\n     * @return The MIDI data stream.\n     */\n    static byte[] make2ByteMsgBuff(\n            byte msgID, byte channel, byte[] param_a, boolean useRunningStatus) {\n        int numMsgs = param_a.length;\n\n        byte[] msgBuff;\n        if (useRunningStatus) {\n            msgBuff = new byte[1 + numMsgs];\n            int byteOffset = 0;\n            msgBuff[byteOffset++] =\n                    MidiSpec.makeChanMessageCode(msgID, channel);\n            for(int index = 0; index < numMsgs; index++) {\n                msgBuff[byteOffset++] = param_a[index];\n            }\n        } else {\n            msgBuff = new byte[numMsgs * 2];\n            int byteOffset = 0;\n            for(int index = 0; index < numMsgs; index++) {\n                msgBuff[byteOffset++] =\n                        MidiSpec.makeChanMessageCode(msgID, channel);\n                msgBuff[byteOffset++] = param_a[index];\n            }\n        }\n        return msgBuff;\n    }\n}"
  },
  {
    "path": "native-midi/app/src/main/java/com/example/nativemidi/MidiSpec.java",
    "content": "/*\n * Copyright (C) 2019 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\npackage com.example.nativemidi;\n\npublic class MidiSpec {\n    // Message Codes\n    public static final byte MIDICODE_NOTEOFF       = 0x08;\n    public static final byte MIDICODE_NOTEON        = 0x09;\n    public static final byte MIDICODE_POLYPRESS     = 0x0A;\n    public static final byte MIDICODE_CONTROLLER    = 0x0B;\n    public static final byte MIDICODE_PROGCHANGE    = 0x0C;\n    public static final byte MIDICODE_CHANPRESS     = 0x0D;\n    public static final byte MIDICODE_PITCHBEND     = 0x0E;\n\n    // System Commands\n    public static final byte MIDICODE_SYSEX         = (byte)0xF0;\n    public static final byte MIDICODE_ENDOFSYSEX    = (byte)0xF7;\n    public static final byte MIDICODE_ACTIVESENSING = (byte)0xFE;\n    public static final byte MIDICODE_RESET         = (byte)0xFF;\n\n    // Continuous Controllers\n    public static final byte MAX_CC_VALUE = 127;\n    public static final byte MIDICC_MODWHEEL = 1;\n\n    public static final int MAX_PITCHBEND_VALUE = 0x3FFF;\n    public static final int MID_PITCHBEND_VALUE = 0x2000;\n\n    public static byte makeChanMessageCode(byte msg, byte chan) {\n        return (byte)((msg << 4) | chan);\n    }\n}\n"
  },
  {
    "path": "native-midi/app/src/main/res/drawable/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path\n        android:fillColor=\"#008577\"\n        android:pathData=\"M0,0h108v108h-108z\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M9,0L9,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,0L19,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,0L29,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,0L39,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,0L49,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,0L59,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,0L69,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,0L79,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M89,0L89,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M99,0L99,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,9L108,9\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,19L108,19\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,29L108,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,39L108,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,49L108,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,59L108,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,69L108,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,79L108,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,89L108,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,99L108,99\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,29L89,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,39L89,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,49L89,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,59L89,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,69L89,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,79L89,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,19L29,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,19L39,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,19L49,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,19L59,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,19L69,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,19L79,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n</vector>\n"
  },
  {
    "path": "native-midi/app/src/main/res/drawable-v24/ic_launcher_foreground.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z\"\n        android:strokeWidth=\"1\"\n        android:strokeColor=\"#00000000\">\n        <aapt:attr name=\"android:fillColor\">\n            <gradient\n                android:endX=\"78.5885\"\n                android:endY=\"90.9159\"\n                android:startX=\"48.7653\"\n                android:startY=\"61.0927\"\n                android:type=\"linear\">\n                <item\n                    android:color=\"#44000000\"\n                    android:offset=\"0.0\" />\n                <item\n                    android:color=\"#00000000\"\n                    android:offset=\"1.0\" />\n            </gradient>\n        </aapt:attr>\n    </path>\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:fillType=\"nonZero\"\n        android:pathData=\"M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z\"\n        android:strokeWidth=\"1\"\n        android:strokeColor=\"#00000000\" />\n</vector>\n"
  },
  {
    "path": "native-midi/app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/activity_main\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:paddingBottom=\"@dimen/activity_vertical_margin\"\n    android:paddingLeft=\"@dimen/activity_horizontal_margin\"\n    android:paddingRight=\"@dimen/activity_horizontal_margin\"\n    android:paddingTop=\"@dimen/activity_vertical_margin\"\n    tools:context=\"cts.android.com.nativemidisendapp.MainActivity\">\n\n    <LinearLayout\n        android:orientation=\"vertical\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_alignParentStart=\"true\">\n\n        <TextView\n            android:text=\"Send\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:textSize=\"30sp\"/>\n\n        <Spinner\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:id=\"@+id/outputDevicesSpinner\"/>\n\n        <TextView\n            android:text=\"Note Messages\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:paddingTop=\"16dp\"/>\n\n        <LinearLayout\n            android:orientation=\"horizontal\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n\n            <Button\n                android:text=\"Note On\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:id=\"@+id/keyDownBtn\"\n                android:layout_weight=\"1\"/>\n\n            <Button\n                android:text=\"Note Off\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:id=\"@+id/keyUpBtn\"\n                android:layout_weight=\"1\"/>\n        </LinearLayout>\n\n        <TextView\n            android:text=\"Mod Wheel\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:paddingTop=\"16dp\"/>\n\n        <SeekBar\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:id=\"@+id/controllerSeekBar\"/>\n\n        <TextView\n            android:text=\"Pitch Bend\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:paddingTop=\"16dp\"/>\n\n        <SeekBar\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:id=\"@+id/pitchBendSeekBar\"/>\n\n        <LinearLayout\n            android:orientation=\"horizontal\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n\n            <Button\n                android:text=\"Program Change\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:id=\"@+id/progChangeBtn\"/>\n\n            <EditText\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:id=\"@+id/progNumEdit\"\n                android:layout_weight=\"1\"/>\n        </LinearLayout>\n\n        <TextView\n            android:text=\"Receive\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:textSize=\"30sp\"\n            android:paddingTop=\"16dp\"/>\n\n        <Spinner\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:id=\"@+id/inputDevicesSpinner\"/>\n\n        <TextView\n            android:text=\"Messages\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:paddingTop=\"16dp\"/>\n\n        <TextView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:id=\"@+id/receiveMessageTx\"/>\n\n    </LinearLayout>\n\n</RelativeLayout>\n"
  },
  {
    "path": "native-midi/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\" />\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "native-midi/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\" />\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "native-midi/app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#008577</color>\n    <color name=\"colorPrimaryDark\">#00574B</color>\n    <color name=\"colorAccent\">#D81B60</color>\n</resources>\n"
  },
  {
    "path": "native-midi/app/src/main/res/values/dimens.xml",
    "content": "<resources>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"activity_horizontal_margin\">16dp</dimen>\n    <dimen name=\"activity_vertical_margin\">16dp</dimen>\n</resources>\n"
  },
  {
    "path": "native-midi/app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">native midi</string>\n</resources>\n"
  },
  {
    "path": "native-midi/app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.DarkActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "native-midi/app/src/main/res/values-w820dp/dimens.xml",
    "content": "<resources>\n    <!-- Example customization of dimensions originally defined in res/values/dimens.xml\n         (such as screen margins) for screens with more than 820dp of available width. This\n         would include 7\" and 10\" devices in landscape (~960dp and ~1280dp respectively). -->\n    <dimen name=\"activity_horizontal_margin\">64dp</dimen>\n</resources>\n"
  },
  {
    "path": "nn-samples/README.md",
    "content": "# Sample removed\n\nThis sample has been removed because the Android Neural Networks API has been\ndeprecated. Apps should instead use TensorFlow Lite. For for information, see\nthe [NNAPI Migration Guide].\n\n[NNAPI Migration Guide]: https://developer.android.com/ndk/guides/neuralnetworks/migration-guide\n"
  },
  {
    "path": "orderfile/README.md",
    "content": "# Order file demo\n\nOrder files are text files containing symbols representing functions names.\nLinkers (lld) uses order files to layout functions in a specific order. These\nbinaries with ordered symbols will reduce page faults and improve a program's\nlaunch time due to the efficient loading of symbols during a program’s\ncold-start.\n\n## Files\n\n- app/src/main/cpp/orderfile.cpp: The source code for the orderfile library that\n  is used by the Kotlin app.\n- app/src/main/cpp/CMakeLists.txt: The CMakeLists either sets the orderfile\n  library as generating profiles or loading the orderfile.\n- app/src/main/java/MainActivity.kt: The Kotlin app source code.\n\n## Profile Steps\n\n1. For simplicity, we have setup the `CMakeLists.txt` and you just need make\n   sure `set(GENERATE_PROFILES ON)` is not commented. You need to pass any\n   optimization flag except `-O0`. The mapping file is not generated and the\n   profile instrumentation does not work without an optimization flag.\n2. Run the app on Android Studio. You can either run it on a physical or virtual\n   device. You will see \"Hello World\" on the screen.\n3. To pull the data from the device, you'll need to move it from an app-writable\n   directory to a shell readable directory for adb pull.\n4. Use `llvm-profdata` to merge all the raw files and create an orderfile.\n\n```\nadb shell \"run-as com.example.orderfiledemo sh -c 'cat /data/user/0/com.example.orderfiledemo/cache/demo.profraw' | cat > /data/local/tmp/demo.profraw\"\nadb pull /data/local/tmp/demo.profraw .\n<NDK_PATH>/toolchains/llvm/prebuilt/<ARCH>/bin/llvm-profdata merge demo.profraw -o demo.profdata \n<NDK_PATH>/toolchains/llvm/prebuilt/<ARCH>/bin/llvm-profdata order demo.profdata -o demo.orderfile\n```\n\n## Load Steps\n\n1. For load, you need to uncomment\n   `set(USE_PROFILE \"${CMAKE_SOURCE_DIR}/demo.orderfile\")` and make sure\n   `set(GENERATE_PROFILES ON)` is commented.\n\n2. If you want to validate the shared library's layout is different, you need to\n   find `liborderfiledemo.so` and run `nm`\n\n```\nmv demo.orderfile app/src/main/cpp\nnm -n liborderfiledemo.so\n```\n\n## Difference between Java and Kotlin App\n\nThe main difference between a Java app and a Kotlin app is the syntax. You can\neasily change this Kotlin example into a Java example.\n\n- Load Library\n\n```\n# Kotlin\ncompanion object {\n    init {\n        System.loadLibrary(\"orderfiledemo\")\n    }\n}\n\n# Java\nstatic {\n    System.loadLibrary(\"orderfiledemo\");\n}\n```\n\n- Recognize an external method\n\n```\n# Kotlin\nexternal fun runWorkload(tempDir: String)\n\n# Java\nprivate native void runWorkload(String tempDir);\n```\n\n- Get the cache directory\n\n```agsl\n# Kotlin\nrunWorkload(applicationContext.cacheDir.toString())\n\n# Java\nrunWorkload(getcacheDir().toString())\n```\n"
  },
  {
    "path": "orderfile/app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "orderfile/app/build.gradle",
    "content": "plugins {\n    id \"ndksamples.android.application\"\n    id 'ndksamples.android.kotlin'\n}\n\nandroid {\n    namespace 'com.example.orderfiledemo'\n\n    defaultConfig {\n        applicationId \"com.example.orderfiledemo\"\n        versionCode 1\n        versionName \"1.0\"\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        externalNativeBuild {\n            cmake {\n                cppFlags ''\n            }\n        }\n    }\n\n    externalNativeBuild {\n        cmake {\n            path file('src/main/cpp/CMakeLists.txt')\n        }\n    }\n\n    buildFeatures {\n        prefab true\n        viewBinding true\n    }\n}\n\ndependencies {\n    implementation project(\":base\")\n    implementation libs.appcompat\n    implementation libs.material\n    implementation libs.androidx.constraintlayout\n}\n"
  },
  {
    "path": "orderfile/app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile\n"
  },
  {
    "path": "orderfile/app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <application\n        android:allowBackup=\"true\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:roundIcon=\"@mipmap/ic_launcher_round\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/Theme.OrderfileDemo\">\n        <activity\n            android:name=\".MainActivity\"\n            android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "orderfile/app/src/main/cpp/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.22.1)\nproject(OrderfileDemo CXX)\n\ninclude(AppLibrary)\nfind_package(base CONFIG REQUIRED)\n\n# We have setup build variables that you can just comment or uncomment to use.\n# Make sure to have only one build variable uncommented at a time.\n# If you want to generate profiles and mapping file, make sure GENERATE_PROFILES is uncommented.\n# If you want to use your generated order file to layout symbols, uncomment USE_PROFILE.\n\n\nset(GENERATE_PROFILES ON)\n#set(USE_PROFILE \"${CMAKE_SOURCE_DIR}/demo.orderfile\")\n\nadd_app_library(orderfiledemo SHARED orderfile.cpp)\ntarget_link_libraries(orderfiledemo PRIVATE base::base log)\n\nif(GENERATE_PROFILES)\n    # Generating profiles requires any optimization flag aside from -O0.\n    target_compile_options(orderfiledemo PRIVATE -fprofile-generate -ftemporal-profile -O1)\n    target_link_options(orderfiledemo PRIVATE -fprofile-generate -ftemporal-profile)\n    target_compile_definitions(orderfiledemo PRIVATE GENERATE_PROFILES)\nelseif(USE_PROFILE)\n    target_compile_options(orderfiledemo PRIVATE)\n    target_link_options(orderfiledemo PRIVATE -Wl,--symbol-ordering-file=${USE_PROFILE} -Wl,--no-warn-symbol-ordering)\nendif()\n"
  },
  {
    "path": "orderfile/app/src/main/cpp/demo.orderfile",
    "content": "# Ordered 4 functions\nJNI_OnLoad\n_Z11RunWorkloadP7_JNIEnvP8_jobjectP8_jstring\n_Z23DumpProfileDataIfNeededPKc\n_ZL8snprintfPcU17pass_object_size1mPKcz\n"
  },
  {
    "path": "orderfile/app/src/main/cpp/liborderfiledemo.map.txt",
    "content": "LIBORDERFILEDEMO {\n  global:\n    JNI_OnLoad;\n  local:\n    *;\n};\n"
  },
  {
    "path": "orderfile/app/src/main/cpp/orderfile.cpp",
    "content": "#include <android/log.h>\n#include <base/macros.h>\n#include <errno.h>\n#include <jni.h>\n#include <linux/limits.h>\n#include <stdlib.h>\n#include <string.h>\n\nconst char kLogTag[] = \"orderfiledemo\";\n\n#ifdef GENERATE_PROFILES\nextern \"C\" int __llvm_profile_set_filename(const char*);\nextern \"C\" int __llvm_profile_initialize_file(void);\nextern \"C\" int __llvm_profile_dump(void);\n#endif\n\nvoid DumpProfileDataIfNeeded(const char* temp_dir) {\n#ifdef GENERATE_PROFILES\n  char profile_location[PATH_MAX] = {};\n  snprintf(profile_location, sizeof(profile_location), \"%s/demo.profraw\",\n           temp_dir);\n  if (__llvm_profile_set_filename(profile_location) == -1) {\n    __android_log_print(ANDROID_LOG_ERROR, kLogTag,\n                        \"__llvm_profile_set_filename(\\\"%s\\\") failed: %s\",\n                        profile_location, strerror(errno));\n    return;\n  }\n\n  if (__llvm_profile_initialize_file() == -1) {\n    __android_log_print(ANDROID_LOG_ERROR, kLogTag,\n                        \"__llvm_profile_initialize_file failed: %s\",\n                        strerror(errno));\n    return;\n  }\n\n  if (__llvm_profile_dump() == -1) {\n    __android_log_print(ANDROID_LOG_ERROR, kLogTag,\n                        \"__llvm_profile_dump() failed: %s\", strerror(errno));\n    return;\n  }\n  __android_log_print(ANDROID_LOG_DEBUG, kLogTag, \"Wrote profile data to %s\",\n                      profile_location);\n#else\n  (void)temp_dir; // To avoid unused-parameter warning\n  __android_log_print(ANDROID_LOG_DEBUG, kLogTag,\n                      \"Did not write profile data because the app was not \"\n                      \"built for profile generation\");\n#endif\n}\n\nvoid RunWorkload(JNIEnv* env, jobject /* this */, jstring temp_dir) {\n  DumpProfileDataIfNeeded(env->GetStringUTFChars(temp_dir, 0));\n}\n\nextern \"C\" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* _Nonnull vm,\n                                             void* _Nullable) {\n  JNIEnv* env;\n  if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {\n    return JNI_ERR;\n  }\n\n  jclass c = env->FindClass(\"com/example/orderfiledemo/MainActivity\");\n  if (c == nullptr) return JNI_ERR;\n\n  static const JNINativeMethod methods[] = {\n      {\"runWorkload\", \"(Ljava/lang/String;)V\",\n       reinterpret_cast<void*>(RunWorkload)},\n  };\n  int rc = env->RegisterNatives(c, methods, arraysize(methods));\n  if (rc != JNI_OK) return rc;\n\n  return JNI_VERSION_1_6;\n}\n"
  },
  {
    "path": "orderfile/app/src/main/java/com/example/orderfiledemo/MainActivity.kt",
    "content": "package com.example.orderfiledemo \n\nimport androidx.appcompat.app.AppCompatActivity\nimport android.os.Bundle\nimport com.example.orderfiledemo .databinding.ActivityMainBinding\n\nclass MainActivity : AppCompatActivity() {\n\n    private lateinit var binding: ActivityMainBinding\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        binding = ActivityMainBinding.inflate(layoutInflater)\n        setContentView(binding.root)\n        runWorkload(applicationContext.cacheDir.toString())\n        binding.sampleText.text = \"Hello, world!\"\n    }\n\n    /**\n     * A native method that is implemented by the 'orderfiledemo' native library,\n     * which is packaged with this application.\n     */\n    external fun runWorkload(tempDir: String)\n\n    companion object {\n        // Used to load the 'orderfiledemo' library on application startup.\n        init {\n            System.loadLibrary(\"orderfiledemo\")\n        }\n    }\n}\n"
  },
  {
    "path": "orderfile/app/src/main/res/drawable/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path\n        android:fillColor=\"#3DDC84\"\n        android:pathData=\"M0,0h108v108h-108z\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M9,0L9,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,0L19,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,0L29,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,0L39,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,0L49,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,0L59,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,0L69,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,0L79,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M89,0L89,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M99,0L99,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,9L108,9\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,19L108,19\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,29L108,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,39L108,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,49L108,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,59L108,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,69L108,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,79L108,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,89L108,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,99L108,99\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,29L89,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,39L89,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,49L89,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,59L89,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,69L89,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,79L89,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,19L29,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,19L39,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,19L49,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,19L59,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,19L69,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,19L79,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n</vector>\n"
  },
  {
    "path": "orderfile/app/src/main/res/drawable-v24/ic_launcher_foreground.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path android:pathData=\"M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z\">\n        <aapt:attr name=\"android:fillColor\">\n            <gradient\n                android:endX=\"85.84757\"\n                android:endY=\"92.4963\"\n                android:startX=\"42.9492\"\n                android:startY=\"49.59793\"\n                android:type=\"linear\">\n                <item\n                    android:color=\"#44000000\"\n                    android:offset=\"0.0\" />\n                <item\n                    android:color=\"#00000000\"\n                    android:offset=\"1.0\" />\n            </gradient>\n        </aapt:attr>\n    </path>\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:fillType=\"nonZero\"\n        android:pathData=\"M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z\"\n        android:strokeWidth=\"1\"\n        android:strokeColor=\"#00000000\" />\n</vector>\n"
  },
  {
    "path": "orderfile/app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".MainActivity\">\n\n    <TextView\n        android:id=\"@+id/sample_text\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"Hello World!\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintLeft_toLeftOf=\"parent\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "orderfile/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\t<background android:drawable=\"@drawable/ic_launcher_background\" />\n\t<foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>\n"
  },
  {
    "path": "orderfile/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\t<background android:drawable=\"@drawable/ic_launcher_background\" />\n\t<foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>\n"
  },
  {
    "path": "orderfile/app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<color name=\"purple_200\">\n\t\t#FFBB86FC\n\t</color>\n\t<color name=\"purple_500\">\n\t\t#FF6200EE\n\t</color>\n\t<color name=\"purple_700\">\n\t\t#FF3700B3\n\t</color>\n\t<color name=\"teal_200\">\n\t\t#FF03DAC5\n\t</color>\n\t<color name=\"teal_700\">\n\t\t#FF018786\n\t</color>\n\t<color name=\"black\">\n\t\t#FF000000\n\t</color>\n\t<color name=\"white\">\n\t\t#FFFFFFFF\n\t</color>\n</resources>\n"
  },
  {
    "path": "orderfile/app/src/main/res/values/strings.xml",
    "content": "<resources>\n\t<string name=\"app_name\">\n\t\tOrderfile Demo\n\t</string>\n</resources>\n"
  },
  {
    "path": "orderfile/app/src/main/res/values/themes.xml",
    "content": "<resources xmlns:tools=\"http://schemas.android.com/tools\">\n\t<!-- Base application theme. -->\n\t<style name=\"Theme.OrderfileDemo\" parent=\"Theme.MaterialComponents.DayNight.DarkActionBar\">\n\t\t<!-- Primary brand color. -->\n\t\t<item name=\"colorPrimary\">\n\t\t\t@color/purple_500\n\t\t</item>\n\t\t<item name=\"colorPrimaryVariant\">\n\t\t\t@color/purple_700\n\t\t</item>\n\t\t<item name=\"colorOnPrimary\">\n\t\t\t@color/white\n\t\t</item>\n\t\t<!-- Secondary brand color. -->\n\t\t<item name=\"colorSecondary\">\n\t\t\t@color/teal_200\n\t\t</item>\n\t\t<item name=\"colorSecondaryVariant\">\n\t\t\t@color/teal_700\n\t\t</item>\n\t\t<item name=\"colorOnSecondary\">\n\t\t\t@color/black\n\t\t</item>\n\t\t<!-- Status bar color. -->\n\t\t<item name=\"android:statusBarColor\" tools:targetApi=\"l\">\n\t\t\t?attr/colorPrimaryVariant\n\t\t</item>\n\t\t<!-- Customize your theme here. -->\n\t</style>\n</resources>\n"
  },
  {
    "path": "orderfile/app/src/main/res/values-night/themes.xml",
    "content": "<resources xmlns:tools=\"http://schemas.android.com/tools\">\n    <!-- Base application theme. -->\n    <style name=\"Theme.OrderfileDemo\" parent=\"Theme.MaterialComponents.DayNight.DarkActionBar\">\n        <!-- Primary brand color. -->\n        <item name=\"colorPrimary\">@color/purple_200</item>\n        <item name=\"colorPrimaryVariant\">@color/purple_700</item>\n        <item name=\"colorOnPrimary\">@color/black</item>\n        <!-- Secondary brand color. -->\n        <item name=\"colorSecondary\">@color/teal_200</item>\n        <item name=\"colorSecondaryVariant\">@color/teal_200</item>\n        <item name=\"colorOnSecondary\">@color/black</item>\n        <!-- Status bar color. -->\n        <item name=\"android:statusBarColor\" tools:targetApi=\"l\">?attr/colorPrimaryVariant</item>\n        <!-- Customize your theme here. -->\n    </style>\n</resources>\n"
  },
  {
    "path": "prefab/README.md",
    "content": "# Sample removed\n\nThe samples that used to reside in this directory have been removed. The\nbehaviors demonstrated here (publication and consumption of AARs with native\nAPIs) are now used throughout the samples for code sharing, and were Android\nGradle Plugin features rather than NDK features.\n\nFor an example of how to create an AAR that exposes a native library, see the\n`base` module, or any other with `buildFeatures { prefabPublishing = true }`.\n\nFor examples of how to consume native APIs from an AAR, see any of the other\nsamples which set `buildFeatures { prefab = true }`.\n\nSee https://developer.android.com/build/native-dependencies for the Android\nGradle Plugin's documentation of these features.\n"
  },
  {
    "path": "san-angeles/README.md",
    "content": "# Sample removed\n\nThis sample was removed because it did not demonstrate any Android NDK features\nnot already shown by other samples.\n"
  },
  {
    "path": "sanitizers/.gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n/.idea/caches\n/.idea/libraries\n/.idea/modules.xml\n/.idea/workspace.xml\n/.idea/navEditor.xml\n/.idea/assetWizardSettings.xml\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n.cxx\nlocal.properties\n"
  },
  {
    "path": "sanitizers/README.md",
    "content": "# Sanitizers\n\nThis Android sample shows how to use sanitizers to detect problems in your\nnative code, such as memory errors and undefined behavior.\n\n## Build variants\n\nUsing a sanitizer requires building your app differently. Your native code must\nbe compiled differently, and you may need to include a runtime library and a\nwrapper script.\n\nTo accomplish this, we use a different build variant for each sanitizer. You may\nwish to review the\n[documentation](https://developer.android.com/studio/build/build-variants) and\n[codelab](https://developer.android.com/codelabs/build-variants) for build\nvariants.\n\nThe runtime libraries and wrapper script are included with the NDK distribution,\nbut it hasn't been well-documented how to use them. By using some tricks in\n[CMakeLists.txt](app/src/main/cpp/CMakeLists.txt), we can automatically grab\nwhat we need from the NDK and make it available to the build.\n\n## Hardware-assisted Address Sanitizer (hwasan)\n\nThe recommended way to detect memory errors such as use-after-free in native\ncode is with hwasan. It uses special hardware features on 64-bit ARM devices. It\nis preferable to asan (below) because it has much less RAM overhead, and is\nactively supported.\n\nFor more information, including how to flash a build of Android that supports\nhwasan, refer to the Android developer\n[guide](https://developer.android.com/ndk/guides/hwasan) and the\n[clang documentation](https://clang.llvm.org/docs/HardwareAssistedAddressSanitizerDesign.html).\n\n[native-lib.cpp](app/src/main/cpp/native-lib.cpp) contains a simple\nuse-after-free error:\n\n```C++\nint* foo = new int;\n*foo = 3;\ndelete foo;\n*foo = 4;\n```\n\nWhen you build and run the hwasan build variant, the sample app should\nimmediately crash, and the\n[logcat panel](https://developer.android.com/studio/debug/logcat) in Android\nStudio should contain information about the problem:\n\n![hwasan](hwasan.png)\n\n## Address Sanitizer (asan)\n\nIf you want to test on a 32-bit device, or prefer not to flash a custom build,\nyou can use the asan build variant instead. As described in the\n[developer guide](https://developer.android.com/ndk/guides/asan), this requires\na runtime library and wrapper script, which this sample copies automatically\nfrom the NDK distribution.\n\nAs with hwasan, the sample app should immediately crash, and you can look at the\nlogcat panel for information about the problem:\n\n![asan](asan.png)\n\n## Undefined Behavior Sanitizer (ubsan)\n\nThe undefined behavior sanitizer detects undefined behavior in your native code.\nFor more information on the types of problems it can detect, refer to the\n[clang documentation](https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html).\nIt requires a runtime library, which the sample app copies automatically from\nthe NDK distribution.\n\n[native-lib.cpp](app/src/main/cpp/native-lib.cpp) contains a signed integer\noverflow error, which is undefined behavior:\n\n```C++\nint k = 0x7fffffff;\nk += 1;\n```\n\nThis triggers a crash when you build and run the ubsan variant, and the logcat\npanel tells you what's going on:\n\n![ubsan](ubsan.png)\n"
  },
  {
    "path": "sanitizers/app/.gitignore",
    "content": "/build\n\n# These are installed by the cmake build.\nlibclang_rt.*.so\n"
  },
  {
    "path": "sanitizers/app/build.gradle",
    "content": "plugins {\n    id \"ndksamples.android.application\"\n    id \"ndksamples.android.kotlin\"\n}\n\nandroid {\n    namespace 'com.example.sanitizers'\n\n    defaultConfig {\n        applicationId \"com.example.sanitizers\"\n        // If you raise minSdk to 23 or higher, make sure you've read the note\n        // below about useLegacyPackaging.\n        //\n        // Note that the hwasan build type will override this. See the\n        // androidComponents stanza below.\n        minSdk 21\n        versionCode 1\n        versionName \"1.0\"\n\n        // The sanitizers aren't all mutually compatible, so this sample is\n        // split into a buildType per sanitizer below. For most of those\n        // sanitizers, we support every ABI. The HWASan buildType is the\n        // exception, where we want to enable only arm64-v8a.\n        //\n        // Unfortunately, the convention plugin enables every ABI using\n        // defaultConfig.ndk.abiFilters, which apparently overrides anything we\n        // do in buildTypes. To be able to control which ABIs get built here\n        // using buildTypes, we have to undo the work done by the convention\n        // plugin by clearing the defaultConfig abiFilters. Instead, we enable\n        // all the ABIs in the debug and release buildTypes below, inherit from\n        // those for most of the sanitizers, but then again reset the list for\n        // HWASan to enable only arm64-v8a.\n        //\n        // We could instead change the convention plugin to use buildType\n        // instead, but then all the samples that need to disable rv64 would\n        // have to do it twice (once for release and once for debug). Since the\n        // sanitizers sample is the only one that needs this behavior, I'd\n        // rather keep the mess here rather than spread it around.\n        ndk {\n            abiFilters.clear()\n        }\n    }\n\n    buildTypes {\n        // Now that the defaultConfig abiFilters have been cleared, the\n        // buildType abiFilters will actually have an effect. Enable all ABIs,\n        // since that's what we want for most of the sanitizers.\n        debug {\n            ndk {\n                abiFilters(\n                    \"arm64-v8a\",\n                    \"armeabi-v7a\",\n                    \"riscv64\",\n                    \"x86\",\n                    \"x86_64\",\n                )\n            }\n\n            // Allows buildTypes which inherit from debug to match dependencies\n            // with the debug buildType.\n            matchingFallbacks = [\"debug\"]\n        }\n\n        release {\n            ndk {\n                abiFilters(\n                    \"arm64-v8a\",\n                    \"armeabi-v7a\",\n                    \"riscv64\",\n                    \"x86\",\n                    \"x86_64\",\n                )\n            }\n        }\n\n        // HWASan for devices starting from Android 14. Does no longer require a special system image.\n        // See https://developer.android.com/ndk/guides/hwasan.\n        hwasan {\n            initWith debug\n            debuggable true\n            packagingOptions {\n                jniLibs {\n                    // Needed for wrap.sh.\n                    useLegacyPackaging = true\n                }\n            }\n            externalNativeBuild {\n                cmake {\n                    arguments \"-DANDROID_STL=c++_shared\", \"-DSANITIZE=hwasan\"\n                }\n            }\n            ndk {\n                // The defaultConfig's abiFilters were cleared above, but then\n                // we also populated the debug buildType's abiFilters with all\n                // ABIs, which the hwasan buildType inherits. We only want\n                // arm64-v8a here.\n                abiFilters.clear()\n                abiFilters \"arm64-v8a\"\n            }\n        }\n        asan {\n            initWith debug\n            debuggable true\n            packagingOptions {\n                jniLibs {\n                    // Without legacy packaging, the Android package manager\n                    // will not extract the libraries from the APK, and the app\n                    // will instead load them directly from the APK. That saves\n                    // space on disk so is generally preferable, but ASan\n                    // doesn't work in that configuration, so we need to\n                    // opt-out of the new behavior.\n                    //\n                    // Note that this won't actually do anything to the sample\n                    // in its default configuration. The sample uses minSdk 21,\n                    // and legacy packaging is the default for all builds below\n                    // minSdk 23.\n                    useLegacyPackaging true\n                }\n            }\n            externalNativeBuild {\n                cmake {\n                    arguments \"-DANDROID_ARM_MODE=arm\", \"-DANDROID_STL=c++_shared\", \"-DSANITIZE=asan\"\n                }\n            }\n        }\n        ubsan {\n            initWith debug\n            externalNativeBuild {\n                cmake {\n                    arguments \"-DSANITIZE=ubsan\"\n                }\n            }\n        }\n    }\n\n    externalNativeBuild {\n        cmake {\n            path file('src/main/cpp/CMakeLists.txt')\n        }\n    }\n\n    buildFeatures {\n        prefab true\n        viewBinding true\n    }\n\n    androidComponents {\n        beforeVariants(selector().withBuildType(\"hwasan\")) { variantBuilder ->\n            variantBuilder.minSdk = 34\n        }\n    }\n}\n\ndependencies {\n    implementation project(\":base\")\n    implementation libs.appcompat\n    implementation libs.material\n    implementation libs.androidx.constraintlayout\n}\n"
  },
  {
    "path": "sanitizers/app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "sanitizers/app/src/asan/resources/.gitignore",
    "content": "# These are installed by the cmake build.\nwrap.sh\n"
  },
  {
    "path": "sanitizers/app/src/hwasan/resources/lib/arm64-v8a/wrap.sh",
    "content": "#!/system/bin/sh\nLD_HWASAN=1 exec \"$@\"\n"
  },
  {
    "path": "sanitizers/app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <application\n        android:allowBackup=\"true\"\n        android:dataExtractionRules=\"@xml/data_extraction_rules\"\n        android:fullBackupContent=\"@xml/backup_rules\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:roundIcon=\"@mipmap/ic_launcher_round\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/Theme.Sanitizers\"\n        tools:targetApi=\"31\">\n        <activity\n            android:name=\".MainActivity\"\n            android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n\n            <meta-data\n                android:name=\"android.app.lib_name\"\n                android:value=\"\" />\n        </activity>\n    </application>\n\n</manifest>"
  },
  {
    "path": "sanitizers/app/src/main/cpp/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.22.1)\nproject(sanitizers LANGUAGES CXX)\n\ninclude(AppLibrary)\nfind_package(base CONFIG REQUIRED)\n\nadd_app_library(sanitizers SHARED native-lib.cpp)\ntarget_link_libraries(sanitizers PRIVATE base::base log)\n\nif(SANITIZE)\n    # For asan and ubsan, we need to copy some files from the NDK into our APK.\n    get_filename_component(HINT_PATH ${ANDROID_C_COMPILER} DIRECTORY)\n    set(ARCH_STR ${CMAKE_ANDROID_ARCH})\n    if(\"${CMAKE_ANDROID_ARCH_ABI}\" STREQUAL \"arm64-v8a\")\n        set(ARCH_STR \"aarch64\")\n    elseif(\"${CMAKE_ANDROID_ARCH_ABI}\" STREQUAL \"armeabi\")\n        set(ARCH_STR \"arm\")\n    elseif(\"${CMAKE_ANDROID_ARCH_ABI}\" STREQUAL \"armeabi-v7a\")\n        set(ARCH_STR \"arm\")\n    elseif(\"${CMAKE_ANDROID_ARCH_ABI}\" STREQUAL \"x86\")\n        set(ARCH_STR \"i686\")\n    elseif(\"${CMAKE_ANDROID_ARCH_ABI}\" STREQUAL \"x86_64\")\n        set(ARCH_STR \"x86_64\")\n    endif()\n\n    if(${SANITIZE} STREQUAL \"hwasan\")\n        target_compile_options(sanitizers PUBLIC -fsanitize=hwaddress -fno-omit-frame-pointer)\n        target_link_options(sanitizers PUBLIC -fsanitize=hwaddress)\n    elseif(${SANITIZE} STREQUAL \"asan\")\n        target_compile_options(sanitizers PUBLIC -fsanitize=address -fno-omit-frame-pointer)\n        target_link_options(sanitizers PUBLIC -fsanitize=address)\n\n        # Grab libclang_rt.asan-${ARCH_STR}-android.so from the NDK.\n        file(GLOB ASAN_GLOB \"${HINT_PATH}/../lib/clang/*/lib/linux\")\n        find_file(ASAN\n            NAMES libclang_rt.asan-${ARCH_STR}-android.so\n            PATHS ${ASAN_GLOB})\n        get_filename_component(ASAN_NAME ${ASAN} NAME)\n        set(ASAN_NAME ${CMAKE_SOURCE_DIR}/../../asan/jniLibs/${CMAKE_ANDROID_ARCH_ABI}/${ASAN_NAME})\n        add_custom_command(\n            TARGET sanitizers PRE_BUILD\n            COMMAND ${CMAKE_COMMAND} -E copy ${ASAN} ${ASAN_NAME})\n\n        # Grab the asan wrapper script from the NDK.\n        find_file(WRAP\n            NAMES asan.sh\n            HINTS ${HINT_PATH}/../../../../../wrap.sh)\n        set(WRAP_NAME ${CMAKE_SOURCE_DIR}/../../asan/resources/lib/${CMAKE_ANDROID_ARCH_ABI}/wrap.sh)\n        add_custom_command(\n            TARGET sanitizers PRE_BUILD\n            COMMAND ${CMAKE_COMMAND} -E copy ${WRAP} ${WRAP_NAME})\n    elseif(${SANITIZE} STREQUAL \"ubsan\")\n        target_compile_options(sanitizers PUBLIC -fsanitize=undefined -fno-sanitize-recover=undefined)\n        target_link_options(sanitizers PUBLIC -fsanitize=undefined -fno-sanitize-recover=undefined)\n\n        # Grab libclang_rt.ubsan_standalone-${ARCH_STR}-android.so from the NDK.\n        file(GLOB UBSAN_GLOB \"${HINT_PATH}/../lib/clang/*/lib/linux\")\n        find_file(UBSAN\n            NAMES libclang_rt.ubsan_standalone-${ARCH_STR}-android.so\n            PATHS ${UBSAN_GLOB})\n        get_filename_component(UBSAN_NAME ${UBSAN} NAME)\n        set(UBSAN_NAME ${CMAKE_SOURCE_DIR}/../../ubsan/jniLibs/${CMAKE_ANDROID_ARCH_ABI}/${UBSAN_NAME})\n        add_custom_command(\n            TARGET sanitizers PRE_BUILD\n            COMMAND ${CMAKE_COMMAND} -E copy ${UBSAN} ${UBSAN_NAME})\n    endif()\nendif()\n"
  },
  {
    "path": "sanitizers/app/src/main/cpp/libsanitizers.map.txt",
    "content": "LIBSANITIZERS {\n  global:\n    JNI_OnLoad;\n  local:\n    *;\n};\n"
  },
  {
    "path": "sanitizers/app/src/main/cpp/native-lib.cpp",
    "content": "#include <base/macros.h>\n#include <jni.h>\n\n#include <string>\n\njstring StringFromJni(JNIEnv* env, jobject /* this */) {\n  // Use-after-free error, caught by asan and hwasan.\n  int* foo = new int;\n  *foo = 3;\n  delete foo;\n  *foo = 4;\n\n  // Signed integer overflow. Undefined behavior caught by ubsan.\n  [[maybe_unused]] int k = 0x7fffffff;\n  k += 1;\n\n  std::string hello = \"Hello from C++\";\n  return env->NewStringUTF(hello.c_str());\n}\n\nextern \"C\" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* _Nonnull vm,\n                                             void* _Nullable) {\n  JNIEnv* env;\n  if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {\n    return JNI_ERR;\n  }\n\n  jclass c = env->FindClass(\"com/example/sanitizers/MainActivity\");\n  if (c == nullptr) return JNI_ERR;\n\n  static const JNINativeMethod methods[] = {\n      {\"stringFromJNI\", \"()Ljava/lang/String;\",\n       reinterpret_cast<void*>(StringFromJni)},\n  };\n  int rc = env->RegisterNatives(c, methods, arraysize(methods));\n  if (rc != JNI_OK) return rc;\n\n  return JNI_VERSION_1_6;\n}\n"
  },
  {
    "path": "sanitizers/app/src/main/java/com/example/sanitizers/MainActivity.kt",
    "content": "package com.example.sanitizers\n\nimport androidx.appcompat.app.AppCompatActivity\nimport android.os.Bundle\nimport android.widget.TextView\nimport com.example.sanitizers.databinding.ActivityMainBinding\n\nclass MainActivity : AppCompatActivity() {\n\n    private lateinit var binding: ActivityMainBinding\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        binding = ActivityMainBinding.inflate(layoutInflater)\n        setContentView(binding.root)\n\n        // Example of a call to a native method\n        binding.sampleText.text = stringFromJNI()\n    }\n\n    /**\n     * A native method that is implemented by the 'sanitizers' native library,\n     * which is packaged with this application.\n     */\n    external fun stringFromJNI(): String\n\n    companion object {\n        // Used to load the 'sanitizers' library on application startup.\n        init {\n            System.loadLibrary(\"sanitizers\")\n        }\n    }\n}"
  },
  {
    "path": "sanitizers/app/src/main/res/drawable/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path\n        android:fillColor=\"#3DDC84\"\n        android:pathData=\"M0,0h108v108h-108z\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M9,0L9,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,0L19,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,0L29,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,0L39,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,0L49,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,0L59,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,0L69,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,0L79,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M89,0L89,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M99,0L99,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,9L108,9\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,19L108,19\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,29L108,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,39L108,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,49L108,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,59L108,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,69L108,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,79L108,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,89L108,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,99L108,99\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,29L89,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,39L89,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,49L89,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,59L89,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,69L89,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,79L89,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,19L29,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,19L39,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,19L49,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,19L59,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,19L69,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,19L79,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n</vector>\n"
  },
  {
    "path": "sanitizers/app/src/main/res/drawable-v24/ic_launcher_foreground.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path android:pathData=\"M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z\">\n        <aapt:attr name=\"android:fillColor\">\n            <gradient\n                android:endX=\"85.84757\"\n                android:endY=\"92.4963\"\n                android:startX=\"42.9492\"\n                android:startY=\"49.59793\"\n                android:type=\"linear\">\n                <item\n                    android:color=\"#44000000\"\n                    android:offset=\"0.0\" />\n                <item\n                    android:color=\"#00000000\"\n                    android:offset=\"1.0\" />\n            </gradient>\n        </aapt:attr>\n    </path>\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:fillType=\"nonZero\"\n        android:pathData=\"M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z\"\n        android:strokeWidth=\"1\"\n        android:strokeColor=\"#00000000\" />\n</vector>"
  },
  {
    "path": "sanitizers/app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".MainActivity\">\n\n    <TextView\n        android:id=\"@+id/sample_text\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"Hello World!\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "sanitizers/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\" />\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "sanitizers/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\" />\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "sanitizers/app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"purple_200\">#FFBB86FC</color>\n    <color name=\"purple_500\">#FF6200EE</color>\n    <color name=\"purple_700\">#FF3700B3</color>\n    <color name=\"teal_200\">#FF03DAC5</color>\n    <color name=\"teal_700\">#FF018786</color>\n    <color name=\"black\">#FF000000</color>\n    <color name=\"white\">#FFFFFFFF</color>\n</resources>"
  },
  {
    "path": "sanitizers/app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">Sanitizers</string>\n</resources>"
  },
  {
    "path": "sanitizers/app/src/main/res/values/themes.xml",
    "content": "<resources xmlns:tools=\"http://schemas.android.com/tools\">\n    <!-- Base application theme. -->\n    <style name=\"Theme.Sanitizers\" parent=\"Theme.MaterialComponents.DayNight.DarkActionBar\">\n        <!-- Primary brand color. -->\n        <item name=\"colorPrimary\">@color/purple_500</item>\n        <item name=\"colorPrimaryVariant\">@color/purple_700</item>\n        <item name=\"colorOnPrimary\">@color/white</item>\n        <!-- Secondary brand color. -->\n        <item name=\"colorSecondary\">@color/teal_200</item>\n        <item name=\"colorSecondaryVariant\">@color/teal_700</item>\n        <item name=\"colorOnSecondary\">@color/black</item>\n        <!-- Status bar color. -->\n        <item name=\"android:statusBarColor\">?attr/colorPrimaryVariant</item>\n        <!-- Customize your theme here. -->\n    </style>\n</resources>"
  },
  {
    "path": "sanitizers/app/src/main/res/values-night/themes.xml",
    "content": "<resources xmlns:tools=\"http://schemas.android.com/tools\">\n    <!-- Base application theme. -->\n    <style name=\"Theme.Sanitizers\" parent=\"Theme.MaterialComponents.DayNight.DarkActionBar\">\n        <!-- Primary brand color. -->\n        <item name=\"colorPrimary\">@color/purple_200</item>\n        <item name=\"colorPrimaryVariant\">@color/purple_700</item>\n        <item name=\"colorOnPrimary\">@color/black</item>\n        <!-- Secondary brand color. -->\n        <item name=\"colorSecondary\">@color/teal_200</item>\n        <item name=\"colorSecondaryVariant\">@color/teal_200</item>\n        <item name=\"colorOnSecondary\">@color/black</item>\n        <!-- Status bar color. -->\n        <item name=\"android:statusBarColor\">?attr/colorPrimaryVariant</item>\n        <!-- Customize your theme here. -->\n    </style>\n</resources>"
  },
  {
    "path": "sanitizers/app/src/main/res/xml/backup_rules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Sample backup rules file; uncomment and customize as necessary.\n   See https://developer.android.com/guide/topics/data/autobackup\n   for details.\n   Note: This file is ignored for devices older that API 31\n   See https://developer.android.com/about/versions/12/backup-restore\n-->\n<full-backup-content>\n    <!--\n   <include domain=\"sharedpref\" path=\".\"/>\n   <exclude domain=\"sharedpref\" path=\"device.xml\"/>\n-->\n</full-backup-content>"
  },
  {
    "path": "sanitizers/app/src/main/res/xml/data_extraction_rules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Sample data extraction rules file; uncomment and customize as necessary.\n   See https://developer.android.com/about/versions/12/backup-restore#xml-changes\n   for details.\n-->\n<data-extraction-rules>\n    <cloud-backup>\n        <!-- TODO: Use <include> and <exclude> to control what is backed up.\n        <include .../>\n        <exclude .../>\n        -->\n    </cloud-backup>\n    <!--\n    <device-transfer>\n        <include .../>\n        <exclude .../>\n    </device-transfer>\n    -->\n</data-extraction-rules>"
  },
  {
    "path": "sensor-graph/README.md",
    "content": "# Sensor-Graph\n\nSensor graph is a C++ Android sample that read current accelerometer values and\ndraw them using OpenGL.\n\nIt demonstrate usage of the following Native C++ API:\n\n- [Sensors](http://developer.android.com/ndk/reference/group___sensor.html)\n- [Assets](http://developer.android.com/ndk/reference/group___asset.html)\n\n## Screenshots\n\n![screenshot](screenshot.png)\n"
  },
  {
    "path": "sensor-graph/accelerometer/build.gradle",
    "content": "plugins {\n    id \"ndksamples.android.application\"\n}\n\nandroid {\n    namespace 'com.android.accelerometergraph'\n\n    defaultConfig {\n        applicationId 'com.android.accelerometergraph'\n        externalNativeBuild {\n            cmake {\n                arguments '-DANDROID_STL=c++_static'\n            }\n        }\n    }\n\n    externalNativeBuild {\n        cmake {\n            path 'src/main/cpp/CMakeLists.txt'\n        }\n    }\n\n    buildFeatures {\n        prefab true\n    }\n}\n\ndependencies {\n    implementation project(\":base\")\n}\n"
  },
  {
    "path": "sensor-graph/accelerometer/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n/*\n**\n** Copyright 2009, The Android Open Source Project\n**\n** Licensed under the Apache License, Version 2.0 (the \"License\");\n** you may not use this file except in compliance with the License.\n** You may obtain a copy of the License at\n**\n**     http://www.apache.org/licenses/LICENSE-2.0\n**\n** Unless required by applicable law or agreed to in writing, software\n** distributed under the License is distributed on an \"AS IS\" BASIS,\n** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n** See the License for the specific language governing permissions and\n** limitations under the License.\n*/\n-->\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n  <uses-feature android:glEsVersion=\"0x00020000\" android:required=\"true\"/>\n    <application\n        android:allowBackup=\"false\"\n        android:fullBackupContent=\"false\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/accelerometergraph_activity\">\n      <activity android:name=\".AccelerometerGraphActivity\"\n                android:theme=\"@android:style/Theme.NoTitleBar.Fullscreen\"\n                android:launchMode=\"singleTask\"\n                android:configChanges=\"orientation|keyboardHidden\"\n          android:exported=\"true\">\n        <intent-filter>\n          <action android:name=\"android.intent.action.MAIN\" />\n          <category android:name=\"android.intent.category.LAUNCHER\" />\n        </intent-filter>\n      </activity>\n    </application>\n</manifest>\n"
  },
  {
    "path": "sensor-graph/accelerometer/src/main/assets/shader.glslf",
    "content": "precision mediump float;\n\nuniform vec4 uFragColor;\n\nvoid main() {\n    gl_FragColor = uFragColor;\n}\n"
  },
  {
    "path": "sensor-graph/accelerometer/src/main/assets/shader.glslv",
    "content": "attribute float vPosition;\nattribute float vSensorValue;\n\nvoid main() {\n    gl_Position = vec4(vPosition, vSensorValue/9.81, 0, 1);\n}\n"
  },
  {
    "path": "sensor-graph/accelerometer/src/main/cpp/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.22.1)\nproject(SensorGraph LANGUAGES CXX)\n\ninclude(AppLibrary)\nfind_package(base CONFIG REQUIRED)\n\nadd_app_library(accelerometergraph SHARED sensorgraph.cpp)\n\ntarget_link_libraries(accelerometergraph\n    PRIVATE\n    base::base\n    android\n    GLESv2\n    log\n)\n"
  },
  {
    "path": "sensor-graph/accelerometer/src/main/cpp/libaccelerometergraph.map.txt",
    "content": "LIBACCELEROMETERGRAPH {\n  global:\n    JNI_OnLoad;\n  local:\n    *;\n};\n"
  },
  {
    "path": "sensor-graph/accelerometer/src/main/cpp/sensorgraph.cpp",
    "content": "/*\n * Copyright (C) 2015 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// OpenGL ES 2.0 code\n#include <GLES2/gl2.h>\n#include <android/asset_manager_jni.h>\n#include <android/log.h>\n#include <android/sensor.h>\n#include <dlfcn.h>\n#include <jni.h>\n\n#include <cassert>\n#include <cstdint>\n#include <string>\n\n#define LOG_TAG \"accelerometergraph\"\n#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)\n\nconst int LOOPER_ID_USER = 3;\nconst int SENSOR_HISTORY_LENGTH = 100;\nconst int SENSOR_REFRESH_RATE_HZ = 100;\nconstexpr int32_t SENSOR_REFRESH_PERIOD_US =\n    int32_t(1000000 / SENSOR_REFRESH_RATE_HZ);\nconst float SENSOR_FILTER_ALPHA = 0.1f;\n\n/*\n * AcquireASensorManagerInstance(void)\n *    Workaround AsensorManager_getInstance() deprecation false alarm\n *    for Android-N and before, when compiling with NDK-r15\n */\n#include <base/macros.h>\n#include <dlfcn.h>\nconst char* kPackageName = \"com.android.accelerometergraph\";\nASensorManager* AcquireASensorManagerInstance(void) {\n  typedef ASensorManager* (*PF_GETINSTANCEFORPACKAGE)(const char* name);\n  void* androidHandle = dlopen(\"libandroid.so\", RTLD_NOW);\n  PF_GETINSTANCEFORPACKAGE getInstanceForPackageFunc =\n      (PF_GETINSTANCEFORPACKAGE)dlsym(androidHandle,\n                                      \"ASensorManager_getInstanceForPackage\");\n  if (getInstanceForPackageFunc) {\n    return getInstanceForPackageFunc(kPackageName);\n  }\n\n  typedef ASensorManager* (*PF_GETINSTANCE)();\n  PF_GETINSTANCE getInstanceFunc =\n      (PF_GETINSTANCE)dlsym(androidHandle, \"ASensorManager_getInstance\");\n  // by all means at this point, ASensorManager_getInstance should be available\n  assert(getInstanceFunc);\n  return getInstanceFunc();\n}\n\nclass sensorgraph {\n  std::string vertexShaderSource;\n  std::string fragmentShaderSource;\n  ASensorManager* sensorManager;\n  const ASensor* accelerometer;\n  ASensorEventQueue* accelerometerEventQueue;\n  ALooper* looper;\n\n  GLuint shaderProgram;\n  GLuint vPositionHandle;\n  GLuint vSensorValueHandle;\n  GLuint uFragColorHandle;\n  GLfloat xPos[SENSOR_HISTORY_LENGTH];\n\n  struct AccelerometerData {\n    GLfloat x;\n    GLfloat y;\n    GLfloat z;\n  };\n  AccelerometerData sensorData[SENSOR_HISTORY_LENGTH * 2];\n  AccelerometerData sensorDataFilter;\n  int sensorDataIndex;\n\n public:\n  sensorgraph() : sensorDataIndex(0) {}\n\n  void init(AAssetManager* assetManager) {\n    AAsset* vertexShaderAsset =\n        AAssetManager_open(assetManager, \"shader.glslv\", AASSET_MODE_BUFFER);\n    assert(vertexShaderAsset != NULL);\n    const void* vertexShaderBuf = AAsset_getBuffer(vertexShaderAsset);\n    assert(vertexShaderBuf != NULL);\n    off_t vertexShaderLength = AAsset_getLength(vertexShaderAsset);\n    vertexShaderSource =\n        std::string((const char*)vertexShaderBuf, (size_t)vertexShaderLength);\n    AAsset_close(vertexShaderAsset);\n\n    AAsset* fragmentShaderAsset =\n        AAssetManager_open(assetManager, \"shader.glslf\", AASSET_MODE_BUFFER);\n    assert(fragmentShaderAsset != NULL);\n    const void* fragmentShaderBuf = AAsset_getBuffer(fragmentShaderAsset);\n    assert(fragmentShaderBuf != NULL);\n    off_t fragmentShaderLength = AAsset_getLength(fragmentShaderAsset);\n    fragmentShaderSource = std::string((const char*)fragmentShaderBuf,\n                                       (size_t)fragmentShaderLength);\n    AAsset_close(fragmentShaderAsset);\n\n    sensorManager = AcquireASensorManagerInstance();\n    assert(sensorManager != NULL);\n    accelerometer = ASensorManager_getDefaultSensor(sensorManager,\n                                                    ASENSOR_TYPE_ACCELEROMETER);\n    assert(accelerometer != NULL);\n    looper = ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS);\n    assert(looper != NULL);\n    accelerometerEventQueue = ASensorManager_createEventQueue(\n        sensorManager, looper, LOOPER_ID_USER, NULL, NULL);\n    assert(accelerometerEventQueue != NULL);\n    auto status =\n        ASensorEventQueue_enableSensor(accelerometerEventQueue, accelerometer);\n    assert(status >= 0);\n    status = ASensorEventQueue_setEventRate(\n        accelerometerEventQueue, accelerometer, SENSOR_REFRESH_PERIOD_US);\n    assert(status >= 0);\n    (void)status;  // to silent unused compiler warning\n\n    generateXPos();\n  }\n\n  void surfaceCreated() {\n    LOGI(\"GL_VERSION: %s\", glGetString(GL_VERSION));\n    LOGI(\"GL_VENDOR: %s\", glGetString(GL_VENDOR));\n    LOGI(\"GL_RENDERER: %s\", glGetString(GL_RENDERER));\n    LOGI(\"GL_EXTENSIONS: %s\", glGetString(GL_EXTENSIONS));\n\n    shaderProgram = createProgram(vertexShaderSource, fragmentShaderSource);\n    assert(shaderProgram != 0);\n    GLint getPositionLocationResult =\n        glGetAttribLocation(shaderProgram, \"vPosition\");\n    assert(getPositionLocationResult != -1);\n    vPositionHandle = (GLuint)getPositionLocationResult;\n    GLint getSensorValueLocationResult =\n        glGetAttribLocation(shaderProgram, \"vSensorValue\");\n    assert(getSensorValueLocationResult != -1);\n    vSensorValueHandle = (GLuint)getSensorValueLocationResult;\n    GLint getFragColorLocationResult =\n        glGetUniformLocation(shaderProgram, \"uFragColor\");\n    assert(getFragColorLocationResult != -1);\n    uFragColorHandle = (GLuint)getFragColorLocationResult;\n  }\n\n  void surfaceChanged(int w, int h) { glViewport(0, 0, w, h); }\n\n  void generateXPos() {\n    for (auto i = 0; i < SENSOR_HISTORY_LENGTH; i++) {\n      float t =\n          static_cast<float>(i) / static_cast<float>(SENSOR_HISTORY_LENGTH - 1);\n      xPos[i] = -1.f * (1.f - t) + 1.f * t;\n    }\n  }\n\n  GLuint createProgram(const std::string& pVertexSource,\n                       const std::string& pFragmentSource) {\n    GLuint vertexShader = loadShader(GL_VERTEX_SHADER, pVertexSource);\n    GLuint pixelShader = loadShader(GL_FRAGMENT_SHADER, pFragmentSource);\n    GLuint program = glCreateProgram();\n    assert(program != 0);\n    glAttachShader(program, vertexShader);\n    glAttachShader(program, pixelShader);\n    glLinkProgram(program);\n    GLint programLinked = 0;\n    glGetProgramiv(program, GL_LINK_STATUS, &programLinked);\n    assert(programLinked != 0);\n    glDeleteShader(vertexShader);\n    glDeleteShader(pixelShader);\n    return program;\n  }\n\n  GLuint loadShader(GLenum shaderType, const std::string& pSource) {\n    GLuint shader = glCreateShader(shaderType);\n    assert(shader != 0);\n    const char* sourceBuf = pSource.c_str();\n    glShaderSource(shader, 1, &sourceBuf, NULL);\n    glCompileShader(shader);\n    GLint shaderCompiled = 0;\n    glGetShaderiv(shader, GL_COMPILE_STATUS, &shaderCompiled);\n    assert(shaderCompiled != 0);\n    return shader;\n  }\n\n  void update() {\n    ALooper_pollOnce(0, NULL, NULL, NULL);\n    ASensorEvent event;\n    float a = SENSOR_FILTER_ALPHA;\n    while (ASensorEventQueue_getEvents(accelerometerEventQueue, &event, 1) >\n           0) {\n      sensorDataFilter.x =\n          a * event.acceleration.x + (1.0f - a) * sensorDataFilter.x;\n      sensorDataFilter.y =\n          a * event.acceleration.y + (1.0f - a) * sensorDataFilter.y;\n      sensorDataFilter.z =\n          a * event.acceleration.z + (1.0f - a) * sensorDataFilter.z;\n    }\n    sensorData[sensorDataIndex] = sensorDataFilter;\n    sensorData[SENSOR_HISTORY_LENGTH + sensorDataIndex] = sensorDataFilter;\n    sensorDataIndex = (sensorDataIndex + 1) % SENSOR_HISTORY_LENGTH;\n  }\n\n  void render() {\n    glClearColor(0.f, 0.f, 0.f, 1.0f);\n    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);\n\n    glUseProgram(shaderProgram);\n\n    glEnableVertexAttribArray(vPositionHandle);\n    glVertexAttribPointer(vPositionHandle, 1, GL_FLOAT, GL_FALSE, 0, xPos);\n\n    glEnableVertexAttribArray(vSensorValueHandle);\n    glVertexAttribPointer(vSensorValueHandle, 1, GL_FLOAT, GL_FALSE,\n                          sizeof(AccelerometerData),\n                          &sensorData[sensorDataIndex].x);\n\n    glUniform4f(uFragColorHandle, 1.0f, 1.0f, 0.0f, 1.0f);\n    glDrawArrays(GL_LINE_STRIP, 0, SENSOR_HISTORY_LENGTH);\n\n    glVertexAttribPointer(vSensorValueHandle, 1, GL_FLOAT, GL_FALSE,\n                          sizeof(AccelerometerData),\n                          &sensorData[sensorDataIndex].y);\n    glUniform4f(uFragColorHandle, 1.0f, 0.0f, 1.0f, 1.0f);\n    glDrawArrays(GL_LINE_STRIP, 0, SENSOR_HISTORY_LENGTH);\n\n    glVertexAttribPointer(vSensorValueHandle, 1, GL_FLOAT, GL_FALSE,\n                          sizeof(AccelerometerData),\n                          &sensorData[sensorDataIndex].z);\n    glUniform4f(uFragColorHandle, 0.0f, 1.0f, 1.0f, 1.0f);\n    glDrawArrays(GL_LINE_STRIP, 0, SENSOR_HISTORY_LENGTH);\n  }\n\n  void pause() {\n    ASensorEventQueue_disableSensor(accelerometerEventQueue, accelerometer);\n  }\n\n  void resume() {\n    ASensorEventQueue_enableSensor(accelerometerEventQueue, accelerometer);\n    [[maybe_unused]] auto status = ASensorEventQueue_setEventRate(\n        accelerometerEventQueue, accelerometer, SENSOR_REFRESH_PERIOD_US);\n    assert(status >= 0);\n  }\n};\n\nsensorgraph gSensorGraph;\n\nvoid Init(JNIEnv* env, jclass, jobject assetManager) {\n  AAssetManager* nativeAssetManager = AAssetManager_fromJava(env, assetManager);\n  gSensorGraph.init(nativeAssetManager);\n}\n\nvoid SurfaceCreated(JNIEnv*, jclass) { gSensorGraph.surfaceCreated(); }\n\nvoid SurfaceChanged(JNIEnv*, jclass, jint width, jint height) {\n  gSensorGraph.surfaceChanged(width, height);\n}\n\nvoid DrawFrame(JNIEnv*, jclass) {\n  gSensorGraph.update();\n  gSensorGraph.render();\n}\n\nvoid Pause(JNIEnv*, jclass) { gSensorGraph.pause(); }\n\nvoid Resume(JNIEnv*, jclass) { gSensorGraph.resume(); }\n\nextern \"C\" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* _Nonnull vm,\n                                             void* _Nullable) {\n  JNIEnv* env;\n  if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {\n    return JNI_ERR;\n  }\n\n  jclass c =\n      env->FindClass(\"com/android/accelerometergraph/AccelerometerGraphJNI\");\n  if (c == nullptr) return JNI_ERR;\n\n  static const JNINativeMethod methods[] = {\n      {\"init\", \"(Landroid/content/res/AssetManager;)V\",\n       reinterpret_cast<void*>(Init)},\n      {\"surfaceCreated\", \"()V\", reinterpret_cast<void*>(SurfaceCreated)},\n      {\"surfaceChanged\", \"(II)V\", reinterpret_cast<void*>(SurfaceChanged)},\n      {\"drawFrame\", \"()V\", reinterpret_cast<void*>(DrawFrame)},\n      {\"pause\", \"()V\", reinterpret_cast<void*>(Pause)},\n      {\"resume\", \"()V\", reinterpret_cast<void*>(Resume)},\n  };\n  int rc = env->RegisterNatives(c, methods, arraysize(methods));\n  if (rc != JNI_OK) return rc;\n\n  return JNI_VERSION_1_6;\n}\n"
  },
  {
    "path": "sensor-graph/accelerometer/src/main/java/com/android/accelerometergraph/AccelerometerGraphActivity.java",
    "content": "/*\n * Copyright (C) 2007 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.android.accelerometergraph;\n\nimport android.app.Activity;\nimport android.opengl.GLSurfaceView;\nimport android.os.Bundle;\n\nimport javax.microedition.khronos.egl.EGLConfig;\nimport javax.microedition.khronos.opengles.GL10;\n\n\npublic class AccelerometerGraphActivity extends Activity {\n\n    GLSurfaceView mView;\n\n    @Override protected void onCreate(Bundle icicle) {\n        super.onCreate(icicle);\n        mView = new GLSurfaceView(getApplication());\n        mView.setEGLContextClientVersion(2);\n        mView.setRenderer(new GLSurfaceView.Renderer() {\n            @Override\n            public void onSurfaceCreated(GL10 gl, EGLConfig config) {\n                AccelerometerGraphJNI.surfaceCreated();\n            }\n\n            @Override\n            public void onSurfaceChanged(GL10 gl, int width, int height) {\n                AccelerometerGraphJNI.surfaceChanged(width, height);\n            }\n\n            @Override\n            public void onDrawFrame(GL10 gl) {\n                AccelerometerGraphJNI.drawFrame();\n            }\n        });\n        mView.queueEvent(new Runnable() {\n            @Override\n            public void run() {\n                AccelerometerGraphJNI.init(getAssets());\n            }\n        });\n\t    setContentView(mView);\n    }\n\n    @Override protected void onPause() {\n        super.onPause();\n        mView.onPause();\n        mView.queueEvent(new Runnable() {\n            @Override\n            public void run() {\n                AccelerometerGraphJNI.pause();\n            }\n        });\n    }\n\n    @Override protected void onResume() {\n        super.onResume();\n        mView.onResume();\n        mView.queueEvent(new Runnable() {\n            @Override\n            public void run() {\n                AccelerometerGraphJNI.resume();\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "sensor-graph/accelerometer/src/main/java/com/android/accelerometergraph/AccelerometerGraphJNI.java",
    "content": "/*\n * Copyright (C) 2007 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.android.accelerometergraph;\n\n// Wrapper for native library\n\nimport android.content.res.AssetManager;\n\npublic class AccelerometerGraphJNI {\n\n     static {\n         System.loadLibrary(\"accelerometergraph\");\n     }\n\n     public static native void init(AssetManager assetManager);\n     public static native void surfaceCreated();\n     public static native void surfaceChanged(int width, int height);\n     public static native void drawFrame();\n     public static native void pause();\n     public static native void resume();\n}\n"
  },
  {
    "path": "sensor-graph/accelerometer/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n/*\n**\n** Copyright 2006, The Android Open Source Project\n**\n** Licensed under the Apache License, Version 2.0 (the \"License\"); \n** you may not use this file except in compliance with the License. \n** You may obtain a copy of the License at \n**\n**     http://www.apache.org/licenses/LICENSE-2.0 \n**\n** Unless required by applicable law or agreed to in writing, software \n** distributed under the License is distributed on an \"AS IS\" BASIS, \n** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. \n** See the License for the specific language governing permissions and \n** limitations under the License.\n*/\n-->\n\n<!-- This file contains resource definitions for displayed strings, allowing\n     them to be changed based on the locale and options. -->\n\n<resources>\n    <!-- Simple strings. -->\n    <string name=\"accelerometergraph_activity\">Accelerometer Graph</string>\n\n</resources>\n\n"
  },
  {
    "path": "settings.gradle",
    "content": "pluginManagement {\n    includeBuild(\"build-logic\")\n    repositories {\n        google {\n            content {\n                includeGroupByRegex(\"com\\\\.android.*\")\n                includeGroupByRegex(\"com\\\\.google.*\")\n                includeGroupByRegex(\"androidx.*\")\n            }\n        }\n        mavenCentral()\n        gradlePluginPortal()\n    }\n}\ndependencyResolutionManagement {\n    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)\n    repositories {\n        google()\n        mavenCentral()\n    }\n}\n\nrootProject.name = \"NDK Samples\"\ninclude(\":base\")\ninclude(\":bitmap-plasma:app\")\ninclude(\":camera:basic\")\ninclude(\":camera:camera-utils\")\ninclude(\":camera:texture-view\")\ninclude(\":endless-tunnel:app\")\ninclude(\":exceptions:app\")\ninclude(\":gles3jni:app\")\ninclude(\":hello-gl2:app\")\ninclude(\":hello-jni:app\")\ninclude(\":hello-jniCallback:app\")\ninclude(\":hello-vulkan:app\")\ninclude(\":native-activity:app\")\ninclude(\":native-audio:app\")\ninclude(\":native-codec:app\")\ninclude(\":native-midi:app\")\ninclude(\":orderfile:app\")\ninclude(\":sanitizers:app\")\ninclude(\":sensor-graph:accelerometer\")\ninclude(\":teapots:choreographer-30fps\")\ninclude(\":teapots:classic-teapot\")\ninclude(\":teapots:image-decoder\")\ninclude(\":teapots:more-teapots\")\ninclude(\":teapots:textured-teapot\")\ninclude(\":unit-test:app\")\ninclude(\":vectorization\")\n"
  },
  {
    "path": "teapots/.gitignore",
    "content": "**/stb\n\n"
  },
  {
    "path": "teapots/README.md",
    "content": "# Teapots\n\nTeapots is an collection of Android C++ samples that uses a Teapot rendering to\ndemonstrate Android NDK platform features:\n\n- classic-teapot: Rendering classic teapot mesh using GLES 2.0 API and\n  [NativeActivity](http://developer.android.com/reference/android/app/NativeActivity.html).\n- more-teapots: Rendering multiple instances of Classic Teapot with GLES 3.0\n  Instance Rendering\n- choreographer-30fps: demonstrates multiple frame rate throttling techniques\n  based on API level using Choreographer API and EGL Android presentation time\n  extension.\n- textured-teapot: Rendering classic teapot plus textures\n- image-decoder: Same as textured-teapot, except that texture decoding is done\n  with the ImageDecoder API introduced in Android 11 (Android NDK r21b)\n\n## Screenshots\n\n![screenshot](screenshot.png)\n"
  },
  {
    "path": "teapots/choreographer-30fps/build.gradle",
    "content": "plugins {\n    id \"ndksamples.android.application\"\n}\n\nandroid {\n    namespace 'com.sample.choreographer'\n\n    defaultConfig {\n        applicationId 'com.sample.choreographer'\n        externalNativeBuild {\n            cmake {\n                arguments '-DANDROID_STL=c++_static'\n            }\n        }\n    }\n\n    externalNativeBuild {\n        cmake {\n            path 'src/main/cpp/CMakeLists.txt'\n        }\n    }\n\n    buildFeatures {\n        prefab true\n    }\n}\n\ndependencies {\n    implementation project(\":base\")\n    implementation libs.appcompat\n    implementation libs.androidx.constraintlayout\n}\n"
  },
  {
    "path": "teapots/choreographer-30fps/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:versionCode=\"1\"\n          android:versionName=\"1.0\" >\n\n  <uses-feature android:glEsVersion=\"0x00020000\"></uses-feature>\n\n  <application\n      android:allowBackup=\"false\"\n      android:fullBackupContent=\"false\"\n      android:supportsRtl=\"true\"\n      android:icon=\"@mipmap/ic_launcher\"\n      android:label=\"@string/app_name\"\n      android:theme=\"@style/AppTheme\"\n      android:name=\"com.sample.choreographer.ChoreographerApplication\"\n      >\n\n    <!-- Our activity is the built-in NativeActivity framework class.\n         This will take care of integrating with our NDK code. -->\n    <activity android:name=\"com.sample.choreographer.ChoreographerNativeActivity\"\n              android:label=\"@string/app_name\"\n              android:configChanges=\"orientation|keyboardHidden\"\n        android:exported=\"true\">\n      <!-- Tell NativeActivity the name of our .so -->\n      <meta-data android:name=\"android.app.lib_name\"\n                 android:value=\"ChoreographerNativeActivity\" />\n      <intent-filter>\n        <action android:name=\"android.intent.action.MAIN\" />\n        <category android:name=\"android.intent.category.LAUNCHER\" />\n      </intent-filter>\n    </activity>\n  </application>\n</manifest>\n"
  },
  {
    "path": "teapots/choreographer-30fps/src/main/assets/Shaders/ShaderPlain.fsh",
    "content": "//\n// Copyright (C) 2015 The Android Open Source Project\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n//  ShaderPlain.fsh\n//\n\n#define USE_PHONG (1)\n\nuniform lowp vec3       vMaterialAmbient;\nuniform lowp vec4       vMaterialSpecular;\n\nvarying lowp vec4 colorDiffuse;\n\n#if USE_PHONG\nuniform highp vec3      vLight0;\nvarying mediump vec3 position;\nvarying mediump vec3 normal;\n#else\nvarying lowp vec4 colorSpecular;\n#endif\n\nvoid main()\n{\n#if USE_PHONG\n    mediump vec3 halfVector = normalize(-vLight0 + position);\n    mediump float NdotH = max(dot(normalize(normal), halfVector), 0.0);\n    mediump float fPower = vMaterialSpecular.w;\n    mediump float specular = pow(NdotH, fPower);\n\n    lowp vec4 colorSpecular = vec4( vMaterialSpecular.xyz * specular, 1 );\n    gl_FragColor = colorDiffuse + colorSpecular;\n#else\n    gl_FragColor = colorDiffuse + colorSpecular;\n#endif\n}\n"
  },
  {
    "path": "teapots/choreographer-30fps/src/main/assets/Shaders/VS_ShaderPlain.vsh",
    "content": "//\n// Copyright (C) 2015 The Android Open Source Project\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n//  ShaderPlain.vsh\n//\n\n#define USE_PHONG (1)\n\nattribute highp vec3    myVertex;\nattribute highp vec3    myNormal;\nattribute mediump vec2  myUV;\nattribute mediump vec4  myBone;\n\nvarying mediump vec2    texCoord;\nvarying lowp    vec4    colorDiffuse;\n\n#if USE_PHONG\nvarying mediump vec3 position;\nvarying mediump vec3 normal;\n#else\nvarying lowp    vec4    colorSpecular;\n#endif\n\nuniform highp mat4      uMVMatrix;\nuniform highp mat4      uPMatrix;\n\nuniform highp vec3      vLight0;\n\nuniform lowp vec4       vMaterialDiffuse;\nuniform lowp vec3       vMaterialAmbient;\nuniform lowp vec4       vMaterialSpecular;\n\nvoid main(void)\n{\n    highp vec4 p = vec4(myVertex,1);\n    gl_Position = uPMatrix * p;\n\n    texCoord = myUV;\n\n    highp vec3 worldNormal = vec3(mat3(uMVMatrix[0].xyz, uMVMatrix[1].xyz, uMVMatrix[2].xyz) * myNormal);\n    highp vec3 ecPosition = p.xyz;\n\n    colorDiffuse = dot( worldNormal, normalize(-vLight0+ecPosition) ) * vMaterialDiffuse  + vec4( vMaterialAmbient, 1 );\n\n#if USE_PHONG\n    normal = worldNormal;\n    position = ecPosition;\n#else\n    highp vec3 halfVector = normalize(ecPosition - vLight0);\n\n    highp float NdotH = max(-dot(worldNormal, halfVector), 0.0);\n    float fPower = vMaterialSpecular.w;\n    highp float specular = min( pow(NdotH, fPower), 1.0);\n    colorSpecular = vec4( vMaterialSpecular.xyz * specular, 1 );\n#endif\n}\n"
  },
  {
    "path": "teapots/choreographer-30fps/src/main/cpp/CMakeLists.txt",
    "content": "#\n# Copyright (C) The Android Open Source Project\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\ncmake_minimum_required(VERSION 3.22.1)\nproject(ChoreographerNativeActivity LANGUAGES C CXX)\n\ninclude(AppLibrary)\nfind_package(base CONFIG REQUIRED)\n\n# build the ndk-helper library\nget_filename_component(commonDir ${CMAKE_CURRENT_SOURCE_DIR}/../../../../common ABSOLUTE)\nget_filename_component(ndkHelperSrc ${commonDir}/ndk_helper ABSOLUTE)\nadd_subdirectory(${ndkHelperSrc}\n    ndkHelperBin/${CMAKE_BUILD_TYPE}/${ANDROID_ABI})\n\n# now build app's shared lib\nadd_app_library(${PROJECT_NAME}\n    SHARED\n    ChoreographerNativeActivity.cpp\n    TeapotRenderer.cpp\n)\n\n# Export ANativeActivity_onCreate(),\n# Refer to: https://github.com/android-ndk/ndk/issues/381.\nset_target_properties(${PROJECT_NAME}\n    PROPERTIES LINK_FLAGS \"-u ANativeActivity_onCreate\")\n\n# add lib dependencies\ntarget_link_libraries(${PROJECT_NAME}\n    PRIVATE\n    base::base\n    NdkHelper\n)\n"
  },
  {
    "path": "teapots/choreographer-30fps/src/main/cpp/ChoreographerNativeActivity.cpp",
    "content": "/*\n * Copyright 2016 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//--------------------------------------------------------------------------------\n// Include files\n//--------------------------------------------------------------------------------\n#include <EGL/egl.h>\n#include <android/log.h>\n#include <android_native_app_glue.h>\n#include <base/macros.h>\n#include <dlfcn.h>\n\n#include <condition_variable>\n#include <thread>\n\n#include \"NDKHelper.h\"\n#include \"TeapotRenderer.h\"\n//-------------------------------------------------------------------------\n// Preprocessor\n//-------------------------------------------------------------------------\n#define HELPER_CLASS_NAME \\\n  \"com/sample/helper/NDKHelper\"  // Class name of helper function\n\n// Indicate API mode to achieve 30 FPS.\nenum APIMode {\n  kAPINone,\n  kAPINativeChoreographer,\n  kAPIJavaChoreographer,\n  kAPIEGLExtension,\n};\n\nconst int32_t kFPSThrottleInterval = 2;\nconst int64_t kFPSThrottlePresentationInterval =\n    (kFPSThrottleInterval / 60.0f) * 1000000000;\n#define COULD_RENDER(now, last) \\\n  (((now) - (last)) >= kFPSThrottlePresentationInterval)\n\n// Declaration for native chreographer API.\nstruct AChoreographer;\ntypedef void (*AChoreographer_frameCallback)(long frameTimeNanos, void* data);\ntypedef AChoreographer* (*func_AChoreographer_getInstance)();\ntypedef void (*func_AChoreographer_postFrameCallback)(\n    AChoreographer* choreographer, AChoreographer_frameCallback callback,\n    void* data);\n\n//-------------------------------------------------------------------------\n// Shared state for our app.\n//-------------------------------------------------------------------------\nstruct android_app;\nclass Engine {\n  android_app* app_;\n\n  TeapotRenderer renderer_;\n\n  ndk_helper::GLContext* gl_context_;\n\n  bool initialized_resources_;\n  bool has_focus_;\n  bool fps_throttle_;\n\n  ndk_helper::DoubletapDetector doubletap_detector_;\n  ndk_helper::PinchDetector pinch_detector_;\n  ndk_helper::DragDetector drag_detector_;\n  ndk_helper::PerfMonitor monitor_;\n\n  ndk_helper::TapCamera tap_camera_;\n\n  APIMode api_mode_;\n  APIMode original_api_mode_;\n\n  void UpdateFPS(float fFPS);\n  void ShowUI();\n  void TransformPosition(ndk_helper::Vec2& vec);\n  void Swap();\n\n  // Do swap operation at the end of rendering if necessary.\n  void DoSwap();\n  void CheckAPISupport();\n  void StartFPSThrottle();\n  void StopFPSThrottle();\n  int64_t GetCurrentTime();\n\n  void StartChoreographer();\n  void StartJavaChoreographer();\n  void StopJavaChoreographer();\n  static void choreographer_callback(long frameTimeNanos, void* data);\n\n  // Function pointers for native Choreographer API.\n  func_AChoreographer_getInstance AChoreographer_getInstance_;\n  func_AChoreographer_postFrameCallback AChoreographer_postFrameCallback_;\n\n  // Stuff for EGL Android presentation time extension.\n  int64_t presentation_time_;\n  bool (*eglPresentationTimeANDROID_)(EGLDisplay dpy, EGLSurface sur,\n                                      khronos_stime_nanoseconds_t time);\n\n  int64_t prevFrameTimeNanos_;\n  bool should_render_;\n  std::mutex mtx_;              // mutex for critical section\n  std::condition_variable cv_;  // condition variable for critical section\n\n public:\n  static void HandleCmd(struct android_app* app, int32_t cmd);\n  static int32_t HandleInput(android_app* app, AInputEvent* event);\n\n  Engine();\n  ~Engine();\n  void SetState(android_app* app);\n  int InitDisplay(android_app* app);\n  void LoadResources();\n  void UnloadResources();\n  void DrawFrame();\n  void TermDisplay();\n  void TrimMemory();\n  bool IsReady();\n  void UpdatePosition(AInputEvent* event, int32_t iIndex, float& fX, float& fY);\n\n  // Do swap operation while Choreographer callback. Need to be a public method\n  // since it's called from JNI callback.\n  void SynchInCallback(jlong frameTimeNamos);\n};\n\n// Global instance of the Engine class.\nEngine g_engine;\n\nEngine::Engine()\n    : app_(NULL),\n      initialized_resources_(false),\n      has_focus_(false),\n      fps_throttle_(true),\n      api_mode_(kAPINone),\n      prevFrameTimeNanos_(static_cast<int64_t>(0)),\n      should_render_(true) {\n  gl_context_ = ndk_helper::GLContext::GetInstance();\n}\n\nEngine::~Engine() {}\n\n/**\n * Check which API is supported in the device.\n */\nvoid Engine::CheckAPISupport() {\n  auto apilevel = AConfiguration_getSdkVersion(app_->config);\n  LOGI(\"Device API Level %d\", apilevel);\n\n  if (apilevel >= 24) {\n    // Native Choreographer API is supported in API level 24~.\n    void* lib = dlopen(\"libandroid.so\", RTLD_NOW | RTLD_LOCAL);\n    if (lib != nullptr) {\n      LOGI(\"Run with Choreographer Native API.\");\n      api_mode_ = kAPINativeChoreographer;\n\n      // Retrieve function pointers from shared object.\n      AChoreographer_getInstance_ =\n          reinterpret_cast<func_AChoreographer_getInstance>(\n              dlsym(lib, \"AChoreographer_getInstance\"));\n      AChoreographer_postFrameCallback_ =\n          reinterpret_cast<func_AChoreographer_postFrameCallback>(\n              dlsym(lib, \"AChoreographer_postFrameCallback\"));\n      assert(AChoreographer_getInstance_);\n      assert(AChoreographer_postFrameCallback_);\n    }\n  } else if (apilevel >= 18) {\n    // eglPresentationTimeANDROID would be supported in API level 18~.\n    LOGI(\"Run with EGLExtension.\");\n    api_mode_ = kAPIEGLExtension;\n\n    // Retrieve the EGL extension's function pointer.\n    eglPresentationTimeANDROID_ = reinterpret_cast<bool (*)(\n        EGLDisplay, EGLSurface, khronos_stime_nanoseconds_t)>(\n        eglGetProcAddress(\"eglPresentationTimeANDROID\"));\n    assert(eglPresentationTimeANDROID_);\n    presentation_time_ = GetCurrentTime();\n  } else if (apilevel >= 16) {\n    // Choreographer Java API is supported API level 16~.\n    LOGI(\"Run with Chreographer Java API.\");\n    api_mode_ = kAPIJavaChoreographer;\n  } else {\n    api_mode_ = kAPINone;\n  }\n  original_api_mode_ = api_mode_;\n  StartFPSThrottle();\n}\n\nvoid Engine::StartFPSThrottle() {\n  api_mode_ = original_api_mode_;\n  if (api_mode_ == kAPINativeChoreographer) {\n    // Initiate choreographer callback.\n    StartChoreographer();\n  } else if (api_mode_ == kAPIJavaChoreographer) {\n    // Initiate Java choreographer callback.\n    StartJavaChoreographer();\n  }\n}\n\nvoid Engine::StopFPSThrottle() {\n  if (api_mode_ == kAPINativeChoreographer) {\n    should_render_ = true;\n    //    ALooper_wake(app_->looper);\n  } else if (api_mode_ == kAPIJavaChoreographer) {\n    StopJavaChoreographer();\n  }\n  api_mode_ = kAPINone;\n}\n\nvoid Engine::DoSwap() {\n  if (api_mode_ == kAPINativeChoreographer) {\n    // Use choreographer to synchronize.\n    // Do nothing but wait the until choreographer callback.\n    should_render_ = false;\n  } else if (api_mode_ == kAPIJavaChoreographer) {\n    // Wait until the conditional variable is signaled.\n    std::unique_lock<std::mutex> lock(mtx_);\n    cv_.wait(lock);\n    Swap();\n  } else if (api_mode_ == kAPIEGLExtension) {\n    // Use eglPresentationTimeANDROID extension.\n    presentation_time_ += kFPSThrottlePresentationInterval;\n    eglPresentationTimeANDROID_(gl_context_->GetDisplay(),\n                                gl_context_->GetSurface(), presentation_time_);\n    Swap();\n  } else {\n    // Regular Swap.\n    Swap();\n  }\n}\n\n// Native Chreographer API support.\nvoid Engine::StartChoreographer() {\n  // Initiate choreographer callbacks.\n  if (api_mode_ == kAPINativeChoreographer) {\n    auto choreographer = AChoreographer_getInstance_();\n    AChoreographer_postFrameCallback_(choreographer, choreographer_callback,\n                                      this);\n  }\n}\n\n// Native Choreographer callback.\nvoid Engine::choreographer_callback(long frameTimeNanos, void* data) {\n  auto engine = reinterpret_cast<Engine*>(data);\n\n  // Post next callback for self.\n  if (engine->has_focus_) {\n    engine->StartChoreographer();\n  }\n\n  // Swap buffer if the timing meets the 30fps time interval condition.\n  // The callback is in the same thread context, so that we can just invoke\n  // eglSwapBuffers().\n  if (COULD_RENDER(frameTimeNanos, engine->prevFrameTimeNanos_)) {\n    engine->should_render_ = true;\n    engine->Swap();\n    // Wake up main looper so that it will continue rendering.\n    ALooper_wake(engine->app_->looper);\n    engine->prevFrameTimeNanos_ = frameTimeNanos;\n  }\n}\n\n// Java choreographer API support.\n// With Java API, we uses synch primitive to synchronize Java thread and render\n// thread.\nvoid Engine::StartJavaChoreographer() {\n  JNIEnv* jni;\n  app_->activity->vm->AttachCurrentThread(&jni, NULL);\n  // Intiate Java Chreographer API.\n  jclass clazz = jni->GetObjectClass(app_->activity->clazz);\n  jmethodID methodID = jni->GetMethodID(clazz, \"startChoreographer\", \"()V\");\n  jni->CallVoidMethod(app_->activity->clazz, methodID);\n  app_->activity->vm->DetachCurrentThread();\n  return;\n}\n\nvoid Engine::StopJavaChoreographer() {\n  JNIEnv* jni;\n  app_->activity->vm->AttachCurrentThread(&jni, NULL);\n  // Intiate Java Chreographer API.\n  jclass clazz = jni->GetObjectClass(app_->activity->clazz);\n  jmethodID methodID = jni->GetMethodID(clazz, \"stopChoreographer\", \"()V\");\n  jni->CallVoidMethod(app_->activity->clazz, methodID);\n  app_->activity->vm->DetachCurrentThread();\n  // Make sure the render thread is not blocked.\n  cv_.notify_one();\n  return;\n}\n\nvoid Engine::SynchInCallback(jlong frameTimeInNanos) {\n  // Signal render thread if the timing meets the 30fps time interval condition.\n  if (COULD_RENDER(frameTimeInNanos, prevFrameTimeNanos_)) {\n    prevFrameTimeNanos_ = frameTimeInNanos;\n    cv_.notify_one();\n  }\n};\n\nvoid ChoregrapherCallback(JNIEnv*, jobject, jlong frameTimeInNanos) {\n  g_engine.SynchInCallback(frameTimeInNanos);\n}\n\n// Helper functions.\nint64_t Engine::GetCurrentTime() {\n  timespec time;\n  clock_gettime(CLOCK_MONOTONIC, &time);\n  return static_cast<int64_t>(time.tv_sec) * 1e9 +\n         static_cast<int64_t>(time.tv_nsec);\n}\n\nvoid Engine::Swap() {\n  if (EGL_SUCCESS != gl_context_->Swap()) {\n    UnloadResources();\n    LoadResources();\n  }\n}\n\n/**\n * Load resources\n */\nvoid Engine::LoadResources() {\n  renderer_.Init();\n  renderer_.Bind(&tap_camera_);\n}\n\n/**\n * Unload resources\n */\nvoid Engine::UnloadResources() { renderer_.Unload(); }\n\n/**\n * Initialize an EGL context for the current display.\n */\nint Engine::InitDisplay(android_app* app) {\n  if (!initialized_resources_) {\n    gl_context_->Init(app_->window);\n    LoadResources();\n    initialized_resources_ = true;\n  } else if (app->window != gl_context_->GetANativeWindow()) {\n    // Re-initialize ANativeWindow.\n    // On some devices, ANativeWindow is re-created when the app is resumed\n    assert(gl_context_->GetANativeWindow());\n    UnloadResources();\n    gl_context_->Invalidate();\n    app_ = app;\n    gl_context_->Init(app->window);\n    LoadResources();\n    initialized_resources_ = true;\n  } else {\n    // initialize OpenGL ES and EGL\n    if (EGL_SUCCESS != gl_context_->Resume(app_->window)) {\n      UnloadResources();\n      LoadResources();\n    }\n  }\n\n  ShowUI();\n\n  // Initialize GL state.\n  glEnable(GL_CULL_FACE);\n  glEnable(GL_DEPTH_TEST);\n  glDepthFunc(GL_LEQUAL);\n\n  // Note that screen size might have been changed\n  glViewport(0, 0, gl_context_->GetScreenWidth(),\n             gl_context_->GetScreenHeight());\n  renderer_.UpdateViewport();\n\n  tap_camera_.SetFlip(1.f, -1.f, -1.f);\n  tap_camera_.SetPinchTransformFactor(2.f, 2.f, 8.f);\n\n  return 0;\n}\n\n/**\n * Just the current frame in the display.\n */\nvoid Engine::DrawFrame() {\n  float fps;\n  if (monitor_.Update(fps)) {\n    UpdateFPS(fps);\n  }\n  renderer_.Update(monitor_.GetCurrentTime());\n\n  // Just fill the screen with a color.\n  glClearColor(0.5f, 0.5f, 0.5f, 1.f);\n  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n  float color[2][3] = {{1.0f, 0.5f, 0.5f}, {1.0f, 0.0f, 0.0f}};\n  int32_t i = fps_throttle_ ? 0 : 1;\n  renderer_.Render(color[i][0], color[i][1], color[i][2]);\n  DoSwap();\n}\n\n/**\n * Tear down the EGL context currently associated with the display.\n */\nvoid Engine::TermDisplay() { gl_context_->Suspend(); }\n\nvoid Engine::TrimMemory() {\n  LOGI(\"Trimming memory\");\n  gl_context_->Invalidate();\n}\n\n/**\n * Process the next input event.\n */\nint32_t Engine::HandleInput(android_app* app, AInputEvent* event) {\n  Engine* eng = (Engine*)app->userData;\n  if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION) {\n    ndk_helper::GESTURE_STATE doubleTapState =\n        eng->doubletap_detector_.Detect(event);\n    ndk_helper::GESTURE_STATE dragState = eng->drag_detector_.Detect(event);\n    ndk_helper::GESTURE_STATE pinchState = eng->pinch_detector_.Detect(event);\n\n    // Double tap detector has a priority over other detectors\n    if (doubleTapState == ndk_helper::GESTURE_STATE_ACTION) {\n      // Detect double tap\n      eng->tap_camera_.Reset(true);\n\n      // Switch mode between 30FPS <-> 60FPS.\n      eng->fps_throttle_ = !eng->fps_throttle_;\n      LOGI(\"Switched FPS throttle mode.\");\n      if (eng->fps_throttle_) {\n        eng->StartFPSThrottle();\n      } else {\n        eng->StopFPSThrottle();\n      }\n    } else {\n      // Handle drag state\n      if (dragState & ndk_helper::GESTURE_STATE_START) {\n        // Otherwise, start dragging\n        ndk_helper::Vec2 v;\n        eng->drag_detector_.GetPointer(v);\n        eng->TransformPosition(v);\n        eng->tap_camera_.BeginDrag(v);\n      } else if (dragState & ndk_helper::GESTURE_STATE_MOVE) {\n        ndk_helper::Vec2 v;\n        eng->drag_detector_.GetPointer(v);\n        eng->TransformPosition(v);\n        eng->tap_camera_.Drag(v);\n      } else if (dragState & ndk_helper::GESTURE_STATE_END) {\n        eng->tap_camera_.EndDrag();\n      }\n\n      // Handle pinch state\n      if (pinchState & ndk_helper::GESTURE_STATE_START) {\n        // Start new pinch\n        ndk_helper::Vec2 v1;\n        ndk_helper::Vec2 v2;\n        eng->pinch_detector_.GetPointers(v1, v2);\n        eng->TransformPosition(v1);\n        eng->TransformPosition(v2);\n        eng->tap_camera_.BeginPinch(v1, v2);\n      } else if (pinchState & ndk_helper::GESTURE_STATE_MOVE) {\n        // Multi touch\n        // Start new pinch\n        ndk_helper::Vec2 v1;\n        ndk_helper::Vec2 v2;\n        eng->pinch_detector_.GetPointers(v1, v2);\n        eng->TransformPosition(v1);\n        eng->TransformPosition(v2);\n        eng->tap_camera_.Pinch(v1, v2);\n      }\n    }\n    return 1;\n  }\n  return 0;\n}\n\n/**\n * Process the next main command.\n */\nvoid Engine::HandleCmd(struct android_app* app, int32_t cmd) {\n  Engine* eng = (Engine*)app->userData;\n  switch (cmd) {\n    case APP_CMD_SAVE_STATE:\n      break;\n    case APP_CMD_INIT_WINDOW:\n      // The window is being shown, get it ready.\n      if (app->window != NULL) {\n        eng->InitDisplay(app);\n        eng->has_focus_ = true;\n        eng->DrawFrame();\n      }\n      break;\n    case APP_CMD_TERM_WINDOW:\n      // The window is being hidden or closed, clean it up.\n      eng->TermDisplay();\n      eng->has_focus_ = false;\n      break;\n    case APP_CMD_STOP:\n      break;\n    case APP_CMD_GAINED_FOCUS:\n      // Start animation\n      eng->has_focus_ = true;\n\n      // Update counter when the app becomes active.\n      eng->presentation_time_ = eng->GetCurrentTime();\n      if (eng->api_mode_ == kAPINativeChoreographer) {\n        eng->StartChoreographer();\n      }\n      break;\n    case APP_CMD_LOST_FOCUS:\n      // Also stop animating.\n      eng->has_focus_ = false;\n      eng->DrawFrame();\n      break;\n    case APP_CMD_LOW_MEMORY:\n      // Free up GL resources\n      eng->TrimMemory();\n      break;\n  }\n}\n\n//-------------------------------------------------------------------------\n// Misc\n//-------------------------------------------------------------------------\nvoid Engine::SetState(android_app* state) {\n  app_ = state;\n  doubletap_detector_.SetConfiguration(app_->config);\n  drag_detector_.SetConfiguration(app_->config);\n  pinch_detector_.SetConfiguration(app_->config);\n\n  CheckAPISupport();\n}\n\nbool Engine::IsReady() {\n  if (has_focus_ && should_render_) return true;\n\n  return false;\n}\n\nvoid Engine::TransformPosition(ndk_helper::Vec2& vec) {\n  vec = ndk_helper::Vec2(2.0f, 2.0f) * vec /\n            ndk_helper::Vec2(gl_context_->GetScreenWidth(),\n                             gl_context_->GetScreenHeight()) -\n        ndk_helper::Vec2(1.f, 1.f);\n}\n\nvoid Engine::ShowUI() {\n  JNIEnv* jni;\n  app_->activity->vm->AttachCurrentThread(&jni, NULL);\n\n  // Default class retrieval\n  jclass clazz = jni->GetObjectClass(app_->activity->clazz);\n  jmethodID methodID = jni->GetMethodID(clazz, \"showUI\", \"()V\");\n  jni->CallVoidMethod(app_->activity->clazz, methodID);\n\n  app_->activity->vm->DetachCurrentThread();\n  return;\n}\n\nvoid Engine::UpdateFPS(float fFPS) {\n  JNIEnv* jni;\n  app_->activity->vm->AttachCurrentThread(&jni, NULL);\n\n  // Default class retrieval\n  jclass clazz = jni->GetObjectClass(app_->activity->clazz);\n  jmethodID methodID = jni->GetMethodID(clazz, \"updateFPS\", \"(F)V\");\n  jni->CallVoidMethod(app_->activity->clazz, methodID, fFPS);\n\n  app_->activity->vm->DetachCurrentThread();\n  return;\n}\n\n/**\n * This is the main entry point of a native application that is using\n * android_native_app_glue.  It runs in its own thread, with its own\n * event loop for receiving input events and doing other things.\n */\nvoid android_main(android_app* state) {\n  g_engine.SetState(state);\n\n  // Init helper functions\n  ndk_helper::JNIHelper::Init(state->activity, HELPER_CLASS_NAME);\n\n  state->userData = &g_engine;\n  state->onAppCmd = Engine::HandleCmd;\n  state->onInputEvent = Engine::HandleInput;\n\n  // loop waiting for stuff to do.\n  while (!state->destroyRequested) {\n    // If not animating, we will block forever waiting for events.\n    // If animating, we loop until all events are read, then continue\n    // to draw the next frame of animation.\n    android_poll_source* source = nullptr;\n    auto result = ALooper_pollOnce(g_engine.IsReady() ? 0 : -1, nullptr,\n                                   nullptr, (void**)&source);\n    if (result == ALOOPER_POLL_ERROR) {\n      LOGE(\"ALooper_pollOnce returned an error\");\n      abort();\n    }\n\n    // Process this event.\n    if (source != NULL) source->process(state, source);\n\n    if (g_engine.IsReady()) {\n      // Drawing is throttled to the screen update rate, so there\n      // is no need to do timing here.\n      g_engine.DrawFrame();\n    }\n  }\n\n  g_engine.TermDisplay();\n}\n\nextern \"C\" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* _Nonnull vm,\n                                             void* _Nullable) {\n  JNIEnv* env;\n  if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {\n    return JNI_ERR;\n  }\n\n  jclass c =\n      env->FindClass(\"com/sample/choreographer/ChoreographerNativeActivity\");\n  if (c == nullptr) return JNI_ERR;\n\n  static const JNINativeMethod methods[] = {\n      {\"choregrapherCallback\", \"(J)V\",\n       reinterpret_cast<void*>(ChoregrapherCallback)},\n  };\n  int rc = env->RegisterNatives(c, methods, arraysize(methods));\n  if (rc != JNI_OK) return rc;\n\n  return JNI_VERSION_1_6;\n}\n"
  },
  {
    "path": "teapots/choreographer-30fps/src/main/cpp/TeapotRenderer.cpp",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//--------------------------------------------------------------------------------\n// TeapotRenderer.cpp\n// Render a teapot\n//--------------------------------------------------------------------------------\n//--------------------------------------------------------------------------------\n// Include files\n//--------------------------------------------------------------------------------\n#include \"TeapotRenderer.h\"\n\n//--------------------------------------------------------------------------------\n// Teapot model data\n//--------------------------------------------------------------------------------\n#include \"teapot.inl\"\n\n//--------------------------------------------------------------------------------\n// Ctor\n//--------------------------------------------------------------------------------\nTeapotRenderer::TeapotRenderer() {}\n\n//--------------------------------------------------------------------------------\n// Dtor\n//--------------------------------------------------------------------------------\nTeapotRenderer::~TeapotRenderer() { Unload(); }\n\nvoid TeapotRenderer::Init() {\n  // Settings\n  glFrontFace(GL_CCW);\n\n  // Load shader\n  LoadShaders(&shader_param_, \"Shaders/VS_ShaderPlain.vsh\",\n              \"Shaders/ShaderPlain.fsh\");\n\n  // Create Index buffer\n  num_indices_ = sizeof(teapotIndices) / sizeof(teapotIndices[0]);\n  glGenBuffers(1, &ibo_);\n  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo_);\n  glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(teapotIndices), teapotIndices,\n               GL_STATIC_DRAW);\n  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);\n\n  // Create VBO\n  num_vertices_ = sizeof(teapotPositions) / sizeof(teapotPositions[0]) / 3;\n  int32_t stride = sizeof(TEAPOT_VERTEX);\n  int32_t index = 0;\n  TEAPOT_VERTEX* p = new TEAPOT_VERTEX[num_vertices_];\n  for (int32_t i = 0; i < num_vertices_; ++i) {\n    p[i].pos[0] = teapotPositions[index];\n    p[i].pos[1] = teapotPositions[index + 1];\n    p[i].pos[2] = teapotPositions[index + 2];\n\n    p[i].normal[0] = teapotNormals[index];\n    p[i].normal[1] = teapotNormals[index + 1];\n    p[i].normal[2] = teapotNormals[index + 2];\n    index += 3;\n  }\n  glGenBuffers(1, &vbo_);\n  glBindBuffer(GL_ARRAY_BUFFER, vbo_);\n  glBufferData(GL_ARRAY_BUFFER, stride * num_vertices_, p, GL_STATIC_DRAW);\n  glBindBuffer(GL_ARRAY_BUFFER, 0);\n\n  delete[] p;\n\n  UpdateViewport();\n  mat_model_ = ndk_helper::Mat4::Translation(0, 0, -15.f);\n\n  ndk_helper::Mat4 mat = ndk_helper::Mat4::RotationX(M_PI / 3);\n  mat_model_ = mat * mat_model_;\n}\n\nvoid TeapotRenderer::UpdateViewport() {\n  // Init Projection matrices\n  int32_t viewport[4];\n  glGetIntegerv(GL_VIEWPORT, viewport);\n\n  const float CAM_NEAR = 5.f;\n  const float CAM_FAR = 10000.f;\n  if (viewport[2] < viewport[3]) {\n    float aspect =\n        static_cast<float>(viewport[2]) / static_cast<float>(viewport[3]);\n    mat_projection_ =\n        ndk_helper::Mat4::Perspective(aspect, 1.0f, CAM_NEAR, CAM_FAR);\n  } else {\n    float aspect =\n        static_cast<float>(viewport[3]) / static_cast<float>(viewport[2]);\n    mat_projection_ =\n        ndk_helper::Mat4::Perspective(1.0f, aspect, CAM_NEAR, CAM_FAR);\n  }\n}\n\nvoid TeapotRenderer::Unload() {\n  if (vbo_) {\n    glDeleteBuffers(1, &vbo_);\n    vbo_ = 0;\n  }\n\n  if (ibo_) {\n    glDeleteBuffers(1, &ibo_);\n    ibo_ = 0;\n  }\n\n  if (shader_param_.program_) {\n    glDeleteProgram(shader_param_.program_);\n    shader_param_.program_ = 0;\n  }\n}\n\nvoid TeapotRenderer::Update(double time) {\n  const float CAM_X = 0.f;\n  const float CAM_Y = 0.f;\n  const float CAM_Z = 700.f;\n\n  mat_view_ = ndk_helper::Mat4::LookAt(ndk_helper::Vec3(CAM_X, CAM_Y, CAM_Z),\n                                       ndk_helper::Vec3(0.f, 0.f, 0.f),\n                                       ndk_helper::Vec3(0.f, 1.f, 0.f));\n\n  if (camera_) {\n    camera_->Update(time);\n    mat_view_ = camera_->GetTransformMatrix() * mat_view_ *\n                camera_->GetRotationMatrix() * mat_model_;\n  } else {\n    mat_view_ = mat_view_ * mat_model_;\n  }\n}\n\nvoid TeapotRenderer::Render(float r, float g, float b) {\n  //\n  // Feed Projection and Model View matrices to the shaders\n  ndk_helper::Mat4 mat_vp = mat_projection_ * mat_view_;\n\n  // Bind the VBO\n  glBindBuffer(GL_ARRAY_BUFFER, vbo_);\n\n  int32_t iStride = sizeof(TEAPOT_VERTEX);\n  // Pass the vertex data\n  glVertexAttribPointer(ATTRIB_VERTEX, 3, GL_FLOAT, GL_FALSE, iStride, nullptr);\n  glEnableVertexAttribArray(ATTRIB_VERTEX);\n\n  glVertexAttribPointer(ATTRIB_NORMAL, 3, GL_FLOAT, GL_FALSE, iStride,\n                        reinterpret_cast<void*>(3 * sizeof(GLfloat)));\n  glEnableVertexAttribArray(ATTRIB_NORMAL);\n\n  // Bind the IB\n  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo_);\n\n  glUseProgram(shader_param_.program_);\n\n  TEAPOT_MATERIALS material = {\n      {r, g, b},\n      {1.0f, 1.0f, 1.0f, 10.f},\n      {0.1f, 0.1f, 0.1f},\n  };\n\n  // Update uniforms\n  glUniform4f(shader_param_.material_diffuse_, material.diffuse_color[0],\n              material.diffuse_color[1], material.diffuse_color[2], 1.f);\n\n  glUniform4f(shader_param_.material_specular_, material.specular_color[0],\n              material.specular_color[1], material.specular_color[2],\n              material.specular_color[3]);\n  //\n  // using glUniform3fv here was troublesome\n  //\n  glUniform3f(shader_param_.material_ambient_, material.ambient_color[0],\n              material.ambient_color[1], material.ambient_color[2]);\n\n  glUniformMatrix4fv(shader_param_.matrix_projection_, 1, GL_FALSE,\n                     mat_vp.Ptr());\n  glUniformMatrix4fv(shader_param_.matrix_view_, 1, GL_FALSE, mat_view_.Ptr());\n  glUniform3f(shader_param_.light0_, 100.f, -200.f, -600.f);\n\n  glDrawElements(GL_TRIANGLES, num_indices_, GL_UNSIGNED_SHORT, nullptr);\n\n  glBindBuffer(GL_ARRAY_BUFFER, 0);\n  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);\n}\n\nbool TeapotRenderer::LoadShaders(SHADER_PARAMS* params, const char* strVsh,\n                                 const char* strFsh) {\n  GLuint program;\n  GLuint vert_shader, frag_shader;\n\n  // Create shader program\n  program = glCreateProgram();\n  LOGI(\"Created Shader %d\", program);\n\n  // Create and compile vertex shader\n  if (!ndk_helper::shader::CompileShader(&vert_shader, GL_VERTEX_SHADER,\n                                         strVsh)) {\n    LOGI(\"Failed to compile vertex shader\");\n    glDeleteProgram(program);\n    return false;\n  }\n\n  // Create and compile fragment shader\n  if (!ndk_helper::shader::CompileShader(&frag_shader, GL_FRAGMENT_SHADER,\n                                         strFsh)) {\n    LOGI(\"Failed to compile fragment shader\");\n    glDeleteProgram(program);\n    return false;\n  }\n\n  // Attach vertex shader to program\n  glAttachShader(program, vert_shader);\n\n  // Attach fragment shader to program\n  glAttachShader(program, frag_shader);\n\n  // Bind attribute locations\n  // this needs to be done prior to linking\n  glBindAttribLocation(program, ATTRIB_VERTEX, \"myVertex\");\n  glBindAttribLocation(program, ATTRIB_NORMAL, \"myNormal\");\n  glBindAttribLocation(program, ATTRIB_UV, \"myUV\");\n\n  // Link program\n  if (!ndk_helper::shader::LinkProgram(program)) {\n    LOGI(\"Failed to link program: %d\", program);\n\n    if (vert_shader) {\n      glDeleteShader(vert_shader);\n      vert_shader = 0;\n    }\n    if (frag_shader) {\n      glDeleteShader(frag_shader);\n      frag_shader = 0;\n    }\n    if (program) {\n      glDeleteProgram(program);\n    }\n\n    return false;\n  }\n\n  // Get uniform locations\n  params->matrix_projection_ = glGetUniformLocation(program, \"uPMatrix\");\n  params->matrix_view_ = glGetUniformLocation(program, \"uMVMatrix\");\n\n  params->light0_ = glGetUniformLocation(program, \"vLight0\");\n  params->material_diffuse_ = glGetUniformLocation(program, \"vMaterialDiffuse\");\n  params->material_ambient_ = glGetUniformLocation(program, \"vMaterialAmbient\");\n  params->material_specular_ =\n      glGetUniformLocation(program, \"vMaterialSpecular\");\n\n  // Release vertex and fragment shaders\n  if (vert_shader) glDeleteShader(vert_shader);\n  if (frag_shader) glDeleteShader(frag_shader);\n\n  params->program_ = program;\n  return true;\n}\n\nbool TeapotRenderer::Bind(ndk_helper::TapCamera* camera) {\n  camera_ = camera;\n  return true;\n}\n"
  },
  {
    "path": "teapots/choreographer-30fps/src/main/cpp/TeapotRenderer.h",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//--------------------------------------------------------------------------------\n// Teapot Renderer.h\n// Renderer for teapots\n//--------------------------------------------------------------------------------\n#ifndef _TEAPOTRENDERER_H\n#define _TEAPOTRENDERER_H\n\n//--------------------------------------------------------------------------------\n// Include files\n//--------------------------------------------------------------------------------\n#include <EGL/egl.h>\n#include <GLES/gl.h>\n#include <android/log.h>\n#include <android/native_window_jni.h>\n#include <android/sensor.h>\n#include <android_native_app_glue.h>\n#include <errno.h>\n#include <jni.h>\n\n#include <vector>\n\n#define CLASS_NAME \"android/app/NativeActivity\"\n#define APPLICATION_CLASS_NAME \"com/sample/teapot/TeapotApplication\"\n\n#include \"NDKHelper.h\"\n\nstruct TEAPOT_VERTEX {\n  float pos[3];\n  float normal[3];\n};\n\nenum SHADER_ATTRIBUTES {\n  ATTRIB_VERTEX,\n  ATTRIB_NORMAL,\n  ATTRIB_UV,\n};\n\nstruct SHADER_PARAMS {\n  GLuint program_;\n  GLuint light0_;\n  GLuint material_diffuse_;\n  GLuint material_ambient_;\n  GLuint material_specular_;\n\n  GLuint matrix_projection_;\n  GLuint matrix_view_;\n};\n\nstruct TEAPOT_MATERIALS {\n  float diffuse_color[3];\n  float specular_color[4];\n  float ambient_color[3];\n};\n\nclass TeapotRenderer {\n  int32_t num_indices_;\n  int32_t num_vertices_;\n  GLuint ibo_;\n  GLuint vbo_;\n\n  SHADER_PARAMS shader_param_;\n  bool LoadShaders(SHADER_PARAMS* params, const char* strVsh,\n                   const char* strFsh);\n\n  ndk_helper::Mat4 mat_projection_;\n  ndk_helper::Mat4 mat_view_;\n  ndk_helper::Mat4 mat_model_;\n\n  ndk_helper::TapCamera* camera_;\n\n public:\n  TeapotRenderer();\n  virtual ~TeapotRenderer();\n  void Init();\n  void Render(float r, float g, float b);\n  void Update(double time);\n  bool Bind(ndk_helper::TapCamera* camera);\n  void Unload();\n  void UpdateViewport();\n};\n\n#endif\n"
  },
  {
    "path": "teapots/choreographer-30fps/src/main/cpp/libChoreographerNativeActivity.map.txt",
    "content": "LIBCHOREOGRAPHERNATIVEACTIVITY {\n  global:\n    ANativeActivity_onCreate;\n    JNI_OnLoad;\n  local:\n    *;\n};\n"
  },
  {
    "path": "teapots/choreographer-30fps/src/main/cpp/teapot.inl",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//\n// Teapot.inl\n// Derived from WebGL sample\n// https://github.com/KhronosGroup/WebGL/blob/master/sdk/demos/google/shiny-teapot/teapot-streams.js\n//\n\nfloat teapotPositions[] = {17.83489990234375,\n                           0,\n                           30.573999404907227,\n                           16.452699661254883,\n                           -7.000179767608643,\n                           30.573999404907227,\n                           16.223100662231445,\n                           -6.902520179748535,\n                           31.51460075378418,\n                           17.586000442504883,\n                           0,\n                           31.51460075378418,\n                           16.48940086364746,\n                           -7.015810012817383,\n                           31.828100204467773,\n                           17.87470054626465,\n                           0,\n                           31.828100204467773,\n                           17.031099319458008,\n                           -7.246280193328857,\n                           31.51460075378418,\n                           18.46190071105957,\n                           0,\n                           31.51460075378418,\n                           17.62779998779297,\n                           -7.500199794769287,\n                           30.573999404907227,\n                           19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           12.662699699401855,\n                           -12.662699699401855,\n                           30.573999404907227,\n                           12.486100196838379,\n                           -12.486100196838379,\n                           31.51460075378418,\n                           12.690999984741211,\n                           -12.690999984741211,\n                           31.828100204467773,\n                           13.10789966583252,\n                           -13.10789966583252,\n                           31.51460075378418,\n                           13.56719970703125,\n                           -13.56719970703125,\n                           30.573999404907227,\n                           7.000179767608643,\n                           -16.452699661254883,\n                           30.573999404907227,\n                           6.902520179748535,\n                           -16.223100662231445,\n                           31.51460075378418,\n                           7.015810012817383,\n                           -16.48940086364746,\n                           31.828100204467773,\n                           7.246280193328857,\n                           -17.031099319458008,\n                           31.51460075378418,\n                           7.500199794769287,\n                           -17.62779998779297,\n                           30.573999404907227,\n                           0,\n                           -17.83489990234375,\n                           30.573999404907227,\n                           0,\n                           -17.586000442504883,\n                           31.51460075378418,\n                           0,\n                           -17.87470054626465,\n                           31.828100204467773,\n                           0,\n                           -18.46190071105957,\n                           31.51460075378418,\n                           0,\n                           -19.108800888061523,\n                           30.573999404907227,\n                           0,\n                           -17.83489990234375,\n                           30.573999404907227,\n                           -7.483870029449463,\n                           -16.452699661254883,\n                           30.573999404907227,\n                           -7.106579780578613,\n                           -16.223100662231445,\n                           31.51460075378418,\n                           0,\n                           -17.586000442504883,\n                           31.51460075378418,\n                           -7.07627010345459,\n                           -16.48940086364746,\n                           31.828100204467773,\n                           0,\n                           -17.87470054626465,\n                           31.828100204467773,\n                           -7.25383996963501,\n                           -17.031099319458008,\n                           31.51460075378418,\n                           0,\n                           -18.46190071105957,\n                           31.51460075378418,\n                           -7.500199794769287,\n                           -17.62779998779297,\n                           30.573999404907227,\n                           0,\n                           -19.108800888061523,\n                           30.573999404907227,\n                           -13.092700004577637,\n                           -12.662699699401855,\n                           30.573999404907227,\n                           -12.667499542236328,\n                           -12.486100196838379,\n                           31.51460075378418,\n                           -12.744799613952637,\n                           -12.690999984741211,\n                           31.828100204467773,\n                           -13.11460018157959,\n                           -13.10789966583252,\n                           31.51460075378418,\n                           -13.56719970703125,\n                           -13.56719970703125,\n                           30.573999404907227,\n                           -16.61389923095703,\n                           -7.000179767608643,\n                           30.573999404907227,\n                           -16.291099548339844,\n                           -6.902520179748535,\n                           31.51460075378418,\n                           -16.50950050354004,\n                           -7.015810012817383,\n                           31.828100204467773,\n                           -17.033599853515625,\n                           -7.246280193328857,\n                           31.51460075378418,\n                           -17.62779998779297,\n                           -7.500199794769287,\n                           30.573999404907227,\n                           -17.83489990234375,\n                           0,\n                           30.573999404907227,\n                           -17.586000442504883,\n                           0,\n                           31.51460075378418,\n                           -17.87470054626465,\n                           0,\n                           31.828100204467773,\n                           -18.46190071105957,\n                           0,\n                           31.51460075378418,\n                           -19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           -17.83489990234375,\n                           0,\n                           30.573999404907227,\n                           -16.452699661254883,\n                           7.000179767608643,\n                           30.573999404907227,\n                           -16.223100662231445,\n                           6.902520179748535,\n                           31.51460075378418,\n                           -17.586000442504883,\n                           0,\n                           31.51460075378418,\n                           -16.48940086364746,\n                           7.015810012817383,\n                           31.828100204467773,\n                           -17.87470054626465,\n                           0,\n                           31.828100204467773,\n                           -17.031099319458008,\n                           7.246280193328857,\n                           31.51460075378418,\n                           -18.46190071105957,\n                           0,\n                           31.51460075378418,\n                           -17.62779998779297,\n                           7.500199794769287,\n                           30.573999404907227,\n                           -19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           -12.662699699401855,\n                           12.662699699401855,\n                           30.573999404907227,\n                           -12.486100196838379,\n                           12.486100196838379,\n                           31.51460075378418,\n                           -12.690999984741211,\n                           12.690999984741211,\n                           31.828100204467773,\n                           -13.10789966583252,\n                           13.10789966583252,\n                           31.51460075378418,\n                           -13.56719970703125,\n                           13.56719970703125,\n                           30.573999404907227,\n                           -7.000179767608643,\n                           16.452699661254883,\n                           30.573999404907227,\n                           -6.902520179748535,\n                           16.223100662231445,\n                           31.51460075378418,\n                           -7.015810012817383,\n                           16.48940086364746,\n                           31.828100204467773,\n                           -7.246280193328857,\n                           17.031099319458008,\n                           31.51460075378418,\n                           -7.500199794769287,\n                           17.62779998779297,\n                           30.573999404907227,\n                           0,\n                           17.83489990234375,\n                           30.573999404907227,\n                           0,\n                           17.586000442504883,\n                           31.51460075378418,\n                           0,\n                           17.87470054626465,\n                           31.828100204467773,\n                           0,\n                           18.46190071105957,\n                           31.51460075378418,\n                           0,\n                           19.108800888061523,\n                           30.573999404907227,\n                           0,\n                           17.83489990234375,\n                           30.573999404907227,\n                           7.000179767608643,\n                           16.452699661254883,\n                           30.573999404907227,\n                           6.902520179748535,\n                           16.223100662231445,\n                           31.51460075378418,\n                           0,\n                           17.586000442504883,\n                           31.51460075378418,\n                           7.015810012817383,\n                           16.48940086364746,\n                           31.828100204467773,\n                           0,\n                           17.87470054626465,\n                           31.828100204467773,\n                           7.246280193328857,\n                           17.031099319458008,\n                           31.51460075378418,\n                           0,\n                           18.46190071105957,\n                           31.51460075378418,\n                           7.500199794769287,\n                           17.62779998779297,\n                           30.573999404907227,\n                           0,\n                           19.108800888061523,\n                           30.573999404907227,\n                           12.662699699401855,\n                           12.662699699401855,\n                           30.573999404907227,\n                           12.486100196838379,\n                           12.486100196838379,\n                           31.51460075378418,\n                           12.690999984741211,\n                           12.690999984741211,\n                           31.828100204467773,\n                           13.10789966583252,\n                           13.10789966583252,\n                           31.51460075378418,\n                           13.56719970703125,\n                           13.56719970703125,\n                           30.573999404907227,\n                           16.452699661254883,\n                           7.000179767608643,\n                           30.573999404907227,\n                           16.223100662231445,\n                           6.902520179748535,\n                           31.51460075378418,\n                           16.48940086364746,\n                           7.015810012817383,\n                           31.828100204467773,\n                           17.031099319458008,\n                           7.246280193328857,\n                           31.51460075378418,\n                           17.62779998779297,\n                           7.500199794769287,\n                           30.573999404907227,\n                           17.83489990234375,\n                           0,\n                           30.573999404907227,\n                           17.586000442504883,\n                           0,\n                           31.51460075378418,\n                           17.87470054626465,\n                           0,\n                           31.828100204467773,\n                           18.46190071105957,\n                           0,\n                           31.51460075378418,\n                           19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           17.62779998779297,\n                           -7.500199794769287,\n                           30.573999404907227,\n                           19.785400390625,\n                           -8.418190002441406,\n                           25.572900772094727,\n                           21.447599411010742,\n                           0,\n                           25.572900772094727,\n                           21.667600631713867,\n                           -9.218990325927734,\n                           20.661399841308594,\n                           23.487899780273438,\n                           0,\n                           20.661399841308594,\n                           22.99880027770996,\n                           -9.785409927368164,\n                           15.928999900817871,\n                           24.930999755859375,\n                           0,\n                           15.928999900817871,\n                           23.503799438476562,\n                           -10.000300407409668,\n                           11.465299606323242,\n                           25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           13.56719970703125,\n                           -13.56719970703125,\n                           30.573999404907227,\n                           15.227800369262695,\n                           -15.227800369262695,\n                           25.572900772094727,\n                           16.67639923095703,\n                           -16.67639923095703,\n                           20.661399841308594,\n                           17.701000213623047,\n                           -17.701000213623047,\n                           15.928999900817871,\n                           18.089599609375,\n                           -18.089599609375,\n                           11.465299606323242,\n                           7.500199794769287,\n                           -17.62779998779297,\n                           30.573999404907227,\n                           8.418190002441406,\n                           -19.785400390625,\n                           25.572900772094727,\n                           9.218990325927734,\n                           -21.667600631713867,\n                           20.661399841308594,\n                           9.785409927368164,\n                           -22.99880027770996,\n                           15.928999900817871,\n                           10.000300407409668,\n                           -23.503799438476562,\n                           11.465299606323242,\n                           0,\n                           -19.108800888061523,\n                           30.573999404907227,\n                           0,\n                           -21.447599411010742,\n                           25.572900772094727,\n                           0,\n                           -23.487899780273438,\n                           20.661399841308594,\n                           0,\n                           -24.930999755859375,\n                           15.928999900817871,\n                           0,\n                           -25.4783992767334,\n                           11.465299606323242,\n                           0,\n                           -19.108800888061523,\n                           30.573999404907227,\n                           -7.500199794769287,\n                           -17.62779998779297,\n                           30.573999404907227,\n                           -8.418190002441406,\n                           -19.785400390625,\n                           25.572900772094727,\n                           0,\n                           -21.447599411010742,\n                           25.572900772094727,\n                           -9.218990325927734,\n                           -21.667600631713867,\n                           20.661399841308594,\n                           0,\n                           -23.487899780273438,\n                           20.661399841308594,\n                           -9.785409927368164,\n                           -22.99880027770996,\n                           15.928999900817871,\n                           0,\n                           -24.930999755859375,\n                           15.928999900817871,\n                           -10.000300407409668,\n                           -23.503799438476562,\n                           11.465299606323242,\n                           0,\n                           -25.4783992767334,\n                           11.465299606323242,\n                           -13.56719970703125,\n                           -13.56719970703125,\n                           30.573999404907227,\n                           -15.227800369262695,\n                           -15.227800369262695,\n                           25.572900772094727,\n                           -16.67639923095703,\n                           -16.67639923095703,\n                           20.661399841308594,\n                           -17.701000213623047,\n                           -17.701000213623047,\n                           15.928999900817871,\n                           -18.089599609375,\n                           -18.089599609375,\n                           11.465299606323242,\n                           -17.62779998779297,\n                           -7.500199794769287,\n                           30.573999404907227,\n                           -19.785400390625,\n                           -8.418190002441406,\n                           25.572900772094727,\n                           -21.667600631713867,\n                           -9.218990325927734,\n                           20.661399841308594,\n                           -22.99880027770996,\n                           -9.785409927368164,\n                           15.928999900817871,\n                           -23.503799438476562,\n                           -10.000300407409668,\n                           11.465299606323242,\n                           -19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           -21.447599411010742,\n                           0,\n                           25.572900772094727,\n                           -23.487899780273438,\n                           0,\n                           20.661399841308594,\n                           -24.930999755859375,\n                           0,\n                           15.928999900817871,\n                           -25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           -19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           -17.62779998779297,\n                           7.500199794769287,\n                           30.573999404907227,\n                           -19.785400390625,\n                           8.418190002441406,\n                           25.572900772094727,\n                           -21.447599411010742,\n                           0,\n                           25.572900772094727,\n                           -21.667600631713867,\n                           9.218990325927734,\n                           20.661399841308594,\n                           -23.487899780273438,\n                           0,\n                           20.661399841308594,\n                           -22.99880027770996,\n                           9.785409927368164,\n                           15.928999900817871,\n                           -24.930999755859375,\n                           0,\n                           15.928999900817871,\n                           -23.503799438476562,\n                           10.000300407409668,\n                           11.465299606323242,\n                           -25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           -13.56719970703125,\n                           13.56719970703125,\n                           30.573999404907227,\n                           -15.227800369262695,\n                           15.227800369262695,\n                           25.572900772094727,\n                           -16.67639923095703,\n                           16.67639923095703,\n                           20.661399841308594,\n                           -17.701000213623047,\n                           17.701000213623047,\n                           15.928999900817871,\n                           -18.089599609375,\n                           18.089599609375,\n                           11.465299606323242,\n                           -7.500199794769287,\n                           17.62779998779297,\n                           30.573999404907227,\n                           -8.418190002441406,\n                           19.785400390625,\n                           25.572900772094727,\n                           -9.218990325927734,\n                           21.667600631713867,\n                           20.661399841308594,\n                           -9.785409927368164,\n                           22.99880027770996,\n                           15.928999900817871,\n                           -10.000300407409668,\n                           23.503799438476562,\n                           11.465299606323242,\n                           0,\n                           19.108800888061523,\n                           30.573999404907227,\n                           0,\n                           21.447599411010742,\n                           25.572900772094727,\n                           0,\n                           23.487899780273438,\n                           20.661399841308594,\n                           0,\n                           24.930999755859375,\n                           15.928999900817871,\n                           0,\n                           25.4783992767334,\n                           11.465299606323242,\n                           0,\n                           19.108800888061523,\n                           30.573999404907227,\n                           7.500199794769287,\n                           17.62779998779297,\n                           30.573999404907227,\n                           8.418190002441406,\n                           19.785400390625,\n                           25.572900772094727,\n                           0,\n                           21.447599411010742,\n                           25.572900772094727,\n                           9.218990325927734,\n                           21.667600631713867,\n                           20.661399841308594,\n                           0,\n                           23.487899780273438,\n                           20.661399841308594,\n                           9.785409927368164,\n                           22.99880027770996,\n                           15.928999900817871,\n                           0,\n                           24.930999755859375,\n                           15.928999900817871,\n                           10.000300407409668,\n                           23.503799438476562,\n                           11.465299606323242,\n                           0,\n                           25.4783992767334,\n                           11.465299606323242,\n                           13.56719970703125,\n                           13.56719970703125,\n                           30.573999404907227,\n                           15.227800369262695,\n                           15.227800369262695,\n                           25.572900772094727,\n                           16.67639923095703,\n                           16.67639923095703,\n                           20.661399841308594,\n                           17.701000213623047,\n                           17.701000213623047,\n                           15.928999900817871,\n                           18.089599609375,\n                           18.089599609375,\n                           11.465299606323242,\n                           17.62779998779297,\n                           7.500199794769287,\n                           30.573999404907227,\n                           19.785400390625,\n                           8.418190002441406,\n                           25.572900772094727,\n                           21.667600631713867,\n                           9.218990325927734,\n                           20.661399841308594,\n                           22.99880027770996,\n                           9.785409927368164,\n                           15.928999900817871,\n                           23.503799438476562,\n                           10.000300407409668,\n                           11.465299606323242,\n                           19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           21.447599411010742,\n                           0,\n                           25.572900772094727,\n                           23.487899780273438,\n                           0,\n                           20.661399841308594,\n                           24.930999755859375,\n                           0,\n                           15.928999900817871,\n                           25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           23.503799438476562,\n                           -10.000300407409668,\n                           11.465299606323242,\n                           22.5856990814209,\n                           -9.609620094299316,\n                           7.688300132751465,\n                           24.48310089111328,\n                           0,\n                           7.688300132751465,\n                           20.565799713134766,\n                           -8.750229835510254,\n                           4.89661979675293,\n                           22.29360008239746,\n                           0,\n                           4.89661979675293,\n                           18.54599952697754,\n                           -7.890830039978027,\n                           3.0006699562072754,\n                           20.104000091552734,\n                           0,\n                           3.0006699562072754,\n                           17.62779998779297,\n                           -7.500199794769287,\n                           1.9108799695968628,\n                           19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           18.089599609375,\n                           -18.089599609375,\n                           11.465299606323242,\n                           17.382999420166016,\n                           -17.382999420166016,\n                           7.688300132751465,\n                           15.828399658203125,\n                           -15.828399658203125,\n                           4.89661979675293,\n                           14.273900032043457,\n                           -14.273900032043457,\n                           3.0006699562072754,\n                           13.56719970703125,\n                           -13.56719970703125,\n                           1.9108799695968628,\n                           10.000300407409668,\n                           -23.503799438476562,\n                           11.465299606323242,\n                           9.609620094299316,\n                           -22.5856990814209,\n                           7.688300132751465,\n                           8.750229835510254,\n                           -20.565799713134766,\n                           4.89661979675293,\n                           7.890830039978027,\n                           -18.54599952697754,\n                           3.0006699562072754,\n                           7.500199794769287,\n                           -17.62779998779297,\n                           1.9108799695968628,\n                           0,\n                           -25.4783992767334,\n                           11.465299606323242,\n                           0,\n                           -24.48310089111328,\n                           7.688300132751465,\n                           0,\n                           -22.29360008239746,\n                           4.89661979675293,\n                           0,\n                           -20.104000091552734,\n                           3.0006699562072754,\n                           0,\n                           -19.108800888061523,\n                           1.9108799695968628,\n                           0,\n                           -25.4783992767334,\n                           11.465299606323242,\n                           -10.000300407409668,\n                           -23.503799438476562,\n                           11.465299606323242,\n                           -9.609620094299316,\n                           -22.5856990814209,\n                           7.688300132751465,\n                           0,\n                           -24.48310089111328,\n                           7.688300132751465,\n                           -8.750229835510254,\n                           -20.565799713134766,\n                           4.89661979675293,\n                           0,\n                           -22.29360008239746,\n                           4.89661979675293,\n                           -7.890830039978027,\n                           -18.54599952697754,\n                           3.0006699562072754,\n                           0,\n                           -20.104000091552734,\n                           3.0006699562072754,\n                           -7.500199794769287,\n                           -17.62779998779297,\n                           1.9108799695968628,\n                           0,\n                           -19.108800888061523,\n                           1.9108799695968628,\n                           -18.089599609375,\n                           -18.089599609375,\n                           11.465299606323242,\n                           -17.382999420166016,\n                           -17.382999420166016,\n                           7.688300132751465,\n                           -15.828399658203125,\n                           -15.828399658203125,\n                           4.89661979675293,\n                           -14.273900032043457,\n                           -14.273900032043457,\n                           3.0006699562072754,\n                           -13.56719970703125,\n                           -13.56719970703125,\n                           1.9108799695968628,\n                           -23.503799438476562,\n                           -10.000300407409668,\n                           11.465299606323242,\n                           -22.5856990814209,\n                           -9.609620094299316,\n                           7.688300132751465,\n                           -20.565799713134766,\n                           -8.750229835510254,\n                           4.89661979675293,\n                           -18.54599952697754,\n                           -7.890830039978027,\n                           3.0006699562072754,\n                           -17.62779998779297,\n                           -7.500199794769287,\n                           1.9108799695968628,\n                           -25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           -24.48310089111328,\n                           0,\n                           7.688300132751465,\n                           -22.29360008239746,\n                           0,\n                           4.89661979675293,\n                           -20.104000091552734,\n                           0,\n                           3.0006699562072754,\n                           -19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           -25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           -23.503799438476562,\n                           10.000300407409668,\n                           11.465299606323242,\n                           -22.5856990814209,\n                           9.609620094299316,\n                           7.688300132751465,\n                           -24.48310089111328,\n                           0,\n                           7.688300132751465,\n                           -20.565799713134766,\n                           8.750229835510254,\n                           4.89661979675293,\n                           -22.29360008239746,\n                           0,\n                           4.89661979675293,\n                           -18.54599952697754,\n                           7.890830039978027,\n                           3.0006699562072754,\n                           -20.104000091552734,\n                           0,\n                           3.0006699562072754,\n                           -17.62779998779297,\n                           7.500199794769287,\n                           1.9108799695968628,\n                           -19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           -18.089599609375,\n                           18.089599609375,\n                           11.465299606323242,\n                           -17.382999420166016,\n                           17.382999420166016,\n                           7.688300132751465,\n                           -15.828399658203125,\n                           15.828399658203125,\n                           4.89661979675293,\n                           -14.273900032043457,\n                           14.273900032043457,\n                           3.0006699562072754,\n                           -13.56719970703125,\n                           13.56719970703125,\n                           1.9108799695968628,\n                           -10.000300407409668,\n                           23.503799438476562,\n                           11.465299606323242,\n                           -9.609620094299316,\n                           22.5856990814209,\n                           7.688300132751465,\n                           -8.750229835510254,\n                           20.565799713134766,\n                           4.89661979675293,\n                           -7.890830039978027,\n                           18.54599952697754,\n                           3.0006699562072754,\n                           -7.500199794769287,\n                           17.62779998779297,\n                           1.9108799695968628,\n                           0,\n                           25.4783992767334,\n                           11.465299606323242,\n                           0,\n                           24.48310089111328,\n                           7.688300132751465,\n                           0,\n                           22.29360008239746,\n                           4.89661979675293,\n                           0,\n                           20.104000091552734,\n                           3.0006699562072754,\n                           0,\n                           19.108800888061523,\n                           1.9108799695968628,\n                           0,\n                           25.4783992767334,\n                           11.465299606323242,\n                           10.000300407409668,\n                           23.503799438476562,\n                           11.465299606323242,\n                           9.609620094299316,\n                           22.5856990814209,\n                           7.688300132751465,\n                           0,\n                           24.48310089111328,\n                           7.688300132751465,\n                           8.750229835510254,\n                           20.565799713134766,\n                           4.89661979675293,\n                           0,\n                           22.29360008239746,\n                           4.89661979675293,\n                           7.890830039978027,\n                           18.54599952697754,\n                           3.0006699562072754,\n                           0,\n                           20.104000091552734,\n                           3.0006699562072754,\n                           7.500199794769287,\n                           17.62779998779297,\n                           1.9108799695968628,\n                           0,\n                           19.108800888061523,\n                           1.9108799695968628,\n                           18.089599609375,\n                           18.089599609375,\n                           11.465299606323242,\n                           17.382999420166016,\n                           17.382999420166016,\n                           7.688300132751465,\n                           15.828399658203125,\n                           15.828399658203125,\n                           4.89661979675293,\n                           14.273900032043457,\n                           14.273900032043457,\n                           3.0006699562072754,\n                           13.56719970703125,\n                           13.56719970703125,\n                           1.9108799695968628,\n                           23.503799438476562,\n                           10.000300407409668,\n                           11.465299606323242,\n                           22.5856990814209,\n                           9.609620094299316,\n                           7.688300132751465,\n                           20.565799713134766,\n                           8.750229835510254,\n                           4.89661979675293,\n                           18.54599952697754,\n                           7.890830039978027,\n                           3.0006699562072754,\n                           17.62779998779297,\n                           7.500199794769287,\n                           1.9108799695968628,\n                           25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           24.48310089111328,\n                           0,\n                           7.688300132751465,\n                           22.29360008239746,\n                           0,\n                           4.89661979675293,\n                           20.104000091552734,\n                           0,\n                           3.0006699562072754,\n                           19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           17.62779998779297,\n                           -7.500199794769287,\n                           1.9108799695968628,\n                           17.228500366210938,\n                           -7.330269813537598,\n                           1.2092299461364746,\n                           18.675800323486328,\n                           0,\n                           1.2092299461364746,\n                           15.093799591064453,\n                           -6.422039985656738,\n                           0.5971490144729614,\n                           16.361900329589844,\n                           0,\n                           0.5971490144729614,\n                           9.819259643554688,\n                           -4.177840232849121,\n                           0.16421599686145782,\n                           10.644200325012207,\n                           0,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           13.56719970703125,\n                           -13.56719970703125,\n                           1.9108799695968628,\n                           13.25979995727539,\n                           -13.25979995727539,\n                           1.2092299461364746,\n                           11.616900444030762,\n                           -11.616900444030762,\n                           0.5971490144729614,\n                           7.557370185852051,\n                           -7.557370185852051,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           7.500199794769287,\n                           -17.62779998779297,\n                           1.9108799695968628,\n                           7.330269813537598,\n                           -17.228500366210938,\n                           1.2092299461364746,\n                           6.422039985656738,\n                           -15.093799591064453,\n                           0.5971490144729614,\n                           4.177840232849121,\n                           -9.819259643554688,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           -19.108800888061523,\n                           1.9108799695968628,\n                           0,\n                           -18.675800323486328,\n                           1.2092299461364746,\n                           0,\n                           -16.361900329589844,\n                           0.5971490144729614,\n                           0,\n                           -10.644200325012207,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           -19.108800888061523,\n                           1.9108799695968628,\n                           -7.500199794769287,\n                           -17.62779998779297,\n                           1.9108799695968628,\n                           -7.330269813537598,\n                           -17.228500366210938,\n                           1.2092299461364746,\n                           0,\n                           -18.675800323486328,\n                           1.2092299461364746,\n                           -6.422039985656738,\n                           -15.093799591064453,\n                           0.5971490144729614,\n                           0,\n                           -16.361900329589844,\n                           0.5971490144729614,\n                           -4.177840232849121,\n                           -9.819259643554688,\n                           0.16421599686145782,\n                           0,\n                           -10.644200325012207,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           -13.56719970703125,\n                           -13.56719970703125,\n                           1.9108799695968628,\n                           -13.25979995727539,\n                           -13.25979995727539,\n                           1.2092299461364746,\n                           -11.616900444030762,\n                           -11.616900444030762,\n                           0.5971490144729614,\n                           -7.557370185852051,\n                           -7.557370185852051,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           -17.62779998779297,\n                           -7.500199794769287,\n                           1.9108799695968628,\n                           -17.228500366210938,\n                           -7.330269813537598,\n                           1.2092299461364746,\n                           -15.093799591064453,\n                           -6.422039985656738,\n                           0.5971490144729614,\n                           -9.819259643554688,\n                           -4.177840232849121,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           -19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           -18.675800323486328,\n                           0,\n                           1.2092299461364746,\n                           -16.361900329589844,\n                           0,\n                           0.5971490144729614,\n                           -10.644200325012207,\n                           0,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           -19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           -17.62779998779297,\n                           7.500199794769287,\n                           1.9108799695968628,\n                           -17.228500366210938,\n                           7.330269813537598,\n                           1.2092299461364746,\n                           -18.675800323486328,\n                           0,\n                           1.2092299461364746,\n                           -15.093799591064453,\n                           6.422039985656738,\n                           0.5971490144729614,\n                           -16.361900329589844,\n                           0,\n                           0.5971490144729614,\n                           -9.819259643554688,\n                           4.177840232849121,\n                           0.16421599686145782,\n                           -10.644200325012207,\n                           0,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           -13.56719970703125,\n                           13.56719970703125,\n                           1.9108799695968628,\n                           -13.25979995727539,\n                           13.25979995727539,\n                           1.2092299461364746,\n                           -11.616900444030762,\n                           11.616900444030762,\n                           0.5971490144729614,\n                           -7.557370185852051,\n                           7.557370185852051,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           -7.500199794769287,\n                           17.62779998779297,\n                           1.9108799695968628,\n                           -7.330269813537598,\n                           17.228500366210938,\n                           1.2092299461364746,\n                           -6.422039985656738,\n                           15.093799591064453,\n                           0.5971490144729614,\n                           -4.177840232849121,\n                           9.819259643554688,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           19.108800888061523,\n                           1.9108799695968628,\n                           0,\n                           18.675800323486328,\n                           1.2092299461364746,\n                           0,\n                           16.361900329589844,\n                           0.5971490144729614,\n                           0,\n                           10.644200325012207,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           19.108800888061523,\n                           1.9108799695968628,\n                           7.500199794769287,\n                           17.62779998779297,\n                           1.9108799695968628,\n                           7.330269813537598,\n                           17.228500366210938,\n                           1.2092299461364746,\n                           0,\n                           18.675800323486328,\n                           1.2092299461364746,\n                           6.422039985656738,\n                           15.093799591064453,\n                           0.5971490144729614,\n                           0,\n                           16.361900329589844,\n                           0.5971490144729614,\n                           4.177840232849121,\n                           9.819259643554688,\n                           0.16421599686145782,\n                           0,\n                           10.644200325012207,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           13.56719970703125,\n                           13.56719970703125,\n                           1.9108799695968628,\n                           13.25979995727539,\n                           13.25979995727539,\n                           1.2092299461364746,\n                           11.616900444030762,\n                           11.616900444030762,\n                           0.5971490144729614,\n                           7.557370185852051,\n                           7.557370185852051,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           17.62779998779297,\n                           7.500199794769287,\n                           1.9108799695968628,\n                           17.228500366210938,\n                           7.330269813537598,\n                           1.2092299461364746,\n                           15.093799591064453,\n                           6.422039985656738,\n                           0.5971490144729614,\n                           9.819259643554688,\n                           4.177840232849121,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           18.675800323486328,\n                           0,\n                           1.2092299461364746,\n                           16.361900329589844,\n                           0,\n                           0.5971490144729614,\n                           10.644200325012207,\n                           0,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           -20.382699966430664,\n                           0,\n                           25.796899795532227,\n                           -20.1835994720459,\n                           -2.149739980697632,\n                           26.244699478149414,\n                           -26.511600494384766,\n                           -2.149739980697632,\n                           26.192899703979492,\n                           -26.334299087524414,\n                           0,\n                           25.752099990844727,\n                           -31.156299591064453,\n                           -2.149739980697632,\n                           25.830400466918945,\n                           -30.733299255371094,\n                           0,\n                           25.438600540161133,\n                           -34.016998291015625,\n                           -2.149739980697632,\n                           24.846500396728516,\n                           -33.46030044555664,\n                           0,\n                           24.587600708007812,\n                           -34.99290084838867,\n                           -2.149739980697632,\n                           22.930500030517578,\n                           -34.39580154418945,\n                           0,\n                           22.930500030517578,\n                           -19.74570083618164,\n                           -2.8663198947906494,\n                           27.229999542236328,\n                           -26.901599884033203,\n                           -2.8663198947906494,\n                           27.162799835205078,\n                           -32.08679962158203,\n                           -2.8663198947906494,\n                           26.69260025024414,\n                           -35.241798400878906,\n                           -2.8663198947906494,\n                           25.416200637817383,\n                           -36.30670166015625,\n                           -2.8663198947906494,\n                           22.930500030517578,\n                           -19.30780029296875,\n                           -2.149739980697632,\n                           28.215299606323242,\n                           -27.29159927368164,\n                           -2.149739980697632,\n                           28.132699966430664,\n                           -33.017398834228516,\n                           -2.149739980697632,\n                           27.55470085144043,\n                           -36.46649932861328,\n                           -2.149739980697632,\n                           25.98579978942871,\n                           -37.620399475097656,\n                           -2.149739980697632,\n                           22.930500030517578,\n                           -19.108800888061523,\n                           0,\n                           28.66320037841797,\n                           -27.468900680541992,\n                           0,\n                           28.57360076904297,\n                           -33.440399169921875,\n                           0,\n                           27.94659996032715,\n                           -37.02330017089844,\n                           0,\n                           26.244699478149414,\n                           -38.21760177612305,\n                           0,\n                           22.930500030517578,\n                           -19.108800888061523,\n                           0,\n                           28.66320037841797,\n                           -19.30780029296875,\n                           2.149739980697632,\n                           28.215299606323242,\n                           -27.29159927368164,\n                           2.149739980697632,\n                           28.132699966430664,\n                           -27.468900680541992,\n                           0,\n                           28.57360076904297,\n                           -33.017398834228516,\n                           2.149739980697632,\n                           27.55470085144043,\n                           -33.440399169921875,\n                           0,\n                           27.94659996032715,\n                           -36.46649932861328,\n                           2.149739980697632,\n                           25.98579978942871,\n                           -37.02330017089844,\n                           0,\n                           26.244699478149414,\n                           -37.620399475097656,\n                           2.149739980697632,\n                           22.930500030517578,\n                           -38.21760177612305,\n                           0,\n                           22.930500030517578,\n                           -19.74570083618164,\n                           2.8663198947906494,\n                           27.229999542236328,\n                           -26.901599884033203,\n                           2.8663198947906494,\n                           27.162799835205078,\n                           -32.08679962158203,\n                           2.8663198947906494,\n                           26.69260025024414,\n                           -35.241798400878906,\n                           2.8663198947906494,\n                           25.416200637817383,\n                           -36.30670166015625,\n                           2.8663198947906494,\n                           22.930500030517578,\n                           -20.1835994720459,\n                           2.149739980697632,\n                           26.244699478149414,\n                           -26.511600494384766,\n                           2.149739980697632,\n                           26.192899703979492,\n                           -31.156299591064453,\n                           2.149739980697632,\n                           25.830400466918945,\n                           -34.016998291015625,\n                           2.149739980697632,\n                           24.846500396728516,\n                           -34.99290084838867,\n                           2.149739980697632,\n                           22.930500030517578,\n                           -20.382699966430664,\n                           0,\n                           25.796899795532227,\n                           -26.334299087524414,\n                           0,\n                           25.752099990844727,\n                           -30.733299255371094,\n                           0,\n                           25.438600540161133,\n                           -33.46030044555664,\n                           0,\n                           24.587600708007812,\n                           -34.39580154418945,\n                           0,\n                           22.930500030517578,\n                           -34.39580154418945,\n                           0,\n                           22.930500030517578,\n                           -34.99290084838867,\n                           -2.149739980697632,\n                           22.930500030517578,\n                           -34.44089889526367,\n                           -2.149739980697632,\n                           20.082199096679688,\n                           -33.89820098876953,\n                           0,\n                           20.33289909362793,\n                           -32.711299896240234,\n                           -2.149739980697632,\n                           16.81529998779297,\n                           -32.32569885253906,\n                           0,\n                           17.197900772094727,\n                           -29.69420051574707,\n                           -2.149739980697632,\n                           13.590499877929688,\n                           -29.558900833129883,\n                           0,\n                           14.062899589538574,\n                           -25.279300689697266,\n                           -2.149739980697632,\n                           10.8681001663208,\n                           -25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           -36.30670166015625,\n                           -2.8663198947906494,\n                           22.930500030517578,\n                           -35.6348991394043,\n                           -2.8663198947906494,\n                           19.530500411987305,\n                           -33.55979919433594,\n                           -2.8663198947906494,\n                           15.973699569702148,\n                           -29.99180030822754,\n                           -2.8663198947906494,\n                           12.551300048828125,\n                           -24.841400146484375,\n                           -2.8663198947906494,\n                           9.554389953613281,\n                           -37.620399475097656,\n                           -2.149739980697632,\n                           22.930500030517578,\n                           -36.82889938354492,\n                           -2.149739980697632,\n                           18.97879981994629,\n                           -34.408199310302734,\n                           -2.149739980697632,\n                           15.132100105285645,\n                           -30.289499282836914,\n                           -2.149739980697632,\n                           11.512200355529785,\n                           -24.403499603271484,\n                           -2.149739980697632,\n                           8.240659713745117,\n                           -38.21760177612305,\n                           0,\n                           22.930500030517578,\n                           -37.37160110473633,\n                           0,\n                           18.728099822998047,\n                           -34.79389953613281,\n                           0,\n                           14.749600410461426,\n                           -30.424800872802734,\n                           0,\n                           11.039799690246582,\n                           -24.204500198364258,\n                           0,\n                           7.643509864807129,\n                           -38.21760177612305,\n                           0,\n                           22.930500030517578,\n                           -37.620399475097656,\n                           2.149739980697632,\n                           22.930500030517578,\n                           -36.82889938354492,\n                           2.149739980697632,\n                           18.97879981994629,\n                           -37.37160110473633,\n                           0,\n                           18.728099822998047,\n                           -34.408199310302734,\n                           2.149739980697632,\n                           15.132100105285645,\n                           -34.79389953613281,\n                           0,\n                           14.749600410461426,\n                           -30.289499282836914,\n                           2.149739980697632,\n                           11.512200355529785,\n                           -30.424800872802734,\n                           0,\n                           11.039799690246582,\n                           -24.403499603271484,\n                           2.149739980697632,\n                           8.240659713745117,\n                           -24.204500198364258,\n                           0,\n                           7.643509864807129,\n                           -36.30670166015625,\n                           2.8663198947906494,\n                           22.930500030517578,\n                           -35.6348991394043,\n                           2.8663198947906494,\n                           19.530500411987305,\n                           -33.55979919433594,\n                           2.8663198947906494,\n                           15.973699569702148,\n                           -29.99180030822754,\n                           2.8663198947906494,\n                           12.551300048828125,\n                           -24.841400146484375,\n                           2.8663198947906494,\n                           9.554389953613281,\n                           -34.99290084838867,\n                           2.149739980697632,\n                           22.930500030517578,\n                           -34.44089889526367,\n                           2.149739980697632,\n                           20.082199096679688,\n                           -32.711299896240234,\n                           2.149739980697632,\n                           16.81529998779297,\n                           -29.69420051574707,\n                           2.149739980697632,\n                           13.590499877929688,\n                           -25.279300689697266,\n                           2.149739980697632,\n                           10.8681001663208,\n                           -34.39580154418945,\n                           0,\n                           22.930500030517578,\n                           -33.89820098876953,\n                           0,\n                           20.33289909362793,\n                           -32.32569885253906,\n                           0,\n                           17.197900772094727,\n                           -29.558900833129883,\n                           0,\n                           14.062899589538574,\n                           -25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           21.656600952148438,\n                           0,\n                           18.15329933166504,\n                           21.656600952148438,\n                           -4.729420185089111,\n                           16.511199951171875,\n                           28.233999252319336,\n                           -4.270359992980957,\n                           18.339000701904297,\n                           27.76740074157715,\n                           0,\n                           19.55660057067871,\n                           31.011899948120117,\n                           -3.2604401111602783,\n                           22.221399307250977,\n                           30.4148006439209,\n                           0,\n                           22.930500030517578,\n                           32.59560012817383,\n                           -2.2505099773406982,\n                           26.764400482177734,\n                           31.867900848388672,\n                           0,\n                           27.020999908447266,\n                           35.5900993347168,\n                           -1.791450023651123,\n                           30.573999404907227,\n                           34.39580154418945,\n                           0,\n                           30.573999404907227,\n                           21.656600952148438,\n                           -6.3059000968933105,\n                           12.89840030670166,\n                           29.260299682617188,\n                           -5.693819999694824,\n                           15.660200119018555,\n                           32.32569885253906,\n                           -4.347249984741211,\n                           20.661399841308594,\n                           34.19670104980469,\n                           -3.0006699562072754,\n                           26.199899673461914,\n                           38.21760177612305,\n                           -2.3886001110076904,\n                           30.573999404907227,\n                           21.656600952148438,\n                           -4.729420185089111,\n                           9.285670280456543,\n                           30.286699295043945,\n                           -4.270359992980957,\n                           12.981499671936035,\n                           33.639400482177734,\n                           -3.2604401111602783,\n                           19.101299285888672,\n                           35.79790115356445,\n                           -2.2505099773406982,\n                           25.635400772094727,\n                           40.845001220703125,\n                           -1.791450023651123,\n                           30.573999404907227,\n                           21.656600952148438,\n                           0,\n                           7.643509864807129,\n                           30.75320053100586,\n                           0,\n                           11.763799667358398,\n                           34.23659896850586,\n                           0,\n                           18.392200469970703,\n                           36.52560043334961,\n                           0,\n                           25.378799438476562,\n                           42.03929901123047,\n                           0,\n                           30.573999404907227,\n                           21.656600952148438,\n                           0,\n                           7.643509864807129,\n                           21.656600952148438,\n                           4.729420185089111,\n                           9.285670280456543,\n                           30.286699295043945,\n                           4.270359992980957,\n                           12.981499671936035,\n                           30.75320053100586,\n                           0,\n                           11.763799667358398,\n                           33.639400482177734,\n                           3.2604401111602783,\n                           19.101299285888672,\n                           34.23659896850586,\n                           0,\n                           18.392200469970703,\n                           35.79790115356445,\n                           2.2505099773406982,\n                           25.635400772094727,\n                           36.52560043334961,\n                           0,\n                           25.378799438476562,\n                           40.845001220703125,\n                           1.791450023651123,\n                           30.573999404907227,\n                           42.03929901123047,\n                           0,\n                           30.573999404907227,\n                           21.656600952148438,\n                           6.3059000968933105,\n                           12.89840030670166,\n                           29.260299682617188,\n                           5.693819999694824,\n                           15.660200119018555,\n                           32.32569885253906,\n                           4.347249984741211,\n                           20.661399841308594,\n                           34.19670104980469,\n                           3.0006699562072754,\n                           26.199899673461914,\n                           38.21760177612305,\n                           2.3886001110076904,\n                           30.573999404907227,\n                           21.656600952148438,\n                           4.729420185089111,\n                           16.511199951171875,\n                           28.233999252319336,\n                           4.270359992980957,\n                           18.339000701904297,\n                           31.011899948120117,\n                           3.2604401111602783,\n                           22.221399307250977,\n                           32.59560012817383,\n                           2.2505099773406982,\n                           26.764400482177734,\n                           35.5900993347168,\n                           1.791450023651123,\n                           30.573999404907227,\n                           21.656600952148438,\n                           0,\n                           18.15329933166504,\n                           27.76740074157715,\n                           0,\n                           19.55660057067871,\n                           30.4148006439209,\n                           0,\n                           22.930500030517578,\n                           31.867900848388672,\n                           0,\n                           27.020999908447266,\n                           34.39580154418945,\n                           0,\n                           30.573999404907227,\n                           34.39580154418945,\n                           0,\n                           30.573999404907227,\n                           35.5900993347168,\n                           -1.791450023651123,\n                           30.573999404907227,\n                           36.59049987792969,\n                           -1.679479956626892,\n                           31.137699127197266,\n                           35.3114013671875,\n                           0,\n                           31.111499786376953,\n                           37.18870162963867,\n                           -1.4331599473953247,\n                           31.332599639892578,\n                           35.98820114135742,\n                           0,\n                           31.290599822998047,\n                           37.206600189208984,\n                           -1.1868300437927246,\n                           31.1481990814209,\n                           36.187198638916016,\n                           0,\n                           31.111499786376953,\n                           36.46590042114258,\n                           -1.074869990348816,\n                           30.573999404907227,\n                           35.669700622558594,\n                           0,\n                           30.573999404907227,\n                           38.21760177612305,\n                           -2.3886001110076904,\n                           30.573999404907227,\n                           39.40439987182617,\n                           -2.2393100261688232,\n                           31.195499420166016,\n                           39.829898834228516,\n                           -1.9108799695968628,\n                           31.424999237060547,\n                           39.44919967651367,\n                           -1.582450032234192,\n                           31.229000091552734,\n                           38.21760177612305,\n                           -1.4331599473953247,\n                           30.573999404907227,\n                           40.845001220703125,\n                           -1.791450023651123,\n                           30.573999404907227,\n                           42.218299865722656,\n                           -1.679479956626892,\n                           31.25320053100586,\n                           42.47100067138672,\n                           -1.4331599473953247,\n                           31.51740074157715,\n                           41.69169998168945,\n                           -1.1868300437927246,\n                           31.309900283813477,\n                           39.969200134277344,\n                           -1.074869990348816,\n                           30.573999404907227,\n                           42.03929901123047,\n                           0,\n                           30.573999404907227,\n                           43.49729919433594,\n                           0,\n                           31.279399871826172,\n                           43.67150115966797,\n                           0,\n                           31.55929946899414,\n                           42.71110153198242,\n                           0,\n                           31.346599578857422,\n                           40.76539993286133,\n                           0,\n                           30.573999404907227,\n                           42.03929901123047,\n                           0,\n                           30.573999404907227,\n                           40.845001220703125,\n                           1.791450023651123,\n                           30.573999404907227,\n                           42.218299865722656,\n                           1.679479956626892,\n                           31.25320053100586,\n                           43.49729919433594,\n                           0,\n                           31.279399871826172,\n                           42.47100067138672,\n                           1.4331599473953247,\n                           31.51740074157715,\n                           43.67150115966797,\n                           0,\n                           31.55929946899414,\n                           41.69169998168945,\n                           1.1868300437927246,\n                           31.309900283813477,\n                           42.71110153198242,\n                           0,\n                           31.346599578857422,\n                           39.969200134277344,\n                           1.074869990348816,\n                           30.573999404907227,\n                           40.76539993286133,\n                           0,\n                           30.573999404907227,\n                           38.21760177612305,\n                           2.3886001110076904,\n                           30.573999404907227,\n                           39.40439987182617,\n                           2.2393100261688232,\n                           31.195499420166016,\n                           39.829898834228516,\n                           1.9108799695968628,\n                           31.424999237060547,\n                           39.44919967651367,\n                           1.582450032234192,\n                           31.229000091552734,\n                           38.21760177612305,\n                           1.4331599473953247,\n                           30.573999404907227,\n                           35.5900993347168,\n                           1.791450023651123,\n                           30.573999404907227,\n                           36.59049987792969,\n                           1.679479956626892,\n                           31.137699127197266,\n                           37.18870162963867,\n                           1.4331599473953247,\n                           31.332599639892578,\n                           37.206600189208984,\n                           1.1868300437927246,\n                           31.1481990814209,\n                           36.46590042114258,\n                           1.074869990348816,\n                           30.573999404907227,\n                           34.39580154418945,\n                           0,\n                           30.573999404907227,\n                           35.3114013671875,\n                           0,\n                           31.111499786376953,\n                           35.98820114135742,\n                           0,\n                           31.290599822998047,\n                           36.187198638916016,\n                           0,\n                           31.111499786376953,\n                           35.669700622558594,\n                           0,\n                           30.573999404907227,\n                           0,\n                           0,\n                           40.12839889526367,\n                           0,\n                           0,\n                           40.12839889526367,\n                           4.004499912261963,\n                           -1.7077000141143799,\n                           39.501399993896484,\n                           4.339280128479004,\n                           0,\n                           39.501399993896484,\n                           3.8207099437713623,\n                           -1.6290700435638428,\n                           37.97869873046875,\n                           4.140230178833008,\n                           0,\n                           37.97869873046875,\n                           2.314160108566284,\n                           -0.985912024974823,\n                           36.09769821166992,\n                           2.5080299377441406,\n                           0,\n                           36.09769821166992,\n                           2.3503799438476562,\n                           -1.0000300407409668,\n                           34.39580154418945,\n                           2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           3.0849199295043945,\n                           -3.0849199295043945,\n                           39.501399993896484,\n                           2.943150043487549,\n                           -2.943150043487549,\n                           37.97869873046875,\n                           1.782039999961853,\n                           -1.782039999961853,\n                           36.09769821166992,\n                           1.8089599609375,\n                           -1.8089599609375,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           1.7077000141143799,\n                           -4.004499912261963,\n                           39.501399993896484,\n                           1.6290700435638428,\n                           -3.8207099437713623,\n                           37.97869873046875,\n                           0.985912024974823,\n                           -2.314160108566284,\n                           36.09769821166992,\n                           1.0000300407409668,\n                           -2.3503799438476562,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           0,\n                           -4.339280128479004,\n                           39.501399993896484,\n                           0,\n                           -4.140230178833008,\n                           37.97869873046875,\n                           0,\n                           -2.5080299377441406,\n                           36.09769821166992,\n                           0,\n                           -2.547840118408203,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -1.7077000141143799,\n                           -4.004499912261963,\n                           39.501399993896484,\n                           0,\n                           -4.339280128479004,\n                           39.501399993896484,\n                           -1.6290700435638428,\n                           -3.8207099437713623,\n                           37.97869873046875,\n                           0,\n                           -4.140230178833008,\n                           37.97869873046875,\n                           -0.985912024974823,\n                           -2.314160108566284,\n                           36.09769821166992,\n                           0,\n                           -2.5080299377441406,\n                           36.09769821166992,\n                           -1.0000300407409668,\n                           -2.3503799438476562,\n                           34.39580154418945,\n                           0,\n                           -2.547840118408203,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -3.0849199295043945,\n                           -3.0849199295043945,\n                           39.501399993896484,\n                           -2.943150043487549,\n                           -2.943150043487549,\n                           37.97869873046875,\n                           -1.782039999961853,\n                           -1.782039999961853,\n                           36.09769821166992,\n                           -1.8089599609375,\n                           -1.8089599609375,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -4.004499912261963,\n                           -1.7077000141143799,\n                           39.501399993896484,\n                           -3.8207099437713623,\n                           -1.6290700435638428,\n                           37.97869873046875,\n                           -2.314160108566284,\n                           -0.985912024974823,\n                           36.09769821166992,\n                           -2.3503799438476562,\n                           -1.0000300407409668,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -4.339280128479004,\n                           0,\n                           39.501399993896484,\n                           -4.140230178833008,\n                           0,\n                           37.97869873046875,\n                           -2.5080299377441406,\n                           0,\n                           36.09769821166992,\n                           -2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -4.004499912261963,\n                           1.7077000141143799,\n                           39.501399993896484,\n                           -4.339280128479004,\n                           0,\n                           39.501399993896484,\n                           -3.8207099437713623,\n                           1.6290700435638428,\n                           37.97869873046875,\n                           -4.140230178833008,\n                           0,\n                           37.97869873046875,\n                           -2.314160108566284,\n                           0.985912024974823,\n                           36.09769821166992,\n                           -2.5080299377441406,\n                           0,\n                           36.09769821166992,\n                           -2.3503799438476562,\n                           1.0000300407409668,\n                           34.39580154418945,\n                           -2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -3.0849199295043945,\n                           3.0849199295043945,\n                           39.501399993896484,\n                           -2.943150043487549,\n                           2.943150043487549,\n                           37.97869873046875,\n                           -1.782039999961853,\n                           1.782039999961853,\n                           36.09769821166992,\n                           -1.8089599609375,\n                           1.8089599609375,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -1.7077000141143799,\n                           4.004499912261963,\n                           39.501399993896484,\n                           -1.6290700435638428,\n                           3.8207099437713623,\n                           37.97869873046875,\n                           -0.985912024974823,\n                           2.314160108566284,\n                           36.09769821166992,\n                           -1.0000300407409668,\n                           2.3503799438476562,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           0,\n                           4.339280128479004,\n                           39.501399993896484,\n                           0,\n                           4.140230178833008,\n                           37.97869873046875,\n                           0,\n                           2.5080299377441406,\n                           36.09769821166992,\n                           0,\n                           2.547840118408203,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           0,\n                           0,\n                           40.12839889526367,\n                           1.7077000141143799,\n                           4.004499912261963,\n                           39.501399993896484,\n                           0,\n                           4.339280128479004,\n                           39.501399993896484,\n                           1.6290700435638428,\n                           3.8207099437713623,\n                           37.97869873046875,\n                           0,\n                           4.140230178833008,\n                           37.97869873046875,\n                           0.985912024974823,\n                           2.314160108566284,\n                           36.09769821166992,\n                           0,\n                           2.5080299377441406,\n                           36.09769821166992,\n                           1.0000300407409668,\n                           2.3503799438476562,\n                           34.39580154418945,\n                           0,\n                           2.547840118408203,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           3.0849199295043945,\n                           3.0849199295043945,\n                           39.501399993896484,\n                           2.943150043487549,\n                           2.943150043487549,\n                           37.97869873046875,\n                           1.782039999961853,\n                           1.782039999961853,\n                           36.09769821166992,\n                           1.8089599609375,\n                           1.8089599609375,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           4.004499912261963,\n                           1.7077000141143799,\n                           39.501399993896484,\n                           3.8207099437713623,\n                           1.6290700435638428,\n                           37.97869873046875,\n                           2.314160108566284,\n                           0.985912024974823,\n                           36.09769821166992,\n                           2.3503799438476562,\n                           1.0000300407409668,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           4.339280128479004,\n                           0,\n                           39.501399993896484,\n                           4.140230178833008,\n                           0,\n                           37.97869873046875,\n                           2.5080299377441406,\n                           0,\n                           36.09769821166992,\n                           2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           2.3503799438476562,\n                           -1.0000300407409668,\n                           34.39580154418945,\n                           5.361800193786621,\n                           -2.2813100814819336,\n                           33.261199951171875,\n                           5.812250137329102,\n                           0,\n                           33.261199951171875,\n                           9.695320129394531,\n                           -4.125110149383545,\n                           32.484901428222656,\n                           10.50979995727539,\n                           0,\n                           32.484901428222656,\n                           13.58810043334961,\n                           -5.781400203704834,\n                           31.708599090576172,\n                           14.729700088500977,\n                           0,\n                           31.708599090576172,\n                           15.27750015258789,\n                           -6.5001702308654785,\n                           30.573999404907227,\n                           16.56089973449707,\n                           0,\n                           30.573999404907227,\n                           1.8089599609375,\n                           -1.8089599609375,\n                           34.39580154418945,\n                           4.126699924468994,\n                           -4.126699924468994,\n                           33.261199951171875,\n                           7.461979866027832,\n                           -7.461979866027832,\n                           32.484901428222656,\n                           10.458100318908691,\n                           -10.458100318908691,\n                           31.708599090576172,\n                           11.758299827575684,\n                           -11.758299827575684,\n                           30.573999404907227,\n                           1.0000300407409668,\n                           -2.3503799438476562,\n                           34.39580154418945,\n                           2.2813100814819336,\n                           -5.361800193786621,\n                           33.261199951171875,\n                           4.125110149383545,\n                           -9.695320129394531,\n                           32.484901428222656,\n                           5.781400203704834,\n                           -13.58810043334961,\n                           31.708599090576172,\n                           6.5001702308654785,\n                           -15.27750015258789,\n                           30.573999404907227,\n                           0,\n                           -2.547840118408203,\n                           34.39580154418945,\n                           0,\n                           -5.812250137329102,\n                           33.261199951171875,\n                           0,\n                           -10.50979995727539,\n                           32.484901428222656,\n                           0,\n                           -14.729700088500977,\n                           31.708599090576172,\n                           0,\n                           -16.56089973449707,\n                           30.573999404907227,\n                           0,\n                           -2.547840118408203,\n                           34.39580154418945,\n                           -1.0000300407409668,\n                           -2.3503799438476562,\n                           34.39580154418945,\n                           -2.2813100814819336,\n                           -5.361800193786621,\n                           33.261199951171875,\n                           0,\n                           -5.812250137329102,\n                           33.261199951171875,\n                           -4.125110149383545,\n                           -9.695320129394531,\n                           32.484901428222656,\n                           0,\n                           -10.50979995727539,\n                           32.484901428222656,\n                           -5.781400203704834,\n                           -13.58810043334961,\n                           31.708599090576172,\n                           0,\n                           -14.729700088500977,\n                           31.708599090576172,\n                           -6.5001702308654785,\n                           -15.27750015258789,\n                           30.573999404907227,\n                           0,\n                           -16.56089973449707,\n                           30.573999404907227,\n                           -1.8089599609375,\n                           -1.8089599609375,\n                           34.39580154418945,\n                           -4.126699924468994,\n                           -4.126699924468994,\n                           33.261199951171875,\n                           -7.461979866027832,\n                           -7.461979866027832,\n                           32.484901428222656,\n                           -10.458100318908691,\n                           -10.458100318908691,\n                           31.708599090576172,\n                           -11.758299827575684,\n                           -11.758299827575684,\n                           30.573999404907227,\n                           -2.3503799438476562,\n                           -1.0000300407409668,\n                           34.39580154418945,\n                           -5.361800193786621,\n                           -2.2813100814819336,\n                           33.261199951171875,\n                           -9.695320129394531,\n                           -4.125110149383545,\n                           32.484901428222656,\n                           -13.58810043334961,\n                           -5.781400203704834,\n                           31.708599090576172,\n                           -15.27750015258789,\n                           -6.5001702308654785,\n                           30.573999404907227,\n                           -2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           -5.812250137329102,\n                           0,\n                           33.261199951171875,\n                           -10.50979995727539,\n                           0,\n                           32.484901428222656,\n                           -14.729700088500977,\n                           0,\n                           31.708599090576172,\n                           -16.56089973449707,\n                           0,\n                           30.573999404907227,\n                           -2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           -2.3503799438476562,\n                           1.0000300407409668,\n                           34.39580154418945,\n                           -5.361800193786621,\n                           2.2813100814819336,\n                           33.261199951171875,\n                           -5.812250137329102,\n                           0,\n                           33.261199951171875,\n                           -9.695320129394531,\n                           4.125110149383545,\n                           32.484901428222656,\n                           -10.50979995727539,\n                           0,\n                           32.484901428222656,\n                           -13.58810043334961,\n                           5.781400203704834,\n                           31.708599090576172,\n                           -14.729700088500977,\n                           0,\n                           31.708599090576172,\n                           -15.27750015258789,\n                           6.5001702308654785,\n                           30.573999404907227,\n                           -16.56089973449707,\n                           0,\n                           30.573999404907227,\n                           -1.8089599609375,\n                           1.8089599609375,\n                           34.39580154418945,\n                           -4.126699924468994,\n                           4.126699924468994,\n                           33.261199951171875,\n                           -7.461979866027832,\n                           7.461979866027832,\n                           32.484901428222656,\n                           -10.458100318908691,\n                           10.458100318908691,\n                           31.708599090576172,\n                           -11.758299827575684,\n                           11.758299827575684,\n                           30.573999404907227,\n                           -1.0000300407409668,\n                           2.3503799438476562,\n                           34.39580154418945,\n                           -2.2813100814819336,\n                           5.361800193786621,\n                           33.261199951171875,\n                           -4.125110149383545,\n                           9.695320129394531,\n                           32.484901428222656,\n                           -5.781400203704834,\n                           13.58810043334961,\n                           31.708599090576172,\n                           -6.5001702308654785,\n                           15.27750015258789,\n                           30.573999404907227,\n                           0,\n                           2.547840118408203,\n                           34.39580154418945,\n                           0,\n                           5.812250137329102,\n                           33.261199951171875,\n                           0,\n                           10.50979995727539,\n                           32.484901428222656,\n                           0,\n                           14.729700088500977,\n                           31.708599090576172,\n                           0,\n                           16.56089973449707,\n                           30.573999404907227,\n                           0,\n                           2.547840118408203,\n                           34.39580154418945,\n                           1.0000300407409668,\n                           2.3503799438476562,\n                           34.39580154418945,\n                           2.2813100814819336,\n                           5.361800193786621,\n                           33.261199951171875,\n                           0,\n                           5.812250137329102,\n                           33.261199951171875,\n                           4.125110149383545,\n                           9.695320129394531,\n                           32.484901428222656,\n                           0,\n                           10.50979995727539,\n                           32.484901428222656,\n                           5.781400203704834,\n                           13.58810043334961,\n                           31.708599090576172,\n                           0,\n                           14.729700088500977,\n                           31.708599090576172,\n                           6.5001702308654785,\n                           15.27750015258789,\n                           30.573999404907227,\n                           0,\n                           16.56089973449707,\n                           30.573999404907227,\n                           1.8089599609375,\n                           1.8089599609375,\n                           34.39580154418945,\n                           4.126699924468994,\n                           4.126699924468994,\n                           33.261199951171875,\n                           7.461979866027832,\n                           7.461979866027832,\n                           32.484901428222656,\n                           10.458100318908691,\n                           10.458100318908691,\n                           31.708599090576172,\n                           11.758299827575684,\n                           11.758299827575684,\n                           30.573999404907227,\n                           2.3503799438476562,\n                           1.0000300407409668,\n                           34.39580154418945,\n                           5.361800193786621,\n                           2.2813100814819336,\n                           33.261199951171875,\n                           9.695320129394531,\n                           4.125110149383545,\n                           32.484901428222656,\n                           13.58810043334961,\n                           5.781400203704834,\n                           31.708599090576172,\n                           15.27750015258789,\n                           6.5001702308654785,\n                           30.573999404907227,\n                           2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           5.812250137329102,\n                           0,\n                           33.261199951171875,\n                           10.50979995727539,\n                           0,\n                           32.484901428222656,\n                           14.729700088500977,\n                           0,\n                           31.708599090576172,\n                           16.56089973449707,\n                           0,\n                           30.573999404907227};\n\nfloat teapotNormals[] = {-0.9667419791221619,\n                         0,\n                         -0.25575199723243713,\n                         -0.8930140137672424,\n                         0.3698819875717163,\n                         -0.2563450038433075,\n                         -0.8934370279312134,\n                         0.36910200119018555,\n                         0.2559970021247864,\n                         -0.9668239951133728,\n                         0,\n                         0.2554430067539215,\n                         -0.0838799998164177,\n                         0.03550700098276138,\n                         0.9958429932594299,\n                         -0.09205400198698044,\n                         0,\n                         0.9957540035247803,\n                         0.629721999168396,\n                         -0.2604379951953888,\n                         0.7318620085716248,\n                         0.6820489764213562,\n                         0,\n                         0.7313070297241211,\n                         0.803725004196167,\n                         -0.3325839936733246,\n                         0.4933690130710602,\n                         0.8703010082244873,\n                         0,\n                         0.4925200045108795,\n                         -0.6834070086479187,\n                         0.6834070086479187,\n                         -0.2567310035228729,\n                         -0.6835309863090515,\n                         0.6835309863090515,\n                         0.25606799125671387,\n                         -0.06492599844932556,\n                         0.06492500007152557,\n                         0.9957759976387024,\n                         0.48139700293540955,\n                         -0.48139700293540955,\n                         0.7324709892272949,\n                         0.6148040294647217,\n                         -0.6148040294647217,\n                         0.4939970076084137,\n                         -0.3698819875717163,\n                         0.8930140137672424,\n                         -0.2563450038433075,\n                         -0.36910200119018555,\n                         0.8934370279312134,\n                         0.2559959888458252,\n                         -0.03550700098276138,\n                         0.0838790014386177,\n                         0.9958429932594299,\n                         0.26043900847435,\n                         -0.6297230124473572,\n                         0.7318609952926636,\n                         0.3325839936733246,\n                         -0.803725004196167,\n                         0.4933690130710602,\n                         -0.002848000032827258,\n                         0.9661769866943359,\n                         -0.25786298513412476,\n                         -0.001921999966725707,\n                         0.9670090079307556,\n                         0.2547360062599182,\n                         -0.00026500000967644155,\n                         0.09227199852466583,\n                         0.9957339763641357,\n                         0.00002300000051036477,\n                         -0.6820600032806396,\n                         0.7312960028648376,\n                         0,\n                         -0.8703010082244873,\n                         0.4925200045108795,\n                         -0.002848000032827258,\n                         0.9661769866943359,\n                         -0.25786298513412476,\n                         0.37905800342559814,\n                         0.852770984172821,\n                         -0.35929998755455017,\n                         0.37711000442504883,\n                         0.9140909910202026,\n                         0.14908500015735626,\n                         -0.001921999966725707,\n                         0.9670090079307556,\n                         0.2547360062599182,\n                         0.0275030005723238,\n                         0.12255500257015228,\n                         0.9920809864997864,\n                         -0.00026500000967644155,\n                         0.09227199852466583,\n                         0.9957339763641357,\n                         -0.26100900769233704,\n                         -0.6353650093078613,\n                         0.7267630100250244,\n                         0.00002300000051036477,\n                         -0.6820600032806396,\n                         0.7312960028648376,\n                         -0.33248499035835266,\n                         -0.8042709827423096,\n                         0.4925459921360016,\n                         0,\n                         -0.8703010082244873,\n                         0.4925200045108795,\n                         0.6635469794273376,\n                         0.6252639889717102,\n                         -0.4107919931411743,\n                         0.712664008140564,\n                         0.6976209878921509,\n                         0.07372400164604187,\n                         0.09972699731588364,\n                         0.12198299914598465,\n                         0.98750901222229,\n                         -0.4873189926147461,\n                         -0.4885669946670532,\n                         0.7237560153007507,\n                         -0.6152420043945312,\n                         -0.6154839992523193,\n                         0.4926010072231293,\n                         0.8800280094146729,\n                         0.3387089967727661,\n                         -0.3329069912433624,\n                         0.9172769784927368,\n                         0.36149299144744873,\n                         0.16711199283599854,\n                         0.11358699947595596,\n                         0.04806999862194061,\n                         0.9923650026321411,\n                         -0.6341490149497986,\n                         -0.2618879973888397,\n                         0.7275090217590332,\n                         -0.8041260242462158,\n                         -0.33270499110221863,\n                         0.49263399839401245,\n                         0.9666900038719177,\n                         -0.010453999973833561,\n                         -0.2557379901409149,\n                         0.967441976070404,\n                         -0.00810300000011921,\n                         0.25296199321746826,\n                         0.0934389978647232,\n                         -0.0012799999676644802,\n                         0.9956240057945251,\n                         -0.6821659803390503,\n                         0.0003429999924264848,\n                         0.7311969995498657,\n                         -0.8703219890594482,\n                         0.00005400000009103678,\n                         0.492482990026474,\n                         0.9666900038719177,\n                         -0.010453999973833561,\n                         -0.2557379901409149,\n                         0.8930140137672424,\n                         -0.3698819875717163,\n                         -0.2563450038433075,\n                         0.8934370279312134,\n                         -0.36910200119018555,\n                         0.2559970021247864,\n                         0.967441976070404,\n                         -0.00810300000011921,\n                         0.25296199321746826,\n                         0.0838799998164177,\n                         -0.03550700098276138,\n                         0.9958429932594299,\n                         0.0934389978647232,\n                         -0.0012799999676644802,\n                         0.9956240057945251,\n                         -0.629721999168396,\n                         0.2604379951953888,\n                         0.7318620085716248,\n                         -0.6821659803390503,\n                         0.0003429999924264848,\n                         0.7311969995498657,\n                         -0.803725004196167,\n                         0.3325839936733246,\n                         0.4933690130710602,\n                         -0.8703219890594482,\n                         0.00005400000009103678,\n                         0.492482990026474,\n                         0.6834070086479187,\n                         -0.6834070086479187,\n                         -0.2567310035228729,\n                         0.6835309863090515,\n                         -0.6835309863090515,\n                         0.25606799125671387,\n                         0.06492599844932556,\n                         -0.06492500007152557,\n                         0.9957759976387024,\n                         -0.48139700293540955,\n                         0.48139700293540955,\n                         0.7324709892272949,\n                         -0.6148040294647217,\n                         0.6148040294647217,\n                         0.4939970076084137,\n                         0.3698819875717163,\n                         -0.8930140137672424,\n                         -0.2563450038433075,\n                         0.36910200119018555,\n                         -0.8934370279312134,\n                         0.2559959888458252,\n                         0.03550700098276138,\n                         -0.0838790014386177,\n                         0.9958429932594299,\n                         -0.26043900847435,\n                         0.6297230124473572,\n                         0.7318609952926636,\n                         -0.3325839936733246,\n                         0.803725004196167,\n                         0.4933690130710602,\n                         0,\n                         -0.9667419791221619,\n                         -0.25575199723243713,\n                         0,\n                         -0.9668239951133728,\n                         0.2554430067539215,\n                         0,\n                         -0.09205400198698044,\n                         0.9957540035247803,\n                         0,\n                         0.6820489764213562,\n                         0.7313070297241211,\n                         0,\n                         0.8703010082244873,\n                         0.4925200045108795,\n                         0,\n                         -0.9667419791221619,\n                         -0.25575199723243713,\n                         -0.3698819875717163,\n                         -0.8930140137672424,\n                         -0.2563450038433075,\n                         -0.36910200119018555,\n                         -0.8934370279312134,\n                         0.2559970021247864,\n                         0,\n                         -0.9668239951133728,\n                         0.2554430067539215,\n                         -0.03550700098276138,\n                         -0.0838799998164177,\n                         0.9958429932594299,\n                         0,\n                         -0.09205400198698044,\n                         0.9957540035247803,\n                         0.2604379951953888,\n                         0.629721999168396,\n                         0.7318620085716248,\n                         0,\n                         0.6820489764213562,\n                         0.7313070297241211,\n                         0.3325839936733246,\n                         0.803725004196167,\n                         0.4933690130710602,\n                         0,\n                         0.8703010082244873,\n                         0.4925200045108795,\n                         -0.6834070086479187,\n                         -0.6834070086479187,\n                         -0.2567310035228729,\n                         -0.6835309863090515,\n                         -0.6835309863090515,\n                         0.25606799125671387,\n                         -0.06492500007152557,\n                         -0.06492599844932556,\n                         0.9957759976387024,\n                         0.48139700293540955,\n                         0.48139700293540955,\n                         0.7324709892272949,\n                         0.6148040294647217,\n                         0.6148040294647217,\n                         0.4939970076084137,\n                         -0.8930140137672424,\n                         -0.3698819875717163,\n                         -0.2563450038433075,\n                         -0.8934370279312134,\n                         -0.36910200119018555,\n                         0.2559959888458252,\n                         -0.0838790014386177,\n                         -0.03550700098276138,\n                         0.9958429932594299,\n                         0.6297230124473572,\n                         0.26043900847435,\n                         0.7318609952926636,\n                         0.803725004196167,\n                         0.3325839936733246,\n                         0.4933690130710602,\n                         -0.9667419791221619,\n                         0,\n                         -0.25575199723243713,\n                         -0.9668239951133728,\n                         0,\n                         0.2554430067539215,\n                         -0.09205400198698044,\n                         0,\n                         0.9957540035247803,\n                         0.6820489764213562,\n                         0,\n                         0.7313070297241211,\n                         0.8703010082244873,\n                         0,\n                         0.4925200045108795,\n                         0.8703010082244873,\n                         0,\n                         0.4925200045108795,\n                         0.803725004196167,\n                         -0.3325839936733246,\n                         0.4933690130710602,\n                         0.8454390168190002,\n                         -0.34983500838279724,\n                         0.40354499220848083,\n                         0.9153209924697876,\n                         0,\n                         0.4027250111103058,\n                         0.8699960112571716,\n                         -0.36004599928855896,\n                         0.33685898780822754,\n                         0.9418079853057861,\n                         0,\n                         0.33615100383758545,\n                         0.9041929841041565,\n                         -0.37428000569343567,\n                         0.20579099655151367,\n                         0.9786900281906128,\n                         0,\n                         0.20534199476242065,\n                         0.9218789935112,\n                         -0.38175201416015625,\n                         -0.06636899709701538,\n                         0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         0.6148040294647217,\n                         -0.6148040294647217,\n                         0.4939970076084137,\n                         0.6468020081520081,\n                         -0.6468020081520081,\n                         0.40409600734710693,\n                         0.6656550168991089,\n                         -0.6656550168991089,\n                         0.3373520076274872,\n                         0.6919230222702026,\n                         -0.6919230222702026,\n                         0.20611999928951263,\n                         0.7055429816246033,\n                         -0.7055429816246033,\n                         -0.06647899746894836,\n                         0.3325839936733246,\n                         -0.803725004196167,\n                         0.4933690130710602,\n                         0.34983500838279724,\n                         -0.8454390168190002,\n                         0.40354499220848083,\n                         0.36004701256752014,\n                         -0.8699960112571716,\n                         0.33685800433158875,\n                         0.37428000569343567,\n                         -0.9041929841041565,\n                         0.20579099655151367,\n                         0.38175201416015625,\n                         -0.9218789935112,\n                         -0.06636899709701538,\n                         0,\n                         -0.8703010082244873,\n                         0.4925200045108795,\n                         0,\n                         -0.9153209924697876,\n                         0.4027250111103058,\n                         0,\n                         -0.9418079853057861,\n                         0.33615100383758545,\n                         0,\n                         -0.9786900281906128,\n                         0.20534199476242065,\n                         0,\n                         -0.9978039860725403,\n                         -0.06623899936676025,\n                         0,\n                         -0.8703010082244873,\n                         0.4925200045108795,\n                         -0.33248499035835266,\n                         -0.8042709827423096,\n                         0.4925459921360016,\n                         -0.34983500838279724,\n                         -0.8454390168190002,\n                         0.40354499220848083,\n                         0,\n                         -0.9153209924697876,\n                         0.4027250111103058,\n                         -0.36004599928855896,\n                         -0.8699960112571716,\n                         0.33685898780822754,\n                         0,\n                         -0.9418079853057861,\n                         0.33615100383758545,\n                         -0.37428000569343567,\n                         -0.9041929841041565,\n                         0.20579099655151367,\n                         0,\n                         -0.9786900281906128,\n                         0.20534199476242065,\n                         -0.38175201416015625,\n                         -0.9218789935112,\n                         -0.06636899709701538,\n                         0,\n                         -0.9978039860725403,\n                         -0.06623899936676025,\n                         -0.6152420043945312,\n                         -0.6154839992523193,\n                         0.4926010072231293,\n                         -0.6468020081520081,\n                         -0.6468020081520081,\n                         0.40409600734710693,\n                         -0.6656550168991089,\n                         -0.6656550168991089,\n                         0.3373520076274872,\n                         -0.6919230222702026,\n                         -0.6919230222702026,\n                         0.20611999928951263,\n                         -0.7055429816246033,\n                         -0.7055429816246033,\n                         -0.06647899746894836,\n                         -0.8041260242462158,\n                         -0.33270499110221863,\n                         0.49263399839401245,\n                         -0.8454390168190002,\n                         -0.34983500838279724,\n                         0.40354499220848083,\n                         -0.8699960112571716,\n                         -0.36004701256752014,\n                         0.33685800433158875,\n                         -0.9041929841041565,\n                         -0.37428000569343567,\n                         0.20579099655151367,\n                         -0.9218789935112,\n                         -0.38175201416015625,\n                         -0.06636899709701538,\n                         -0.8703219890594482,\n                         0.00005400000009103678,\n                         0.492482990026474,\n                         -0.9153209924697876,\n                         0,\n                         0.4027250111103058,\n                         -0.9418079853057861,\n                         0,\n                         0.33615100383758545,\n                         -0.9786900281906128,\n                         0,\n                         0.20534199476242065,\n                         -0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         -0.8703219890594482,\n                         0.00005400000009103678,\n                         0.492482990026474,\n                         -0.803725004196167,\n                         0.3325839936733246,\n                         0.4933690130710602,\n                         -0.8454390168190002,\n                         0.34983500838279724,\n                         0.40354499220848083,\n                         -0.9153209924697876,\n                         0,\n                         0.4027250111103058,\n                         -0.8699960112571716,\n                         0.36004599928855896,\n                         0.33685898780822754,\n                         -0.9418079853057861,\n                         0,\n                         0.33615100383758545,\n                         -0.9041929841041565,\n                         0.37428000569343567,\n                         0.20579099655151367,\n                         -0.9786900281906128,\n                         0,\n                         0.20534199476242065,\n                         -0.9218789935112,\n                         0.38175201416015625,\n                         -0.06636899709701538,\n                         -0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         -0.6148040294647217,\n                         0.6148040294647217,\n                         0.4939970076084137,\n                         -0.6468020081520081,\n                         0.6468020081520081,\n                         0.40409600734710693,\n                         -0.6656550168991089,\n                         0.6656550168991089,\n                         0.3373520076274872,\n                         -0.6919230222702026,\n                         0.6919230222702026,\n                         0.20611999928951263,\n                         -0.7055429816246033,\n                         0.7055429816246033,\n                         -0.06647899746894836,\n                         -0.3325839936733246,\n                         0.803725004196167,\n                         0.4933690130710602,\n                         -0.34983500838279724,\n                         0.8454390168190002,\n                         0.40354499220848083,\n                         -0.36004701256752014,\n                         0.8699960112571716,\n                         0.33685800433158875,\n                         -0.37428000569343567,\n                         0.9041929841041565,\n                         0.20579099655151367,\n                         -0.38175201416015625,\n                         0.9218789935112,\n                         -0.06636899709701538,\n                         0,\n                         0.8703010082244873,\n                         0.4925200045108795,\n                         0,\n                         0.9153209924697876,\n                         0.4027250111103058,\n                         0,\n                         0.9418079853057861,\n                         0.33615100383758545,\n                         0,\n                         0.9786900281906128,\n                         0.20534199476242065,\n                         0,\n                         0.9978039860725403,\n                         -0.06623899936676025,\n                         0,\n                         0.8703010082244873,\n                         0.4925200045108795,\n                         0.3325839936733246,\n                         0.803725004196167,\n                         0.4933690130710602,\n                         0.34983500838279724,\n                         0.8454390168190002,\n                         0.40354499220848083,\n                         0,\n                         0.9153209924697876,\n                         0.4027250111103058,\n                         0.36004599928855896,\n                         0.8699960112571716,\n                         0.33685898780822754,\n                         0,\n                         0.9418079853057861,\n                         0.33615100383758545,\n                         0.37428000569343567,\n                         0.9041929841041565,\n                         0.20579099655151367,\n                         0,\n                         0.9786900281906128,\n                         0.20534199476242065,\n                         0.38175201416015625,\n                         0.9218789935112,\n                         -0.06636899709701538,\n                         0,\n                         0.9978039860725403,\n                         -0.06623899936676025,\n                         0.6148040294647217,\n                         0.6148040294647217,\n                         0.4939970076084137,\n                         0.6468020081520081,\n                         0.6468020081520081,\n                         0.40409600734710693,\n                         0.6656550168991089,\n                         0.6656550168991089,\n                         0.3373520076274872,\n                         0.6919230222702026,\n                         0.6919230222702026,\n                         0.20611999928951263,\n                         0.7055429816246033,\n                         0.7055429816246033,\n                         -0.06647899746894836,\n                         0.803725004196167,\n                         0.3325839936733246,\n                         0.4933690130710602,\n                         0.8454390168190002,\n                         0.34983500838279724,\n                         0.40354499220848083,\n                         0.8699960112571716,\n                         0.36004701256752014,\n                         0.33685800433158875,\n                         0.9041929841041565,\n                         0.37428000569343567,\n                         0.20579099655151367,\n                         0.9218789935112,\n                         0.38175201416015625,\n                         -0.06636899709701538,\n                         0.8703010082244873,\n                         0,\n                         0.4925200045108795,\n                         0.9153209924697876,\n                         0,\n                         0.4027250111103058,\n                         0.9418079853057861,\n                         0,\n                         0.33615100383758545,\n                         0.9786900281906128,\n                         0,\n                         0.20534199476242065,\n                         0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         0.9218789935112,\n                         -0.38175201416015625,\n                         -0.06636899709701538,\n                         0.8314369916915894,\n                         -0.3441790044307709,\n                         -0.4361799955368042,\n                         0.9001820087432861,\n                         0,\n                         -0.4355129897594452,\n                         0.6735119819641113,\n                         -0.2785939872264862,\n                         -0.6846650242805481,\n                         0.7296109795570374,\n                         0,\n                         -0.6838629841804504,\n                         0.6403989791870117,\n                         -0.26487401127815247,\n                         -0.7209240198135376,\n                         0.6939510107040405,\n                         0,\n                         -0.7200220227241516,\n                         0.7329490184783936,\n                         -0.303166002035141,\n                         -0.6089959740638733,\n                         0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         0.7055429816246033,\n                         -0.7055429816246033,\n                         -0.06647899746894836,\n                         0.6360920071601868,\n                         -0.6360920071601868,\n                         -0.4367780089378357,\n                         0.5149649977684021,\n                         -0.5149649977684021,\n                         -0.6852890253067017,\n                         0.48965099453926086,\n                         -0.48965099453926086,\n                         -0.7214459776878357,\n                         0.5605549812316895,\n                         -0.5605549812316895,\n                         -0.6095539927482605,\n                         0.38175201416015625,\n                         -0.9218789935112,\n                         -0.06636899709701538,\n                         0.3441790044307709,\n                         -0.8314369916915894,\n                         -0.4361799955368042,\n                         0.2785939872264862,\n                         -0.6735119819641113,\n                         -0.6846650242805481,\n                         0.26487401127815247,\n                         -0.6403989791870117,\n                         -0.7209240198135376,\n                         0.303166002035141,\n                         -0.7329490184783936,\n                         -0.6089959740638733,\n                         0,\n                         -0.9978039860725403,\n                         -0.06623899936676025,\n                         0,\n                         -0.9001820087432861,\n                         -0.4355129897594452,\n                         0,\n                         -0.7296109795570374,\n                         -0.6838629841804504,\n                         0,\n                         -0.6939510107040405,\n                         -0.7200220227241516,\n                         0,\n                         -0.7939500212669373,\n                         -0.6079840064048767,\n                         0,\n                         -0.9978039860725403,\n                         -0.06623899936676025,\n                         -0.38175201416015625,\n                         -0.9218789935112,\n                         -0.06636899709701538,\n                         -0.3441790044307709,\n                         -0.8314369916915894,\n                         -0.4361799955368042,\n                         0,\n                         -0.9001820087432861,\n                         -0.4355129897594452,\n                         -0.2785939872264862,\n                         -0.6735119819641113,\n                         -0.6846650242805481,\n                         0,\n                         -0.7296109795570374,\n                         -0.6838629841804504,\n                         -0.26487401127815247,\n                         -0.6403989791870117,\n                         -0.7209240198135376,\n                         0,\n                         -0.6939510107040405,\n                         -0.7200220227241516,\n                         -0.303166002035141,\n                         -0.7329490184783936,\n                         -0.6089959740638733,\n                         0,\n                         -0.7939500212669373,\n                         -0.6079840064048767,\n                         -0.7055429816246033,\n                         -0.7055429816246033,\n                         -0.06647899746894836,\n                         -0.6360920071601868,\n                         -0.6360920071601868,\n                         -0.4367780089378357,\n                         -0.5149649977684021,\n                         -0.5149649977684021,\n                         -0.6852890253067017,\n                         -0.48965099453926086,\n                         -0.48965099453926086,\n                         -0.7214459776878357,\n                         -0.5605549812316895,\n                         -0.5605549812316895,\n                         -0.6095539927482605,\n                         -0.9218789935112,\n                         -0.38175201416015625,\n                         -0.06636899709701538,\n                         -0.8314369916915894,\n                         -0.3441790044307709,\n                         -0.4361799955368042,\n                         -0.6735119819641113,\n                         -0.2785939872264862,\n                         -0.6846650242805481,\n                         -0.6403989791870117,\n                         -0.26487401127815247,\n                         -0.7209240198135376,\n                         -0.7329490184783936,\n                         -0.303166002035141,\n                         -0.6089959740638733,\n                         -0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         -0.9001820087432861,\n                         0,\n                         -0.4355129897594452,\n                         -0.7296109795570374,\n                         0,\n                         -0.6838629841804504,\n                         -0.6939510107040405,\n                         0,\n                         -0.7200220227241516,\n                         -0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         -0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         -0.9218789935112,\n                         0.38175201416015625,\n                         -0.06636899709701538,\n                         -0.8314369916915894,\n                         0.3441790044307709,\n                         -0.4361799955368042,\n                         -0.9001820087432861,\n                         0,\n                         -0.4355129897594452,\n                         -0.6735119819641113,\n                         0.2785939872264862,\n                         -0.6846650242805481,\n                         -0.7296109795570374,\n                         0,\n                         -0.6838629841804504,\n                         -0.6403989791870117,\n                         0.26487401127815247,\n                         -0.7209240198135376,\n                         -0.6939510107040405,\n                         0,\n                         -0.7200220227241516,\n                         -0.7329490184783936,\n                         0.303166002035141,\n                         -0.6089959740638733,\n                         -0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         -0.7055429816246033,\n                         0.7055429816246033,\n                         -0.06647899746894836,\n                         -0.6360920071601868,\n                         0.6360920071601868,\n                         -0.4367780089378357,\n                         -0.5149649977684021,\n                         0.5149649977684021,\n                         -0.6852890253067017,\n                         -0.48965099453926086,\n                         0.48965099453926086,\n                         -0.7214459776878357,\n                         -0.5605549812316895,\n                         0.5605549812316895,\n                         -0.6095539927482605,\n                         -0.38175201416015625,\n                         0.9218789935112,\n                         -0.06636899709701538,\n                         -0.3441790044307709,\n                         0.8314369916915894,\n                         -0.4361799955368042,\n                         -0.2785939872264862,\n                         0.6735119819641113,\n                         -0.6846650242805481,\n                         -0.26487401127815247,\n                         0.6403989791870117,\n                         -0.7209240198135376,\n                         -0.303166002035141,\n                         0.7329490184783936,\n                         -0.6089959740638733,\n                         0,\n                         0.9978039860725403,\n                         -0.06623899936676025,\n                         0,\n                         0.9001820087432861,\n                         -0.4355129897594452,\n                         0,\n                         0.7296109795570374,\n                         -0.6838629841804504,\n                         0,\n                         0.6939510107040405,\n                         -0.7200220227241516,\n                         0,\n                         0.7939500212669373,\n                         -0.6079840064048767,\n                         0,\n                         0.9978039860725403,\n                         -0.06623899936676025,\n                         0.38175201416015625,\n                         0.9218789935112,\n                         -0.06636899709701538,\n                         0.3441790044307709,\n                         0.8314369916915894,\n                         -0.4361799955368042,\n                         0,\n                         0.9001820087432861,\n                         -0.4355129897594452,\n                         0.2785939872264862,\n                         0.6735119819641113,\n                         -0.6846650242805481,\n                         0,\n                         0.7296109795570374,\n                         -0.6838629841804504,\n                         0.26487401127815247,\n                         0.6403989791870117,\n                         -0.7209240198135376,\n                         0,\n                         0.6939510107040405,\n                         -0.7200220227241516,\n                         0.303166002035141,\n                         0.7329490184783936,\n                         -0.6089959740638733,\n                         0,\n                         0.7939500212669373,\n                         -0.6079840064048767,\n                         0.7055429816246033,\n                         0.7055429816246033,\n                         -0.06647899746894836,\n                         0.6360920071601868,\n                         0.6360920071601868,\n                         -0.4367780089378357,\n                         0.5149649977684021,\n                         0.5149649977684021,\n                         -0.6852890253067017,\n                         0.48965099453926086,\n                         0.48965099453926086,\n                         -0.7214459776878357,\n                         0.5605549812316895,\n                         0.5605549812316895,\n                         -0.6095539927482605,\n                         0.9218789935112,\n                         0.38175201416015625,\n                         -0.06636899709701538,\n                         0.8314369916915894,\n                         0.3441790044307709,\n                         -0.4361799955368042,\n                         0.6735119819641113,\n                         0.2785939872264862,\n                         -0.6846650242805481,\n                         0.6403989791870117,\n                         0.26487401127815247,\n                         -0.7209240198135376,\n                         0.7329490184783936,\n                         0.303166002035141,\n                         -0.6089959740638733,\n                         0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         0.9001820087432861,\n                         0,\n                         -0.4355129897594452,\n                         0.7296109795570374,\n                         0,\n                         -0.6838629841804504,\n                         0.6939510107040405,\n                         0,\n                         -0.7200220227241516,\n                         0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         0.7329490184783936,\n                         -0.303166002035141,\n                         -0.6089959740638733,\n                         0.576229989528656,\n                         -0.23821599781513214,\n                         -0.7818009853363037,\n                         0.6238600015640259,\n                         0,\n                         -0.7815359830856323,\n                         0.16362899541854858,\n                         -0.06752700358629227,\n                         -0.9842079877853394,\n                         0.17729100584983826,\n                         0,\n                         -0.984158992767334,\n                         0.04542100057005882,\n                         -0.018735000863671303,\n                         -0.9987919926643372,\n                         0.04920699819922447,\n                         0,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         0,\n                         -1,\n                         0.5605549812316895,\n                         -0.5605549812316895,\n                         -0.6095539927482605,\n                         0.44041600823402405,\n                         -0.44041600823402405,\n                         -0.7823479771614075,\n                         0.12490200251340866,\n                         -0.12490200251340866,\n                         -0.9842759966850281,\n                         0.034662000834941864,\n                         -0.034662000834941864,\n                         -0.9987980127334595,\n                         0,\n                         0,\n                         -1,\n                         0.303166002035141,\n                         -0.7329490184783936,\n                         -0.6089959740638733,\n                         0.23821599781513214,\n                         -0.576229989528656,\n                         -0.7818009853363037,\n                         0.06752700358629227,\n                         -0.16362899541854858,\n                         -0.9842079877853394,\n                         0.018735000863671303,\n                         -0.04542100057005882,\n                         -0.9987919926643372,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         -0.7939500212669373,\n                         -0.6079840064048767,\n                         0,\n                         -0.6238600015640259,\n                         -0.7815359830856323,\n                         0,\n                         -0.17729100584983826,\n                         -0.984158992767334,\n                         0,\n                         -0.04920699819922447,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         -0.7939500212669373,\n                         -0.6079840064048767,\n                         -0.303166002035141,\n                         -0.7329490184783936,\n                         -0.6089959740638733,\n                         -0.23821599781513214,\n                         -0.576229989528656,\n                         -0.7818009853363037,\n                         0,\n                         -0.6238600015640259,\n                         -0.7815359830856323,\n                         -0.06752700358629227,\n                         -0.16362899541854858,\n                         -0.9842079877853394,\n                         0,\n                         -0.17729100584983826,\n                         -0.984158992767334,\n                         -0.018735000863671303,\n                         -0.04542100057005882,\n                         -0.9987919926643372,\n                         0,\n                         -0.04920699819922447,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         0,\n                         -1,\n                         -0.5605549812316895,\n                         -0.5605549812316895,\n                         -0.6095539927482605,\n                         -0.44041600823402405,\n                         -0.44041600823402405,\n                         -0.7823479771614075,\n                         -0.12490200251340866,\n                         -0.12490200251340866,\n                         -0.9842759966850281,\n                         -0.034662000834941864,\n                         -0.034662000834941864,\n                         -0.9987980127334595,\n                         0,\n                         0,\n                         -1,\n                         -0.7329490184783936,\n                         -0.303166002035141,\n                         -0.6089959740638733,\n                         -0.576229989528656,\n                         -0.23821599781513214,\n                         -0.7818009853363037,\n                         -0.16362899541854858,\n                         -0.06752700358629227,\n                         -0.9842079877853394,\n                         -0.04542100057005882,\n                         -0.018735000863671303,\n                         -0.9987919926643372,\n                         0,\n                         0,\n                         -1,\n                         -0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         -0.6238600015640259,\n                         0,\n                         -0.7815359830856323,\n                         -0.17729100584983826,\n                         0,\n                         -0.984158992767334,\n                         -0.04920699819922447,\n                         0,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         -0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         -0.7329490184783936,\n                         0.303166002035141,\n                         -0.6089959740638733,\n                         -0.576229989528656,\n                         0.23821599781513214,\n                         -0.7818009853363037,\n                         -0.6238600015640259,\n                         0,\n                         -0.7815359830856323,\n                         -0.16362899541854858,\n                         0.06752700358629227,\n                         -0.9842079877853394,\n                         -0.17729100584983826,\n                         0,\n                         -0.984158992767334,\n                         -0.04542100057005882,\n                         0.018735000863671303,\n                         -0.9987919926643372,\n                         -0.04920699819922447,\n                         0,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         0,\n                         -1,\n                         -0.5605549812316895,\n                         0.5605549812316895,\n                         -0.6095539927482605,\n                         -0.44041600823402405,\n                         0.44041600823402405,\n                         -0.7823479771614075,\n                         -0.12490200251340866,\n                         0.12490200251340866,\n                         -0.9842759966850281,\n                         -0.034662000834941864,\n                         0.034662000834941864,\n                         -0.9987980127334595,\n                         0,\n                         0,\n                         -1,\n                         -0.303166002035141,\n                         0.7329490184783936,\n                         -0.6089959740638733,\n                         -0.23821599781513214,\n                         0.576229989528656,\n                         -0.7818009853363037,\n                         -0.06752700358629227,\n                         0.16362899541854858,\n                         -0.9842079877853394,\n                         -0.018735000863671303,\n                         0.04542100057005882,\n                         -0.9987919926643372,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         0.7939500212669373,\n                         -0.6079840064048767,\n                         0,\n                         0.6238600015640259,\n                         -0.7815359830856323,\n                         0,\n                         0.17729100584983826,\n                         -0.984158992767334,\n                         0,\n                         0.04920699819922447,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         0.7939500212669373,\n                         -0.6079840064048767,\n                         0.303166002035141,\n                         0.7329490184783936,\n                         -0.6089959740638733,\n                         0.23821599781513214,\n                         0.576229989528656,\n                         -0.7818009853363037,\n                         0,\n                         0.6238600015640259,\n                         -0.7815359830856323,\n                         0.06752700358629227,\n                         0.16362899541854858,\n                         -0.9842079877853394,\n                         0,\n                         0.17729100584983826,\n                         -0.984158992767334,\n                         0.018735000863671303,\n                         0.04542100057005882,\n                         -0.9987919926643372,\n                         0,\n                         0.04920699819922447,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         0,\n                         -1,\n                         0.5605549812316895,\n                         0.5605549812316895,\n                         -0.6095539927482605,\n                         0.44041600823402405,\n                         0.44041600823402405,\n                         -0.7823479771614075,\n                         0.12490200251340866,\n                         0.12490200251340866,\n                         -0.9842759966850281,\n                         0.034662000834941864,\n                         0.034662000834941864,\n                         -0.9987980127334595,\n                         0,\n                         0,\n                         -1,\n                         0.7329490184783936,\n                         0.303166002035141,\n                         -0.6089959740638733,\n                         0.576229989528656,\n                         0.23821599781513214,\n                         -0.7818009853363037,\n                         0.16362899541854858,\n                         0.06752700358629227,\n                         -0.9842079877853394,\n                         0.04542100057005882,\n                         0.018735000863671303,\n                         -0.9987919926643372,\n                         0,\n                         0,\n                         -1,\n                         0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         0.6238600015640259,\n                         0,\n                         -0.7815359830856323,\n                         0.17729100584983826,\n                         0,\n                         -0.984158992767334,\n                         0.04920699819922447,\n                         0,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0.007784999907016754,\n                         0.00021499999274965376,\n                         -0.999970018863678,\n                         0.007038000039756298,\n                         -0.5829259753227234,\n                         -0.8124949932098389,\n                         0.0361270010471344,\n                         -0.5456140041351318,\n                         -0.837257981300354,\n                         0.03913800045847893,\n                         0.0009879999561235309,\n                         -0.9992330074310303,\n                         0.16184599697589874,\n                         -0.5630490183830261,\n                         -0.8104209899902344,\n                         0.17951199412345886,\n                         0.0043680001981556416,\n                         -0.9837459921836853,\n                         0.4823650121688843,\n                         -0.6427459716796875,\n                         -0.5951480269432068,\n                         0.6122999787330627,\n                         0.010459000244736671,\n                         -0.790556013584137,\n                         0.7387199997901917,\n                         -0.6641989946365356,\n                         -0.11459299921989441,\n                         0.9861519932746887,\n                         0.006668999791145325,\n                         -0.16570700705051422,\n                         -0.0019079999765381217,\n                         -0.9867690205574036,\n                         0.1621209979057312,\n                         0.002761000068858266,\n                         -0.9998499751091003,\n                         0.017105000093579292,\n                         0.010532000102102757,\n                         -0.9972469806671143,\n                         0.07339800149202347,\n                         -0.06604000180959702,\n                         -0.9893029928207397,\n                         0.13006900250911713,\n                         -0.09442699700593948,\n                         -0.9953929781913757,\n                         0.016594000160694122,\n                         -0.009201999753713608,\n                         -0.4902929961681366,\n                         0.8715090155601501,\n                         -0.04860600084066391,\n                         -0.5394579768180847,\n                         0.8406090140342712,\n                         -0.22329799830913544,\n                         -0.5527390241622925,\n                         0.8028810024261475,\n                         -0.5963649749755859,\n                         -0.5751349925994873,\n                         0.5599709749221802,\n                         -0.8033369779586792,\n                         -0.5916029810905457,\n                         0.06823500245809555,\n                         -0.01056000031530857,\n                         -0.00010299999848939478,\n                         0.9999439716339111,\n                         -0.05879800021648407,\n                         -0.0007089999853633344,\n                         0.9982699751853943,\n                         -0.28071001172065735,\n                         -0.0032679999712854624,\n                         0.9597870111465454,\n                         -0.7497230172157288,\n                         -0.004267000127583742,\n                         0.6617379784584045,\n                         -0.9973509907722473,\n                         -0.0020580000709742308,\n                         0.07271400094032288,\n                         -0.01056000031530857,\n                         -0.00010299999848939478,\n                         0.9999439716339111,\n                         -0.008791999891400337,\n                         0.49032899737358093,\n                         0.8714929819107056,\n                         -0.04649300128221512,\n                         0.5387560129165649,\n                         0.8411779999732971,\n                         -0.05879800021648407,\n                         -0.0007089999853633344,\n                         0.9982699751853943,\n                         -0.21790899336338043,\n                         0.5491610169410706,\n                         0.8068069815635681,\n                         -0.28071001172065735,\n                         -0.0032679999712854624,\n                         0.9597870111465454,\n                         -0.5972909927368164,\n                         0.5741199851036072,\n                         0.560027003288269,\n                         -0.7497230172157288,\n                         -0.004267000127583742,\n                         0.6617379784584045,\n                         -0.8040000200271606,\n                         0.5912910103797913,\n                         0.0629120022058487,\n                         -0.9973509907722473,\n                         -0.0020580000709742308,\n                         0.07271400094032288,\n                         -0.0018050000071525574,\n                         0.986840009689331,\n                         0.16169099509716034,\n                         0.0020310000982135534,\n                         0.999891996383667,\n                         0.014553000219166279,\n                         0.009215000085532665,\n                         0.9981520175933838,\n                         0.060068998485803604,\n                         -0.059335000813007355,\n                         0.9917230010032654,\n                         0.11386600136756897,\n                         -0.08690100163221359,\n                         0.9961410164833069,\n                         0.01228999998420477,\n                         0.006417000200599432,\n                         0.5830950140953064,\n                         -0.812379002571106,\n                         0.03378299996256828,\n                         0.5453730225563049,\n                         -0.8375130295753479,\n                         0.1571130007505417,\n                         0.562188982963562,\n                         -0.8119469881057739,\n                         0.4844059944152832,\n                         0.6465290188789368,\n                         -0.5893650054931641,\n                         0.7388700246810913,\n                         0.6661880016326904,\n                         -0.10131999850273132,\n                         0.007784999907016754,\n                         0.00021499999274965376,\n                         -0.999970018863678,\n                         0.03913800045847893,\n                         0.0009879999561235309,\n                         -0.9992330074310303,\n                         0.17951199412345886,\n                         0.0043680001981556416,\n                         -0.9837459921836853,\n                         0.6122999787330627,\n                         0.010459000244736671,\n                         -0.790556013584137,\n                         0.9861519932746887,\n                         0.006668999791145325,\n                         -0.16570700705051422,\n                         0.9861519932746887,\n                         0.006668999791145325,\n                         -0.16570700705051422,\n                         0.7387199997901917,\n                         -0.6641989946365356,\n                         -0.11459299921989441,\n                         0.7256090044975281,\n                         -0.6373609900474548,\n                         0.25935098528862,\n                         0.94651198387146,\n                         0.0033569999504834414,\n                         0.3226499855518341,\n                         0.6459450125694275,\n                         -0.6077200174331665,\n                         0.46198800206184387,\n                         0.8258299827575684,\n                         0.007451999932527542,\n                         0.5638700127601624,\n                         0.5316150188446045,\n                         -0.5586140155792236,\n                         0.6366599798202515,\n                         0.6500110030174255,\n                         0.006936000194400549,\n                         0.759893000125885,\n                         0.4249640107154846,\n                         -0.5955389738082886,\n                         0.6817179918289185,\n                         0.5324289798736572,\n                         0.005243999883532524,\n                         0.8464580178260803,\n                         -0.09442699700593948,\n                         -0.9953929781913757,\n                         0.016594000160694122,\n                         -0.04956100136041641,\n                         -0.9985759854316711,\n                         -0.01975500024855137,\n                         -0.03781700134277344,\n                         -0.998649001121521,\n                         -0.035624999552965164,\n                         -0.0379129983484745,\n                         -0.9986140131950378,\n                         -0.03651199862360954,\n                         -0.1688539981842041,\n                         -0.9395300149917603,\n                         -0.2979460060596466,\n                         -0.8033369779586792,\n                         -0.5916029810905457,\n                         0.06823500245809555,\n                         -0.7423409819602966,\n                         -0.5995240211486816,\n                         -0.2991659939289093,\n                         -0.6196020245552063,\n                         -0.5795029997825623,\n                         -0.5294060111045837,\n                         -0.483707994222641,\n                         -0.5438370108604431,\n                         -0.6857600212097168,\n                         -0.44529199600219727,\n                         -0.4131770133972168,\n                         -0.7943549752235413,\n                         -0.9973509907722473,\n                         -0.0020580000709742308,\n                         0.07271400094032288,\n                         -0.9265130162239075,\n                         -0.0019950000569224358,\n                         -0.3762570023536682,\n                         -0.7539200186729431,\n                         -0.004317000042647123,\n                         -0.6569520235061646,\n                         -0.5662239789962769,\n                         -0.003461000043898821,\n                         -0.8242440223693848,\n                         -0.4818040132522583,\n                         -0.0018500000005587935,\n                         -0.8762770295143127,\n                         -0.9973509907722473,\n                         -0.0020580000709742308,\n                         0.07271400094032288,\n                         -0.8040000200271606,\n                         0.5912910103797913,\n                         0.0629120022058487,\n                         -0.7446749806404114,\n                         0.5989770293235779,\n                         -0.29442399740219116,\n                         -0.9265130162239075,\n                         -0.0019950000569224358,\n                         -0.3762570023536682,\n                         -0.6219490170478821,\n                         0.5781649947166443,\n                         -0.5281140208244324,\n                         -0.7539200186729431,\n                         -0.004317000042647123,\n                         -0.6569520235061646,\n                         -0.48117101192474365,\n                         0.5428280234336853,\n                         -0.6883400082588196,\n                         -0.5662239789962769,\n                         -0.003461000043898821,\n                         -0.8242440223693848,\n                         -0.43805500864982605,\n                         0.41574400663375854,\n                         -0.7970349788665771,\n                         -0.4818040132522583,\n                         -0.0018500000005587935,\n                         -0.8762770295143127,\n                         -0.08690100163221359,\n                         0.9961410164833069,\n                         0.01228999998420477,\n                         -0.04433799907565117,\n                         0.9988710284233093,\n                         -0.017055999487638474,\n                         -0.026177000254392624,\n                         0.9992600083351135,\n                         -0.02816700004041195,\n                         -0.025293000042438507,\n                         0.9992780089378357,\n                         -0.028332000598311424,\n                         -0.15748199820518494,\n                         0.9441670179367065,\n                         -0.28939300775527954,\n                         0.7388700246810913,\n                         0.6661880016326904,\n                         -0.10131999850273132,\n                         0.7282440066337585,\n                         0.63714200258255,\n                         0.25240999460220337,\n                         0.6470540165901184,\n                         0.6082550287246704,\n                         0.4597249925136566,\n                         0.5229939818382263,\n                         0.5621700286865234,\n                         0.6406570076942444,\n                         0.4099780023097992,\n                         0.6046689748764038,\n                         0.6828569769859314,\n                         0.9861519932746887,\n                         0.006668999791145325,\n                         -0.16570700705051422,\n                         0.94651198387146,\n                         0.0033569999504834414,\n                         0.3226499855518341,\n                         0.8258299827575684,\n                         0.007451999932527542,\n                         0.5638700127601624,\n                         0.6500110030174255,\n                         0.006936000194400549,\n                         0.759893000125885,\n                         0.5324289798736572,\n                         0.005243999883532524,\n                         0.8464580178260803,\n                         -0.230786994099617,\n                         0.006523000076413155,\n                         0.9729819893836975,\n                         -0.15287800133228302,\n                         -0.7101899981498718,\n                         0.6872109770774841,\n                         -0.31672099232673645,\n                         -0.7021129727363586,\n                         0.6377500295639038,\n                         -0.5489360094070435,\n                         0.0015109999803826213,\n                         0.8358629941940308,\n                         -0.6010670065879822,\n                         -0.645330011844635,\n                         0.471451997756958,\n                         -0.8756710290908813,\n                         -0.009891999885439873,\n                         0.4828070104122162,\n                         -0.635890007019043,\n                         -0.629800021648407,\n                         0.4460900127887726,\n                         -0.8775539994239807,\n                         -0.01909100078046322,\n                         0.47909700870513916,\n                         -0.4357450008392334,\n                         -0.670009970664978,\n                         0.6010090112686157,\n                         -0.6961889863014221,\n                         -0.02449600026011467,\n                         0.7174400091171265,\n                         0.11111299693584442,\n                         -0.9901599884033203,\n                         -0.08506900072097778,\n                         0.22330999374389648,\n                         -0.9747260212898254,\n                         0.006539999973028898,\n                         0.19009700417518616,\n                         -0.9694579839706421,\n                         0.15496399998664856,\n                         0.005270000081509352,\n                         -0.9818699955940247,\n                         0.18948200345039368,\n                         -0.011750999838113785,\n                         -0.9690240025520325,\n                         0.24668699502944946,\n                         0.3439059853553772,\n                         -0.5994120240211487,\n                         -0.7227950096130371,\n                         0.5724899768829346,\n                         -0.5916270017623901,\n                         -0.5676559805870056,\n                         0.7874360084533691,\n                         -0.5605109930038452,\n                         -0.2564600110054016,\n                         0.6470969915390015,\n                         -0.6981409788131714,\n                         -0.3063740134239197,\n                         0.4275279939174652,\n                         -0.7535750269889832,\n                         -0.49934399127960205,\n                         0.4109260141849518,\n                         -0.0012839999981224537,\n                         -0.9116680026054382,\n                         0.6715199947357178,\n                         0.0008989999769255519,\n                         -0.7409859895706177,\n                         0.9220259785652161,\n                         0.00725199980661273,\n                         -0.3870599865913391,\n                         0.8469099998474121,\n                         0.01385399978607893,\n                         -0.5315560102462769,\n                         0.5359240174293518,\n                         0.010503999888896942,\n                         -0.8442010283470154,\n                         0.4109260141849518,\n                         -0.0012839999981224537,\n                         -0.9116680026054382,\n                         0.3411880135536194,\n                         0.6009309887886047,\n                         -0.7228230237960815,\n                         0.5786640048027039,\n                         0.591838002204895,\n                         -0.5611389875411987,\n                         0.6715199947357178,\n                         0.0008989999769255519,\n                         -0.7409859895706177,\n                         0.7848690152168274,\n                         0.5665420293807983,\n                         -0.25102001428604126,\n                         0.9220259785652161,\n                         0.00725199980661273,\n                         -0.3870599865913391,\n                         0.6426810026168823,\n                         0.7039899826049805,\n                         -0.3022570013999939,\n                         0.8469099998474121,\n                         0.01385399978607893,\n                         -0.5315560102462769,\n                         0.4185889959335327,\n                         0.7581170201301575,\n                         -0.5000420212745667,\n                         0.5359240174293518,\n                         0.010503999888896942,\n                         -0.8442010283470154,\n                         0.11580599844455719,\n                         0.9901139736175537,\n                         -0.07913900166749954,\n                         0.23281100392341614,\n                         0.9724410176277161,\n                         0.012564999982714653,\n                         0.20666299760341644,\n                         0.9662799835205078,\n                         0.15360000729560852,\n                         0.02449899911880493,\n                         0.9865779876708984,\n                         0.16144299507141113,\n                         0.0033809999004006386,\n                         0.9774550199508667,\n                         0.2111150026321411,\n                         -0.13491199910640717,\n                         0.7135509848594666,\n                         0.6874909996986389,\n                         -0.31953999400138855,\n                         0.7050619721412659,\n                         0.6330729722976685,\n                         -0.6039019823074341,\n                         0.6499029994010925,\n                         0.4614419937133789,\n                         -0.6318150162696838,\n                         0.6400719881057739,\n                         0.43716898560523987,\n                         -0.4243049919605255,\n                         0.6667500138282776,\n                         0.6127070188522339,\n                         -0.230786994099617,\n                         0.006523000076413155,\n                         0.9729819893836975,\n                         -0.5489360094070435,\n                         0.0015109999803826213,\n                         0.8358629941940308,\n                         -0.8756710290908813,\n                         -0.009891999885439873,\n                         0.4828070104122162,\n                         -0.8775539994239807,\n                         -0.01909100078046322,\n                         0.47909700870513916,\n                         -0.6961889863014221,\n                         -0.02449600026011467,\n                         0.7174400091171265,\n                         -0.6961889863014221,\n                         -0.02449600026011467,\n                         0.7174400091171265,\n                         -0.4357450008392334,\n                         -0.670009970664978,\n                         0.6010090112686157,\n                         -0.25985801219940186,\n                         -0.5525479912757874,\n                         0.7919380068778992,\n                         -0.42579901218414307,\n                         -0.010804999619722366,\n                         0.9047530293464661,\n                         0.009537000209093094,\n                         0.021669000387191772,\n                         0.9997199773788452,\n                         0.022041000425815582,\n                         -0.001623000018298626,\n                         0.9997559785842896,\n                         0.4101540148258209,\n                         0.8490809798240662,\n                         0.3329179883003235,\n                         0.9995980262756348,\n                         -0.01155600044876337,\n                         0.02587899938225746,\n                         0.5415220260620117,\n                         0.6370009779930115,\n                         -0.5486199855804443,\n                         0.7095860242843628,\n                         -0.009670999832451344,\n                         -0.7045519948005676,\n                         -0.011750999838113785,\n                         -0.9690240025520325,\n                         0.24668699502944946,\n                         0.046310000121593475,\n                         -0.8891720175743103,\n                         0.45522499084472656,\n                         -0.010688000358641148,\n                         -0.14889900386333466,\n                         0.9887949824333191,\n                         -0.04437499865889549,\n                         0.7291200160980225,\n                         0.6829460263252258,\n                         0.12282499670982361,\n                         0.9923850297927856,\n                         0.009232000447809696,\n                         0.4275279939174652,\n                         -0.7535750269889832,\n                         -0.49934399127960205,\n                         0.48183900117874146,\n                         -0.857479989528656,\n                         -0.18044300377368927,\n                         0.45527198910713196,\n                         -0.49992498755455017,\n                         0.7367510199546814,\n                         -0.22054199874401093,\n                         0.3582780063152313,\n                         0.9071930050849915,\n                         -0.23591899871826172,\n                         0.7157959938049316,\n                         0.6572499871253967,\n                         0.5359240174293518,\n                         0.010503999888896942,\n                         -0.8442010283470154,\n                         0.7280910015106201,\n                         0.015584999695420265,\n                         -0.6853029727935791,\n                         0.8887389898300171,\n                         0.016679000109434128,\n                         0.4581089913845062,\n                         -0.26009801030158997,\n                         -0.0007999999797903001,\n                         0.965582013130188,\n                         -0.37161099910736084,\n                         0.004416999872773886,\n                         0.9283779859542847,\n                         0.5359240174293518,\n                         0.010503999888896942,\n                         -0.8442010283470154,\n                         0.4185889959335327,\n                         0.7581170201301575,\n                         -0.5000420212745667,\n                         0.4801650047302246,\n                         0.8588529825210571,\n                         -0.17836299538612366,\n                         0.7280910015106201,\n                         0.015584999695420265,\n                         -0.6853029727935791,\n                         0.4881030023097992,\n                         0.49794700741767883,\n                         0.7168020009994507,\n                         0.8887389898300171,\n                         0.016679000109434128,\n                         0.4581089913845062,\n                         -0.2220049947500229,\n                         -0.36189401149749756,\n                         0.9053990244865417,\n                         -0.26009801030158997,\n                         -0.0007999999797903001,\n                         0.965582013130188,\n                         -0.23540399968624115,\n                         -0.7104769945144653,\n                         0.6631799936294556,\n                         -0.37161099910736084,\n                         0.004416999872773886,\n                         0.9283779859542847,\n                         0.0033809999004006386,\n                         0.9774550199508667,\n                         0.2111150026321411,\n                         0.058719001710414886,\n                         0.8971999883651733,\n                         0.437703013420105,\n                         0.0013249999610707164,\n                         0.164000004529953,\n                         0.9864590167999268,\n                         -0.04418899863958359,\n                         -0.7303190231323242,\n                         0.6816750168800354,\n                         0.13880200684070587,\n                         -0.9897300004959106,\n                         -0.034189000725746155,\n                         -0.4243049919605255,\n                         0.6667500138282776,\n                         0.6127070188522339,\n                         -0.25888898968696594,\n                         0.5453789830207825,\n                         0.7972059845924377,\n                         0.012268000282347202,\n                         -0.01928500086069107,\n                         0.9997389912605286,\n                         0.3986299932003021,\n                         -0.8456630110740662,\n                         0.3548929989337921,\n                         0.5375639796257019,\n                         -0.6107370257377625,\n                         -0.5813990235328674,\n                         -0.6961889863014221,\n                         -0.02449600026011467,\n                         0.7174400091171265,\n                         -0.42579901218414307,\n                         -0.010804999619722366,\n                         0.9047530293464661,\n                         0.022041000425815582,\n                         -0.001623000018298626,\n                         0.9997559785842896,\n                         0.9995980262756348,\n                         -0.01155600044876337,\n                         0.02587899938225746,\n                         0.7095860242843628,\n                         -0.009670999832451344,\n                         -0.7045519948005676,\n                         0,\n                         0,\n                         1,\n                         0,\n                         0,\n                         1,\n                         0.7626410126686096,\n                         -0.31482499837875366,\n                         0.5650339722633362,\n                         0.8245400190353394,\n                         -0.00001700000029813964,\n                         0.5658029913902283,\n                         0.8479819893836975,\n                         -0.3500339984893799,\n                         -0.39799800515174866,\n                         0.917701005935669,\n                         -0.00003300000025774352,\n                         -0.397271990776062,\n                         0.8641409873962402,\n                         -0.35644200444221497,\n                         -0.3552600145339966,\n                         0.9352689981460571,\n                         -0.00011200000153621659,\n                         -0.3539389967918396,\n                         0.7209920287132263,\n                         -0.29793301224708557,\n                         0.6256250143051147,\n                         0.7807120084762573,\n                         -0.00007500000356230885,\n                         0.6248909831047058,\n                         0,\n                         0,\n                         1,\n                         0.5833569765090942,\n                         -0.5833380222320557,\n                         0.5651649832725525,\n                         0.648485004901886,\n                         -0.6484479904174805,\n                         -0.3987259864807129,\n                         0.6608719825744629,\n                         -0.6607480049133301,\n                         -0.35589399933815,\n                         0.5518630146980286,\n                         -0.5517799854278564,\n                         0.6252880096435547,\n                         0,\n                         0,\n                         1,\n                         0.31482499837875366,\n                         -0.762628972530365,\n                         0.5650510191917419,\n                         0.35004499554634094,\n                         -0.8479880094528198,\n                         -0.39797601103782654,\n                         0.35647401213645935,\n                         -0.8641520142555237,\n                         -0.35519900918006897,\n                         0.29798200726509094,\n                         -0.7210670113563538,\n                         0.6255149841308594,\n                         0,\n                         0,\n                         1,\n                         -0.00001700000029813964,\n                         -0.8245400190353394,\n                         0.5658029913902283,\n                         -0.00003300000025774352,\n                         -0.917701005935669,\n                         -0.397271990776062,\n                         -0.00011200000153621659,\n                         -0.9352689981460571,\n                         -0.3539389967918396,\n                         -0.00007500000356230885,\n                         -0.7807120084762573,\n                         0.6248900294303894,\n                         0,\n                         0,\n                         1,\n                         0,\n                         0,\n                         1,\n                         -0.31482499837875366,\n                         -0.7626410126686096,\n                         0.5650339722633362,\n                         -0.00001700000029813964,\n                         -0.8245400190353394,\n                         0.5658029913902283,\n                         -0.3500339984893799,\n                         -0.8479819893836975,\n                         -0.39799800515174866,\n                         -0.00003300000025774352,\n                         -0.917701005935669,\n                         -0.397271990776062,\n                         -0.35644200444221497,\n                         -0.8641409873962402,\n                         -0.3552600145339966,\n                         -0.00011200000153621659,\n                         -0.9352689981460571,\n                         -0.3539389967918396,\n                         -0.29793301224708557,\n                         -0.7209920287132263,\n                         0.6256250143051147,\n                         -0.00007500000356230885,\n                         -0.7807120084762573,\n                         0.6248900294303894,\n                         0,\n                         0,\n                         1,\n                         -0.5833380222320557,\n                         -0.5833569765090942,\n                         0.5651649832725525,\n                         -0.6484479904174805,\n                         -0.648485004901886,\n                         -0.3987259864807129,\n                         -0.6607480049133301,\n                         -0.6608719825744629,\n                         -0.35589399933815,\n                         -0.5517799854278564,\n                         -0.5518630146980286,\n                         0.6252880096435547,\n                         0,\n                         0,\n                         1,\n                         -0.762628972530365,\n                         -0.31482499837875366,\n                         0.5650510191917419,\n                         -0.8479880094528198,\n                         -0.35004499554634094,\n                         -0.39797601103782654,\n                         -0.8641520142555237,\n                         -0.35647401213645935,\n                         -0.35519900918006897,\n                         -0.7210670113563538,\n                         -0.29798200726509094,\n                         0.6255149841308594,\n                         0,\n                         0,\n                         1,\n                         -0.8245400190353394,\n                         0.00001700000029813964,\n                         0.5658029913902283,\n                         -0.917701005935669,\n                         0.00003300000025774352,\n                         -0.397271990776062,\n                         -0.9352689981460571,\n                         0.00011200000153621659,\n                         -0.3539389967918396,\n                         -0.7807120084762573,\n                         0.00007500000356230885,\n                         0.6248900294303894,\n                         0,\n                         0,\n                         1,\n                         0,\n                         0,\n                         1,\n                         -0.7626410126686096,\n                         0.31482499837875366,\n                         0.5650339722633362,\n                         -0.8245400190353394,\n                         0.00001700000029813964,\n                         0.5658029913902283,\n                         -0.8479819893836975,\n                         0.3500339984893799,\n                         -0.39799800515174866,\n                         -0.917701005935669,\n                         0.00003300000025774352,\n                         -0.397271990776062,\n                         -0.8641409873962402,\n                         0.35644200444221497,\n                         -0.3552600145339966,\n                         -0.9352689981460571,\n                         0.00011200000153621659,\n                         -0.3539389967918396,\n                         -0.7209920287132263,\n                         0.29793301224708557,\n                         0.6256250143051147,\n                         -0.7807120084762573,\n                         0.00007500000356230885,\n                         0.6248900294303894,\n                         0,\n                         0,\n                         1,\n                         -0.5833569765090942,\n                         0.5833380222320557,\n                         0.5651649832725525,\n                         -0.648485004901886,\n                         0.6484479904174805,\n                         -0.3987259864807129,\n                         -0.6608719825744629,\n                         0.6607480049133301,\n                         -0.35589399933815,\n                         -0.5518630146980286,\n                         0.5517799854278564,\n                         0.6252880096435547,\n                         0,\n                         0,\n                         1,\n                         -0.31482499837875366,\n                         0.762628972530365,\n                         0.5650510191917419,\n                         -0.35004499554634094,\n                         0.8479880094528198,\n                         -0.39797601103782654,\n                         -0.35647401213645935,\n                         0.8641520142555237,\n                         -0.35519900918006897,\n                         -0.29798200726509094,\n                         0.7210670113563538,\n                         0.6255149841308594,\n                         0,\n                         0,\n                         1,\n                         0.00001700000029813964,\n                         0.8245400190353394,\n                         0.5658029913902283,\n                         0.00003300000025774352,\n                         0.917701005935669,\n                         -0.397271990776062,\n                         0.00011200000153621659,\n                         0.9352689981460571,\n                         -0.3539389967918396,\n                         0.00007500000356230885,\n                         0.7807120084762573,\n                         0.6248900294303894,\n                         0,\n                         0,\n                         1,\n                         0,\n                         0,\n                         1,\n                         0.31482499837875366,\n                         0.7626410126686096,\n                         0.5650339722633362,\n                         0.00001700000029813964,\n                         0.8245400190353394,\n                         0.5658029913902283,\n                         0.3500339984893799,\n                         0.8479819893836975,\n                         -0.39799800515174866,\n                         0.00003300000025774352,\n                         0.917701005935669,\n                         -0.397271990776062,\n                         0.35644200444221497,\n                         0.8641409873962402,\n                         -0.3552600145339966,\n                         0.00011200000153621659,\n                         0.9352689981460571,\n                         -0.3539389967918396,\n                         0.29793301224708557,\n                         0.7209920287132263,\n                         0.6256250143051147,\n                         0.00007500000356230885,\n                         0.7807120084762573,\n                         0.6248900294303894,\n                         0,\n                         0,\n                         1,\n                         0.5833380222320557,\n                         0.5833569765090942,\n                         0.5651649832725525,\n                         0.6484479904174805,\n                         0.648485004901886,\n                         -0.3987259864807129,\n                         0.6607480049133301,\n                         0.6608719825744629,\n                         -0.35589399933815,\n                         0.5517799854278564,\n                         0.5518630146980286,\n                         0.6252880096435547,\n                         0,\n                         0,\n                         1,\n                         0.762628972530365,\n                         0.31482499837875366,\n                         0.5650510191917419,\n                         0.8479880094528198,\n                         0.35004499554634094,\n                         -0.39797601103782654,\n                         0.8641520142555237,\n                         0.35647401213645935,\n                         -0.35519900918006897,\n                         0.7210670113563538,\n                         0.29798200726509094,\n                         0.6255149841308594,\n                         0,\n                         0,\n                         1,\n                         0.8245400190353394,\n                         -0.00001700000029813964,\n                         0.5658029913902283,\n                         0.917701005935669,\n                         -0.00003300000025774352,\n                         -0.397271990776062,\n                         0.9352689981460571,\n                         -0.00011200000153621659,\n                         -0.3539389967918396,\n                         0.7807120084762573,\n                         -0.00007500000356230885,\n                         0.6248909831047058,\n                         0.7807120084762573,\n                         -0.00007500000356230885,\n                         0.6248909831047058,\n                         0.7209920287132263,\n                         -0.29793301224708557,\n                         0.6256250143051147,\n                         0.21797800064086914,\n                         -0.0902160033583641,\n                         0.9717749953269958,\n                         0.23658299446105957,\n                         0,\n                         0.9716110229492188,\n                         0.1595889925956726,\n                         -0.06596100330352783,\n                         0.9849770069122314,\n                         0.17308400571346283,\n                         0,\n                         0.9849069714546204,\n                         0.3504979908466339,\n                         -0.1447400003671646,\n                         0.9253119826316833,\n                         0.37970298528671265,\n                         0,\n                         0.925108015537262,\n                         0.48558899760246277,\n                         -0.20147399604320526,\n                         0.8506529927253723,\n                         0.5266720056533813,\n                         0,\n                         0.8500679731369019,\n                         0.5518630146980286,\n                         -0.5517799854278564,\n                         0.6252880096435547,\n                         0.16663099825382233,\n                         -0.16663099825382233,\n                         0.9718379974365234,\n                         0.12190800160169601,\n                         -0.12190800160169601,\n                         0.9850260019302368,\n                         0.2676680088043213,\n                         -0.2676680088043213,\n                         0.9255849719047546,\n                         0.37131500244140625,\n                         -0.37131500244140625,\n                         0.8510289788246155,\n                         0.29798200726509094,\n                         -0.7210670113563538,\n                         0.6255149841308594,\n                         0.0902160033583641,\n                         -0.21797800064086914,\n                         0.9717749953269958,\n                         0.06596100330352783,\n                         -0.1595889925956726,\n                         0.9849770069122314,\n                         0.1447400003671646,\n                         -0.3504979908466339,\n                         0.9253119826316833,\n                         0.20147399604320526,\n                         -0.48558899760246277,\n                         0.8506529927253723,\n                         -0.00007500000356230885,\n                         -0.7807120084762573,\n                         0.6248900294303894,\n                         0,\n                         -0.23658299446105957,\n                         0.9716110229492188,\n                         0,\n                         -0.17308400571346283,\n                         0.9849069714546204,\n                         0,\n                         -0.37970298528671265,\n                         0.925108015537262,\n                         0,\n                         -0.5266720056533813,\n                         0.8500679731369019,\n                         -0.00007500000356230885,\n                         -0.7807120084762573,\n                         0.6248900294303894,\n                         -0.29793301224708557,\n                         -0.7209920287132263,\n                         0.6256250143051147,\n                         -0.0902160033583641,\n                         -0.21797800064086914,\n                         0.9717749953269958,\n                         0,\n                         -0.23658299446105957,\n                         0.9716110229492188,\n                         -0.06596100330352783,\n                         -0.1595889925956726,\n                         0.9849770069122314,\n                         0,\n                         -0.17308400571346283,\n                         0.9849069714546204,\n                         -0.1447400003671646,\n                         -0.3504979908466339,\n                         0.9253119826316833,\n                         0,\n                         -0.37970298528671265,\n                         0.925108015537262,\n                         -0.20147399604320526,\n                         -0.48558899760246277,\n                         0.8506529927253723,\n                         0,\n                         -0.5266720056533813,\n                         0.8500679731369019,\n                         -0.5517799854278564,\n                         -0.5518630146980286,\n                         0.6252880096435547,\n                         -0.16663099825382233,\n                         -0.16663099825382233,\n                         0.9718379974365234,\n                         -0.12190800160169601,\n                         -0.12190800160169601,\n                         0.9850260019302368,\n                         -0.2676680088043213,\n                         -0.2676680088043213,\n                         0.9255849719047546,\n                         -0.37131500244140625,\n                         -0.37131500244140625,\n                         0.8510289788246155,\n                         -0.7210670113563538,\n                         -0.29798200726509094,\n                         0.6255149841308594,\n                         -0.21797800064086914,\n                         -0.0902160033583641,\n                         0.9717749953269958,\n                         -0.1595889925956726,\n                         -0.06596100330352783,\n                         0.9849770069122314,\n                         -0.3504979908466339,\n                         -0.1447400003671646,\n                         0.9253119826316833,\n                         -0.48558899760246277,\n                         -0.20147399604320526,\n                         0.8506529927253723,\n                         -0.7807120084762573,\n                         0.00007500000356230885,\n                         0.6248900294303894,\n                         -0.23658299446105957,\n                         0,\n                         0.9716110229492188,\n                         -0.17308400571346283,\n                         0,\n                         0.9849069714546204,\n                         -0.37970298528671265,\n                         0,\n                         0.925108015537262,\n                         -0.5266720056533813,\n                         0,\n                         0.8500679731369019,\n                         -0.7807120084762573,\n                         0.00007500000356230885,\n                         0.6248900294303894,\n                         -0.7209920287132263,\n                         0.29793301224708557,\n                         0.6256250143051147,\n                         -0.21797800064086914,\n                         0.0902160033583641,\n                         0.9717749953269958,\n                         -0.23658299446105957,\n                         0,\n                         0.9716110229492188,\n                         -0.1595889925956726,\n                         0.06596100330352783,\n                         0.9849770069122314,\n                         -0.17308400571346283,\n                         0,\n                         0.9849069714546204,\n                         -0.3504979908466339,\n                         0.1447400003671646,\n                         0.9253119826316833,\n                         -0.37970298528671265,\n                         0,\n                         0.925108015537262,\n                         -0.48558899760246277,\n                         0.20147399604320526,\n                         0.8506529927253723,\n                         -0.5266720056533813,\n                         0,\n                         0.8500679731369019,\n                         -0.5518630146980286,\n                         0.5517799854278564,\n                         0.6252880096435547,\n                         -0.16663099825382233,\n                         0.16663099825382233,\n                         0.9718379974365234,\n                         -0.12190800160169601,\n                         0.12190800160169601,\n                         0.9850260019302368,\n                         -0.2676680088043213,\n                         0.2676680088043213,\n                         0.9255849719047546,\n                         -0.37131500244140625,\n                         0.37131500244140625,\n                         0.8510289788246155,\n                         -0.29798200726509094,\n                         0.7210670113563538,\n                         0.6255149841308594,\n                         -0.0902160033583641,\n                         0.21797800064086914,\n                         0.9717749953269958,\n                         -0.06596100330352783,\n                         0.1595889925956726,\n                         0.9849770069122314,\n                         -0.1447400003671646,\n                         0.3504979908466339,\n                         0.9253119826316833,\n                         -0.20147399604320526,\n                         0.48558899760246277,\n                         0.8506529927253723,\n                         0.00007500000356230885,\n                         0.7807120084762573,\n                         0.6248900294303894,\n                         0,\n                         0.23658299446105957,\n                         0.9716110229492188,\n                         0,\n                         0.17308400571346283,\n                         0.9849069714546204,\n                         0,\n                         0.37970298528671265,\n                         0.925108015537262,\n                         0,\n                         0.5266720056533813,\n                         0.8500679731369019,\n                         0.00007500000356230885,\n                         0.7807120084762573,\n                         0.6248900294303894,\n                         0.29793301224708557,\n                         0.7209920287132263,\n                         0.6256250143051147,\n                         0.0902160033583641,\n                         0.21797800064086914,\n                         0.9717749953269958,\n                         0,\n                         0.23658299446105957,\n                         0.9716110229492188,\n                         0.06596100330352783,\n                         0.1595889925956726,\n                         0.9849770069122314,\n                         0,\n                         0.17308400571346283,\n                         0.9849069714546204,\n                         0.1447400003671646,\n                         0.3504979908466339,\n                         0.9253119826316833,\n                         0,\n                         0.37970298528671265,\n                         0.925108015537262,\n                         0.20147399604320526,\n                         0.48558899760246277,\n                         0.8506529927253723,\n                         0,\n                         0.5266720056533813,\n                         0.8500679731369019,\n                         0.5517799854278564,\n                         0.5518630146980286,\n                         0.6252880096435547,\n                         0.16663099825382233,\n                         0.16663099825382233,\n                         0.9718379974365234,\n                         0.12190800160169601,\n                         0.12190800160169601,\n                         0.9850260019302368,\n                         0.2676680088043213,\n                         0.2676680088043213,\n                         0.9255849719047546,\n                         0.37131500244140625,\n                         0.37131500244140625,\n                         0.8510289788246155,\n                         0.7210670113563538,\n                         0.29798200726509094,\n                         0.6255149841308594,\n                         0.21797800064086914,\n                         0.0902160033583641,\n                         0.9717749953269958,\n                         0.1595889925956726,\n                         0.06596100330352783,\n                         0.9849770069122314,\n                         0.3504979908466339,\n                         0.1447400003671646,\n                         0.9253119826316833,\n                         0.48558899760246277,\n                         0.20147399604320526,\n                         0.8506529927253723,\n                         0.7807120084762573,\n                         -0.00007500000356230885,\n                         0.6248909831047058,\n                         0.23658299446105957,\n                         0,\n                         0.9716110229492188,\n                         0.17308400571346283,\n                         0,\n                         0.9849069714546204,\n                         0.37970298528671265,\n                         0,\n                         0.925108015537262,\n                         0.5266720056533813,\n                         0,\n                         0.8500679731369019};\n\nfloat teapotTangents[] = {0.012897999957203865,\n                          0.998727023601532,\n                          -0.048757001757621765,\n                          0.3861910104751587,\n                          0.9210079908370972,\n                          -0.016421999782323837,\n                          0.38136398792266846,\n                          0.9230089783668518,\n                          0.000155999994603917,\n                          0.012866999953985214,\n                          0.9987300038337708,\n                          0.04870200157165527,\n                          0.3750790059566498,\n                          0.9061710238456726,\n                          -0.0007169999880716205,\n                          0.19210100173950195,\n                          0.9812139868736267,\n                          0.01775900088250637,\n                          0.3782620131969452,\n                          0.9142940044403076,\n                          -0.00011300000187475234,\n                          0.10451500117778778,\n                          0.9897350072860718,\n                          -0.09747499972581863,\n                          0.3655939996242523,\n                          0.9257190227508545,\n                          0.028463000431656837,\n                          0.04767199978232384,\n                          0.9953050017356873,\n                          -0.08423800021409988,\n                          0.7092679738998413,\n                          0.7031199932098389,\n                          -0.016364000737667084,\n                          0.7061989903450012,\n                          0.7061989903450012,\n                          0,\n                          0.6937360167503357,\n                          0.6937360167503357,\n                          0,\n                          0.6997770071029663,\n                          0.6997770071029663,\n                          0,\n                          0.6924030184745789,\n                          0.7150859832763672,\n                          0.02822900004684925,\n                          0.9243540167808533,\n                          0.37810400128364563,\n                          -0.01657800003886223,\n                          0.9230089783668518,\n                          0.38136398792266846,\n                          -0.000155999994603917,\n                          0.9061710238456726,\n                          0.3750790059566498,\n                          0.0007169999880716205,\n                          0.9142940044403076,\n                          0.3782620131969452,\n                          0.00011300000187475234,\n                          0.9133660197257996,\n                          0.39544400572776794,\n                          0.028490999713540077,\n                          0.9987040162086487,\n                          0.015853000804781914,\n                          0.04836999997496605,\n                          0.9987369775772095,\n                          0.014649000018835068,\n                          -0.04806999862194061,\n                          0.9812150001525879,\n                          0.19211700558662415,\n                          -0.01754000037908554,\n                          0.9897350072860718,\n                          0.10452800244092941,\n                          0.09745799750089645,\n                          0.9953050017356873,\n                          0.04767199978232384,\n                          0.08423800021409988,\n                          0.9988179802894592,\n                          -0.009758999571204185,\n                          -0.047600001096725464,\n                          0.9094679951667786,\n                          -0.4095839858055115,\n                          -0.012636999599635601,\n                          0.9240090250968933,\n                          -0.3811509907245636,\n                          -0.0003150000120513141,\n                          0.9987890124320984,\n                          -0.01066299993544817,\n                          0.04801800101995468,\n                          0.9072269797325134,\n                          -0.37142300605773926,\n                          0.0207310002297163,\n                          0.9814350008964539,\n                          -0.19095200300216675,\n                          0.01795700006186962,\n                          0.914870023727417,\n                          -0.3771440088748932,\n                          -0.0011480000102892518,\n                          0.989749014377594,\n                          -0.10442499816417694,\n                          -0.09742700308561325,\n                          0.925815999507904,\n                          -0.3653950095176697,\n                          0.028308000415563583,\n                          0.9953050017356873,\n                          -0.04767199978232384,\n                          -0.08423800021409988,\n                          0.6768929958343506,\n                          -0.7314029932022095,\n                          -0.01988700032234192,\n                          0.6994619965553284,\n                          -0.7145140171051025,\n                          -0.00029799999902024865,\n                          0.6940590143203735,\n                          -0.6933979988098145,\n                          0.015560000203549862,\n                          0.7002580165863037,\n                          -0.6996300220489502,\n                          -0.000783999974373728,\n                          0.715142011642456,\n                          -0.6923869848251343,\n                          0.028078999370336533,\n                          0.351936012506485,\n                          -0.933899998664856,\n                          -0.019843999296426773,\n                          0.36654001474380493,\n                          -0.9298419952392578,\n                          -0.0005210000090301037,\n                          0.37116900086402893,\n                          -0.9084830284118652,\n                          0.00152299995534122,\n                          0.3776479959487915,\n                          -0.9147650003433228,\n                          -0.00011000000085914508,\n                          0.39533698558807373,\n                          -0.9134349822998047,\n                          0.028410999104380608,\n                          0.0013210000470280647,\n                          -0.9989479780197144,\n                          0.045830998569726944,\n                          0.003897000104188919,\n                          -0.9988909959793091,\n                          -0.04690299928188324,\n                          0.18705999851226807,\n                          -0.9821630120277405,\n                          -0.018818000331521034,\n                          0.10363999754190445,\n                          -0.9898579716682434,\n                          0.09715499728918076,\n                          0.04757700115442276,\n                          -0.9953129887580872,\n                          0.08418799936771393,\n                          -0.02296699956059456,\n                          -0.9986780285835266,\n                          -0.04599199816584587,\n                          -0.3861910104751587,\n                          -0.9210079908370972,\n                          -0.016421999782323837,\n                          -0.38136398792266846,\n                          -0.9230089783668518,\n                          0.000155999994603917,\n                          -0.020431000739336014,\n                          -0.9987260103225708,\n                          0.04614400118589401,\n                          -0.3750790059566498,\n                          -0.9061710238456726,\n                          -0.0007169999880716205,\n                          -0.19216600060462952,\n                          -0.9812189936637878,\n                          0.01677200011909008,\n                          -0.3782620131969452,\n                          -0.9142940044403076,\n                          -0.00011300000187475234,\n                          -0.10471200197935104,\n                          -0.9897390007972717,\n                          -0.09722500294446945,\n                          -0.3655939996242523,\n                          -0.9257190227508545,\n                          0.028463000431656837,\n                          -0.047710999846458435,\n                          -0.9953050017356873,\n                          -0.08420699834823608,\n                          -0.7092679738998413,\n                          -0.7031199932098389,\n                          -0.016364000737667084,\n                          -0.7061989903450012,\n                          -0.7061989903450012,\n                          0,\n                          -0.6937360167503357,\n                          -0.6937360167503357,\n                          0,\n                          -0.6997770071029663,\n                          -0.6997770071029663,\n                          0,\n                          -0.6924030184745789,\n                          -0.7150859832763672,\n                          0.02822900004684925,\n                          -0.9243540167808533,\n                          -0.37810400128364563,\n                          -0.01657800003886223,\n                          -0.9230089783668518,\n                          -0.38136398792266846,\n                          -0.000155999994603917,\n                          -0.9061710238456726,\n                          -0.3750790059566498,\n                          0.0007169999880716205,\n                          -0.9142940044403076,\n                          -0.3782620131969452,\n                          0.00011300000187475234,\n                          -0.9133660197257996,\n                          -0.39544400572776794,\n                          0.028490999713540077,\n                          -0.998727023601532,\n                          -0.012897999957203865,\n                          0.048757001757621765,\n                          -0.9987300038337708,\n                          -0.012866999953985214,\n                          -0.04870200157165527,\n                          -0.9812139868736267,\n                          -0.19210100173950195,\n                          -0.01775900088250637,\n                          -0.9897350072860718,\n                          -0.10451500117778778,\n                          0.09747499972581863,\n                          -0.9953050017356873,\n                          -0.04767199978232384,\n                          0.08423800021409988,\n                          -0.998727023601532,\n                          0.012897999957203865,\n                          -0.048757001757621765,\n                          -0.9210079908370972,\n                          0.3861910104751587,\n                          -0.016421999782323837,\n                          -0.9230089783668518,\n                          0.38136398792266846,\n                          0.000155999994603917,\n                          -0.9987300038337708,\n                          0.012866999953985214,\n                          0.04870200157165527,\n                          -0.9061710238456726,\n                          0.3750790059566498,\n                          -0.0007169999880716205,\n                          -0.9812139868736267,\n                          0.19210100173950195,\n                          0.01775900088250637,\n                          -0.9142940044403076,\n                          0.3782620131969452,\n                          -0.00011300000187475234,\n                          -0.9897350072860718,\n                          0.10451500117778778,\n                          -0.09747499972581863,\n                          -0.9257190227508545,\n                          0.3655939996242523,\n                          0.028463000431656837,\n                          -0.9953050017356873,\n                          0.04767199978232384,\n                          -0.08423800021409988,\n                          -0.7031199932098389,\n                          0.7092679738998413,\n                          -0.016364000737667084,\n                          -0.7061989903450012,\n                          0.7061989903450012,\n                          0,\n                          -0.6937360167503357,\n                          0.6937360167503357,\n                          0,\n                          -0.6997770071029663,\n                          0.6997770071029663,\n                          0,\n                          -0.7150859832763672,\n                          0.6924030184745789,\n                          0.02822900004684925,\n                          -0.37810400128364563,\n                          0.9243540167808533,\n                          -0.01657800003886223,\n                          -0.38136398792266846,\n                          0.9230089783668518,\n                          -0.000155999994603917,\n                          -0.3750790059566498,\n                          0.9061710238456726,\n                          0.0007169999880716205,\n                          -0.3782620131969452,\n                          0.9142940044403076,\n                          0.00011300000187475234,\n                          -0.39544400572776794,\n                          0.9133660197257996,\n                          0.028490999713540077,\n                          -0.012897999957203865,\n                          0.998727023601532,\n                          0.048757001757621765,\n                          -0.012866999953985214,\n                          0.9987300038337708,\n                          -0.04870200157165527,\n                          -0.19210100173950195,\n                          0.9812139868736267,\n                          -0.01775900088250637,\n                          -0.10451500117778778,\n                          0.9897350072860718,\n                          0.09747499972581863,\n                          -0.04767199978232384,\n                          0.9953050017356873,\n                          0.08423800021409988,\n                          0.04767199978232384,\n                          0.9953050017356873,\n                          -0.08423800021409988,\n                          0.39544400572776794,\n                          0.9133660197257996,\n                          -0.028490999713540077,\n                          0.38111698627471924,\n                          0.9210190176963806,\n                          -0.000015999999959603883,\n                          0.031922999769449234,\n                          0.9968529939651489,\n                          -0.07255599647760391,\n                          0.3815299868583679,\n                          0.9219080209732056,\n                          0.0000019999999949504854,\n                          0.022261999547481537,\n                          0.9978039860725403,\n                          -0.06237399950623512,\n                          0.3821389973163605,\n                          0.9231889843940735,\n                          0.00001700000029813964,\n                          0.008317999541759491,\n                          0.9991790056228638,\n                          -0.03964800015091896,\n                          0.38228899240493774,\n                          0.9239469766616821,\n                          -0.004430000204592943,\n                          0.0008660000166855752,\n                          0.9999139904975891,\n                          0.013048999942839146,\n                          0.7150859832763672,\n                          0.6924030184745789,\n                          -0.02822900004684925,\n                          0.7048519849777222,\n                          0.7048519849777222,\n                          0,\n                          0.7055330276489258,\n                          0.7055330276489258,\n                          0,\n                          0.7065179944038391,\n                          0.7065179944038391,\n                          0,\n                          0.7068390250205994,\n                          0.707252025604248,\n                          -0.004379999823868275,\n                          0.9257190227508545,\n                          0.3655939996242523,\n                          -0.028463000431656837,\n                          0.9210180044174194,\n                          0.38111698627471924,\n                          0.000015999999959603883,\n                          0.9219080209732056,\n                          0.3815299868583679,\n                          -0.0000019999999949504854,\n                          0.9231889843940735,\n                          0.3821389973163605,\n                          -0.00001700000029813964,\n                          0.9237229824066162,\n                          0.38283199071884155,\n                          -0.004399999976158142,\n                          0.9953050017356873,\n                          0.04767199978232384,\n                          0.08423800021409988,\n                          0.9968529939651489,\n                          0.031922999769449234,\n                          0.07255599647760391,\n                          0.9978039860725403,\n                          0.022261999547481537,\n                          0.06237399950623512,\n                          0.9991790056228638,\n                          0.008317999541759491,\n                          0.03964800015091896,\n                          0.9999139904975891,\n                          0.0008660000166855752,\n                          -0.013048999942839146,\n                          0.9953050017356873,\n                          -0.04767199978232384,\n                          -0.08423800021409988,\n                          0.9135000109672546,\n                          -0.3951619863510132,\n                          -0.02861100062727928,\n                          0.9210190176963806,\n                          -0.38111698627471924,\n                          -0.000015999999959603883,\n                          0.9968529939651489,\n                          -0.031922999769449234,\n                          -0.07255599647760391,\n                          0.9219080209732056,\n                          -0.3815299868583679,\n                          0.0000019999999949504854,\n                          0.9978039860725403,\n                          -0.022261999547481537,\n                          -0.06237399950623512,\n                          0.9231889843940735,\n                          -0.3821389973163605,\n                          0.00001700000029813964,\n                          0.9991790056228638,\n                          -0.008317999541759491,\n                          -0.03964800015091896,\n                          0.9239469766616821,\n                          -0.38228899240493774,\n                          -0.004430000204592943,\n                          0.9999139904975891,\n                          -0.0008660000166855752,\n                          0.013048999942839146,\n                          0.6925899982452393,\n                          -0.7149369716644287,\n                          -0.028262000530958176,\n                          0.7048519849777222,\n                          -0.7048519849777222,\n                          0,\n                          0.7055330276489258,\n                          -0.7055330276489258,\n                          0,\n                          0.7065179944038391,\n                          -0.7065179944038391,\n                          0,\n                          0.707252025604248,\n                          -0.7068390250205994,\n                          -0.004379999823868275,\n                          0.3656100034713745,\n                          -0.9257280230522156,\n                          -0.02841299958527088,\n                          0.38111698627471924,\n                          -0.9210180044174194,\n                          0.000015999999959603883,\n                          0.3815299868583679,\n                          -0.9219080209732056,\n                          -0.0000019999999949504854,\n                          0.3821389973163605,\n                          -0.9231889843940735,\n                          -0.00001700000029813964,\n                          0.38283199071884155,\n                          -0.9237229824066162,\n                          -0.004399999976158142,\n                          0.04757700115442276,\n                          -0.9953129887580872,\n                          0.08418799936771393,\n                          0.031922999769449234,\n                          -0.9968529939651489,\n                          0.07255599647760391,\n                          0.022261999547481537,\n                          -0.9978039860725403,\n                          0.06237399950623512,\n                          0.008317999541759491,\n                          -0.9991790056228638,\n                          0.03964800015091896,\n                          0.0008660000166855752,\n                          -0.9999139904975891,\n                          -0.013048999942839146,\n                          -0.047710999846458435,\n                          -0.9953050017356873,\n                          -0.08420699834823608,\n                          -0.39544400572776794,\n                          -0.9133660197257996,\n                          -0.028490999713540077,\n                          -0.38111698627471924,\n                          -0.9210190176963806,\n                          -0.000015999999959603883,\n                          -0.031922999769449234,\n                          -0.9968529939651489,\n                          -0.07255599647760391,\n                          -0.3815299868583679,\n                          -0.9219080209732056,\n                          0.0000019999999949504854,\n                          -0.022261999547481537,\n                          -0.9978039860725403,\n                          -0.06237399950623512,\n                          -0.3821389973163605,\n                          -0.9231889843940735,\n                          0.00001700000029813964,\n                          -0.008317999541759491,\n                          -0.9991790056228638,\n                          -0.03964800015091896,\n                          -0.38228899240493774,\n                          -0.9239469766616821,\n                          -0.004430000204592943,\n                          -0.0008660000166855752,\n                          -0.9999139904975891,\n                          0.013048999942839146,\n                          -0.7150859832763672,\n                          -0.6924030184745789,\n                          -0.02822900004684925,\n                          -0.7048519849777222,\n                          -0.7048519849777222,\n                          0,\n                          -0.7055330276489258,\n                          -0.7055330276489258,\n                          0,\n                          -0.7065179944038391,\n                          -0.7065179944038391,\n                          0,\n                          -0.7068390250205994,\n                          -0.707252025604248,\n                          -0.004379999823868275,\n                          -0.9257190227508545,\n                          -0.3655939996242523,\n                          -0.028463000431656837,\n                          -0.9210180044174194,\n                          -0.38111698627471924,\n                          0.000015999999959603883,\n                          -0.9219080209732056,\n                          -0.3815299868583679,\n                          -0.0000019999999949504854,\n                          -0.9231889843940735,\n                          -0.3821389973163605,\n                          -0.00001700000029813964,\n                          -0.9237229824066162,\n                          -0.38283199071884155,\n                          -0.004399999976158142,\n                          -0.9953050017356873,\n                          -0.04767199978232384,\n                          0.08423800021409988,\n                          -0.9968529939651489,\n                          -0.031922999769449234,\n                          0.07255599647760391,\n                          -0.9978039860725403,\n                          -0.022261999547481537,\n                          0.06237399950623512,\n                          -0.9991790056228638,\n                          -0.008317999541759491,\n                          0.03964800015091896,\n                          -0.9999139904975891,\n                          -0.0008660000166855752,\n                          -0.013048999942839146,\n                          -0.9953050017356873,\n                          0.04767199978232384,\n                          -0.08423800021409988,\n                          -0.9133660197257996,\n                          0.39544400572776794,\n                          -0.028490999713540077,\n                          -0.9210190176963806,\n                          0.38111698627471924,\n                          -0.000015999999959603883,\n                          -0.9968529939651489,\n                          0.031922999769449234,\n                          -0.07255599647760391,\n                          -0.9219080209732056,\n                          0.3815299868583679,\n                          0.0000019999999949504854,\n                          -0.9978039860725403,\n                          0.022261999547481537,\n                          -0.06237399950623512,\n                          -0.9231889843940735,\n                          0.3821389973163605,\n                          0.00001700000029813964,\n                          -0.9991790056228638,\n                          0.008317999541759491,\n                          -0.03964800015091896,\n                          -0.9239469766616821,\n                          0.38228899240493774,\n                          -0.004430000204592943,\n                          -0.9999139904975891,\n                          0.0008660000166855752,\n                          0.013048999942839146,\n                          -0.6924030184745789,\n                          0.7150859832763672,\n                          -0.02822900004684925,\n                          -0.7048519849777222,\n                          0.7048519849777222,\n                          0,\n                          -0.7055330276489258,\n                          0.7055330276489258,\n                          0,\n                          -0.7065179944038391,\n                          0.7065179944038391,\n                          0,\n                          -0.707252025604248,\n                          0.7068390250205994,\n                          -0.004379999823868275,\n                          -0.3655939996242523,\n                          0.9257190227508545,\n                          -0.028463000431656837,\n                          -0.38111698627471924,\n                          0.9210180044174194,\n                          0.000015999999959603883,\n                          -0.3815299868583679,\n                          0.9219080209732056,\n                          -0.0000019999999949504854,\n                          -0.3821389973163605,\n                          0.9231889843940735,\n                          -0.00001700000029813964,\n                          -0.38283199071884155,\n                          0.9237229824066162,\n                          -0.004399999976158142,\n                          -0.04767199978232384,\n                          0.9953050017356873,\n                          0.08423800021409988,\n                          -0.031922999769449234,\n                          0.9968529939651489,\n                          0.07255599647760391,\n                          -0.022261999547481537,\n                          0.9978039860725403,\n                          0.06237399950623512,\n                          -0.008317999541759491,\n                          0.9991790056228638,\n                          0.03964800015091896,\n                          -0.0008660000166855752,\n                          0.9999139904975891,\n                          -0.013048999942839146,\n                          0.0008660000166855752,\n                          0.9999139904975891,\n                          0.013048999942839146,\n                          0.38283199071884155,\n                          0.9237229824066162,\n                          0.004399999976158142,\n                          0.38101500272750854,\n                          0.9204739928245544,\n                          -0.00003899999865097925,\n                          0.03731299936771393,\n                          0.9963229894638062,\n                          0.07712399959564209,\n                          0.37877199053764343,\n                          0.9154880046844482,\n                          0.00008399999933317304,\n                          0.09151100367307663,\n                          0.9910060167312622,\n                          0.097632996737957,\n                          0.378387987613678,\n                          0.9145749807357788,\n                          0.00009999999747378752,\n                          0.10134600102901459,\n                          0.9900450110435486,\n                          0.09767600148916245,\n                          0.356795996427536,\n                          0.9266510009765625,\n                          -0.03188199922442436,\n                          0.07246600091457367,\n                          0.9928709864616394,\n                          0.09463199973106384,\n                          0.707252025604248,\n                          0.7068390250205994,\n                          0.004379999823868275,\n                          0.7044739723205566,\n                          0.7044739723205566,\n                          0,\n                          0.7006790041923523,\n                          0.7006790041923523,\n                          0,\n                          0.6999930143356323,\n                          0.6999930143356323,\n                          0,\n                          0.6847820281982422,\n                          0.7192310094833374,\n                          -0.03167999908328056,\n                          0.9239469766616821,\n                          0.38228899240493774,\n                          0.004430000204592943,\n                          0.9204739928245544,\n                          0.38101500272750854,\n                          0.00003899999865097925,\n                          0.9154880046844482,\n                          0.37877199053764343,\n                          -0.00008399999933317304,\n                          0.9145749807357788,\n                          0.378387987613678,\n                          -0.00009999999747378752,\n                          0.9078760147094727,\n                          0.40216198563575745,\n                          -0.03206299990415573,\n                          0.9999139904975891,\n                          0.0008660000166855752,\n                          -0.013048999942839146,\n                          0.9963229894638062,\n                          0.03731299936771393,\n                          -0.07712399959564209,\n                          0.9910060167312622,\n                          0.09151100367307663,\n                          -0.097632996737957,\n                          0.9900450110435486,\n                          0.10134600102901459,\n                          -0.09767600148916245,\n                          0.9928709864616394,\n                          0.07246600091457367,\n                          -0.09463199973106384,\n                          0.9999139904975891,\n                          -0.0008660000166855752,\n                          0.013048999942839146,\n                          0.9237229824066162,\n                          -0.38283199071884155,\n                          0.004399999976158142,\n                          0.9204739928245544,\n                          -0.38101500272750854,\n                          -0.00003899999865097925,\n                          0.9963229894638062,\n                          -0.03731299936771393,\n                          0.07712399959564209,\n                          0.9154880046844482,\n                          -0.37877199053764343,\n                          0.00008399999933317304,\n                          0.9910060167312622,\n                          -0.09151100367307663,\n                          0.097632996737957,\n                          0.9145749807357788,\n                          -0.378387987613678,\n                          0.00009999999747378752,\n                          0.9900450110435486,\n                          -0.10134600102901459,\n                          0.09767600148916245,\n                          0.9266510009765625,\n                          -0.356795996427536,\n                          -0.03188199922442436,\n                          0.9928709864616394,\n                          -0.07246600091457367,\n                          0.09463199973106384,\n                          0.7068390250205994,\n                          -0.707252025604248,\n                          0.004379999823868275,\n                          0.7044739723205566,\n                          -0.7044739723205566,\n                          0,\n                          0.7006790041923523,\n                          -0.7006790041923523,\n                          0,\n                          0.6999930143356323,\n                          -0.6999930143356323,\n                          0,\n                          0.7192310094833374,\n                          -0.6847820281982422,\n                          -0.03167999908328056,\n                          0.38228899240493774,\n                          -0.9239469766616821,\n                          0.004430000204592943,\n                          0.38101500272750854,\n                          -0.9204739928245544,\n                          0.00003899999865097925,\n                          0.37877199053764343,\n                          -0.9154880046844482,\n                          -0.00008399999933317304,\n                          0.378387987613678,\n                          -0.9145749807357788,\n                          -0.00009999999747378752,\n                          0.40216198563575745,\n                          -0.9078760147094727,\n                          -0.03206299990415573,\n                          0.0008660000166855752,\n                          -0.9999139904975891,\n                          -0.013048999942839146,\n                          0.03731299936771393,\n                          -0.9963229894638062,\n                          -0.07712399959564209,\n                          0.09151100367307663,\n                          -0.9910060167312622,\n                          -0.097632996737957,\n                          0.10134600102901459,\n                          -0.9900450110435486,\n                          -0.09767600148916245,\n                          0.07246600091457367,\n                          -0.9928709864616394,\n                          -0.09463199973106384,\n                          -0.0008660000166855752,\n                          -0.9999139904975891,\n                          0.013048999942839146,\n                          -0.38283199071884155,\n                          -0.9237229824066162,\n                          0.004399999976158142,\n                          -0.38101500272750854,\n                          -0.9204739928245544,\n                          -0.00003899999865097925,\n                          -0.03731299936771393,\n                          -0.9963229894638062,\n                          0.07712399959564209,\n                          -0.37877199053764343,\n                          -0.9154880046844482,\n                          0.00008399999933317304,\n                          -0.09151100367307663,\n                          -0.9910060167312622,\n                          0.097632996737957,\n                          -0.378387987613678,\n                          -0.9145749807357788,\n                          0.00009999999747378752,\n                          -0.10134600102901459,\n                          -0.9900450110435486,\n                          0.09767600148916245,\n                          -0.356795996427536,\n                          -0.9266510009765625,\n                          -0.03188199922442436,\n                          -0.07246600091457367,\n                          -0.9928709864616394,\n                          0.09463199973106384,\n                          -0.707252025604248,\n                          -0.7068390250205994,\n                          0.004379999823868275,\n                          -0.7044739723205566,\n                          -0.7044739723205566,\n                          0,\n                          -0.7006790041923523,\n                          -0.7006790041923523,\n                          0,\n                          -0.6999930143356323,\n                          -0.6999930143356323,\n                          0,\n                          -0.6847820281982422,\n                          -0.7192310094833374,\n                          -0.03167999908328056,\n                          -0.9239469766616821,\n                          -0.38228899240493774,\n                          0.004430000204592943,\n                          -0.9204739928245544,\n                          -0.38101500272750854,\n                          0.00003899999865097925,\n                          -0.9154880046844482,\n                          -0.37877199053764343,\n                          -0.00008399999933317304,\n                          -0.9145749807357788,\n                          -0.378387987613678,\n                          -0.00009999999747378752,\n                          -0.9078760147094727,\n                          -0.40216198563575745,\n                          -0.03206299990415573,\n                          -0.9999139904975891,\n                          -0.0008660000166855752,\n                          -0.013048999942839146,\n                          -0.9963229894638062,\n                          -0.03731299936771393,\n                          -0.07712399959564209,\n                          -0.9910060167312622,\n                          -0.09151100367307663,\n                          -0.097632996737957,\n                          -0.9900450110435486,\n                          -0.10134600102901459,\n                          -0.09767600148916245,\n                          -0.9928709864616394,\n                          -0.07246600091457367,\n                          -0.09463199973106384,\n                          -0.9999139904975891,\n                          0.0008660000166855752,\n                          0.013048999942839146,\n                          -0.9237229824066162,\n                          0.38283199071884155,\n                          0.004399999976158142,\n                          -0.9204739928245544,\n                          0.38101500272750854,\n                          -0.00003899999865097925,\n                          -0.9963229894638062,\n                          0.03731299936771393,\n                          0.07712399959564209,\n                          -0.9154880046844482,\n                          0.37877199053764343,\n                          0.00008399999933317304,\n                          -0.9910060167312622,\n                          0.09151100367307663,\n                          0.097632996737957,\n                          -0.9145749807357788,\n                          0.378387987613678,\n                          0.00009999999747378752,\n                          -0.9900450110435486,\n                          0.10134600102901459,\n                          0.09767600148916245,\n                          -0.9266510009765625,\n                          0.356795996427536,\n                          -0.03188199922442436,\n                          -0.9928709864616394,\n                          0.07246600091457367,\n                          0.09463199973106384,\n                          -0.7068390250205994,\n                          0.707252025604248,\n                          0.004379999823868275,\n                          -0.7044739723205566,\n                          0.7044739723205566,\n                          0,\n                          -0.7006790041923523,\n                          0.7006790041923523,\n                          0,\n                          -0.6999930143356323,\n                          0.6999930143356323,\n                          0,\n                          -0.7192310094833374,\n                          0.6847820281982422,\n                          -0.03167999908328056,\n                          -0.38228899240493774,\n                          0.9239469766616821,\n                          0.004430000204592943,\n                          -0.38101500272750854,\n                          0.9204739928245544,\n                          0.00003899999865097925,\n                          -0.37877199053764343,\n                          0.9154880046844482,\n                          -0.00008399999933317304,\n                          -0.378387987613678,\n                          0.9145749807357788,\n                          -0.00009999999747378752,\n                          -0.40216198563575745,\n                          0.9078760147094727,\n                          -0.03206299990415573,\n                          -0.0008660000166855752,\n                          0.9999139904975891,\n                          -0.013048999942839146,\n                          -0.03731299936771393,\n                          0.9963229894638062,\n                          -0.07712399959564209,\n                          -0.09151100367307663,\n                          0.9910060167312622,\n                          -0.097632996737957,\n                          -0.10134600102901459,\n                          0.9900450110435486,\n                          -0.09767600148916245,\n                          -0.07246600091457367,\n                          0.9928709864616394,\n                          -0.09463199973106384,\n                          0.07246600091457367,\n                          0.9928709864616394,\n                          0.09463199973106384,\n                          0.40216198563575745,\n                          0.9078760147094727,\n                          0.03206299990415573,\n                          0.37766799330711365,\n                          0.912958025932312,\n                          0.00018099999579135329,\n                          0.11919300258159637,\n                          0.9883019924163818,\n                          0.09514500200748444,\n                          0.37516000866889954,\n                          0.906607985496521,\n                          0.00016799999866634607,\n                          0.187733992934227,\n                          0.9816380143165588,\n                          0.03381900116801262,\n                          0.2823430001735687,\n                          0.767549991607666,\n                          -0.1682250052690506,\n                          0.12883399426937103,\n                          0.6540690064430237,\n                          -0.32698601484298706,\n                          0.06457000225782394,\n                          0.32701900601387024,\n                          -0.6666669845581055,\n                          0,\n                          0,\n                          -1,\n                          0.7192320227622986,\n                          0.6847820281982422,\n                          0.03167999908328056,\n                          0.6987630128860474,\n                          0.6987630128860474,\n                          0,\n                          0.694034993648529,\n                          0.694034993648529,\n                          0,\n                          0.5551990270614624,\n                          0.6008960008621216,\n                          -0.16825300455093384,\n                          0.1854030042886734,\n                          0.27701398730278015,\n                          -0.6666669845581055,\n                          0.9266499876976013,\n                          0.3567950129508972,\n                          0.03188199922442436,\n                          0.912958025932312,\n                          0.37766799330711365,\n                          -0.00018099999579135329,\n                          0.906607985496521,\n                          0.37516000866889954,\n                          -0.00016799999866634607,\n                          0.742605984210968,\n                          0.3426159918308258,\n                          -0.1683180034160614,\n                          0.27701398730278015,\n                          0.1854030042886734,\n                          -0.6666669845581055,\n                          0.9928709864616394,\n                          0.07246600091457367,\n                          -0.09463199973106384,\n                          0.9883019924163818,\n                          0.11919300258159637,\n                          -0.09514500200748444,\n                          0.9816370010375977,\n                          0.187733992934227,\n                          -0.03381900116801262,\n                          0.9811030030250549,\n                          0.19325199723243713,\n                          -0.009519999846816063,\n                          0.49052900075912476,\n                          0.0968559980392456,\n                          -0.5,\n                          0.9928709864616394,\n                          -0.07246600091457367,\n                          0.09463199973106384,\n                          0.9078760147094727,\n                          -0.40216198563575745,\n                          0.03206299990415573,\n                          0.912958025932312,\n                          -0.37766799330711365,\n                          0.00018099999579135329,\n                          0.9883019924163818,\n                          -0.11919300258159637,\n                          0.09514500200748444,\n                          0.906607985496521,\n                          -0.37516000866889954,\n                          0.00016799999866634607,\n                          0.9816380143165588,\n                          -0.187733992934227,\n                          0.03381900116801262,\n                          0.767549991607666,\n                          -0.2823430001735687,\n                          -0.1682250052690506,\n                          0.6540690064430237,\n                          -0.12883399426937103,\n                          -0.32698601484298706,\n                          0.32701900601387024,\n                          -0.06457000225782394,\n                          -0.6666669845581055,\n                          0,\n                          0,\n                          -1,\n                          0.6847820281982422,\n                          -0.7192320227622986,\n                          0.03167999908328056,\n                          0.6987630128860474,\n                          -0.6987630128860474,\n                          0,\n                          0.694034993648529,\n                          -0.694034993648529,\n                          0,\n                          0.6008960008621216,\n                          -0.5551990270614624,\n                          -0.16825300455093384,\n                          0.27701398730278015,\n                          -0.1854030042886734,\n                          -0.6666669845581055,\n                          0.3567950129508972,\n                          -0.9266499876976013,\n                          0.03188199922442436,\n                          0.37766799330711365,\n                          -0.912958025932312,\n                          -0.00018099999579135329,\n                          0.37516000866889954,\n                          -0.906607985496521,\n                          -0.00016799999866634607,\n                          0.3426159918308258,\n                          -0.742605984210968,\n                          -0.1683180034160614,\n                          0.1854030042886734,\n                          -0.27701398730278015,\n                          -0.6666669845581055,\n                          0.07246600091457367,\n                          -0.9928709864616394,\n                          -0.09463199973106384,\n                          0.11919300258159637,\n                          -0.9883019924163818,\n                          -0.09514500200748444,\n                          0.187733992934227,\n                          -0.9816370010375977,\n                          -0.03381900116801262,\n                          0.19325199723243713,\n                          -0.9811030030250549,\n                          -0.009519999846816063,\n                          0.0968559980392456,\n                          -0.49052900075912476,\n                          -0.5,\n                          -0.07246600091457367,\n                          -0.9928709864616394,\n                          0.09463199973106384,\n                          -0.40216198563575745,\n                          -0.9078760147094727,\n                          0.03206299990415573,\n                          -0.37766799330711365,\n                          -0.912958025932312,\n                          0.00018099999579135329,\n                          -0.11919300258159637,\n                          -0.9883019924163818,\n                          0.09514500200748444,\n                          -0.37516000866889954,\n                          -0.906607985496521,\n                          0.00016799999866634607,\n                          -0.187733992934227,\n                          -0.9816380143165588,\n                          0.03381900116801262,\n                          -0.2823430001735687,\n                          -0.767549991607666,\n                          -0.1682250052690506,\n                          -0.12883399426937103,\n                          -0.6540690064430237,\n                          -0.32698601484298706,\n                          -0.06457000225782394,\n                          -0.32701900601387024,\n                          -0.6666669845581055,\n                          0,\n                          0,\n                          -1,\n                          -0.7192320227622986,\n                          -0.6847820281982422,\n                          0.03167999908328056,\n                          -0.6987630128860474,\n                          -0.6987630128860474,\n                          0,\n                          -0.694034993648529,\n                          -0.694034993648529,\n                          0,\n                          -0.5551990270614624,\n                          -0.6008960008621216,\n                          -0.16825300455093384,\n                          -0.1854030042886734,\n                          -0.27701398730278015,\n                          -0.6666669845581055,\n                          -0.9266499876976013,\n                          -0.3567950129508972,\n                          0.03188199922442436,\n                          -0.912958025932312,\n                          -0.37766799330711365,\n                          -0.00018099999579135329,\n                          -0.906607985496521,\n                          -0.37516000866889954,\n                          -0.00016799999866634607,\n                          -0.742605984210968,\n                          -0.3426159918308258,\n                          -0.1683180034160614,\n                          -0.27701398730278015,\n                          -0.1854030042886734,\n                          -0.6666669845581055,\n                          -0.9928709864616394,\n                          -0.07246600091457367,\n                          -0.09463199973106384,\n                          -0.9883019924163818,\n                          -0.11919300258159637,\n                          -0.09514500200748444,\n                          -0.9816370010375977,\n                          -0.187733992934227,\n                          -0.03381900116801262,\n                          -0.9811030030250549,\n                          -0.19325199723243713,\n                          -0.009519999846816063,\n                          -0.49052900075912476,\n                          -0.0968559980392456,\n                          -0.5,\n                          -0.9928709864616394,\n                          0.07246600091457367,\n                          0.09463199973106384,\n                          -0.9078760147094727,\n                          0.40216198563575745,\n                          0.03206299990415573,\n                          -0.912958025932312,\n                          0.37766799330711365,\n                          0.00018099999579135329,\n                          -0.9883019924163818,\n                          0.11919300258159637,\n                          0.09514500200748444,\n                          -0.906607985496521,\n                          0.37516000866889954,\n                          0.00016799999866634607,\n                          -0.9816380143165588,\n                          0.187733992934227,\n                          0.03381900116801262,\n                          -0.767549991607666,\n                          0.2823430001735687,\n                          -0.1682250052690506,\n                          -0.6540690064430237,\n                          0.12883399426937103,\n                          -0.32698601484298706,\n                          -0.32701900601387024,\n                          0.06457000225782394,\n                          -0.6666669845581055,\n                          0,\n                          0,\n                          -1,\n                          -0.6847820281982422,\n                          0.7192320227622986,\n                          0.03167999908328056,\n                          -0.6987630128860474,\n                          0.6987630128860474,\n                          0,\n                          -0.694034993648529,\n                          0.694034993648529,\n                          0,\n                          -0.6008960008621216,\n                          0.5551990270614624,\n                          -0.16825300455093384,\n                          -0.27701398730278015,\n                          0.1854030042886734,\n                          -0.6666669845581055,\n                          -0.3567950129508972,\n                          0.9266499876976013,\n                          0.03188199922442436,\n                          -0.37766799330711365,\n                          0.912958025932312,\n                          -0.00018099999579135329,\n                          -0.37516000866889954,\n                          0.906607985496521,\n                          -0.00016799999866634607,\n                          -0.3426159918308258,\n                          0.742605984210968,\n                          -0.1683180034160614,\n                          -0.1854030042886734,\n                          0.27701398730278015,\n                          -0.6666669845581055,\n                          -0.07246600091457367,\n                          0.9928709864616394,\n                          -0.09463199973106384,\n                          -0.11919300258159637,\n                          0.9883019924163818,\n                          -0.09514500200748444,\n                          -0.187733992934227,\n                          0.9816370010375977,\n                          -0.03381900116801262,\n                          -0.19325199723243713,\n                          0.9811030030250549,\n                          -0.009519999846816063,\n                          -0.0968559980392456,\n                          0.49052900075912476,\n                          -0.5,\n                          -0.006597999949008226,\n                          0.9961680173873901,\n                          0.0001630000042496249,\n                          -0.043907999992370605,\n                          0.779125988483429,\n                          -0.55936598777771,\n                          0.23287899792194366,\n                          0.79271000623703,\n                          -0.506534993648529,\n                          0.11139900237321854,\n                          0.9923329949378967,\n                          0.0053449999541044235,\n                          0.4521920084953308,\n                          0.7370989918708801,\n                          -0.42180201411247253,\n                          0.17797799408435822,\n                          0.9827970266342163,\n                          0.036841001361608505,\n                          0.6075379848480225,\n                          0.7066869735717773,\n                          -0.270797997713089,\n                          0.11894699931144714,\n                          0.9864829778671265,\n                          0.10517799854278564,\n                          0.6583719849586487,\n                          0.7438470125198364,\n                          -0.06727500259876251,\n                          0.0010629999451339245,\n                          0.99891597032547,\n                          0.04653400182723999,\n                          -0.1622990071773529,\n                          -0.14869500696659088,\n                          -0.9069569706916809,\n                          0.3020159900188446,\n                          -0.014301000162959099,\n                          -0.8847119808197021,\n                          0.7048640251159668,\n                          -0.042514998465776443,\n                          -0.6788020133972168,\n                          0.8948519825935364,\n                          -0.11078000068664551,\n                          -0.38824599981307983,\n                          0.9622920155525208,\n                          -0.09367900341749191,\n                          -0.14349600672721863,\n                          -0.12511900067329407,\n                          -0.8479049801826477,\n                          -0.4783349931240082,\n                          0.11315400153398514,\n                          -0.8153669834136963,\n                          -0.5167160034179688,\n                          0.3956319987773895,\n                          -0.7910019755363464,\n                          -0.4345270097255707,\n                          0.5244609713554382,\n                          -0.8012329936027527,\n                          -0.2643829882144928,\n                          0.571465015411377,\n                          -0.7902160286903381,\n                          -0.12332800030708313,\n                          -0.0943560004234314,\n                          -0.9955379962921143,\n                          -0.0010989999864250422,\n                          0.012040999718010426,\n                          -0.9965500235557556,\n                          0,\n                          0.09501499682664871,\n                          -0.9936969876289368,\n                          0.02440500073134899,\n                          0.03737499937415123,\n                          -0.9978089928627014,\n                          0.035909999161958694,\n                          -0.0008800000068731606,\n                          -0.9973530173301697,\n                          -0.04031199961900711,\n                          0.007164000067859888,\n                          -0.9961649775505066,\n                          -0.00002700000004551839,\n                          0.043988000601530075,\n                          -0.8330309987068176,\n                          0.4691329896450043,\n                          -0.2334270030260086,\n                          -0.7983189821243286,\n                          0.49840399622917175,\n                          -0.10737399756908417,\n                          -0.9927549958229065,\n                          -0.007029999978840351,\n                          -0.45147499442100525,\n                          -0.7576299905776978,\n                          0.39375001192092896,\n                          -0.15364399552345276,\n                          -0.9863160252571106,\n                          -0.048294998705387115,\n                          -0.5575600266456604,\n                          -0.7753210067749023,\n                          0.2001740038394928,\n                          -0.07242999970912933,\n                          -0.9923030138015747,\n                          -0.08845999836921692,\n                          -0.5877019762992859,\n                          -0.8041930198669434,\n                          0.04768599942326546,\n                          0.0005830000154674053,\n                          -0.9997940063476562,\n                          -0.020301999524235725,\n                          0.13663700222969055,\n                          -0.14665700495243073,\n                          0.8966140151023865,\n                          -0.3045389950275421,\n                          -0.012237999588251114,\n                          0.8833180069923401,\n                          -0.7020289897918701,\n                          -0.033987998962402344,\n                          0.6724730134010315,\n                          -0.8890330195426941,\n                          -0.09636799991130829,\n                          0.37605398893356323,\n                          -0.9668099880218506,\n                          -0.08601800352334976,\n                          0.1358419954776764,\n                          0.12022499740123749,\n                          0.7918559908866882,\n                          0.5693140029907227,\n                          -0.11313500255346298,\n                          0.8111780285835266,\n                          0.5236610174179077,\n                          -0.39790698885917664,\n                          0.7734419703483582,\n                          0.45853298902511597,\n                          -0.5793390274047852,\n                          0.7346490025520325,\n                          0.32973799109458923,\n                          -0.6447499990463257,\n                          0.7340419888496399,\n                          0.12459299713373184,\n                          0.09378799796104431,\n                          0.9955919981002808,\n                          0.000944000028539449,\n                          -0.01607999950647354,\n                          0.9964879751205444,\n                          0.00035600000410340726,\n                          -0.11933200061321259,\n                          0.9912199974060059,\n                          -0.01737299934029579,\n                          -0.08618299663066864,\n                          0.9940080046653748,\n                          -0.053598999977111816,\n                          -0.004110999871045351,\n                          0.9980229735374451,\n                          0.015703000128269196,\n                          0.010142000392079353,\n                          0.9933879971504211,\n                          0.10034400224685669,\n                          0.6597890257835388,\n                          0.7114480137825012,\n                          0.12964099645614624,\n                          0.5634239912033081,\n                          0.7594000101089478,\n                          0.289902001619339,\n                          -0.021227000281214714,\n                          0.9976930022239685,\n                          0.05189099907875061,\n                          0.3972559869289398,\n                          0.7709670066833496,\n                          0.45872700214385986,\n                          -0.05054600164294243,\n                          0.9957669973373413,\n                          0.060869000852108,\n                          0.11805199831724167,\n                          0.7611619830131531,\n                          0.5692800283432007,\n                          -0.11414600163698196,\n                          0.9869359731674194,\n                          0.08862999826669693,\n                          -0.0012870000209659338,\n                          0.7195389866828918,\n                          0.6293820142745972,\n                          -0.18971200287342072,\n                          0.9752820134162903,\n                          0.11328700184822083,\n                          0.9685969948768616,\n                          -0.08966200053691864,\n                          0.13331100344657898,\n                          0.8902140259742737,\n                          -0.051961999386548996,\n                          0.39323100447654724,\n                          0.6728280186653137,\n                          -0.050324998795986176,\n                          0.6965069770812988,\n                          0.25133201479911804,\n                          -0.04306900128722191,\n                          0.9169719815254211,\n                          -0.19813700020313263,\n                          -0.2512879967689514,\n                          0.9046909809112549,\n                          0.5937719941139221,\n                          -0.8024669885635376,\n                          0.03307799994945526,\n                          0.5571249723434448,\n                          -0.7907459735870361,\n                          0.2022089958190918,\n                          0.4313510060310364,\n                          -0.8083119988441467,\n                          0.37996000051498413,\n                          0.19395600259304047,\n                          -0.8197799921035767,\n                          0.5133119821548462,\n                          -0.1517219990491867,\n                          -0.8084930181503296,\n                          0.5055829882621765,\n                          0.0035200000274926424,\n                          -0.9997940063476562,\n                          0.019979000091552734,\n                          0.01159599982202053,\n                          -0.9981369972229004,\n                          -0.02326199971139431,\n                          0.01310999970883131,\n                          -0.9988970160484314,\n                          -0.008480999618768692,\n                          -0.02485400065779686,\n                          -0.9978809952735901,\n                          0.021263999864459038,\n                          -0.11335399746894836,\n                          -0.9881970286369324,\n                          0.06441199779510498,\n                          -0.0035459999926388264,\n                          -0.9954169988632202,\n                          -0.07682599872350693,\n                          -0.5816869735717773,\n                          -0.7760900259017944,\n                          -0.13957500457763672,\n                          -0.5260769724845886,\n                          -0.790789008140564,\n                          -0.2781960070133209,\n                          0.017288999632000923,\n                          -0.9983699917793274,\n                          -0.03728000074625015,\n                          -0.36800798773765564,\n                          -0.7982890009880066,\n                          -0.4405499994754791,\n                          0.03743100166320801,\n                          -0.9973520040512085,\n                          -0.03640099987387657,\n                          -0.09636899828910828,\n                          -0.7829139828681946,\n                          -0.5500450134277344,\n                          0.10426300019025803,\n                          -0.9894949793815613,\n                          -0.06746900081634521,\n                          0.10083399713039398,\n                          -0.8161320090293884,\n                          -0.48112401366233826,\n                          0.18510299921035767,\n                          -0.9776470065116882,\n                          -0.09971100091934204,\n                          -0.9615049958229065,\n                          -0.08203399926424026,\n                          -0.14958199858665466,\n                          -0.8876789808273315,\n                          -0.04622500017285347,\n                          -0.39955899119377136,\n                          -0.6675580143928528,\n                          -0.03723999857902527,\n                          -0.7007560133934021,\n                          -0.245511993765831,\n                          -0.03216199949383736,\n                          -0.9151920080184937,\n                          0.15477199852466583,\n                          -0.24929499626159668,\n                          -0.8975690007209778,\n                          -0.6700729727745056,\n                          0.7402250170707703,\n                          -0.01942499913275242,\n                          -0.5923460125923157,\n                          0.7624830007553101,\n                          -0.21566900610923767,\n                          -0.45611900091171265,\n                          0.7868310213088989,\n                          -0.39906400442123413,\n                          -0.21001900732517242,\n                          0.8031420111656189,\n                          -0.5333020091056824,\n                          0.05119999870657921,\n                          0.7096909880638123,\n                          -0.6591699719429016,\n                          -0.014175999909639359,\n                          0.9989240169525146,\n                          -0.04416000097990036,\n                          -0.0065449997782707214,\n                          0.9983869791030884,\n                          0.008813999593257904,\n                          0.0023960000835359097,\n                          0.9989259839057922,\n                          -0.016711000353097916,\n                          0.03813000023365021,\n                          0.9969249963760376,\n                          -0.04171599820256233,\n                          0.11744900047779083,\n                          0.986670970916748,\n                          -0.0799890011548996,\n                          -0.02072799950838089,\n                          -0.997963011264801,\n                          0.0017740000039339066,\n                          0.10236400365829468,\n                          -0.695684015750885,\n                          -0.6961740255355835,\n                          0.28174999356269836,\n                          -0.7065439820289612,\n                          -0.6379269957542419,\n                          -0.027713999152183533,\n                          -0.9983959794044495,\n                          -0.016395000740885735,\n                          0.4621469974517822,\n                          -0.7501789927482605,\n                          -0.43765199184417725,\n                          -0.014942999929189682,\n                          -0.9960020184516907,\n                          -0.04751100018620491,\n                          0.6121799945831299,\n                          -0.7355859875679016,\n                          -0.1658719927072525,\n                          0.08200599998235703,\n                          -0.9833409786224365,\n                          0.11102399975061417,\n                          0.7232419848442078,\n                          -0.6012910008430481,\n                          -0.14595800638198853,\n                          0.32238098978996277,\n                          -0.9036369919776917,\n                          0.28197699785232544,\n                          0.1188960000872612,\n                          0.09661199897527695,\n                          -0.9692260026931763,\n                          0.3230240046977997,\n                          0.06791900098323822,\n                          -0.9069269895553589,\n                          0.6287810206413269,\n                          0.00962899997830391,\n                          -0.711097002029419,\n                          0.8952469825744629,\n                          -0.060169998556375504,\n                          -0.3366979956626892,\n                          0.9689210057258606,\n                          -0.04508800059556961,\n                          -0.13095800578594208,\n                          0.06500200182199478,\n                          0.7708680033683777,\n                          -0.6083509922027588,\n                          0.1816529929637909,\n                          0.7457069754600525,\n                          -0.593995988368988,\n                          0.37600401043891907,\n                          0.7467949986457825,\n                          -0.4776870012283325,\n                          0.6288849711418152,\n                          0.7020969986915588,\n                          -0.27160701155662537,\n                          0.8230010271072388,\n                          0.5295370221138,\n                          -0.09450399875640869,\n                          -0.12820099294185638,\n                          0.9899809956550598,\n                          -0.05917999893426895,\n                          -0.11097600311040878,\n                          0.9872509837150574,\n                          -0.09937400370836258,\n                          -0.06767299771308899,\n                          0.9865689873695374,\n                          -0.1427209973335266,\n                          -0.0003349999897181988,\n                          0.9967420101165771,\n                          0.025443999096751213,\n                          0.29019099473953247,\n                          0.9243509769439697,\n                          0.1957239955663681,\n                          0.07294999808073044,\n                          0.9949049949645996,\n                          0.03147900104522705,\n                          -0.04948300123214722,\n                          0.7695090174674988,\n                          0.6163870096206665,\n                          -0.24193400144577026,\n                          0.7750219702720642,\n                          0.5679330229759216,\n                          0.05620399862527847,\n                          0.9959489703178406,\n                          0.052143000066280365,\n                          -0.4294399917125702,\n                          0.779321014881134,\n                          0.41615501046180725,\n                          0.023887999355793,\n                          0.9943940043449402,\n                          0.07553800195455551,\n                          -0.6655910015106201,\n                          0.6939520239830017,\n                          0.20106400549411774,\n                          -0.09678799659013748,\n                          0.9791589975357056,\n                          -0.12869000434875488,\n                          -0.7716730237007141,\n                          0.5443729758262634,\n                          0.1793539971113205,\n                          -0.417836993932724,\n                          0.8721759915351868,\n                          -0.2544029951095581,\n                          -0.09499499946832657,\n                          0.08934500068426132,\n                          0.9787889719009399,\n                          -0.3299880027770996,\n                          0.06701900064945221,\n                          0.9273520112037659,\n                          -0.6511250138282776,\n                          0.023523999378085136,\n                          0.7280719876289368,\n                          -0.9116759896278381,\n                          -0.033263999968767166,\n                          0.34162598848342896,\n                          -0.9896330237388611,\n                          -0.013496000319719315,\n                          0.07834099978208542,\n                          -0.07044100016355515,\n                          -0.6954740285873413,\n                          0.7080140113830566,\n                          -0.21969600021839142,\n                          -0.6959800124168396,\n                          0.6642320156097412,\n                          -0.4075010120868683,\n                          -0.7370589971542358,\n                          0.5047789812088013,\n                          -0.5866039991378784,\n                          -0.7473030090332031,\n                          0.24636299908161163,\n                          -0.799036979675293,\n                          -0.5617390275001526,\n                          0.05794600024819374,\n                          0.07605399936437607,\n                          -0.9967970252037048,\n                          0.02472200058400631,\n                          0.08756300061941147,\n                          -0.9926980137825012,\n                          0.05929899960756302,\n                          0.07250799983739853,\n                          -0.9901790022850037,\n                          0.11122000217437744,\n                          0.015556000173091888,\n                          -0.9970260262489319,\n                          -0.011235999874770641,\n                          -0.194814994931221,\n                          -0.9439409971237183,\n                          -0.22127500176429749,\n                          0.3417310118675232,\n                          -0.8896859884262085,\n                          0.3012309968471527,\n                          0.8375009894371033,\n                          -0.4931910037994385,\n                          0.05739299952983856,\n                          0.8273029923439026,\n                          -0.4684619903564453,\n                          -0.05539099872112274,\n                          0.5311300158500671,\n                          -0.8121910095214844,\n                          0.24026300013065338,\n                          0.8069959878921509,\n                          -0.47689300775527954,\n                          0.002638000063598156,\n                          0.644743025302887,\n                          -0.7642210125923157,\n                          -0.015455000102519989,\n                          0.8856800198554993,\n                          -0.4464530050754547,\n                          0.047488000243902206,\n                          -0.011536000296473503,\n                          -0.999845027923584,\n                          -0.0008730000117793679,\n                          0.7597830295562744,\n                          -0.6229599714279175,\n                          0.026636000722646713,\n                          0.321245014667511,\n                          -0.8855000138282776,\n                          0.3356960117816925,\n                          0.998091995716095,\n                          -0.005673000123351812,\n                          0.025262000039219856,\n                          0.9941530227661133,\n                          0.046904999762773514,\n                          -0.00951599981635809,\n                          0.9838590025901794,\n                          -0.00041700000292621553,\n                          0.010572000406682491,\n                          0.990556001663208,\n                          0.01886500045657158,\n                          0.04422200098633766,\n                          0.9921990036964417,\n                          -0.12290599942207336,\n                          0.011202000081539154,\n                          0.828000009059906,\n                          0.5258169770240784,\n                          -0.0846100002527237,\n                          0.8704839944839478,\n                          0.4878079891204834,\n                          0.00635599996894598,\n                          0.7773939967155457,\n                          0.5659670233726501,\n                          -0.09634699672460556,\n                          0.8190580010414124,\n                          0.4740380048751831,\n                          0.01190400030463934,\n                          0.9017590284347534,\n                          0.3486430048942566,\n                          -0.05601400136947632,\n                          0.41038599610328674,\n                          0.870602011680603,\n                          0.27135801315307617,\n                          0.3019320070743561,\n                          0.8897680044174194,\n                          0.34101900458335876,\n                          0.13912299275398254,\n                          0.9423390030860901,\n                          -0.3042120039463043,\n                          0.6167309880256653,\n                          0.7692840099334717,\n                          0.1667650043964386,\n                          0.5558350086212158,\n                          0.8010749816894531,\n                          0.21867799758911133,\n                          -0.4410029947757721,\n                          0.8555399775505066,\n                          -0.2693159878253937,\n                          -0.8639690279960632,\n                          0.464356005191803,\n                          -0.019222000613808632,\n                          -0.8705710172653198,\n                          0.4855479896068573,\n                          -0.005623999983072281,\n                          -0.33969300985336304,\n                          0.8762779831886292,\n                          -0.34097298979759216,\n                          -0.7608209848403931,\n                          0.5840269923210144,\n                          0.11236599832773209,\n                          -0.16763299703598022,\n                          0.9419429898262024,\n                          0.29091599583625793,\n                          -0.8260639905929565,\n                          0.47304999828338623,\n                          -0.0134699996560812,\n                          -0.6006280183792114,\n                          0.7822970151901245,\n                          -0.1611420065164566,\n                          -0.8495870232582092,\n                          0.4440779983997345,\n                          0.17417700588703156,\n                          -0.5251449942588806,\n                          0.8236340284347534,\n                          -0.21412399411201477,\n                          -0.9991480112075806,\n                          0.0017519999528303742,\n                          0.007890000008046627,\n                          -0.9946579933166504,\n                          0.06129400059580803,\n                          0.007796999998390675,\n                          -0.9840919971466064,\n                          0.008732999674975872,\n                          -0.0001289999927394092,\n                          -0.9916059970855713,\n                          0.015207000076770782,\n                          -0.04798699915409088,\n                          -0.9899899959564209,\n                          -0.13816699385643005,\n                          -0.019433999434113503,\n                          -0.7927820086479187,\n                          -0.5669599771499634,\n                          0.06795799732208252,\n                          -0.8363490104675293,\n                          -0.4685719907283783,\n                          0.048955000936985016,\n                          -0.8138830065727234,\n                          -0.4743089973926544,\n                          0.0008379999781027436,\n                          -0.8869869709014893,\n                          -0.4417180120944977,\n                          -0.05625399947166443,\n                          -0.7898640036582947,\n                          -0.5522750020027161,\n                          -0.15016800165176392,\n                          -0.297340989112854,\n                          -0.8998129963874817,\n                          -0.3192580044269562,\n                          -0.49759799242019653,\n                          -0.8317790031433105,\n                          -0.24411599338054657,\n                          -0.6295620203018188,\n                          -0.7765420079231262,\n                          0.01261799968779087,\n                          -0.011338000185787678,\n                          -0.9998990297317505,\n                          -0.008561000227928162,\n                          -0.3547320067882538,\n                          -0.8679590225219727,\n                          -0.3453510105609894,\n                          0.09618999809026718,\n                          0.49066001176834106,\n                          -0.5,\n                          0.1851000040769577,\n                          0.27721700072288513,\n                          -0.6666669845581055,\n                          0.32566601037979126,\n                          0.76139897108078,\n                          -0.18199099600315094,\n                          0.062401000410318375,\n                          0.9939020276069641,\n                          -0.09090700000524521,\n                          0.3803209960460663,\n                          0.9214360117912292,\n                          -0.00007100000220816582,\n                          0.030918000265955925,\n                          0.9969729781150818,\n                          0.07133600115776062,\n                          0.3804109990596771,\n                          0.9220889806747437,\n                          0.0001630000042496249,\n                          0.02471200004220009,\n                          0.9975799918174744,\n                          0.06498300284147263,\n                          0.35510900616645813,\n                          0.926891028881073,\n                          0.03216100111603737,\n                          0.07657899707555771,\n                          0.9924740195274353,\n                          -0.09555599838495255,\n                          0.27721700072288513,\n                          0.1851000040769577,\n                          -0.6666669845581055,\n                          0.5929989814758301,\n                          0.5781109929084778,\n                          -0.18205299973487854,\n                          0.7048519849777222,\n                          0.7048519849777222,\n                          0,\n                          0.7052720189094543,\n                          0.7054179906845093,\n                          -0.00002499999936844688,\n                          0.6835219860076904,\n                          0.7199410200119019,\n                          0.03204600140452385,\n                          0.3271070122718811,\n                          0.06412599980831146,\n                          -0.6666669845581055,\n                          0.7694699764251709,\n                          0.3061000108718872,\n                          -0.18225300312042236,\n                          0.9214379787445068,\n                          0.38033199310302734,\n                          0.0000670000008540228,\n                          0.9220880270004272,\n                          0.3804430067539215,\n                          -0.00016799999866634607,\n                          0.9071130156517029,\n                          0.403003990650177,\n                          0.032437000423669815,\n                          0,\n                          0,\n                          -1,\n                          0.6626030206680298,\n                          0.04157499969005585,\n                          -0.272724986076355,\n                          0.9969789981842041,\n                          0.03082600049674511,\n                          -0.07129299640655518,\n                          0.9975910186767578,\n                          0.024447999894618988,\n                          -0.06492199748754501,\n                          0.9925040006637573,\n                          0.07630900293588638,\n                          0.09545700252056122,\n                          0.49066001176834106,\n                          -0.09618999809026718,\n                          -0.5,\n                          0.27721700072288513,\n                          -0.1851000040769577,\n                          -0.6666669845581055,\n                          0.76139897108078,\n                          -0.32566601037979126,\n                          -0.18199099600315094,\n                          0.9939020276069641,\n                          -0.062401000410318375,\n                          -0.09090700000524521,\n                          0.9214360117912292,\n                          -0.3803209960460663,\n                          -0.00007100000220816582,\n                          0.9969729781150818,\n                          -0.030918000265955925,\n                          0.07133600115776062,\n                          0.9220889806747437,\n                          -0.3804109990596771,\n                          0.0001630000042496249,\n                          0.9975799918174744,\n                          -0.02471200004220009,\n                          0.06498300284147263,\n                          0.926891028881073,\n                          -0.35510900616645813,\n                          0.03216100111603737,\n                          0.9924740195274353,\n                          -0.07657899707555771,\n                          -0.09555599838495255,\n                          0.1851000040769577,\n                          -0.27721700072288513,\n                          -0.6666669845581055,\n                          0.5781109929084778,\n                          -0.5929989814758301,\n                          -0.18205299973487854,\n                          0.7048519849777222,\n                          -0.7048519849777222,\n                          0,\n                          0.7054179906845093,\n                          -0.7052720189094543,\n                          -0.00002499999936844688,\n                          0.7199410200119019,\n                          -0.6835219860076904,\n                          0.03204600140452385,\n                          0.06412599980831146,\n                          -0.3271070122718811,\n                          -0.6666669845581055,\n                          0.3061000108718872,\n                          -0.7694699764251709,\n                          -0.18225300312042236,\n                          0.38033199310302734,\n                          -0.9214379787445068,\n                          0.0000670000008540228,\n                          0.3804430067539215,\n                          -0.9220880270004272,\n                          -0.00016799999866634607,\n                          0.403003990650177,\n                          -0.9071130156517029,\n                          0.032437000423669815,\n                          0,\n                          0,\n                          -1,\n                          0.04157499969005585,\n                          -0.6626030206680298,\n                          -0.272724986076355,\n                          0.03082600049674511,\n                          -0.9969789981842041,\n                          -0.07129299640655518,\n                          0.024447999894618988,\n                          -0.9975910186767578,\n                          -0.06492199748754501,\n                          0.07630900293588638,\n                          -0.9925040006637573,\n                          0.09545700252056122,\n                          -0.09618999809026718,\n                          -0.49066001176834106,\n                          -0.5,\n                          -0.1851000040769577,\n                          -0.27721700072288513,\n                          -0.6666669845581055,\n                          -0.32566601037979126,\n                          -0.76139897108078,\n                          -0.18199099600315094,\n                          -0.062401000410318375,\n                          -0.9939020276069641,\n                          -0.09090700000524521,\n                          -0.3803209960460663,\n                          -0.9214360117912292,\n                          -0.00007100000220816582,\n                          -0.030918000265955925,\n                          -0.9969729781150818,\n                          0.07133600115776062,\n                          -0.3804109990596771,\n                          -0.9220889806747437,\n                          0.0001630000042496249,\n                          -0.02471200004220009,\n                          -0.9975799918174744,\n                          0.06498300284147263,\n                          -0.35510900616645813,\n                          -0.926891028881073,\n                          0.03216100111603737,\n                          -0.07657899707555771,\n                          -0.9924740195274353,\n                          -0.09555599838495255,\n                          -0.27721700072288513,\n                          -0.1851000040769577,\n                          -0.6666669845581055,\n                          -0.5929989814758301,\n                          -0.5781109929084778,\n                          -0.18205299973487854,\n                          -0.7048519849777222,\n                          -0.7048519849777222,\n                          0,\n                          -0.7052720189094543,\n                          -0.7054179906845093,\n                          -0.00002499999936844688,\n                          -0.6835219860076904,\n                          -0.7199410200119019,\n                          0.03204600140452385,\n                          -0.3271070122718811,\n                          -0.06412599980831146,\n                          -0.6666669845581055,\n                          -0.7694699764251709,\n                          -0.3061000108718872,\n                          -0.18225300312042236,\n                          -0.9214379787445068,\n                          -0.38033199310302734,\n                          0.0000670000008540228,\n                          -0.9220880270004272,\n                          -0.3804430067539215,\n                          -0.00016799999866634607,\n                          -0.9071130156517029,\n                          -0.403003990650177,\n                          0.032437000423669815,\n                          0,\n                          0,\n                          -1,\n                          -0.6626030206680298,\n                          -0.04157499969005585,\n                          -0.272724986076355,\n                          -0.9969789981842041,\n                          -0.03082600049674511,\n                          -0.07129299640655518,\n                          -0.9975910186767578,\n                          -0.024447999894618988,\n                          -0.06492199748754501,\n                          -0.9925040006637573,\n                          -0.07630900293588638,\n                          0.09545700252056122,\n                          -0.49066001176834106,\n                          0.09618999809026718,\n                          -0.5,\n                          -0.27721700072288513,\n                          0.1851000040769577,\n                          -0.6666669845581055,\n                          -0.76139897108078,\n                          0.32566601037979126,\n                          -0.18199099600315094,\n                          -0.9939020276069641,\n                          0.062401000410318375,\n                          -0.09090700000524521,\n                          -0.9214360117912292,\n                          0.3803209960460663,\n                          -0.00007100000220816582,\n                          -0.9969729781150818,\n                          0.030918000265955925,\n                          0.07133600115776062,\n                          -0.9220889806747437,\n                          0.3804109990596771,\n                          0.0001630000042496249,\n                          -0.9975799918174744,\n                          0.02471200004220009,\n                          0.06498300284147263,\n                          -0.926891028881073,\n                          0.35510900616645813,\n                          0.03216100111603737,\n                          -0.9924740195274353,\n                          0.07657899707555771,\n                          -0.09555599838495255,\n                          -0.1851000040769577,\n                          0.27721700072288513,\n                          -0.6666669845581055,\n                          -0.5781109929084778,\n                          0.5929989814758301,\n                          -0.18205299973487854,\n                          -0.7048519849777222,\n                          0.7048519849777222,\n                          0,\n                          -0.7054179906845093,\n                          0.7052720189094543,\n                          -0.00002499999936844688,\n                          -0.7199410200119019,\n                          0.6835219860076904,\n                          0.03204600140452385,\n                          -0.06412599980831146,\n                          0.3271070122718811,\n                          -0.6666669845581055,\n                          -0.3061000108718872,\n                          0.7694699764251709,\n                          -0.18225300312042236,\n                          -0.38033199310302734,\n                          0.9214379787445068,\n                          0.0000670000008540228,\n                          -0.3804430067539215,\n                          0.9220880270004272,\n                          -0.00016799999866634607,\n                          -0.403003990650177,\n                          0.9071130156517029,\n                          0.032437000423669815,\n                          0,\n                          0,\n                          -1,\n                          -0.04157499969005585,\n                          0.6626030206680298,\n                          -0.272724986076355,\n                          -0.03082600049674511,\n                          0.9969789981842041,\n                          -0.07129299640655518,\n                          -0.024447999894618988,\n                          0.9975910186767578,\n                          -0.06492199748754501,\n                          -0.07630900293588638,\n                          0.9925040006637573,\n                          0.09545700252056122,\n                          0.07657899707555771,\n                          0.9924740195274353,\n                          -0.09555599838495255,\n                          0.40307098627090454,\n                          0.9070649743080139,\n                          -0.03255299851298332,\n                          0.3753640055656433,\n                          0.9070209860801697,\n                          0.000007000000096013537,\n                          0.18306200206279755,\n                          0.9820899963378906,\n                          -0.04457399994134903,\n                          0.3751649856567383,\n                          0.9065750241279602,\n                          -0.00007400000322377309,\n                          0.18801499903202057,\n                          0.9816100001335144,\n                          -0.03304100036621094,\n                          0.3759070038795471,\n                          0.908607006072998,\n                          -0.00026199998683296144,\n                          0.16623400151729584,\n                          0.983722984790802,\n                          -0.06822899729013443,\n                          0.33324098587036133,\n                          0.9290030002593994,\n                          0.029803000390529633,\n                          0.14071400463581085,\n                          0.9862040281295776,\n                          -0.08718100190162659,\n                          0.7198299765586853,\n                          0.6836559772491455,\n                          -0.032017000019550323,\n                          0.6943539977073669,\n                          0.6943539977073669,\n                          0,\n                          0.694034993648529,\n                          0.694034993648529,\n                          0,\n                          0.6955100297927856,\n                          0.6955100297927856,\n                          0,\n                          0.6639170050621033,\n                          0.7306150197982788,\n                          0.029100999236106873,\n                          0.9268649816513062,\n                          0.35523301362991333,\n                          -0.03203999996185303,\n                          0.9070209860801697,\n                          0.3753649890422821,\n                          -0.000007000000096013537,\n                          0.9065750241279602,\n                          0.3751649856567383,\n                          0.00007300000288523734,\n                          0.908607006072998,\n                          0.3759070038795471,\n                          0.00026199998683296144,\n                          0.8926259875297546,\n                          0.4211460053920746,\n                          0.028991999104619026,\n                          0.9924740195274353,\n                          0.07646500319242477,\n                          0.09565100073814392,\n                          0.9820899963378906,\n                          0.18306200206279755,\n                          0.04457399994134903,\n                          0.9816100001335144,\n                          0.18801499903202057,\n                          0.03304100036621094,\n                          0.983722984790802,\n                          0.16623400151729584,\n                          0.06822899729013443,\n                          0.9862040281295776,\n                          0.14071400463581085,\n                          0.08718100190162659,\n                          0.9924740195274353,\n                          -0.07657899707555771,\n                          -0.09555599838495255,\n                          0.9070649743080139,\n                          -0.40307098627090454,\n                          -0.03255299851298332,\n                          0.9070209860801697,\n                          -0.3753640055656433,\n                          0.000007000000096013537,\n                          0.9820899963378906,\n                          -0.18306200206279755,\n                          -0.04457399994134903,\n                          0.9065750241279602,\n                          -0.3751649856567383,\n                          -0.00007400000322377309,\n                          0.9816100001335144,\n                          -0.18801499903202057,\n                          -0.03304100036621094,\n                          0.908607006072998,\n                          -0.3759070038795471,\n                          -0.00026199998683296144,\n                          0.983722984790802,\n                          -0.16623400151729584,\n                          -0.06822899729013443,\n                          0.9290030002593994,\n                          -0.33324098587036133,\n                          0.029803000390529633,\n                          0.9862040281295776,\n                          -0.14071400463581085,\n                          -0.08718100190162659,\n                          0.6836559772491455,\n                          -0.7198299765586853,\n                          -0.032017000019550323,\n                          0.6943539977073669,\n                          -0.6943539977073669,\n                          0,\n                          0.694034993648529,\n                          -0.694034993648529,\n                          0,\n                          0.6955100297927856,\n                          -0.6955100297927856,\n                          0,\n                          0.7306150197982788,\n                          -0.6639170050621033,\n                          0.029100999236106873,\n                          0.35523301362991333,\n                          -0.9268649816513062,\n                          -0.03203999996185303,\n                          0.3753649890422821,\n                          -0.9070209860801697,\n                          -0.000007000000096013537,\n                          0.3751649856567383,\n                          -0.9065750241279602,\n                          0.00007300000288523734,\n                          0.3759070038795471,\n                          -0.908607006072998,\n                          0.00026199998683296144,\n                          0.4211460053920746,\n                          -0.8926259875297546,\n                          0.028991999104619026,\n                          0.07646500319242477,\n                          -0.9924740195274353,\n                          0.09565100073814392,\n                          0.18306200206279755,\n                          -0.9820899963378906,\n                          0.04457399994134903,\n                          0.18801499903202057,\n                          -0.9816100001335144,\n                          0.03304100036621094,\n                          0.16623400151729584,\n                          -0.983722984790802,\n                          0.06822899729013443,\n                          0.14071400463581085,\n                          -0.9862040281295776,\n                          0.08718100190162659,\n                          -0.07657899707555771,\n                          -0.9924740195274353,\n                          -0.09555599838495255,\n                          -0.40307098627090454,\n                          -0.9070649743080139,\n                          -0.03255299851298332,\n                          -0.3753640055656433,\n                          -0.9070209860801697,\n                          0.000007000000096013537,\n                          -0.18306200206279755,\n                          -0.9820899963378906,\n                          -0.04457399994134903,\n                          -0.3751649856567383,\n                          -0.9065750241279602,\n                          -0.00007400000322377309,\n                          -0.18801499903202057,\n                          -0.9816100001335144,\n                          -0.03304100036621094,\n                          -0.3759070038795471,\n                          -0.908607006072998,\n                          -0.00026199998683296144,\n                          -0.16623400151729584,\n                          -0.983722984790802,\n                          -0.06822899729013443,\n                          -0.33324098587036133,\n                          -0.9290030002593994,\n                          0.029803000390529633,\n                          -0.14071400463581085,\n                          -0.9862040281295776,\n                          -0.08718100190162659,\n                          -0.7198299765586853,\n                          -0.6836559772491455,\n                          -0.032017000019550323,\n                          -0.6943539977073669,\n                          -0.6943539977073669,\n                          0,\n                          -0.694034993648529,\n                          -0.694034993648529,\n                          0,\n                          -0.6955100297927856,\n                          -0.6955100297927856,\n                          0,\n                          -0.6639170050621033,\n                          -0.7306150197982788,\n                          0.029100999236106873,\n                          -0.9268649816513062,\n                          -0.35523301362991333,\n                          -0.03203999996185303,\n                          -0.9070209860801697,\n                          -0.3753649890422821,\n                          -0.000007000000096013537,\n                          -0.9065750241279602,\n                          -0.3751649856567383,\n                          0.00007300000288523734,\n                          -0.908607006072998,\n                          -0.3759070038795471,\n                          0.00026199998683296144,\n                          -0.8926259875297546,\n                          -0.4211460053920746,\n                          0.028991999104619026,\n                          -0.9924740195274353,\n                          -0.07646500319242477,\n                          0.09565100073814392,\n                          -0.9820899963378906,\n                          -0.18306200206279755,\n                          0.04457399994134903,\n                          -0.9816100001335144,\n                          -0.18801499903202057,\n                          0.03304100036621094,\n                          -0.983722984790802,\n                          -0.16623400151729584,\n                          0.06822899729013443,\n                          -0.9862040281295776,\n                          -0.14071400463581085,\n                          0.08718100190162659,\n                          -0.9924740195274353,\n                          0.07657899707555771,\n                          -0.09555599838495255,\n                          -0.9070649743080139,\n                          0.40307098627090454,\n                          -0.03255299851298332,\n                          -0.9070209860801697,\n                          0.3753640055656433,\n                          0.000007000000096013537,\n                          -0.9820899963378906,\n                          0.18306200206279755,\n                          -0.04457399994134903,\n                          -0.9065750241279602,\n                          0.3751649856567383,\n                          -0.00007400000322377309,\n                          -0.9816100001335144,\n                          0.18801499903202057,\n                          -0.03304100036621094,\n                          -0.908607006072998,\n                          0.3759070038795471,\n                          -0.00026199998683296144,\n                          -0.983722984790802,\n                          0.16623400151729584,\n                          -0.06822899729013443,\n                          -0.9290030002593994,\n                          0.33324098587036133,\n                          0.029803000390529633,\n                          -0.9862040281295776,\n                          0.14071400463581085,\n                          -0.08718100190162659,\n                          -0.6836559772491455,\n                          0.7198299765586853,\n                          -0.032017000019550323,\n                          -0.6943539977073669,\n                          0.6943539977073669,\n                          0,\n                          -0.694034993648529,\n                          0.694034993648529,\n                          0,\n                          -0.6955100297927856,\n                          0.6955100297927856,\n                          0,\n                          -0.7306150197982788,\n                          0.6639170050621033,\n                          0.029100999236106873,\n                          -0.35523301362991333,\n                          0.9268649816513062,\n                          -0.03203999996185303,\n                          -0.3753649890422821,\n                          0.9070209860801697,\n                          -0.000007000000096013537,\n                          -0.3751649856567383,\n                          0.9065750241279602,\n                          0.00007300000288523734,\n                          -0.3759070038795471,\n                          0.908607006072998,\n                          0.00026199998683296144,\n                          -0.4211460053920746,\n                          0.8926259875297546,\n                          0.028991999104619026,\n                          -0.07646500319242477,\n                          0.9924740195274353,\n                          0.09565100073814392,\n                          -0.18306200206279755,\n                          0.9820899963378906,\n                          0.04457399994134903,\n                          -0.18801499903202057,\n                          0.9816100001335144,\n                          0.03304100036621094,\n                          -0.16623400151729584,\n                          0.983722984790802,\n                          0.06822899729013443,\n                          -0.14071400463581085,\n                          0.9862040281295776,\n                          0.08718100190162659};\n\nfloat teapotBinormals[] = {0.2554270029067993,\n                           -0.05043400079011917,\n                           -0.9655119776725769,\n                           0.2302899956703186,\n                           -0.11379700154066086,\n                           -0.9664459824562073,\n                           -0.23653900623321533,\n                           0.09789499640464783,\n                           -0.9666780233383179,\n                           -0.2551180124282837,\n                           0.05037299916148186,\n                           -0.9655969738960266,\n                           -0.9201610088348389,\n                           0.38079801201820374,\n                           -0.09108299762010574,\n                           -0.9770479798316956,\n                           0.1929199993610382,\n                           -0.09032399952411652,\n                           -0.6762400269508362,\n                           0.2798590064048767,\n                           0.6814529895782471,\n                           -0.723800003528595,\n                           0.1429159939289093,\n                           0.6750479936599731,\n                           -0.4681990146636963,\n                           0.1581760048866272,\n                           0.869350016117096,\n                           -0.4902079999446869,\n                           0.09679199755191803,\n                           0.8662149906158447,\n                           0.16952399909496307,\n                           -0.1934960037469864,\n                           -0.9663439989089966,\n                           -0.18106800317764282,\n                           0.18106800317764282,\n                           -0.9666590094566345,\n                           -0.7041199803352356,\n                           0.7041199803352356,\n                           -0.09181900322437286,\n                           -0.5179349780082703,\n                           0.5179349780082703,\n                           0.6807990074157715,\n                           -0.37217798829078674,\n                           0.3260670006275177,\n                           0.8690019845962524,\n                           0.08221600204706192,\n                           -0.243368998169899,\n                           -0.9664430022239685,\n                           -0.09789499640464783,\n                           0.23653900623321533,\n                           -0.9666780233383179,\n                           -0.38079801201820374,\n                           0.9201610088348389,\n                           -0.09108199924230576,\n                           -0.2798590064048767,\n                           0.6762400269508362,\n                           0.6814540028572083,\n                           -0.21894000470638275,\n                           0.44305500388145447,\n                           0.8693490028381348,\n                           0.050822000950574875,\n                           -0.2573910057544708,\n                           -0.9649699926376343,\n                           -0.05021600052714348,\n                           0.25432100892066956,\n                           -0.965815007686615,\n                           -0.19291600584983826,\n                           0.9770249724388123,\n                           -0.09059000015258789,\n                           -0.14291299879550934,\n                           0.7237870097160339,\n                           0.6750609874725342,\n                           -0.09679199755191803,\n                           0.4902079999446869,\n                           0.8662149906158447,\n                           -0.048507001250982285,\n                           -0.2576940059661865,\n                           -0.965008020401001,\n                           -0.15833300352096558,\n                           -0.3227809965610504,\n                           -0.933135986328125,\n                           0.05656199902296066,\n                           0.13793900609016418,\n                           -0.9888240098953247,\n                           0.049150001257658005,\n                           0.2545199990272522,\n                           -0.9658179879188538,\n                           0.378387987613678,\n                           0.9173290133476257,\n                           -0.12381099909543991,\n                           0.1917950063943863,\n                           0.9772530198097229,\n                           -0.09050799906253815,\n                           0.2777239978313446,\n                           0.6716070175170898,\n                           0.6868870258331299,\n                           0.14281700551509857,\n                           0.7238019704818726,\n                           0.6750659942626953,\n                           0.15788200497627258,\n                           0.4674209952354431,\n                           0.8698220252990723,\n                           0.09679199755191803,\n                           0.4902079999446869,\n                           0.8662149906158447,\n                           -0.3139069974422455,\n                           -0.2657270133495331,\n                           -0.9115110039710999,\n                           0.05247500166296959,\n                           0.05178600177168846,\n                           -0.9972789883613586,\n                           0.699787974357605,\n                           0.6969379782676697,\n                           -0.15676100552082062,\n                           0.511929988861084,\n                           0.5116159915924072,\n                           0.6900550127029419,\n                           0.32515400648117065,\n                           0.37111398577690125,\n                           0.8697980046272278,\n                           -0.3181929886341095,\n                           -0.09987600147724152,\n                           -0.9427499771118164,\n                           0.1552799940109253,\n                           0.06176299974322319,\n                           -0.9859380125999451,\n                           0.9187250137329102,\n                           0.3751460015773773,\n                           -0.1233299970626831,\n                           0.6724870204925537,\n                           0.2775439918041229,\n                           0.6860979795455933,\n                           0.4424299895763397,\n                           0.21853800117969513,\n                           0.8697689771652222,\n                           -0.255948007106781,\n                           -0.04464200139045715,\n                           -0.9656590223312378,\n                           0.25306200981140137,\n                           0.046362001448869705,\n                           -0.9663389921188354,\n                           0.9778940081596375,\n                           0.18800100684165955,\n                           -0.09153299778699875,\n                           0.7238150238990784,\n                           0.14205799996852875,\n                           0.675212025642395,\n                           0.49017900228500366,\n                           0.0967010036110878,\n                           0.8662409782409668,\n                           -0.25491899251937866,\n                           0.05033399909734726,\n                           -0.9656509757041931,\n                           -0.2302899956703186,\n                           0.11379700154066086,\n                           -0.9664459824562073,\n                           0.23653900623321533,\n                           -0.09789499640464783,\n                           -0.9666780233383179,\n                           0.252265989780426,\n                           -0.04980999976396561,\n                           -0.9663749933242798,\n                           0.9201610088348389,\n                           -0.38079801201820374,\n                           -0.09108299762010574,\n                           0.9769039750099182,\n                           -0.19289200007915497,\n                           -0.09193000197410583,\n                           0.6762400269508362,\n                           -0.2798590064048767,\n                           0.6814529895782471,\n                           0.7236610054969788,\n                           -0.14288799464702606,\n                           0.6752020120620728,\n                           0.4681990146636963,\n                           -0.1581760048866272,\n                           0.869350016117096,\n                           0.4901660084724426,\n                           -0.09678400307893753,\n                           0.8662390112876892,\n                           -0.16952399909496307,\n                           0.1934960037469864,\n                           -0.9663439989089966,\n                           0.18106800317764282,\n                           -0.18106800317764282,\n                           -0.9666590094566345,\n                           0.7041199803352356,\n                           -0.7041199803352356,\n                           -0.09181900322437286,\n                           0.5179349780082703,\n                           -0.5179349780082703,\n                           0.6807990074157715,\n                           0.37217798829078674,\n                           -0.3260670006275177,\n                           0.8690019845962524,\n                           -0.08221600204706192,\n                           0.243368998169899,\n                           -0.9664430022239685,\n                           0.09789499640464783,\n                           -0.23653900623321533,\n                           -0.9666780233383179,\n                           0.38079801201820374,\n                           -0.9201610088348389,\n                           -0.09108199924230576,\n                           0.2798590064048767,\n                           -0.6762400269508362,\n                           0.6814540028572083,\n                           0.21894000470638275,\n                           -0.44305500388145447,\n                           0.8693490028381348,\n                           -0.05043400079011917,\n                           0.2554270029067993,\n                           -0.9655119776725769,\n                           0.05037299916148186,\n                           -0.2551180124282837,\n                           -0.9655969738960266,\n                           0.1929199993610382,\n                           -0.9770479798316956,\n                           -0.09032399952411652,\n                           0.1429159939289093,\n                           -0.723800003528595,\n                           0.6750479936599731,\n                           0.09679199755191803,\n                           -0.4902079999446869,\n                           0.8662149906158447,\n                           0.05043400079011917,\n                           0.2554270029067993,\n                           -0.9655119776725769,\n                           0.11379700154066086,\n                           0.2302899956703186,\n                           -0.9664459824562073,\n                           -0.09789499640464783,\n                           -0.23653900623321533,\n                           -0.9666780233383179,\n                           -0.05037299916148186,\n                           -0.2551180124282837,\n                           -0.9655969738960266,\n                           -0.38079801201820374,\n                           -0.9201610088348389,\n                           -0.09108299762010574,\n                           -0.1929199993610382,\n                           -0.9770479798316956,\n                           -0.09032399952411652,\n                           -0.2798590064048767,\n                           -0.6762400269508362,\n                           0.6814529895782471,\n                           -0.1429159939289093,\n                           -0.723800003528595,\n                           0.6750479936599731,\n                           -0.1581760048866272,\n                           -0.4681990146636963,\n                           0.869350016117096,\n                           -0.09679199755191803,\n                           -0.4902079999446869,\n                           0.8662149906158447,\n                           0.1934960037469864,\n                           0.16952399909496307,\n                           -0.9663439989089966,\n                           -0.18106800317764282,\n                           -0.18106800317764282,\n                           -0.9666590094566345,\n                           -0.7041199803352356,\n                           -0.7041199803352356,\n                           -0.09181900322437286,\n                           -0.5179349780082703,\n                           -0.5179349780082703,\n                           0.6807990074157715,\n                           -0.3260670006275177,\n                           -0.37217798829078674,\n                           0.8690019845962524,\n                           0.243368998169899,\n                           0.08221600204706192,\n                           -0.9664430022239685,\n                           -0.23653900623321533,\n                           -0.09789499640464783,\n                           -0.9666780233383179,\n                           -0.9201610088348389,\n                           -0.38079801201820374,\n                           -0.09108199924230576,\n                           -0.6762400269508362,\n                           -0.2798590064048767,\n                           0.6814540028572083,\n                           -0.44305500388145447,\n                           -0.21894000470638275,\n                           0.8693490028381348,\n                           0.2554270029067993,\n                           0.05043400079011917,\n                           -0.9655119776725769,\n                           -0.2551180124282837,\n                           -0.05037299916148186,\n                           -0.9655969738960266,\n                           -0.9770479798316956,\n                           -0.1929199993610382,\n                           -0.09032399952411652,\n                           -0.723800003528595,\n                           -0.1429159939289093,\n                           0.6750479936599731,\n                           -0.4902079999446869,\n                           -0.09679199755191803,\n                           0.8662149906158447,\n                           -0.4902079999446869,\n                           0.09679199755191803,\n                           0.8662149906158447,\n                           -0.44305500388145447,\n                           0.21893900632858276,\n                           0.8693490028381348,\n                           -0.37287598848342896,\n                           0.15431199967861176,\n                           0.9149600267410278,\n                           -0.4014579951763153,\n                           0.07926800101995468,\n                           0.9124410152435303,\n                           -0.3112579882144928,\n                           0.12881100177764893,\n                           0.9415550231933594,\n                           -0.33541300892829895,\n                           0.0662280023097992,\n                           0.939740002155304,\n                           -0.19015200436115265,\n                           0.07869099825620651,\n                           0.9785959720611572,\n                           -0.20517399907112122,\n                           0.040511999279260635,\n                           0.977886974811554,\n                           0.06301800161600113,\n                           -0.021289000287652016,\n                           0.9977849721908569,\n                           0.06623400002717972,\n                           -0.013078000396490097,\n                           0.9977179765701294,\n                           -0.3260670006275177,\n                           0.37217798829078674,\n                           0.8690019845962524,\n                           -0.285739004611969,\n                           0.285739004611969,\n                           0.9147170186042786,\n                           -0.23854400217533112,\n                           0.23854400217533112,\n                           0.9413790106773376,\n                           -0.14574900269508362,\n                           0.14574900269508362,\n                           0.9785270094871521,\n                           0.05011200159788132,\n                           -0.04390300065279007,\n                           0.9977779984474182,\n                           -0.1581760048866272,\n                           0.4681999981403351,\n                           0.869350016117096,\n                           -0.15431199967861176,\n                           0.37287598848342896,\n                           0.9149600267410278,\n                           -0.12881100177764893,\n                           0.3112579882144928,\n                           0.9415550231933594,\n                           -0.07869099825620651,\n                           0.19015100598335266,\n                           0.9785959720611572,\n                           0.02946699969470501,\n                           -0.05963199958205223,\n                           0.9977849721908569,\n                           -0.09679199755191803,\n                           0.4902079999446869,\n                           0.8662149906158447,\n                           -0.07926800101995468,\n                           0.4014579951763153,\n                           0.9124410152435303,\n                           -0.0662280023097992,\n                           0.33541300892829895,\n                           0.939740002155304,\n                           -0.040511999279260635,\n                           0.20517399907112122,\n                           0.977886974811554,\n                           0.013078000396490097,\n                           -0.06623400002717972,\n                           0.9977179765701294,\n                           0.09679199755191803,\n                           0.4902079999446869,\n                           0.8662149906158447,\n                           0.21858200430870056,\n                           0.4423219859600067,\n                           0.86981201171875,\n                           0.15431199967861176,\n                           0.37287598848342896,\n                           0.9149600267410278,\n                           0.07926800101995468,\n                           0.4014579951763153,\n                           0.9124410152435303,\n                           0.12881100177764893,\n                           0.3112579882144928,\n                           0.9415550231933594,\n                           0.0662280023097992,\n                           0.33541300892829895,\n                           0.939740002155304,\n                           0.07869099825620651,\n                           0.19015200436115265,\n                           0.9785959720611572,\n                           0.040511999279260635,\n                           0.20517399907112122,\n                           0.977886974811554,\n                           -0.021289000287652016,\n                           -0.06301800161600113,\n                           0.9977849721908569,\n                           -0.013078000396490097,\n                           -0.06623400002717972,\n                           0.9977179765701294,\n                           0.3711329996585846,\n                           0.3251489996910095,\n                           0.8697919845581055,\n                           0.285739004611969,\n                           0.285739004611969,\n                           0.9147170186042786,\n                           0.23854400217533112,\n                           0.23854400217533112,\n                           0.9413790106773376,\n                           0.14574900269508362,\n                           0.14574900269508362,\n                           0.9785270094871521,\n                           -0.04390300065279007,\n                           -0.05011200159788132,\n                           0.9977779984474182,\n                           0.46750199794769287,\n                           0.15794099867343903,\n                           0.8697680234909058,\n                           0.37287598848342896,\n                           0.15431199967861176,\n                           0.9149600267410278,\n                           0.3112579882144928,\n                           0.12881100177764893,\n                           0.9415550231933594,\n                           0.19015100598335266,\n                           0.07869099825620651,\n                           0.9785959720611572,\n                           -0.05963199958205223,\n                           -0.02946699969470501,\n                           0.9977849721908569,\n                           0.49017900228500366,\n                           0.0967010036110878,\n                           0.8662409782409668,\n                           0.4014579951763153,\n                           0.07926800101995468,\n                           0.9124410152435303,\n                           0.33541300892829895,\n                           0.0662280023097992,\n                           0.939740002155304,\n                           0.20517399907112122,\n                           0.040511999279260635,\n                           0.977886974811554,\n                           -0.06623400002717972,\n                           -0.013078000396490097,\n                           0.9977179765701294,\n                           0.4901660084724426,\n                           -0.09678400307893753,\n                           0.8662390112876892,\n                           0.44305500388145447,\n                           -0.21893900632858276,\n                           0.8693490028381348,\n                           0.37287598848342896,\n                           -0.15431199967861176,\n                           0.9149600267410278,\n                           0.4014579951763153,\n                           -0.07926800101995468,\n                           0.9124410152435303,\n                           0.3112579882144928,\n                           -0.12881100177764893,\n                           0.9415550231933594,\n                           0.33541300892829895,\n                           -0.0662280023097992,\n                           0.939740002155304,\n                           0.19015200436115265,\n                           -0.07869099825620651,\n                           0.9785959720611572,\n                           0.20517399907112122,\n                           -0.040511999279260635,\n                           0.977886974811554,\n                           -0.06301800161600113,\n                           0.021289000287652016,\n                           0.9977849721908569,\n                           -0.06623400002717972,\n                           0.013078000396490097,\n                           0.9977179765701294,\n                           0.3260670006275177,\n                           -0.37217798829078674,\n                           0.8690019845962524,\n                           0.285739004611969,\n                           -0.285739004611969,\n                           0.9147170186042786,\n                           0.23854400217533112,\n                           -0.23854400217533112,\n                           0.9413790106773376,\n                           0.14574900269508362,\n                           -0.14574900269508362,\n                           0.9785270094871521,\n                           -0.05011200159788132,\n                           0.04390300065279007,\n                           0.9977779984474182,\n                           0.1581760048866272,\n                           -0.4681999981403351,\n                           0.869350016117096,\n                           0.15431199967861176,\n                           -0.37287598848342896,\n                           0.9149600267410278,\n                           0.12881100177764893,\n                           -0.3112579882144928,\n                           0.9415550231933594,\n                           0.07869099825620651,\n                           -0.19015100598335266,\n                           0.9785959720611572,\n                           -0.02946699969470501,\n                           0.05963199958205223,\n                           0.9977849721908569,\n                           0.09679199755191803,\n                           -0.4902079999446869,\n                           0.8662149906158447,\n                           0.07926800101995468,\n                           -0.4014579951763153,\n                           0.9124410152435303,\n                           0.0662280023097992,\n                           -0.33541300892829895,\n                           0.939740002155304,\n                           0.040511999279260635,\n                           -0.20517399907112122,\n                           0.977886974811554,\n                           -0.013078000396490097,\n                           0.06623400002717972,\n                           0.9977179765701294,\n                           -0.09679199755191803,\n                           -0.4902079999446869,\n                           0.8662149906158447,\n                           -0.21893900632858276,\n                           -0.44305500388145447,\n                           0.8693490028381348,\n                           -0.15431199967861176,\n                           -0.37287598848342896,\n                           0.9149600267410278,\n                           -0.07926800101995468,\n                           -0.4014579951763153,\n                           0.9124410152435303,\n                           -0.12881100177764893,\n                           -0.3112579882144928,\n                           0.9415550231933594,\n                           -0.0662280023097992,\n                           -0.33541300892829895,\n                           0.939740002155304,\n                           -0.07869099825620651,\n                           -0.19015200436115265,\n                           0.9785959720611572,\n                           -0.040511999279260635,\n                           -0.20517399907112122,\n                           0.977886974811554,\n                           0.021289000287652016,\n                           0.06301800161600113,\n                           0.9977849721908569,\n                           0.013078000396490097,\n                           0.06623400002717972,\n                           0.9977179765701294,\n                           -0.37217798829078674,\n                           -0.3260670006275177,\n                           0.8690019845962524,\n                           -0.285739004611969,\n                           -0.285739004611969,\n                           0.9147170186042786,\n                           -0.23854400217533112,\n                           -0.23854400217533112,\n                           0.9413790106773376,\n                           -0.14574900269508362,\n                           -0.14574900269508362,\n                           0.9785270094871521,\n                           0.04390300065279007,\n                           0.05011200159788132,\n                           0.9977779984474182,\n                           -0.4681999981403351,\n                           -0.1581760048866272,\n                           0.869350016117096,\n                           -0.37287598848342896,\n                           -0.15431199967861176,\n                           0.9149600267410278,\n                           -0.3112579882144928,\n                           -0.12881100177764893,\n                           0.9415550231933594,\n                           -0.19015100598335266,\n                           -0.07869099825620651,\n                           0.9785959720611572,\n                           0.05963199958205223,\n                           0.02946699969470501,\n                           0.9977849721908569,\n                           -0.4902079999446869,\n                           -0.09679199755191803,\n                           0.8662149906158447,\n                           -0.4014579951763153,\n                           -0.07926800101995468,\n                           0.9124410152435303,\n                           -0.33541300892829895,\n                           -0.0662280023097992,\n                           0.939740002155304,\n                           -0.20517399907112122,\n                           -0.040511999279260635,\n                           0.977886974811554,\n                           0.06623400002717972,\n                           0.013078000396490097,\n                           0.9977179765701294,\n                           0.06623400002717972,\n                           -0.013078000396490097,\n                           0.9977179765701294,\n                           0.05963199958205223,\n                           -0.02946699969470501,\n                           0.9977849721908569,\n                           0.40303200483322144,\n                           -0.1667889952659607,\n                           0.8998590111732483,\n                           0.4339120090007782,\n                           -0.08567699790000916,\n                           0.8968719840049744,\n                           0.6326310038566589,\n                           -0.2618109881877899,\n                           0.7288579940795898,\n                           0.6777120232582092,\n                           -0.13381600379943848,\n                           0.723048985004425,\n                           0.6661339998245239,\n                           -0.27567601203918457,\n                           0.6930140256881714,\n                           0.7128540277481079,\n                           -0.14075499773025513,\n                           0.6870430111885071,\n                           0.5777599811553955,\n                           -0.19519099593162537,\n                           0.792523980140686,\n                           0.6036490201950073,\n                           -0.11919199675321579,\n                           0.7882900238037109,\n                           0.04390300065279007,\n                           -0.05011200159788132,\n                           0.9977779984474182,\n                           0.30884799361228943,\n                           -0.30884799361228943,\n                           0.8995699882507324,\n                           0.48457300662994385,\n                           -0.48457300662994385,\n                           0.7282710075378418,\n                           0.510138988494873,\n                           -0.510138988494873,\n                           0.6924710273742676,\n                           0.4591110050678253,\n                           -0.40222999453544617,\n                           0.7921029925346375,\n                           0.021289000287652016,\n                           -0.06301800161600113,\n                           0.9977849721908569,\n                           0.16678999364376068,\n                           -0.40303200483322144,\n                           0.8998590111732483,\n                           0.2618109881877899,\n                           -0.6326310038566589,\n                           0.7288579940795898,\n                           0.27567601203918457,\n                           -0.6661339998245239,\n                           0.6930140256881714,\n                           0.2701770067214966,\n                           -0.546737015247345,\n                           0.7925170063972473,\n                           0.013078000396490097,\n                           -0.06623400002717972,\n                           0.9977179765701294,\n                           0.08567599952220917,\n                           -0.4339120090007782,\n                           0.8968719840049744,\n                           0.13381600379943848,\n                           -0.6777120232582092,\n                           0.723048985004425,\n                           0.14075499773025513,\n                           -0.7128540277481079,\n                           0.6870430111885071,\n                           0.11919199675321579,\n                           -0.6036490201950073,\n                           0.7882900238037109,\n                           -0.013078000396490097,\n                           -0.06623400002717972,\n                           0.9977179765701294,\n                           -0.02946699969470501,\n                           -0.05963199958205223,\n                           0.9977849721908569,\n                           -0.1667889952659607,\n                           -0.40303200483322144,\n                           0.8998590111732483,\n                           -0.08567699790000916,\n                           -0.4339120090007782,\n                           0.8968719840049744,\n                           -0.2618109881877899,\n                           -0.6326310038566589,\n                           0.7288579940795898,\n                           -0.13381600379943848,\n                           -0.6777120232582092,\n                           0.723048985004425,\n                           -0.27567601203918457,\n                           -0.6661339998245239,\n                           0.6930140256881714,\n                           -0.14075499773025513,\n                           -0.7128540277481079,\n                           0.6870430111885071,\n                           -0.19519099593162537,\n                           -0.5777599811553955,\n                           0.792523980140686,\n                           -0.11919199675321579,\n                           -0.6036490201950073,\n                           0.7882900238037109,\n                           -0.05011200159788132,\n                           -0.04390300065279007,\n                           0.9977779984474182,\n                           -0.30884799361228943,\n                           -0.30884799361228943,\n                           0.8995699882507324,\n                           -0.48457300662994385,\n                           -0.48457300662994385,\n                           0.7282710075378418,\n                           -0.510138988494873,\n                           -0.510138988494873,\n                           0.6924710273742676,\n                           -0.40222999453544617,\n                           -0.4591110050678253,\n                           0.7921029925346375,\n                           -0.06301800161600113,\n                           -0.021289000287652016,\n                           0.9977849721908569,\n                           -0.40303200483322144,\n                           -0.16678999364376068,\n                           0.8998590111732483,\n                           -0.6326310038566589,\n                           -0.2618109881877899,\n                           0.7288579940795898,\n                           -0.6661339998245239,\n                           -0.27567601203918457,\n                           0.6930140256881714,\n                           -0.546737015247345,\n                           -0.2701770067214966,\n                           0.7925170063972473,\n                           -0.06623400002717972,\n                           -0.013078000396490097,\n                           0.9977179765701294,\n                           -0.4339120090007782,\n                           -0.08567599952220917,\n                           0.8968719840049744,\n                           -0.6777120232582092,\n                           -0.13381600379943848,\n                           0.723048985004425,\n                           -0.7128540277481079,\n                           -0.14075499773025513,\n                           0.6870430111885071,\n                           -0.6036490201950073,\n                           -0.11919199675321579,\n                           0.7882900238037109,\n                           -0.06623400002717972,\n                           0.013078000396490097,\n                           0.9977179765701294,\n                           -0.05963199958205223,\n                           0.02946699969470501,\n                           0.9977849721908569,\n                           -0.40303200483322144,\n                           0.1667889952659607,\n                           0.8998590111732483,\n                           -0.4339120090007782,\n                           0.08567699790000916,\n                           0.8968719840049744,\n                           -0.6326310038566589,\n                           0.2618109881877899,\n                           0.7288579940795898,\n                           -0.6777120232582092,\n                           0.13381600379943848,\n                           0.723048985004425,\n                           -0.6661339998245239,\n                           0.27567601203918457,\n                           0.6930140256881714,\n                           -0.7128540277481079,\n                           0.14075499773025513,\n                           0.6870430111885071,\n                           -0.5777599811553955,\n                           0.19519099593162537,\n                           0.792523980140686,\n                           -0.6036490201950073,\n                           0.11919199675321579,\n                           0.7882900238037109,\n                           -0.04390300065279007,\n                           0.05011200159788132,\n                           0.9977779984474182,\n                           -0.30884799361228943,\n                           0.30884799361228943,\n                           0.8995699882507324,\n                           -0.48457300662994385,\n                           0.48457300662994385,\n                           0.7282710075378418,\n                           -0.510138988494873,\n                           0.510138988494873,\n                           0.6924710273742676,\n                           -0.4591110050678253,\n                           0.40222999453544617,\n                           0.7921029925346375,\n                           -0.021289000287652016,\n                           0.06301800161600113,\n                           0.9977849721908569,\n                           -0.16678999364376068,\n                           0.40303200483322144,\n                           0.8998590111732483,\n                           -0.2618109881877899,\n                           0.6326310038566589,\n                           0.7288579940795898,\n                           -0.27567601203918457,\n                           0.6661339998245239,\n                           0.6930140256881714,\n                           -0.2701770067214966,\n                           0.546737015247345,\n                           0.7925170063972473,\n                           -0.013078000396490097,\n                           0.06623400002717972,\n                           0.9977179765701294,\n                           -0.08567599952220917,\n                           0.4339120090007782,\n                           0.8968719840049744,\n                           -0.13381600379943848,\n                           0.6777120232582092,\n                           0.723048985004425,\n                           -0.14075499773025513,\n                           0.7128540277481079,\n                           0.6870430111885071,\n                           -0.11919199675321579,\n                           0.6036490201950073,\n                           0.7882900238037109,\n                           0.013078000396490097,\n                           0.06623400002717972,\n                           0.9977179765701294,\n                           0.02946699969470501,\n                           0.05963199958205223,\n                           0.9977849721908569,\n                           0.1667889952659607,\n                           0.40303200483322144,\n                           0.8998590111732483,\n                           0.08567699790000916,\n                           0.4339120090007782,\n                           0.8968719840049744,\n                           0.2618109881877899,\n                           0.6326310038566589,\n                           0.7288579940795898,\n                           0.13381600379943848,\n                           0.6777120232582092,\n                           0.723048985004425,\n                           0.27567601203918457,\n                           0.6661339998245239,\n                           0.6930140256881714,\n                           0.14075499773025513,\n                           0.7128540277481079,\n                           0.6870430111885071,\n                           0.19519099593162537,\n                           0.5777599811553955,\n                           0.792523980140686,\n                           0.11919199675321579,\n                           0.6036490201950073,\n                           0.7882900238037109,\n                           0.05011200159788132,\n                           0.04390300065279007,\n                           0.9977779984474182,\n                           0.30884799361228943,\n                           0.30884799361228943,\n                           0.8995699882507324,\n                           0.48457300662994385,\n                           0.48457300662994385,\n                           0.7282710075378418,\n                           0.510138988494873,\n                           0.510138988494873,\n                           0.6924710273742676,\n                           0.40222999453544617,\n                           0.4591110050678253,\n                           0.7921029925346375,\n                           0.06301800161600113,\n                           0.021289000287652016,\n                           0.9977849721908569,\n                           0.40303200483322144,\n                           0.16678999364376068,\n                           0.8998590111732483,\n                           0.6326310038566589,\n                           0.2618109881877899,\n                           0.7288579940795898,\n                           0.6661339998245239,\n                           0.27567601203918457,\n                           0.6930140256881714,\n                           0.546737015247345,\n                           0.2701770067214966,\n                           0.7925170063972473,\n                           0.06623400002717972,\n                           0.013078000396490097,\n                           0.9977179765701294,\n                           0.4339120090007782,\n                           0.08567599952220917,\n                           0.8968719840049744,\n                           0.6777120232582092,\n                           0.13381600379943848,\n                           0.723048985004425,\n                           0.7128540277481079,\n                           0.14075499773025513,\n                           0.6870430111885071,\n                           0.6036490201950073,\n                           0.11919199675321579,\n                           0.7882900238037109,\n                           0.6036490201950073,\n                           -0.11919199675321579,\n                           0.7882900238037109,\n                           0.546737015247345,\n                           -0.2701770067214966,\n                           0.7925170063972473,\n                           0.7223830223083496,\n                           -0.2989569902420044,\n                           0.623528003692627,\n                           0.7723940014839172,\n                           -0.15251100063323975,\n                           0.616562008857727,\n                           0.9094089865684509,\n                           -0.3763520121574402,\n                           0.1770150065422058,\n                           0.9660869836807251,\n                           -0.19075599312782288,\n                           0.1740349978208542,\n                           0.9408230185508728,\n                           -0.3353259861469269,\n                           0.04907499998807907,\n                           0.9843119978904724,\n                           -0.16964000463485718,\n                           0.048493001610040665,\n                           0.9810580015182495,\n                           -0.1937119960784912,\n                           0,\n                           0.7071070075035095,\n                           -0.7071070075035095,\n                           0,\n                           0.40222999453544617,\n                           -0.4591110050678253,\n                           0.7921029925346375,\n                           0.5532029867172241,\n                           -0.5532029867172241,\n                           0.622842013835907,\n                           0.6959879994392395,\n                           -0.6959879994392395,\n                           0.17663900554180145,\n                           0.7403979897499084,\n                           -0.6703829765319824,\n                           0.048958998173475266,\n                           0.8310419917106628,\n                           -0.5562090277671814,\n                           0,\n                           0.19519099593162537,\n                           -0.5777599811553955,\n                           0.792523980140686,\n                           0.2989560067653656,\n                           -0.7223830223083496,\n                           0.623528003692627,\n                           0.3763520121574402,\n                           -0.9094089865684509,\n                           0.1770150065422058,\n                           0.4275760054588318,\n                           -0.902646005153656,\n                           0.04906899854540825,\n                           0.5562090277671814,\n                           -0.8310419917106628,\n                           0,\n                           0.11919199675321579,\n                           -0.6036490201950073,\n                           0.7882900238037109,\n                           0.15251100063323975,\n                           -0.7723940014839172,\n                           0.616562008857727,\n                           0.19075599312782288,\n                           -0.9660869836807251,\n                           0.1740349978208542,\n                           0.19348600506782532,\n                           -0.9799140095710754,\n                           0.048277001827955246,\n                           0.1937119960784912,\n                           -0.9810580015182495,\n                           0,\n                           -0.11919199675321579,\n                           -0.6036490201950073,\n                           0.7882900238037109,\n                           -0.2701770067214966,\n                           -0.546737015247345,\n                           0.7925170063972473,\n                           -0.2989569902420044,\n                           -0.7223830223083496,\n                           0.623528003692627,\n                           -0.15251100063323975,\n                           -0.7723940014839172,\n                           0.616562008857727,\n                           -0.3763520121574402,\n                           -0.9094089865684509,\n                           0.1770150065422058,\n                           -0.19075599312782288,\n                           -0.9660869836807251,\n                           0.1740349978208542,\n                           -0.3353259861469269,\n                           -0.9408230185508728,\n                           0.04907499998807907,\n                           -0.16964000463485718,\n                           -0.9843119978904724,\n                           0.04849399998784065,\n                           -0.1937119960784912,\n                           -0.9810580015182495,\n                           0,\n                           0.7071070075035095,\n                           -0.7071070075035095,\n                           0,\n                           -0.4591110050678253,\n                           -0.40222999453544617,\n                           0.7921029925346375,\n                           -0.5532029867172241,\n                           -0.5532029867172241,\n                           0.622842013835907,\n                           -0.6959879994392395,\n                           -0.6959879994392395,\n                           0.17663900554180145,\n                           -0.6703829765319824,\n                           -0.7403979897499084,\n                           0.048958998173475266,\n                           -0.5562090277671814,\n                           -0.8310419917106628,\n                           0,\n                           -0.5777599811553955,\n                           -0.19519099593162537,\n                           0.792523980140686,\n                           -0.7223830223083496,\n                           -0.2989560067653656,\n                           0.623528003692627,\n                           -0.9094089865684509,\n                           -0.3763520121574402,\n                           0.1770150065422058,\n                           -0.902646005153656,\n                           -0.4275760054588318,\n                           0.04906899854540825,\n                           -0.8310419917106628,\n                           -0.5562090277671814,\n                           0,\n                           -0.6036490201950073,\n                           -0.11919199675321579,\n                           0.7882900238037109,\n                           -0.7723940014839172,\n                           -0.15251100063323975,\n                           0.616562008857727,\n                           -0.9660869836807251,\n                           -0.19075599312782288,\n                           0.1740349978208542,\n                           -0.9799140095710754,\n                           -0.19348600506782532,\n                           0.048277001827955246,\n                           -0.9810580015182495,\n                           -0.1937119960784912,\n                           0,\n                           -0.6036490201950073,\n                           0.11919199675321579,\n                           0.7882900238037109,\n                           -0.546737015247345,\n                           0.2701770067214966,\n                           0.7925170063972473,\n                           -0.7223830223083496,\n                           0.2989569902420044,\n                           0.623528003692627,\n                           -0.7723940014839172,\n                           0.15251100063323975,\n                           0.616562008857727,\n                           -0.9094089865684509,\n                           0.3763520121574402,\n                           0.1770150065422058,\n                           -0.9660869836807251,\n                           0.19075599312782288,\n                           0.1740349978208542,\n                           -0.9408230185508728,\n                           0.3353259861469269,\n                           0.04907499998807907,\n                           -0.9843119978904724,\n                           0.16964000463485718,\n                           0.04849399998784065,\n                           -0.9810580015182495,\n                           0.1937119960784912,\n                           0,\n                           0.7071070075035095,\n                           -0.7071070075035095,\n                           0,\n                           -0.40222999453544617,\n                           0.4591110050678253,\n                           0.7921029925346375,\n                           -0.5532029867172241,\n                           0.5532029867172241,\n                           0.622842013835907,\n                           -0.6959879994392395,\n                           0.6959879994392395,\n                           0.17663900554180145,\n                           -0.7403979897499084,\n                           0.6703829765319824,\n                           0.048958998173475266,\n                           -0.8310419917106628,\n                           0.5562090277671814,\n                           0,\n                           -0.19519099593162537,\n                           0.5777599811553955,\n                           0.792523980140686,\n                           -0.2989560067653656,\n                           0.7223830223083496,\n                           0.623528003692627,\n                           -0.3763520121574402,\n                           0.9094089865684509,\n                           0.1770150065422058,\n                           -0.4275760054588318,\n                           0.902646005153656,\n                           0.04906899854540825,\n                           -0.5562090277671814,\n                           0.8310419917106628,\n                           0,\n                           -0.11919199675321579,\n                           0.6036490201950073,\n                           0.7882900238037109,\n                           -0.15251100063323975,\n                           0.7723940014839172,\n                           0.616562008857727,\n                           -0.19075599312782288,\n                           0.9660869836807251,\n                           0.1740349978208542,\n                           -0.19348600506782532,\n                           0.9799140095710754,\n                           0.048277001827955246,\n                           -0.1937119960784912,\n                           0.9810580015182495,\n                           0,\n                           0.11919199675321579,\n                           0.6036490201950073,\n                           0.7882900238037109,\n                           0.2701770067214966,\n                           0.546737015247345,\n                           0.7925170063972473,\n                           0.2989569902420044,\n                           0.7223830223083496,\n                           0.623528003692627,\n                           0.15251100063323975,\n                           0.7723940014839172,\n                           0.616562008857727,\n                           0.3763520121574402,\n                           0.9094089865684509,\n                           0.1770150065422058,\n                           0.19075599312782288,\n                           0.9660869836807251,\n                           0.1740349978208542,\n                           0.3353259861469269,\n                           0.9408230185508728,\n                           0.04907499998807907,\n                           0.16964000463485718,\n                           0.9843119978904724,\n                           0.04849399998784065,\n                           0.1937119960784912,\n                           0.9810580015182495,\n                           0,\n                           0.7071070075035095,\n                           -0.7071070075035095,\n                           0,\n                           0.4591110050678253,\n                           0.40222999453544617,\n                           0.7921029925346375,\n                           0.5532029867172241,\n                           0.5532029867172241,\n                           0.622842013835907,\n                           0.6959879994392395,\n                           0.6959879994392395,\n                           0.17663900554180145,\n                           0.6703829765319824,\n                           0.7403979897499084,\n                           0.048958998173475266,\n                           0.5562090277671814,\n                           0.8310419917106628,\n                           0,\n                           0.5777599811553955,\n                           0.19519099593162537,\n                           0.792523980140686,\n                           0.7223830223083496,\n                           0.2989560067653656,\n                           0.623528003692627,\n                           0.9094089865684509,\n                           0.3763520121574402,\n                           0.1770150065422058,\n                           0.902646005153656,\n                           0.4275760054588318,\n                           0.04906899854540825,\n                           0.8310419917106628,\n                           0.5562090277671814,\n                           0,\n                           0.6036490201950073,\n                           0.11919199675321579,\n                           0.7882900238037109,\n                           0.7723940014839172,\n                           0.15251100063323975,\n                           0.616562008857727,\n                           0.9660869836807251,\n                           0.19075599312782288,\n                           0.1740349978208542,\n                           0.9799150228500366,\n                           0.19348600506782532,\n                           0.048277001827955246,\n                           0.9810580015182495,\n                           0.1937119960784912,\n                           0,\n                           0.9999480247497559,\n                           0.006622000131756067,\n                           0.007786999922245741,\n                           0.9989290237426758,\n                           0.04125700145959854,\n                           -0.020945999771356583,\n                           0.9700260162353516,\n                           -0.18230900168418884,\n                           0.1606609970331192,\n                           0.9929869771003723,\n                           -0.1116809993982315,\n                           0.038782998919487,\n                           0.8677089810371399,\n                           -0.30993399024009705,\n                           0.38861599564552307,\n                           0.9675049781799316,\n                           -0.18179599940776825,\n                           0.17574100196361542,\n                           0.6127229928970337,\n                           -0.23797500133514404,\n                           0.753616988658905,\n                           0.781611979007721,\n                           -0.1585649996995926,\n                           0.6032750010490417,\n                           0.13049399852752686,\n                           -0.02585900016129017,\n                           0.9911119937896729,\n                           0.16583800315856934,\n                           -0.04606600105762482,\n                           0.9850770235061646,\n                           0.9847609996795654,\n                           -0.03004699945449829,\n                           -0.17129500210285187,\n                           0.9463850259780884,\n                           0.008138000033795834,\n                           0.3229379951953888,\n                           0.6942890286445618,\n                           0.06011800095438957,\n                           0.7171810269355774,\n                           0.405923992395401,\n                           0.09244199842214584,\n                           0.9092199802398682,\n                           0.1477230042219162,\n                           0.0024739999789744616,\n                           0.9890260100364685,\n                           0.991798996925354,\n                           -0.11557900160551071,\n                           -0.05454900115728378,\n                           0.9920099973678589,\n                           0.07202500104904175,\n                           0.10358300060033798,\n                           0.8882240056991577,\n                           0.2238840013742447,\n                           0.40116599202156067,\n                           0.6046879887580872,\n                           0.13691100478172302,\n                           0.7846069931983948,\n                           0.12908099591732025,\n                           -0.06111999973654747,\n                           0.989749014377594,\n                           0.9954820275306702,\n                           -0.09436299651861191,\n                           0.010502999648451805,\n                           0.9981970191001892,\n                           0.012060999870300293,\n                           0.05880200117826462,\n                           0.9550639986991882,\n                           0.09819000214338303,\n                           0.27966299653053284,\n                           0.6606940031051636,\n                           0.05169999971985817,\n                           0.7488729953765869,\n                           0.07273799926042557,\n                           -0.04034300148487091,\n                           0.9965350031852722,\n                           0.9999179840087891,\n                           0.007191000040620565,\n                           0.010560999624431133,\n                           0.9989050030708313,\n                           0.04436499997973442,\n                           -0.014883999712765217,\n                           0.9694769978523254,\n                           -0.17860299348831177,\n                           0.1679760068655014,\n                           0.9924619793891907,\n                           -0.10775599628686905,\n                           0.058378998190164566,\n                           0.8567489981651306,\n                           -0.28829601407051086,\n                           0.4276289939880371,\n                           0.9473999738693237,\n                           -0.16112199425697327,\n                           0.27653801441192627,\n                           0.5627779960632324,\n                           -0.19747799634933472,\n                           0.8026729822158813,\n                           0.6577669978141785,\n                           -0.11438000202178955,\n                           0.7444859743118286,\n                           0.07901199907064438,\n                           0.0013689999468624592,\n                           0.9968730211257935,\n                           0.07274100184440613,\n                           -0.02020600065588951,\n                           0.9971460103988647,\n                           0.9888780117034912,\n                           0.025808999314904213,\n                           -0.14647500216960907,\n                           0.9453979730606079,\n                           -0.006663000211119652,\n                           0.3258500099182129,\n                           0.6921399831771851,\n                           -0.04972299933433533,\n                           0.7200480103492737,\n                           0.3957499861717224,\n                           -0.08134900033473969,\n                           0.9147480130195618,\n                           0.13914500176906586,\n                           -0.00007899999764049426,\n                           0.9902719855308533,\n                           0.9924669861793518,\n                           -0.10311000049114227,\n                           -0.06616800278425217,\n                           0.9926300048828125,\n                           0.07926999777555466,\n                           0.09165900200605392,\n                           0.900858998298645,\n                           0.2553130090236664,\n                           0.3510949909687042,\n                           0.6513699889183044,\n                           0.18318000435829163,\n                           0.7363160252571106,\n                           0.15978699922561646,\n                           -0.02714099921286106,\n                           0.9867780208587646,\n                           0.9955620169639587,\n                           -0.09379199892282486,\n                           0.0077309999614953995,\n                           0.9991030097007751,\n                           0.01610800065100193,\n                           0.039149001240730286,\n                           0.9764699935913086,\n                           0.12068899720907211,\n                           0.17871999740600586,\n                           0.7859060168266296,\n                           0.10103499889373779,\n                           0.6100350022315979,\n                           0.16579000651836395,\n                           -0.014832000248134136,\n                           0.986050009727478,\n                           0.1655299961566925,\n                           -0.10078699886798859,\n                           0.9810410141944885,\n                           -0.0046790000051259995,\n                           -0.1750659942626953,\n                           0.9845460057258606,\n                           -0.3859579861164093,\n                           -0.06494200229644775,\n                           0.9202280044555664,\n                           -0.3219670057296753,\n                           -0.05600599944591522,\n                           0.9450929760932922,\n                           -0.6471610069274902,\n                           -0.11495299637317657,\n                           0.7536370158195496,\n                           -0.5616440176963806,\n                           -0.078855000436306,\n                           0.8236119747161865,\n                           -0.8379700183868408,\n                           -0.23749999701976776,\n                           0.4913240075111389,\n                           -0.7512590289115906,\n                           -0.1447169929742813,\n                           0.6439470052719116,\n                           -0.9052090048789978,\n                           -0.2807050049304962,\n                           0.3190630078315735,\n                           -0.8249419927597046,\n                           -0.2209009975194931,\n                           0.5202630162239075,\n                           -0.13363699615001678,\n                           0.0291920006275177,\n                           0.9905999898910522,\n                           -0.4039649963378906,\n                           0.0019519999623298645,\n                           0.9147719740867615,\n                           -0.7191359996795654,\n                           0.002443999983370304,\n                           0.6948649883270264,\n                           -0.9637579917907715,\n                           0.026884999126195908,\n                           0.26541900634765625,\n                           -0.9637719988822937,\n                           0.2207069993019104,\n                           -0.14977200329303741,\n                           0.03522900119423866,\n                           0.06716900318861008,\n                           0.9971190094947815,\n                           -0.3620629906654358,\n                           -0.01676199957728386,\n                           0.9320030212402344,\n                           -0.6534259915351868,\n                           0.007120999973267317,\n                           0.7569569945335388,\n                           -0.8528590202331543,\n                           0.11686599999666214,\n                           0.5088940262794495,\n                           -0.8814889788627625,\n                           0.3579840064048767,\n                           0.3079349994659424,\n                           0.0726580023765564,\n                           0.02018200047314167,\n                           0.9971529841423035,\n                           -0.37608298659324646,\n                           -0.025955000892281532,\n                           0.926222026348114,\n                           -0.6568350195884705,\n                           -0.015021000057458878,\n                           0.7538840174674988,\n                           -0.8238760232925415,\n                           0.03257700055837631,\n                           0.5658339858055115,\n                           -0.8688690066337585,\n                           0.13078700006008148,\n                           0.4774540066719055,\n                           0.07265599817037582,\n                           -0.07700400054454803,\n                           0.994379997253418,\n                           -0.0343950018286705,\n                           -0.151870995759964,\n                           0.9878020286560059,\n                           -0.40362000465393066,\n                           -0.05282000079751015,\n                           0.9134010076522827,\n                           -0.37586501240730286,\n                           -0.041078001260757446,\n                           0.9257640242576599,\n                           -0.6878190040588379,\n                           -0.0810059979557991,\n                           0.721347987651825,\n                           -0.6558970212936401,\n                           -0.052101001143455505,\n                           0.7530509829521179,\n                           -0.8708800077438354,\n                           -0.2062380015850067,\n                           0.44613200426101685,\n                           -0.8175939917564392,\n                           -0.12448199838399887,\n                           0.5621780157089233,\n                           -0.8926960229873657,\n                           -0.3055669963359833,\n                           0.33124300837516785,\n                           -0.8565059900283813,\n                           -0.21024300158023834,\n                           0.4713769853115082,\n                           -0.15155400335788727,\n                           -0.025412000715732574,\n                           0.9881219863891602,\n                           -0.41033700108528137,\n                           -0.0026420000940561295,\n                           0.9119300246238708,\n                           -0.7240620255470276,\n                           0.00047400000039488077,\n                           0.6897349953651428,\n                           -0.9655590057373047,\n                           -0.017078999429941177,\n                           0.2596229910850525,\n                           -0.973825991153717,\n                           -0.19711799919605255,\n                           -0.1131730005145073,\n                           0.06214199960231781,\n                           0.08235500007867813,\n                           0.9946640133857727,\n                           -0.3334290087223053,\n                           0.007625999860465527,\n                           0.9427440166473389,\n                           -0.608610987663269,\n                           0.04885999858379364,\n                           0.7919629812240601,\n                           -0.8253309726715088,\n                           0.14631199836730957,\n                           0.5453640222549438,\n                           -0.9105669856071472,\n                           0.3146660029888153,\n                           0.2680560052394867,\n                           0.16523399949073792,\n                           0.04589800164103508,\n                           0.985185980796814,\n                           -0.32260099053382874,\n                           -0.010471000336110592,\n                           0.9464769959449768,\n                           -0.5639140009880066,\n                           0.015166000463068485,\n                           0.8256940245628357,\n                           -0.758965015411377,\n                           0.05617399886250496,\n                           0.6487039923667908,\n                           -0.8382350206375122,\n                           0.14245299994945526,\n                           0.5263739824295044,\n                           0.9727830290794373,\n                           -0.019794000312685966,\n                           0.2308720052242279,\n                           0.9828159809112549,\n                           -0.036465998739004135,\n                           0.18095199763774872,\n                           0.9050639867782593,\n                           -0.02252200059592724,\n                           0.4246790111064911,\n                           0.8354039788246155,\n                           -0.03220000118017197,\n                           0.5486930012702942,\n                           0.6465700268745422,\n                           -0.045921001583337784,\n                           0.7614709734916687,\n                           0.4826749861240387,\n                           -0.04895399883389473,\n                           0.8744300007820129,\n                           0.4453999996185303,\n                           0.17256900668144226,\n                           0.8785430192947388,\n                           0.47231200337409973,\n                           0.13768500089645386,\n                           0.8706120252609253,\n                           0.4824250042438507,\n                           0.3898639976978302,\n                           0.7843930125236511,\n                           0.641398012638092,\n                           0.4275979995727539,\n                           0.6370000243186951,\n                           0.9863939881324768,\n                           0.0994419977068901,\n                           0.13091400265693665,\n                           0.9154840111732483,\n                           0.2120320051908493,\n                           0.34195101261138916,\n                           0.7246469855308533,\n                           0.245046004652977,\n                           0.6440799832344055,\n                           0.35685500502586365,\n                           0.17885500192642212,\n                           0.9168779850006104,\n                           0.14101800322532654,\n                           0.24263200163841248,\n                           0.9598140120506287,\n                           0.9366779923439026,\n                           0.16484400629997253,\n                           0.3089669942855835,\n                           0.7982620000839233,\n                           0.2441370040178299,\n                           0.5506129860877991,\n                           0.4769439995288849,\n                           0.2904820144176483,\n                           0.8295450210571289,\n                           0.4125959873199463,\n                           -0.017246000468730927,\n                           0.9107509851455688,\n                           0.341374009847641,\n                           -0.37689098715782166,\n                           0.8610560297966003,\n                           0.9026100039482117,\n                           0.14119599759578705,\n                           0.40664398670196533,\n                           0.7326020002365112,\n                           0.1491979956626892,\n                           0.6641039848327637,\n                           0.38115599751472473,\n                           0.15792299807071686,\n                           0.9109230041503906,\n                           0.5317370295524597,\n                           -0.02143399976193905,\n                           0.846638023853302,\n                           0.7915729880332947,\n                           -0.3539769947528839,\n                           0.49810999631881714,\n                           0.9087340235710144,\n                           -0.07959599792957306,\n                           0.40971601009368896,\n                           0.9386569857597351,\n                           -0.17680299282073975,\n                           0.29607900977134705,\n                           0.7781569957733154,\n                           -0.19467000663280487,\n                           0.5971400141716003,\n                           0.738847017288208,\n                           -0.07674700021743774,\n                           0.6694890260696411,\n                           0.43915998935699463,\n                           -0.22276799380779266,\n                           0.870352029800415,\n                           0.3863860070705414,\n                           -0.0790880024433136,\n                           0.918940007686615,\n                           0.3576120138168335,\n                           0.07325199991464615,\n                           0.9309930205345154,\n                           0.5227140188217163,\n                           0.16167999804019928,\n                           0.8370360136032104,\n                           0.4246380031108856,\n                           0.3233239948749542,\n                           0.845661997795105,\n                           0.733618974685669,\n                           0.48907899856567383,\n                           0.4718089997768402,\n                           0.9886019825935364,\n                           -0.10717800259590149,\n                           0.10573200136423111,\n                           0.9131960272789001,\n                           -0.22303399443626404,\n                           0.3410690128803253,\n                           0.7163559794425964,\n                           -0.25636500120162964,\n                           0.6489310264587402,\n                           0.35149699449539185,\n                           -0.15968100726604462,\n                           0.922469973564148,\n                           0.07999800145626068,\n                           -0.2107039988040924,\n                           0.9742709994316101,\n                           0.9883249998092651,\n                           0.04732999950647354,\n                           0.14482200145721436,\n                           0.9210500121116638,\n                           0.07413999736309052,\n                           0.3823229968547821,\n                           0.6804890036582947,\n                           0.11895299702882767,\n                           0.7230389714241028,\n                           0.4935390055179596,\n                           -0.10269299894571304,\n                           0.8636389970779419,\n                           0.3912479877471924,\n                           -0.4752289950847626,\n                           0.7880880236625671,\n                           0.9700270295143127,\n                           0.07970499992370605,\n                           0.2295520007610321,\n                           0.831250011920929,\n                           0.10592100024223328,\n                           0.5457149744033813,\n                           0.4774230122566223,\n                           0.13252699375152588,\n                           0.8686220049858093,\n                           0.47922399640083313,\n                           -0.0024129999801516533,\n                           0.877689003944397,\n                           0.6902980208396912,\n                           -0.29711300134658813,\n                           0.6597059965133667,\n                           0.6312130093574524,\n                           0.4550989866256714,\n                           0.628055989742279,\n                           0.26494699716567993,\n                           0.5426689982414246,\n                           0.797065019607544,\n                           0.4216960072517395,\n                           0.6728450059890747,\n                           0.6078259944915771,\n                           0.7324270009994507,\n                           0.5829970240592957,\n                           0.35166099667549133,\n                           0.5086709856987,\n                           0.8606399893760681,\n                           -0.023507000878453255,\n                           0.7640720009803772,\n                           0.6449369788169861,\n                           -0.015798000618815422,\n                           0.19029100239276886,\n                           0.2773289978504181,\n                           -0.9417420029640198,\n                           0.02588699944317341,\n                           0.0005750000127591193,\n                           -0.9996650218963623,\n                           -0.33045700192451477,\n                           -0.4387669861316681,\n                           -0.8356329798698425,\n                           -0.6271269917488098,\n                           -0.4645389914512634,\n                           -0.6252319812774658,\n                           -0.02311599999666214,\n                           0.2469020038843155,\n                           0.9687650203704834,\n                           -0.012950999662280083,\n                           0.45514100790023804,\n                           0.8903250098228455,\n                           -0.001180000021122396,\n                           0.9888520240783691,\n                           0.14889399707317352,\n                           0.019520999863743782,\n                           0.6841210126876831,\n                           -0.7291070222854614,\n                           0.012253000400960445,\n                           0.007784999907016754,\n                           -0.9998949766159058,\n                           0.3314639925956726,\n                           -0.3832260072231293,\n                           0.8621309995651245,\n                           0.08274699747562408,\n                           -0.16047699749469757,\n                           0.9835649728775024,\n                           -0.381630003452301,\n                           0.638043999671936,\n                           0.6687729954719543,\n                           -0.44988399744033813,\n                           0.787883996963501,\n                           -0.42052799463272095,\n                           -0.2780170142650604,\n                           0.5983560085296631,\n                           -0.7514500021934509,\n                           0.7378140091896057,\n                           -0.4918749928474426,\n                           0.4622659981250763,\n                           0.6153389811515808,\n                           -0.45540300011634827,\n                           0.6434019804000854,\n                           -0.43678900599479675,\n                           0.33411499857902527,\n                           0.8352140188217163,\n                           -0.7429530024528503,\n                           0.6388909816741943,\n                           -0.1995989978313446,\n                           -0.7432950139045715,\n                           0.5977380275726318,\n                           -0.3003700077533722,\n                           0.7197920083999634,\n                           0.5168960094451904,\n                           0.4633769989013672,\n                           0.22183099389076233,\n                           0.4485720098018646,\n                           0.8657789826393127,\n                           0.08203200250864029,\n                           0.15848000347614288,\n                           0.9839479923248291,\n                           0.5953459739685059,\n                           0.4811680018901825,\n                           0.6434599757194519,\n                           -0.37556400895118713,\n                           -0.6215270161628723,\n                           0.6875,\n                           -0.42666301131248474,\n                           -0.33534398674964905,\n                           0.8399419784545898,\n                           -0.44476398825645447,\n                           -0.7887529730796814,\n                           -0.42432600259780884,\n                           -0.7557309865951538,\n                           -0.6222699880599976,\n                           -0.20408600568771362,\n                           -0.4292669892311096,\n                           -0.5361850261688232,\n                           -0.7267979979515076,\n                           -0.7655900120735168,\n                           -0.5671039819717407,\n                           -0.30375200510025024,\n                           0.007348000071942806,\n                           -0.21113499999046326,\n                           0.9774289727210999,\n                           -0.01990099996328354,\n                           -0.4373210072517395,\n                           0.8990849852561951,\n                           -0.008775000460445881,\n                           -0.9864199757575989,\n                           0.16400499641895294,\n                           0.024855999276041985,\n                           -0.6829339861869812,\n                           -0.7300570011138916,\n                           0.014514000155031681,\n                           0.03655200079083443,\n                           -0.9992259740829468,\n                           0.40192899107933044,\n                           -0.4676550030708313,\n                           0.7872430086135864,\n                           0.41696101427078247,\n                           -0.6813820004463196,\n                           0.6015490293502808,\n                           0.5033609867095947,\n                           -0.8637740015983582,\n                           -0.022839000448584557,\n                           0.2058819979429245,\n                           -0.2945750057697296,\n                           -0.9331870079040527,\n                           -0.2351589947938919,\n                           0.5535579919815063,\n                           -0.7989199757575989,\n                           0.6533820033073425,\n                           -0.435588002204895,\n                           0.619156002998352,\n                           0.7555500268936157,\n                           -0.554410994052887,\n                           0.3489600121974945,\n                           0.7765160202980042,\n                           -0.6298360228538513,\n                           -0.01814199984073639,\n                           0.025975000113248825,\n                           0.008264999836683273,\n                           -0.9996280074119568,\n                           -0.6086519956588745,\n                           0.49536699056625366,\n                           -0.6198019981384277,\n                           -0.9813200235366821,\n                           0.19238099455833435,\n                           0,\n                           -0.831650972366333,\n                           0.5552989840507507,\n                           0,\n                           -0.4425640106201172,\n                           0.38308998942375183,\n                           0.8107889890670776,\n                           -0.5623509883880615,\n                           0.11026400327682495,\n                           0.8195139765739441,\n                           0.367917001247406,\n                           -0.15178599953651428,\n                           0.917385995388031,\n                           0.3960669934749603,\n                           -0.07774800062179565,\n                           0.9149240255355835,\n                           0.3283520042896271,\n                           -0.13562799990177155,\n                           0.9347670078277588,\n                           0.3530749976634979,\n                           -0.06952299922704697,\n                           0.9330080151557922,\n                           -0.5935590267181396,\n                           0.20035800337791443,\n                           0.7794510126113892,\n                           -0.6201800107955933,\n                           0.12245599925518036,\n                           0.7748429775238037,\n                           -0.5552989840507507,\n                           0.831650972366333,\n                           0,\n                           -0.2616960108280182,\n                           0.523730993270874,\n                           0.8106920123100281,\n                           0.2819640040397644,\n                           -0.2819199860095978,\n                           0.9170699715614319,\n                           0.25169798731803894,\n                           -0.25161200761795044,\n                           0.9345269799232483,\n                           -0.4710330069065094,\n                           0.41249701380729675,\n                           0.7797269821166992,\n                           -0.19238099455833435,\n                           0.9813200235366821,\n                           0,\n                           -0.04031100124120712,\n                           0.5840420126914978,\n                           0.8107219934463501,\n                           0.1517850011587143,\n                           -0.3678950071334839,\n                           0.9173960089683533,\n                           0.13561999797821045,\n                           -0.3282899856567383,\n                           0.9347900152206421,\n                           -0.27737799286842346,\n                           0.561601996421814,\n                           0.779528021812439,\n                           -1,\n                           0,\n                           0,\n                           0.29074999690055847,\n                           0.5413560271263123,\n                           0.7889220118522644,\n                           0.07767199724912643,\n                           -0.39607399702072144,\n                           0.9149270057678223,\n                           0.0693729966878891,\n                           -0.3530940115451813,\n                           0.9330130219459534,\n                           -0.12221000343561172,\n                           0.6202139854431152,\n                           0.7748550176620483,\n                           0.19238099455833435,\n                           0.9813200235366821,\n                           0,\n                           0.5552989840507507,\n                           0.831650972366333,\n                           0,\n                           0.38308998942375183,\n                           0.4425640106201172,\n                           0.8107889890670776,\n                           0.11026400327682495,\n                           0.5623509883880615,\n                           0.8195139765739441,\n                           -0.15178599953651428,\n                           -0.367917001247406,\n                           0.917385995388031,\n                           -0.07774800062179565,\n                           -0.3960669934749603,\n                           0.9149240255355835,\n                           -0.13562799990177155,\n                           -0.3283520042896271,\n                           0.9347670078277588,\n                           -0.06952299922704697,\n                           -0.3530749976634979,\n                           0.9330080151557922,\n                           0.20035800337791443,\n                           0.5935590267181396,\n                           0.7794510126113892,\n                           0.12245599925518036,\n                           0.6201800107955933,\n                           0.7748429775238037,\n                           0.831650972366333,\n                           0.5552989840507507,\n                           0,\n                           0.523730993270874,\n                           0.2616960108280182,\n                           0.8106920123100281,\n                           -0.2819199860095978,\n                           -0.2819640040397644,\n                           0.9170699715614319,\n                           -0.25161200761795044,\n                           -0.25169798731803894,\n                           0.9345269799232483,\n                           0.41249701380729675,\n                           0.4710330069065094,\n                           0.7797269821166992,\n                           0.9813200235366821,\n                           0.19238099455833435,\n                           0,\n                           0.5840420126914978,\n                           0.04031100124120712,\n                           0.8107219934463501,\n                           -0.3678950071334839,\n                           -0.1517850011587143,\n                           0.9173960089683533,\n                           -0.3282899856567383,\n                           -0.13561999797821045,\n                           0.9347900152206421,\n                           0.561601996421814,\n                           0.27737799286842346,\n                           0.779528021812439,\n                           -1,\n                           0,\n                           0,\n                           0.5413560271263123,\n                           -0.29074999690055847,\n                           0.7889220118522644,\n                           -0.39607399702072144,\n                           -0.07767199724912643,\n                           0.9149270057678223,\n                           -0.3530940115451813,\n                           -0.0693729966878891,\n                           0.9330130219459534,\n                           0.6202139854431152,\n                           0.12221000343561172,\n                           0.7748550176620483,\n                           0.9813200235366821,\n                           -0.19238099455833435,\n                           0,\n                           0.831650972366333,\n                           -0.5552989840507507,\n                           0,\n                           0.4425640106201172,\n                           -0.38308998942375183,\n                           0.8107889890670776,\n                           0.5623509883880615,\n                           -0.11026400327682495,\n                           0.8195139765739441,\n                           -0.367917001247406,\n                           0.15178599953651428,\n                           0.917385995388031,\n                           -0.3960669934749603,\n                           0.07774800062179565,\n                           0.9149240255355835,\n                           -0.3283520042896271,\n                           0.13562799990177155,\n                           0.9347670078277588,\n                           -0.3530749976634979,\n                           0.06952299922704697,\n                           0.9330080151557922,\n                           0.5935590267181396,\n                           -0.20035800337791443,\n                           0.7794510126113892,\n                           0.6201800107955933,\n                           -0.12245599925518036,\n                           0.7748429775238037,\n                           0.5552989840507507,\n                           -0.831650972366333,\n                           0,\n                           0.2616960108280182,\n                           -0.523730993270874,\n                           0.8106920123100281,\n                           -0.2819640040397644,\n                           0.2819199860095978,\n                           0.9170699715614319,\n                           -0.25169798731803894,\n                           0.25161200761795044,\n                           0.9345269799232483,\n                           0.4710330069065094,\n                           -0.41249701380729675,\n                           0.7797269821166992,\n                           0.19238099455833435,\n                           -0.9813200235366821,\n                           0,\n                           0.04031100124120712,\n                           -0.5840420126914978,\n                           0.8107219934463501,\n                           -0.1517850011587143,\n                           0.3678950071334839,\n                           0.9173960089683533,\n                           -0.13561999797821045,\n                           0.3282899856567383,\n                           0.9347900152206421,\n                           0.27737799286842346,\n                           -0.561601996421814,\n                           0.779528021812439,\n                           -1,\n                           0,\n                           0,\n                           -0.29074999690055847,\n                           -0.5413560271263123,\n                           0.7889220118522644,\n                           -0.07767199724912643,\n                           0.39607399702072144,\n                           0.9149270057678223,\n                           -0.0693729966878891,\n                           0.3530940115451813,\n                           0.9330130219459534,\n                           0.12221000343561172,\n                           -0.6202139854431152,\n                           0.7748550176620483,\n                           -0.19238099455833435,\n                           -0.9813200235366821,\n                           0,\n                           -0.5552989840507507,\n                           -0.831650972366333,\n                           0,\n                           -0.38308998942375183,\n                           -0.4425640106201172,\n                           0.8107889890670776,\n                           -0.11026400327682495,\n                           -0.5623509883880615,\n                           0.8195139765739441,\n                           0.15178599953651428,\n                           0.367917001247406,\n                           0.917385995388031,\n                           0.07774800062179565,\n                           0.3960669934749603,\n                           0.9149240255355835,\n                           0.13562799990177155,\n                           0.3283520042896271,\n                           0.9347670078277588,\n                           0.06952299922704697,\n                           0.3530749976634979,\n                           0.9330080151557922,\n                           -0.20035800337791443,\n                           -0.5935590267181396,\n                           0.7794510126113892,\n                           -0.12245599925518036,\n                           -0.6201800107955933,\n                           0.7748429775238037,\n                           -0.831650972366333,\n                           -0.5552989840507507,\n                           0,\n                           -0.523730993270874,\n                           -0.2616960108280182,\n                           0.8106920123100281,\n                           0.2819199860095978,\n                           0.2819640040397644,\n                           0.9170699715614319,\n                           0.25161200761795044,\n                           0.25169798731803894,\n                           0.9345269799232483,\n                           -0.41249701380729675,\n                           -0.4710330069065094,\n                           0.7797269821166992,\n                           -0.9813200235366821,\n                           -0.19238099455833435,\n                           0,\n                           -0.5840420126914978,\n                           -0.04031100124120712,\n                           0.8107219934463501,\n                           0.3678950071334839,\n                           0.1517850011587143,\n                           0.9173960089683533,\n                           0.3282899856567383,\n                           0.13561999797821045,\n                           0.9347900152206421,\n                           -0.561601996421814,\n                           -0.27737799286842346,\n                           0.779528021812439,\n                           -1,\n                           0,\n                           0,\n                           -0.5413560271263123,\n                           0.29074999690055847,\n                           0.7889220118522644,\n                           0.39607399702072144,\n                           0.07767199724912643,\n                           0.9149270057678223,\n                           0.3530940115451813,\n                           0.0693729966878891,\n                           0.9330130219459534,\n                           -0.6202139854431152,\n                           -0.12221000343561172,\n                           0.7748550176620483,\n                           -0.6201800107955933,\n                           0.12245599925518036,\n                           0.7748429775238037,\n                           -0.5616469979286194,\n                           0.27755099534988403,\n                           0.7794349789619446,\n                           -0.8979210257530212,\n                           0.37159600853919983,\n                           0.23590999841690063,\n                           -0.9542099833488464,\n                           0.18841099739074707,\n                           0.23234599828720093,\n                           -0.9101200103759766,\n                           0.3766449987888336,\n                           0.17268399894237518,\n                           -0.966795027256012,\n                           0.19089600443840027,\n                           0.16990099847316742,\n                           -0.8549879789352417,\n                           0.35383298993110657,\n                           0.3792079985141754,\n                           -0.9100499749183655,\n                           0.17969100177288055,\n                           0.3735229969024658,\n                           -0.8064150214195251,\n                           0.2724289894104004,\n                           0.5248600244522095,\n                           -0.8383409976959229,\n                           0.16553199291229248,\n                           0.5194069743156433,\n                           -0.4125959873199463,\n                           0.47094500064849854,\n                           0.7797279953956604,\n                           -0.687192976474762,\n                           0.687192976474762,\n                           0.23565199971199036,\n                           -0.6965190172195435,\n                           0.6965190172195435,\n                           0.17240400612354279,\n                           -0.6544880270957947,\n                           0.6544870138168335,\n                           0.37853899598121643,\n                           -0.6404970288276672,\n                           0.5611429810523987,\n                           0.5242909789085388,\n                           -0.20047900080680847,\n                           0.5933949947357178,\n                           0.7795450091362,\n                           -0.3715969920158386,\n                           0.8979210257530212,\n                           0.23590999841690063,\n                           -0.3766449987888336,\n                           0.9101200103759766,\n                           0.17268399894237518,\n                           -0.35383298993110657,\n                           0.8549879789352417,\n                           0.3792079985141754,\n                           -0.3770729899406433,\n                           0.7630789875984192,\n                           0.5249059796333313,\n                           -0.12245900183916092,\n                           0.6201940178871155,\n                           0.7748309969902039,\n                           -0.18841099739074707,\n                           0.9542099833488464,\n                           0.23234599828720093,\n                           -0.19089600443840027,\n                           0.966795027256012,\n                           0.16990099847316742,\n                           -0.17969200015068054,\n                           0.9100499749183655,\n                           0.3735229969024658,\n                           -0.16553199291229248,\n                           0.8383409976959229,\n                           0.5194069743156433,\n                           0.12245599925518036,\n                           0.6201800107955933,\n                           0.7748429775238037,\n                           0.27755099534988403,\n                           0.5616469979286194,\n                           0.7794349789619446,\n                           0.37159600853919983,\n                           0.8979210257530212,\n                           0.23590999841690063,\n                           0.18841099739074707,\n                           0.9542099833488464,\n                           0.23234599828720093,\n                           0.3766449987888336,\n                           0.9101200103759766,\n                           0.17268399894237518,\n                           0.19089600443840027,\n                           0.966795027256012,\n                           0.16990099847316742,\n                           0.35383298993110657,\n                           0.8549879789352417,\n                           0.3792079985141754,\n                           0.17969100177288055,\n                           0.9100499749183655,\n                           0.3735229969024658,\n                           0.2724289894104004,\n                           0.8064150214195251,\n                           0.5248600244522095,\n                           0.16553199291229248,\n                           0.8383409976959229,\n                           0.5194069743156433,\n                           0.47094500064849854,\n                           0.4125959873199463,\n                           0.7797279953956604,\n                           0.687192976474762,\n                           0.687192976474762,\n                           0.23565199971199036,\n                           0.6965190172195435,\n                           0.6965190172195435,\n                           0.17240400612354279,\n                           0.6544870138168335,\n                           0.6544880270957947,\n                           0.37853899598121643,\n                           0.5611429810523987,\n                           0.6404970288276672,\n                           0.5242909789085388,\n                           0.5933949947357178,\n                           0.20047900080680847,\n                           0.7795450091362,\n                           0.8979210257530212,\n                           0.3715969920158386,\n                           0.23590999841690063,\n                           0.9101200103759766,\n                           0.3766449987888336,\n                           0.17268399894237518,\n                           0.8549879789352417,\n                           0.35383298993110657,\n                           0.3792079985141754,\n                           0.7630789875984192,\n                           0.3770729899406433,\n                           0.5249059796333313,\n                           0.6201940178871155,\n                           0.12245900183916092,\n                           0.7748309969902039,\n                           0.9542099833488464,\n                           0.18841099739074707,\n                           0.23234599828720093,\n                           0.966795027256012,\n                           0.19089600443840027,\n                           0.16990099847316742,\n                           0.9100499749183655,\n                           0.17969200015068054,\n                           0.3735229969024658,\n                           0.8383409976959229,\n                           0.16553199291229248,\n                           0.5194069743156433,\n                           0.6201800107955933,\n                           -0.12245599925518036,\n                           0.7748429775238037,\n                           0.5616469979286194,\n                           -0.27755099534988403,\n                           0.7794349789619446,\n                           0.8979210257530212,\n                           -0.37159600853919983,\n                           0.23590999841690063,\n                           0.9542099833488464,\n                           -0.18841099739074707,\n                           0.23234599828720093,\n                           0.9101200103759766,\n                           -0.3766449987888336,\n                           0.17268399894237518,\n                           0.966795027256012,\n                           -0.19089600443840027,\n                           0.16990099847316742,\n                           0.8549879789352417,\n                           -0.35383298993110657,\n                           0.3792079985141754,\n                           0.9100499749183655,\n                           -0.17969100177288055,\n                           0.3735229969024658,\n                           0.8064150214195251,\n                           -0.2724289894104004,\n                           0.5248600244522095,\n                           0.8383409976959229,\n                           -0.16553199291229248,\n                           0.5194069743156433,\n                           0.4125959873199463,\n                           -0.47094500064849854,\n                           0.7797279953956604,\n                           0.687192976474762,\n                           -0.687192976474762,\n                           0.23565199971199036,\n                           0.6965190172195435,\n                           -0.6965190172195435,\n                           0.17240400612354279,\n                           0.6544880270957947,\n                           -0.6544870138168335,\n                           0.37853899598121643,\n                           0.6404970288276672,\n                           -0.5611429810523987,\n                           0.5242909789085388,\n                           0.20047900080680847,\n                           -0.5933949947357178,\n                           0.7795450091362,\n                           0.3715969920158386,\n                           -0.8979210257530212,\n                           0.23590999841690063,\n                           0.3766449987888336,\n                           -0.9101200103759766,\n                           0.17268399894237518,\n                           0.35383298993110657,\n                           -0.8549879789352417,\n                           0.3792079985141754,\n                           0.3770729899406433,\n                           -0.7630789875984192,\n                           0.5249059796333313,\n                           0.12245900183916092,\n                           -0.6201940178871155,\n                           0.7748309969902039,\n                           0.18841099739074707,\n                           -0.9542099833488464,\n                           0.23234599828720093,\n                           0.19089600443840027,\n                           -0.966795027256012,\n                           0.16990099847316742,\n                           0.17969200015068054,\n                           -0.9100499749183655,\n                           0.3735229969024658,\n                           0.16553199291229248,\n                           -0.8383409976959229,\n                           0.5194069743156433,\n                           -0.12245599925518036,\n                           -0.6201800107955933,\n                           0.7748429775238037,\n                           -0.27755099534988403,\n                           -0.5616469979286194,\n                           0.7794349789619446,\n                           -0.37159600853919983,\n                           -0.8979210257530212,\n                           0.23590999841690063,\n                           -0.18841099739074707,\n                           -0.9542099833488464,\n                           0.23234599828720093,\n                           -0.3766449987888336,\n                           -0.9101200103759766,\n                           0.17268399894237518,\n                           -0.19089600443840027,\n                           -0.966795027256012,\n                           0.16990099847316742,\n                           -0.35383298993110657,\n                           -0.8549879789352417,\n                           0.3792079985141754,\n                           -0.17969100177288055,\n                           -0.9100499749183655,\n                           0.3735229969024658,\n                           -0.2724289894104004,\n                           -0.8064150214195251,\n                           0.5248600244522095,\n                           -0.16553199291229248,\n                           -0.8383409976959229,\n                           0.5194069743156433,\n                           -0.47094500064849854,\n                           -0.4125959873199463,\n                           0.7797279953956604,\n                           -0.687192976474762,\n                           -0.687192976474762,\n                           0.23565199971199036,\n                           -0.6965190172195435,\n                           -0.6965190172195435,\n                           0.17240400612354279,\n                           -0.6544870138168335,\n                           -0.6544880270957947,\n                           0.37853899598121643,\n                           -0.5611429810523987,\n                           -0.6404970288276672,\n                           0.5242909789085388,\n                           -0.5933949947357178,\n                           -0.20047900080680847,\n                           0.7795450091362,\n                           -0.8979210257530212,\n                           -0.3715969920158386,\n                           0.23590999841690063,\n                           -0.9101200103759766,\n                           -0.3766449987888336,\n                           0.17268399894237518,\n                           -0.8549879789352417,\n                           -0.35383298993110657,\n                           0.3792079985141754,\n                           -0.7630789875984192,\n                           -0.3770729899406433,\n                           0.5249059796333313,\n                           -0.6201940178871155,\n                           -0.12245900183916092,\n                           0.7748309969902039,\n                           -0.9542099833488464,\n                           -0.18841099739074707,\n                           0.23234599828720093,\n                           -0.966795027256012,\n                           -0.19089600443840027,\n                           0.16990099847316742,\n                           -0.9100499749183655,\n                           -0.17969200015068054,\n                           0.3735229969024658,\n                           -0.8383409976959229,\n                           -0.16553199291229248,\n                           0.5194069743156433};\n\nfloat teapotTexCoords[] = {2,\n                           2,\n                           0,\n                           1.75,\n                           2,\n                           0,\n                           1.75,\n                           1.975000023841858,\n                           0,\n                           2,\n                           1.975000023841858,\n                           0,\n                           1.75,\n                           1.9500000476837158,\n                           0,\n                           2,\n                           1.9500000476837158,\n                           0,\n                           1.75,\n                           1.9249999523162842,\n                           0,\n                           2,\n                           1.9249999523162842,\n                           0,\n                           1.75,\n                           1.899999976158142,\n                           0,\n                           2,\n                           1.899999976158142,\n                           0,\n                           1.5,\n                           2,\n                           0,\n                           1.5,\n                           1.975000023841858,\n                           0,\n                           1.5,\n                           1.9500000476837158,\n                           0,\n                           1.5,\n                           1.9249999523162842,\n                           0,\n                           1.5,\n                           1.899999976158142,\n                           0,\n                           1.25,\n                           2,\n                           0,\n                           1.25,\n                           1.975000023841858,\n                           0,\n                           1.25,\n                           1.9500000476837158,\n                           0,\n                           1.25,\n                           1.9249999523162842,\n                           0,\n                           1.25,\n                           1.899999976158142,\n                           0,\n                           1,\n                           2,\n                           0,\n                           1,\n                           1.975000023841858,\n                           0,\n                           1,\n                           1.9500000476837158,\n                           0,\n                           1,\n                           1.9249999523162842,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           1,\n                           2,\n                           0,\n                           0.75,\n                           2,\n                           0,\n                           0.75,\n                           1.975000023841858,\n                           0,\n                           1,\n                           1.975000023841858,\n                           0,\n                           0.75,\n                           1.9500000476837158,\n                           0,\n                           1,\n                           1.9500000476837158,\n                           0,\n                           0.75,\n                           1.9249999523162842,\n                           0,\n                           1,\n                           1.9249999523162842,\n                           0,\n                           0.75,\n                           1.899999976158142,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           0.5,\n                           2,\n                           0,\n                           0.5,\n                           1.975000023841858,\n                           0,\n                           0.5,\n                           1.9500000476837158,\n                           0,\n                           0.5,\n                           1.9249999523162842,\n                           0,\n                           0.5,\n                           1.899999976158142,\n                           0,\n                           0.25,\n                           2,\n                           0,\n                           0.25,\n                           1.975000023841858,\n                           0,\n                           0.25,\n                           1.9500000476837158,\n                           0,\n                           0.25,\n                           1.9249999523162842,\n                           0,\n                           0.25,\n                           1.899999976158142,\n                           0,\n                           0,\n                           2,\n                           0,\n                           0,\n                           1.975000023841858,\n                           0,\n                           0,\n                           1.9500000476837158,\n                           0,\n                           0,\n                           1.9249999523162842,\n                           0,\n                           0,\n                           1.899999976158142,\n                           0,\n                           2,\n                           2,\n                           0,\n                           1.75,\n                           2,\n                           0,\n                           1.75,\n                           1.975000023841858,\n                           0,\n                           2,\n                           1.975000023841858,\n                           0,\n                           1.75,\n                           1.9500000476837158,\n                           0,\n                           2,\n                           1.9500000476837158,\n                           0,\n                           1.75,\n                           1.9249999523162842,\n                           0,\n                           2,\n                           1.9249999523162842,\n                           0,\n                           1.75,\n                           1.899999976158142,\n                           0,\n                           2,\n                           1.899999976158142,\n                           0,\n                           1.5,\n                           2,\n                           0,\n                           1.5,\n                           1.975000023841858,\n                           0,\n                           1.5,\n                           1.9500000476837158,\n                           0,\n                           1.5,\n                           1.9249999523162842,\n                           0,\n                           1.5,\n                           1.899999976158142,\n                           0,\n                           1.25,\n                           2,\n                           0,\n                           1.25,\n                           1.975000023841858,\n                           0,\n                           1.25,\n                           1.9500000476837158,\n                           0,\n                           1.25,\n                           1.9249999523162842,\n                           0,\n                           1.25,\n                           1.899999976158142,\n                           0,\n                           1,\n                           2,\n                           0,\n                           1,\n                           1.975000023841858,\n                           0,\n                           1,\n                           1.9500000476837158,\n                           0,\n                           1,\n                           1.9249999523162842,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           1,\n                           2,\n                           0,\n                           0.75,\n                           2,\n                           0,\n                           0.75,\n                           1.975000023841858,\n                           0,\n                           1,\n                           1.975000023841858,\n                           0,\n                           0.75,\n                           1.9500000476837158,\n                           0,\n                           1,\n                           1.9500000476837158,\n                           0,\n                           0.75,\n                           1.9249999523162842,\n                           0,\n                           1,\n                           1.9249999523162842,\n                           0,\n                           0.75,\n                           1.899999976158142,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           0.5,\n                           2,\n                           0,\n                           0.5,\n                           1.975000023841858,\n                           0,\n                           0.5,\n                           1.9500000476837158,\n                           0,\n                           0.5,\n                           1.9249999523162842,\n                           0,\n                           0.5,\n                           1.899999976158142,\n                           0,\n                           0.25,\n                           2,\n                           0,\n                           0.25,\n                           1.975000023841858,\n                           0,\n                           0.25,\n                           1.9500000476837158,\n                           0,\n                           0.25,\n                           1.9249999523162842,\n                           0,\n                           0.25,\n                           1.899999976158142,\n                           0,\n                           0,\n                           2,\n                           0,\n                           0,\n                           1.975000023841858,\n                           0,\n                           0,\n                           1.9500000476837158,\n                           0,\n                           0,\n                           1.9249999523162842,\n                           0,\n                           0,\n                           1.899999976158142,\n                           0,\n                           2,\n                           1.899999976158142,\n                           0,\n                           1.75,\n                           1.899999976158142,\n                           0,\n                           1.75,\n                           1.6749999523162842,\n                           0,\n                           2,\n                           1.6749999523162842,\n                           0,\n                           1.75,\n                           1.4500000476837158,\n                           0,\n                           2,\n                           1.4500000476837158,\n                           0,\n                           1.75,\n                           1.225000023841858,\n                           0,\n                           2,\n                           1.225000023841858,\n                           0,\n                           1.75,\n                           1,\n                           0,\n                           2,\n                           1,\n                           0,\n                           1.5,\n                           1.899999976158142,\n                           0,\n                           1.5,\n                           1.6749999523162842,\n                           0,\n                           1.5,\n                           1.4500000476837158,\n                           0,\n                           1.5,\n                           1.225000023841858,\n                           0,\n                           1.5,\n                           1,\n                           0,\n                           1.25,\n                           1.899999976158142,\n                           0,\n                           1.25,\n                           1.6749999523162842,\n                           0,\n                           1.25,\n                           1.4500000476837158,\n                           0,\n                           1.25,\n                           1.225000023841858,\n                           0,\n                           1.25,\n                           1,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           1,\n                           1.6749999523162842,\n                           0,\n                           1,\n                           1.4500000476837158,\n                           0,\n                           1,\n                           1.225000023841858,\n                           0,\n                           1,\n                           1,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           0.75,\n                           1.899999976158142,\n                           0,\n                           0.75,\n                           1.6749999523162842,\n                           0,\n                           1,\n                           1.6749999523162842,\n                           0,\n                           0.75,\n                           1.4500000476837158,\n                           0,\n                           1,\n                           1.4500000476837158,\n                           0,\n                           0.75,\n                           1.225000023841858,\n                           0,\n                           1,\n                           1.225000023841858,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.5,\n                           1.899999976158142,\n                           0,\n                           0.5,\n                           1.6749999523162842,\n                           0,\n                           0.5,\n                           1.4500000476837158,\n                           0,\n                           0.5,\n                           1.225000023841858,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.25,\n                           1.899999976158142,\n                           0,\n                           0.25,\n                           1.6749999523162842,\n                           0,\n                           0.25,\n                           1.4500000476837158,\n                           0,\n                           0.25,\n                           1.225000023841858,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0,\n                           1.899999976158142,\n                           0,\n                           0,\n                           1.6749999523162842,\n                           0,\n                           0,\n                           1.4500000476837158,\n                           0,\n                           0,\n                           1.225000023841858,\n                           0,\n                           0,\n                           1,\n                           0,\n                           2,\n                           1.899999976158142,\n                           0,\n                           1.75,\n                           1.899999976158142,\n                           0,\n                           1.75,\n                           1.6749999523162842,\n                           0,\n                           2,\n                           1.6749999523162842,\n                           0,\n                           1.75,\n                           1.4500000476837158,\n                           0,\n                           2,\n                           1.4500000476837158,\n                           0,\n                           1.75,\n                           1.225000023841858,\n                           0,\n                           2,\n                           1.225000023841858,\n                           0,\n                           1.75,\n                           1,\n                           0,\n                           2,\n                           1,\n                           0,\n                           1.5,\n                           1.899999976158142,\n                           0,\n                           1.5,\n                           1.6749999523162842,\n                           0,\n                           1.5,\n                           1.4500000476837158,\n                           0,\n                           1.5,\n                           1.225000023841858,\n                           0,\n                           1.5,\n                           1,\n                           0,\n                           1.25,\n                           1.899999976158142,\n                           0,\n                           1.25,\n                           1.6749999523162842,\n                           0,\n                           1.25,\n                           1.4500000476837158,\n                           0,\n                           1.25,\n                           1.225000023841858,\n                           0,\n                           1.25,\n                           1,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           1,\n                           1.6749999523162842,\n                           0,\n                           1,\n                           1.4500000476837158,\n                           0,\n                           1,\n                           1.225000023841858,\n                           0,\n                           1,\n                           1,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           0.75,\n                           1.899999976158142,\n                           0,\n                           0.75,\n                           1.6749999523162842,\n                           0,\n                           1,\n                           1.6749999523162842,\n                           0,\n                           0.75,\n                           1.4500000476837158,\n                           0,\n                           1,\n                           1.4500000476837158,\n                           0,\n                           0.75,\n                           1.225000023841858,\n                           0,\n                           1,\n                           1.225000023841858,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.5,\n                           1.899999976158142,\n                           0,\n                           0.5,\n                           1.6749999523162842,\n                           0,\n                           0.5,\n                           1.4500000476837158,\n                           0,\n                           0.5,\n                           1.225000023841858,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.25,\n                           1.899999976158142,\n                           0,\n                           0.25,\n                           1.6749999523162842,\n                           0,\n                           0.25,\n                           1.4500000476837158,\n                           0,\n                           0.25,\n                           1.225000023841858,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0,\n                           1.899999976158142,\n                           0,\n                           0,\n                           1.6749999523162842,\n                           0,\n                           0,\n                           1.4500000476837158,\n                           0,\n                           0,\n                           1.225000023841858,\n                           0,\n                           0,\n                           1,\n                           0,\n                           2,\n                           1,\n                           0,\n                           1.75,\n                           1,\n                           0,\n                           1.75,\n                           0.8500000238418579,\n                           0,\n                           2,\n                           0.8500000238418579,\n                           0,\n                           1.75,\n                           0.699999988079071,\n                           0,\n                           2,\n                           0.699999988079071,\n                           0,\n                           1.75,\n                           0.550000011920929,\n                           0,\n                           2,\n                           0.550000011920929,\n                           0,\n                           1.75,\n                           0.4000000059604645,\n                           0,\n                           2,\n                           0.4000000059604645,\n                           0,\n                           1.5,\n                           1,\n                           0,\n                           1.5,\n                           0.8500000238418579,\n                           0,\n                           1.5,\n                           0.699999988079071,\n                           0,\n                           1.5,\n                           0.550000011920929,\n                           0,\n                           1.5,\n                           0.4000000059604645,\n                           0,\n                           1.25,\n                           1,\n                           0,\n                           1.25,\n                           0.8500000238418579,\n                           0,\n                           1.25,\n                           0.699999988079071,\n                           0,\n                           1.25,\n                           0.550000011920929,\n                           0,\n                           1.25,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           1,\n                           0,\n                           1,\n                           0.8500000238418579,\n                           0,\n                           1,\n                           0.699999988079071,\n                           0,\n                           1,\n                           0.550000011920929,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.8500000238418579,\n                           0,\n                           1,\n                           0.8500000238418579,\n                           0,\n                           0.75,\n                           0.699999988079071,\n                           0,\n                           1,\n                           0.699999988079071,\n                           0,\n                           0.75,\n                           0.550000011920929,\n                           0,\n                           1,\n                           0.550000011920929,\n                           0,\n                           0.75,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.8500000238418579,\n                           0,\n                           0.5,\n                           0.699999988079071,\n                           0,\n                           0.5,\n                           0.550000011920929,\n                           0,\n                           0.5,\n                           0.4000000059604645,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.8500000238418579,\n                           0,\n                           0.25,\n                           0.699999988079071,\n                           0,\n                           0.25,\n                           0.550000011920929,\n                           0,\n                           0.25,\n                           0.4000000059604645,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.8500000238418579,\n                           0,\n                           0,\n                           0.699999988079071,\n                           0,\n                           0,\n                           0.550000011920929,\n                           0,\n                           0,\n                           0.4000000059604645,\n                           0,\n                           2,\n                           1,\n                           0,\n                           1.75,\n                           1,\n                           0,\n                           1.75,\n                           0.8500000238418579,\n                           0,\n                           2,\n                           0.8500000238418579,\n                           0,\n                           1.75,\n                           0.699999988079071,\n                           0,\n                           2,\n                           0.699999988079071,\n                           0,\n                           1.75,\n                           0.550000011920929,\n                           0,\n                           2,\n                           0.550000011920929,\n                           0,\n                           1.75,\n                           0.4000000059604645,\n                           0,\n                           2,\n                           0.4000000059604645,\n                           0,\n                           1.5,\n                           1,\n                           0,\n                           1.5,\n                           0.8500000238418579,\n                           0,\n                           1.5,\n                           0.699999988079071,\n                           0,\n                           1.5,\n                           0.550000011920929,\n                           0,\n                           1.5,\n                           0.4000000059604645,\n                           0,\n                           1.25,\n                           1,\n                           0,\n                           1.25,\n                           0.8500000238418579,\n                           0,\n                           1.25,\n                           0.699999988079071,\n                           0,\n                           1.25,\n                           0.550000011920929,\n                           0,\n                           1.25,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           1,\n                           0,\n                           1,\n                           0.8500000238418579,\n                           0,\n                           1,\n                           0.699999988079071,\n                           0,\n                           1,\n                           0.550000011920929,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.8500000238418579,\n                           0,\n                           1,\n                           0.8500000238418579,\n                           0,\n                           0.75,\n                           0.699999988079071,\n                           0,\n                           1,\n                           0.699999988079071,\n                           0,\n                           0.75,\n                           0.550000011920929,\n                           0,\n                           1,\n                           0.550000011920929,\n                           0,\n                           0.75,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.8500000238418579,\n                           0,\n                           0.5,\n                           0.699999988079071,\n                           0,\n                           0.5,\n                           0.550000011920929,\n                           0,\n                           0.5,\n                           0.4000000059604645,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.8500000238418579,\n                           0,\n                           0.25,\n                           0.699999988079071,\n                           0,\n                           0.25,\n                           0.550000011920929,\n                           0,\n                           0.25,\n                           0.4000000059604645,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.8500000238418579,\n                           0,\n                           0,\n                           0.699999988079071,\n                           0,\n                           0,\n                           0.550000011920929,\n                           0,\n                           0,\n                           0.4000000059604645,\n                           0,\n                           2,\n                           0.4000000059604645,\n                           0,\n                           1.75,\n                           0.4000000059604645,\n                           0,\n                           1.75,\n                           0.30000001192092896,\n                           0,\n                           2,\n                           0.30000001192092896,\n                           0,\n                           1.75,\n                           0.20000000298023224,\n                           0,\n                           2,\n                           0.20000000298023224,\n                           0,\n                           1.75,\n                           0.10000000149011612,\n                           0,\n                           2,\n                           0.10000000149011612,\n                           0,\n                           1.75,\n                           0,\n                           0,\n                           2,\n                           0,\n                           0,\n                           1.5,\n                           0.4000000059604645,\n                           0,\n                           1.5,\n                           0.30000001192092896,\n                           0,\n                           1.5,\n                           0.20000000298023224,\n                           0,\n                           1.5,\n                           0.10000000149011612,\n                           0,\n                           1.5,\n                           0,\n                           0,\n                           1.25,\n                           0.4000000059604645,\n                           0,\n                           1.25,\n                           0.30000001192092896,\n                           0,\n                           1.25,\n                           0.20000000298023224,\n                           0,\n                           1.25,\n                           0.10000000149011612,\n                           0,\n                           1.25,\n                           0,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           0.30000001192092896,\n                           0,\n                           1,\n                           0.20000000298023224,\n                           0,\n                           1,\n                           0.10000000149011612,\n                           0,\n                           1,\n                           0,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           0.75,\n                           0.4000000059604645,\n                           0,\n                           0.75,\n                           0.30000001192092896,\n                           0,\n                           1,\n                           0.30000001192092896,\n                           0,\n                           0.75,\n                           0.20000000298023224,\n                           0,\n                           1,\n                           0.20000000298023224,\n                           0,\n                           0.75,\n                           0.10000000149011612,\n                           0,\n                           1,\n                           0.10000000149011612,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.5,\n                           0.4000000059604645,\n                           0,\n                           0.5,\n                           0.30000001192092896,\n                           0,\n                           0.5,\n                           0.20000000298023224,\n                           0,\n                           0.5,\n                           0.10000000149011612,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0.4000000059604645,\n                           0,\n                           0.25,\n                           0.30000001192092896,\n                           0,\n                           0.25,\n                           0.20000000298023224,\n                           0,\n                           0.25,\n                           0.10000000149011612,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0,\n                           0.4000000059604645,\n                           0,\n                           0,\n                           0.30000001192092896,\n                           0,\n                           0,\n                           0.20000000298023224,\n                           0,\n                           0,\n                           0.10000000149011612,\n                           0,\n                           0,\n                           0,\n                           0,\n                           2,\n                           0.4000000059604645,\n                           0,\n                           1.75,\n                           0.4000000059604645,\n                           0,\n                           1.75,\n                           0.30000001192092896,\n                           0,\n                           2,\n                           0.30000001192092896,\n                           0,\n                           1.75,\n                           0.20000000298023224,\n                           0,\n                           2,\n                           0.20000000298023224,\n                           0,\n                           1.75,\n                           0.10000000149011612,\n                           0,\n                           2,\n                           0.10000000149011612,\n                           0,\n                           1.75,\n                           0,\n                           0,\n                           2,\n                           0,\n                           0,\n                           1.5,\n                           0.4000000059604645,\n                           0,\n                           1.5,\n                           0.30000001192092896,\n                           0,\n                           1.5,\n                           0.20000000298023224,\n                           0,\n                           1.5,\n                           0.10000000149011612,\n                           0,\n                           1.5,\n                           0,\n                           0,\n                           1.25,\n                           0.4000000059604645,\n                           0,\n                           1.25,\n                           0.30000001192092896,\n                           0,\n                           1.25,\n                           0.20000000298023224,\n                           0,\n                           1.25,\n                           0.10000000149011612,\n                           0,\n                           1.25,\n                           0,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           0.30000001192092896,\n                           0,\n                           1,\n                           0.20000000298023224,\n                           0,\n                           1,\n                           0.10000000149011612,\n                           0,\n                           1,\n                           0,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           0.75,\n                           0.4000000059604645,\n                           0,\n                           0.75,\n                           0.30000001192092896,\n                           0,\n                           1,\n                           0.30000001192092896,\n                           0,\n                           0.75,\n                           0.20000000298023224,\n                           0,\n                           1,\n                           0.20000000298023224,\n                           0,\n                           0.75,\n                           0.10000000149011612,\n                           0,\n                           1,\n                           0.10000000149011612,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.5,\n                           0.4000000059604645,\n                           0,\n                           0.5,\n                           0.30000001192092896,\n                           0,\n                           0.5,\n                           0.20000000298023224,\n                           0,\n                           0.5,\n                           0.10000000149011612,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0.4000000059604645,\n                           0,\n                           0.25,\n                           0.30000001192092896,\n                           0,\n                           0.25,\n                           0.20000000298023224,\n                           0,\n                           0.25,\n                           0.10000000149011612,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0,\n                           0.4000000059604645,\n                           0,\n                           0,\n                           0.30000001192092896,\n                           0,\n                           0,\n                           0.20000000298023224,\n                           0,\n                           0,\n                           0.10000000149011612,\n                           0,\n                           0,\n                           0,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.875,\n                           1,\n                           0,\n                           0.875,\n                           0.875,\n                           0,\n                           1,\n                           0.875,\n                           0,\n                           0.875,\n                           0.75,\n                           0,\n                           1,\n                           0.75,\n                           0,\n                           0.875,\n                           0.625,\n                           0,\n                           1,\n                           0.625,\n                           0,\n                           0.875,\n                           0.5,\n                           0,\n                           1,\n                           0.5,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.875,\n                           0,\n                           0.75,\n                           0.75,\n                           0,\n                           0.75,\n                           0.625,\n                           0,\n                           0.75,\n                           0.5,\n                           0,\n                           0.625,\n                           1,\n                           0,\n                           0.625,\n                           0.875,\n                           0,\n                           0.625,\n                           0.75,\n                           0,\n                           0.625,\n                           0.625,\n                           0,\n                           0.625,\n                           0.5,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.875,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.5,\n                           0.625,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.375,\n                           1,\n                           0,\n                           0.375,\n                           0.875,\n                           0,\n                           0.5,\n                           0.875,\n                           0,\n                           0.375,\n                           0.75,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.375,\n                           0.625,\n                           0,\n                           0.5,\n                           0.625,\n                           0,\n                           0.375,\n                           0.5,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.875,\n                           0,\n                           0.25,\n                           0.75,\n                           0,\n                           0.25,\n                           0.625,\n                           0,\n                           0.25,\n                           0.5,\n                           0,\n                           0.125,\n                           1,\n                           0,\n                           0.125,\n                           0.875,\n                           0,\n                           0.125,\n                           0.75,\n                           0,\n                           0.125,\n                           0.625,\n                           0,\n                           0.125,\n                           0.5,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           1,\n                           0.5,\n                           0,\n                           0.875,\n                           0.5,\n                           0,\n                           0.875,\n                           0.375,\n                           0,\n                           1,\n                           0.375,\n                           0,\n                           0.875,\n                           0.25,\n                           0,\n                           1,\n                           0.25,\n                           0,\n                           0.875,\n                           0.125,\n                           0,\n                           1,\n                           0.125,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           0.5,\n                           0,\n                           0.75,\n                           0.375,\n                           0,\n                           0.75,\n                           0.25,\n                           0,\n                           0.75,\n                           0.125,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.625,\n                           0.5,\n                           0,\n                           0.625,\n                           0.375,\n                           0,\n                           0.625,\n                           0.25,\n                           0,\n                           0.625,\n                           0.125,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.5,\n                           0.375,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.5,\n                           0.125,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.375,\n                           0.5,\n                           0,\n                           0.375,\n                           0.375,\n                           0,\n                           0.5,\n                           0.375,\n                           0,\n                           0.375,\n                           0.25,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.375,\n                           0.125,\n                           0,\n                           0.5,\n                           0.125,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0.5,\n                           0,\n                           0.25,\n                           0.375,\n                           0,\n                           0.25,\n                           0.25,\n                           0,\n                           0.25,\n                           0.125,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.125,\n                           0.5,\n                           0,\n                           0.125,\n                           0.375,\n                           0,\n                           0.125,\n                           0.25,\n                           0,\n                           0.125,\n                           0.125,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.625,\n                           0.22499999403953552,\n                           0,\n                           0.5,\n                           0.22499999403953552,\n                           0,\n                           0.625,\n                           0.44999998807907104,\n                           0,\n                           0.5,\n                           0.44999998807907104,\n                           0,\n                           0.625,\n                           0.675000011920929,\n                           0,\n                           0.5,\n                           0.675000011920929,\n                           0,\n                           0.625,\n                           0.8999999761581421,\n                           0,\n                           0.5,\n                           0.8999999761581421,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.75,\n                           0.22499999403953552,\n                           0,\n                           0.75,\n                           0.44999998807907104,\n                           0,\n                           0.75,\n                           0.675000011920929,\n                           0,\n                           0.75,\n                           0.8999999761581421,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           0.875,\n                           0.22499999403953552,\n                           0,\n                           0.875,\n                           0.44999998807907104,\n                           0,\n                           0.875,\n                           0.675000011920929,\n                           0,\n                           0.875,\n                           0.8999999761581421,\n                           0,\n                           1,\n                           0,\n                           0,\n                           1,\n                           0.22499999403953552,\n                           0,\n                           1,\n                           0.44999998807907104,\n                           0,\n                           1,\n                           0.675000011920929,\n                           0,\n                           1,\n                           0.8999999761581421,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0.125,\n                           0.22499999403953552,\n                           0,\n                           0,\n                           0.22499999403953552,\n                           0,\n                           0.125,\n                           0.44999998807907104,\n                           0,\n                           0,\n                           0.44999998807907104,\n                           0,\n                           0.125,\n                           0.675000011920929,\n                           0,\n                           0,\n                           0.675000011920929,\n                           0,\n                           0.125,\n                           0.8999999761581421,\n                           0,\n                           0,\n                           0.8999999761581421,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.25,\n                           0.22499999403953552,\n                           0,\n                           0.25,\n                           0.44999998807907104,\n                           0,\n                           0.25,\n                           0.675000011920929,\n                           0,\n                           0.25,\n                           0.8999999761581421,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.375,\n                           0.22499999403953552,\n                           0,\n                           0.375,\n                           0.44999998807907104,\n                           0,\n                           0.375,\n                           0.675000011920929,\n                           0,\n                           0.375,\n                           0.8999999761581421,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.5,\n                           0.22499999403953552,\n                           0,\n                           0.5,\n                           0.44999998807907104,\n                           0,\n                           0.5,\n                           0.675000011920929,\n                           0,\n                           0.5,\n                           0.8999999761581421,\n                           0,\n                           0.5,\n                           0.8999999761581421,\n                           0,\n                           0.625,\n                           0.8999999761581421,\n                           0,\n                           0.625,\n                           0.925000011920929,\n                           0,\n                           0.5,\n                           0.925000011920929,\n                           0,\n                           0.625,\n                           0.949999988079071,\n                           0,\n                           0.5,\n                           0.949999988079071,\n                           0,\n                           0.625,\n                           0.9750000238418579,\n                           0,\n                           0.5,\n                           0.9750000238418579,\n                           0,\n                           0.625,\n                           1,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.75,\n                           0.8999999761581421,\n                           0,\n                           0.75,\n                           0.925000011920929,\n                           0,\n                           0.75,\n                           0.949999988079071,\n                           0,\n                           0.75,\n                           0.9750000238418579,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.875,\n                           0.8999999761581421,\n                           0,\n                           0.875,\n                           0.925000011920929,\n                           0,\n                           0.875,\n                           0.949999988079071,\n                           0,\n                           0.875,\n                           0.9750000238418579,\n                           0,\n                           0.875,\n                           1,\n                           0,\n                           1,\n                           0.8999999761581421,\n                           0,\n                           1,\n                           0.925000011920929,\n                           0,\n                           1,\n                           0.949999988079071,\n                           0,\n                           1,\n                           0.9750000238418579,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0,\n                           0.8999999761581421,\n                           0,\n                           0.125,\n                           0.8999999761581421,\n                           0,\n                           0.125,\n                           0.925000011920929,\n                           0,\n                           0,\n                           0.925000011920929,\n                           0,\n                           0.125,\n                           0.949999988079071,\n                           0,\n                           0,\n                           0.949999988079071,\n                           0,\n                           0.125,\n                           0.9750000238418579,\n                           0,\n                           0,\n                           0.9750000238418579,\n                           0,\n                           0.125,\n                           1,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0.25,\n                           0.8999999761581421,\n                           0,\n                           0.25,\n                           0.925000011920929,\n                           0,\n                           0.25,\n                           0.949999988079071,\n                           0,\n                           0.25,\n                           0.9750000238418579,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.375,\n                           0.8999999761581421,\n                           0,\n                           0.375,\n                           0.925000011920929,\n                           0,\n                           0.375,\n                           0.949999988079071,\n                           0,\n                           0.375,\n                           0.9750000238418579,\n                           0,\n                           0.375,\n                           1,\n                           0,\n                           0.5,\n                           0.8999999761581421,\n                           0,\n                           0.5,\n                           0.925000011920929,\n                           0,\n                           0.5,\n                           0.949999988079071,\n                           0,\n                           0.5,\n                           0.9750000238418579,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.875,\n                           1,\n                           0,\n                           0.875,\n                           0.75,\n                           0,\n                           1,\n                           0.75,\n                           0,\n                           0.875,\n                           0.5,\n                           0,\n                           1,\n                           0.5,\n                           0,\n                           0.875,\n                           0.25,\n                           0,\n                           1,\n                           0.25,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.75,\n                           0,\n                           0.75,\n                           0.5,\n                           0,\n                           0.75,\n                           0.25,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.625,\n                           1,\n                           0,\n                           0.625,\n                           0.75,\n                           0,\n                           0.625,\n                           0.5,\n                           0,\n                           0.625,\n                           0.25,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.375,\n                           1,\n                           0,\n                           0.375,\n                           0.75,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.375,\n                           0.5,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.375,\n                           0.25,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.75,\n                           0,\n                           0.25,\n                           0.5,\n                           0,\n                           0.25,\n                           0.25,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.125,\n                           1,\n                           0,\n                           0.125,\n                           0.75,\n                           0,\n                           0.125,\n                           0.5,\n                           0,\n                           0.125,\n                           0.25,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.875,\n                           1,\n                           0,\n                           0.875,\n                           0.75,\n                           0,\n                           1,\n                           0.75,\n                           0,\n                           0.875,\n                           0.5,\n                           0,\n                           1,\n                           0.5,\n                           0,\n                           0.875,\n                           0.25,\n                           0,\n                           1,\n                           0.25,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.75,\n                           0,\n                           0.75,\n                           0.5,\n                           0,\n                           0.75,\n                           0.25,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.625,\n                           1,\n                           0,\n                           0.625,\n                           0.75,\n                           0,\n                           0.625,\n                           0.5,\n                           0,\n                           0.625,\n                           0.25,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.375,\n                           1,\n                           0,\n                           0.375,\n                           0.75,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.375,\n                           0.5,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.375,\n                           0.25,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.75,\n                           0,\n                           0.25,\n                           0.5,\n                           0,\n                           0.25,\n                           0.25,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.125,\n                           1,\n                           0,\n                           0.125,\n                           0.75,\n                           0,\n                           0.125,\n                           0.5,\n                           0,\n                           0.125,\n                           0.25,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.875,\n                           1,\n                           0,\n                           0.875,\n                           0.75,\n                           0,\n                           1,\n                           0.75,\n                           0,\n                           0.875,\n                           0.5,\n                           0,\n                           1,\n                           0.5,\n                           0,\n                           0.875,\n                           0.25,\n                           0,\n                           1,\n                           0.25,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.75,\n                           0,\n                           0.75,\n                           0.5,\n                           0,\n                           0.75,\n                           0.25,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.625,\n                           1,\n                           0,\n                           0.625,\n                           0.75,\n                           0,\n                           0.625,\n                           0.5,\n                           0,\n                           0.625,\n                           0.25,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.375,\n                           1,\n                           0,\n                           0.375,\n                           0.75,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.375,\n                           0.5,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.375,\n                           0.25,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.75,\n                           0,\n                           0.25,\n                           0.5,\n                           0,\n                           0.25,\n                           0.25,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.125,\n                           1,\n                           0,\n                           0.125,\n                           0.75,\n                           0,\n                           0.125,\n                           0.5,\n                           0,\n                           0.125,\n                           0.25,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.875,\n                           1,\n                           0,\n                           0.875,\n                           0.75,\n                           0,\n                           1,\n                           0.75,\n                           0,\n                           0.875,\n                           0.5,\n                           0,\n                           1,\n                           0.5,\n                           0,\n                           0.875,\n                           0.25,\n                           0,\n                           1,\n                           0.25,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.75,\n                           0,\n                           0.75,\n                           0.5,\n                           0,\n                           0.75,\n                           0.25,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.625,\n                           1,\n                           0,\n                           0.625,\n                           0.75,\n                           0,\n                           0.625,\n                           0.5,\n                           0,\n                           0.625,\n                           0.25,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.375,\n                           1,\n                           0,\n                           0.375,\n                           0.75,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.375,\n                           0.5,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.375,\n                           0.25,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.75,\n                           0,\n                           0.25,\n                           0.5,\n                           0,\n                           0.25,\n                           0.25,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.125,\n                           1,\n                           0,\n                           0.125,\n                           0.75,\n                           0,\n                           0.125,\n                           0.5,\n                           0,\n                           0.125,\n                           0.25,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0,\n                           0};\n\nuint16_t teapotIndices[] = {\n    0,   1,   2,   2,   3,   0,   3,   2,   4,   4,   5,   3,   5,   4,   6,\n    6,   7,   5,   7,   6,   8,   8,   9,   7,   1,   10,  11,  11,  2,   1,\n    2,   11,  12,  12,  4,   2,   4,   12,  13,  13,  6,   4,   6,   13,  14,\n    14,  8,   6,   10,  15,  16,  16,  11,  10,  11,  16,  17,  17,  12,  11,\n    12,  17,  18,  18,  13,  12,  13,  18,  19,  19,  14,  13,  15,  20,  21,\n    21,  16,  15,  16,  21,  22,  22,  17,  16,  17,  22,  23,  23,  18,  17,\n    18,  23,  24,  24,  19,  18,  25,  26,  27,  27,  28,  25,  28,  27,  29,\n    29,  30,  28,  30,  29,  31,  31,  32,  30,  32,  31,  33,  33,  34,  32,\n    26,  35,  36,  36,  27,  26,  27,  36,  37,  37,  29,  27,  29,  37,  38,\n    38,  31,  29,  31,  38,  39,  39,  33,  31,  35,  40,  41,  41,  36,  35,\n    36,  41,  42,  42,  37,  36,  37,  42,  43,  43,  38,  37,  38,  43,  44,\n    44,  39,  38,  40,  45,  46,  46,  41,  40,  41,  46,  47,  47,  42,  41,\n    42,  47,  48,  48,  43,  42,  43,  48,  49,  49,  44,  43,  50,  51,  52,\n    52,  53,  50,  53,  52,  54,  54,  55,  53,  55,  54,  56,  56,  57,  55,\n    57,  56,  58,  58,  59,  57,  51,  60,  61,  61,  52,  51,  52,  61,  62,\n    62,  54,  52,  54,  62,  63,  63,  56,  54,  56,  63,  64,  64,  58,  56,\n    60,  65,  66,  66,  61,  60,  61,  66,  67,  67,  62,  61,  62,  67,  68,\n    68,  63,  62,  63,  68,  69,  69,  64,  63,  65,  70,  71,  71,  66,  65,\n    66,  71,  72,  72,  67,  66,  67,  72,  73,  73,  68,  67,  68,  73,  74,\n    74,  69,  68,  75,  76,  77,  77,  78,  75,  78,  77,  79,  79,  80,  78,\n    80,  79,  81,  81,  82,  80,  82,  81,  83,  83,  84,  82,  76,  85,  86,\n    86,  77,  76,  77,  86,  87,  87,  79,  77,  79,  87,  88,  88,  81,  79,\n    81,  88,  89,  89,  83,  81,  85,  90,  91,  91,  86,  85,  86,  91,  92,\n    92,  87,  86,  87,  92,  93,  93,  88,  87,  88,  93,  94,  94,  89,  88,\n    90,  95,  96,  96,  91,  90,  91,  96,  97,  97,  92,  91,  92,  97,  98,\n    98,  93,  92,  93,  98,  99,  99,  94,  93,  100, 101, 102, 102, 103, 100,\n    103, 102, 104, 104, 105, 103, 105, 104, 106, 106, 107, 105, 107, 106, 108,\n    108, 109, 107, 101, 110, 111, 111, 102, 101, 102, 111, 112, 112, 104, 102,\n    104, 112, 113, 113, 106, 104, 106, 113, 114, 114, 108, 106, 110, 115, 116,\n    116, 111, 110, 111, 116, 117, 117, 112, 111, 112, 117, 118, 118, 113, 112,\n    113, 118, 119, 119, 114, 113, 115, 120, 121, 121, 116, 115, 116, 121, 122,\n    122, 117, 116, 117, 122, 123, 123, 118, 117, 118, 123, 124, 124, 119, 118,\n    125, 126, 127, 127, 128, 125, 128, 127, 129, 129, 130, 128, 130, 129, 131,\n    131, 132, 130, 132, 131, 133, 133, 134, 132, 126, 135, 136, 136, 127, 126,\n    127, 136, 137, 137, 129, 127, 129, 137, 138, 138, 131, 129, 131, 138, 139,\n    139, 133, 131, 135, 140, 141, 141, 136, 135, 136, 141, 142, 142, 137, 136,\n    137, 142, 143, 143, 138, 137, 138, 143, 144, 144, 139, 138, 140, 145, 146,\n    146, 141, 140, 141, 146, 147, 147, 142, 141, 142, 147, 148, 148, 143, 142,\n    143, 148, 149, 149, 144, 143, 150, 151, 152, 152, 153, 150, 153, 152, 154,\n    154, 155, 153, 155, 154, 156, 156, 157, 155, 157, 156, 158, 158, 159, 157,\n    151, 160, 161, 161, 152, 151, 152, 161, 162, 162, 154, 152, 154, 162, 163,\n    163, 156, 154, 156, 163, 164, 164, 158, 156, 160, 165, 166, 166, 161, 160,\n    161, 166, 167, 167, 162, 161, 162, 167, 168, 168, 163, 162, 163, 168, 169,\n    169, 164, 163, 165, 170, 171, 171, 166, 165, 166, 171, 172, 172, 167, 166,\n    167, 172, 173, 173, 168, 167, 168, 173, 174, 174, 169, 168, 175, 176, 177,\n    177, 178, 175, 178, 177, 179, 179, 180, 178, 180, 179, 181, 181, 182, 180,\n    182, 181, 183, 183, 184, 182, 176, 185, 186, 186, 177, 176, 177, 186, 187,\n    187, 179, 177, 179, 187, 188, 188, 181, 179, 181, 188, 189, 189, 183, 181,\n    185, 190, 191, 191, 186, 185, 186, 191, 192, 192, 187, 186, 187, 192, 193,\n    193, 188, 187, 188, 193, 194, 194, 189, 188, 190, 195, 196, 196, 191, 190,\n    191, 196, 197, 197, 192, 191, 192, 197, 198, 198, 193, 192, 193, 198, 199,\n    199, 194, 193, 200, 201, 202, 202, 203, 200, 203, 202, 204, 204, 205, 203,\n    205, 204, 206, 206, 207, 205, 207, 206, 208, 208, 209, 207, 201, 210, 211,\n    211, 202, 201, 202, 211, 212, 212, 204, 202, 204, 212, 213, 213, 206, 204,\n    206, 213, 214, 214, 208, 206, 210, 215, 216, 216, 211, 210, 211, 216, 217,\n    217, 212, 211, 212, 217, 218, 218, 213, 212, 213, 218, 219, 219, 214, 213,\n    215, 220, 221, 221, 216, 215, 216, 221, 222, 222, 217, 216, 217, 222, 223,\n    223, 218, 217, 218, 223, 224, 224, 219, 218, 225, 226, 227, 227, 228, 225,\n    228, 227, 229, 229, 230, 228, 230, 229, 231, 231, 232, 230, 232, 231, 233,\n    233, 234, 232, 226, 235, 236, 236, 227, 226, 227, 236, 237, 237, 229, 227,\n    229, 237, 238, 238, 231, 229, 231, 238, 239, 239, 233, 231, 235, 240, 241,\n    241, 236, 235, 236, 241, 242, 242, 237, 236, 237, 242, 243, 243, 238, 237,\n    238, 243, 244, 244, 239, 238, 240, 245, 246, 246, 241, 240, 241, 246, 247,\n    247, 242, 241, 242, 247, 248, 248, 243, 242, 243, 248, 249, 249, 244, 243,\n    250, 251, 252, 252, 253, 250, 253, 252, 254, 254, 255, 253, 255, 254, 256,\n    256, 257, 255, 257, 256, 258, 258, 259, 257, 251, 260, 261, 261, 252, 251,\n    252, 261, 262, 262, 254, 252, 254, 262, 263, 263, 256, 254, 256, 263, 264,\n    264, 258, 256, 260, 265, 266, 266, 261, 260, 261, 266, 267, 267, 262, 261,\n    262, 267, 268, 268, 263, 262, 263, 268, 269, 269, 264, 263, 265, 270, 271,\n    271, 266, 265, 266, 271, 272, 272, 267, 266, 267, 272, 273, 273, 268, 267,\n    268, 273, 274, 274, 269, 268, 275, 276, 277, 277, 278, 275, 278, 277, 279,\n    279, 280, 278, 280, 279, 281, 281, 282, 280, 282, 281, 283, 283, 284, 282,\n    276, 285, 286, 286, 277, 276, 277, 286, 287, 287, 279, 277, 279, 287, 288,\n    288, 281, 279, 281, 288, 289, 289, 283, 281, 285, 290, 291, 291, 286, 285,\n    286, 291, 292, 292, 287, 286, 287, 292, 293, 293, 288, 287, 288, 293, 294,\n    294, 289, 288, 290, 295, 296, 296, 291, 290, 291, 296, 297, 297, 292, 291,\n    292, 297, 298, 298, 293, 292, 293, 298, 299, 299, 294, 293, 300, 301, 302,\n    302, 303, 300, 303, 302, 304, 304, 305, 303, 305, 304, 306, 306, 307, 305,\n    307, 306, 308, 308, 309, 307, 301, 310, 311, 311, 302, 301, 302, 311, 312,\n    312, 304, 302, 304, 312, 313, 313, 306, 304, 306, 313, 314, 314, 308, 306,\n    310, 315, 316, 316, 311, 310, 311, 316, 317, 317, 312, 311, 312, 317, 318,\n    318, 313, 312, 313, 318, 319, 319, 314, 313, 315, 320, 321, 321, 316, 315,\n    316, 321, 322, 322, 317, 316, 317, 322, 323, 323, 318, 317, 318, 323, 324,\n    324, 319, 318, 325, 326, 327, 327, 328, 325, 328, 327, 329, 329, 330, 328,\n    330, 329, 331, 331, 332, 330, 332, 331, 333, 333, 334, 332, 326, 335, 336,\n    336, 327, 326, 327, 336, 337, 337, 329, 327, 329, 337, 338, 338, 331, 329,\n    331, 338, 339, 339, 333, 331, 335, 340, 341, 341, 336, 335, 336, 341, 342,\n    342, 337, 336, 337, 342, 343, 343, 338, 337, 338, 343, 344, 344, 339, 338,\n    340, 345, 346, 346, 341, 340, 341, 346, 347, 347, 342, 341, 342, 347, 348,\n    348, 343, 342, 343, 348, 349, 349, 344, 343, 350, 351, 352, 352, 353, 350,\n    353, 352, 354, 354, 355, 353, 355, 354, 356, 356, 357, 355, 357, 356, 358,\n    358, 359, 357, 351, 360, 361, 361, 352, 351, 352, 361, 362, 362, 354, 352,\n    354, 362, 363, 363, 356, 354, 356, 363, 364, 364, 358, 356, 360, 365, 366,\n    366, 361, 360, 361, 366, 367, 367, 362, 361, 362, 367, 368, 368, 363, 362,\n    363, 368, 369, 369, 364, 363, 365, 370, 371, 371, 366, 365, 366, 371, 372,\n    372, 367, 366, 367, 372, 373, 373, 368, 367, 368, 373, 374, 374, 369, 368,\n    375, 376, 377, 377, 378, 375, 378, 377, 379, 379, 380, 378, 380, 379, 381,\n    381, 382, 380, 382, 381, 383, 383, 384, 382, 376, 385, 386, 386, 377, 376,\n    377, 386, 387, 387, 379, 377, 379, 387, 388, 388, 381, 379, 381, 388, 389,\n    389, 383, 381, 385, 390, 391, 391, 386, 385, 386, 391, 392, 392, 387, 386,\n    387, 392, 393, 393, 388, 387, 388, 393, 394, 394, 389, 388, 390, 395, 396,\n    396, 391, 390, 391, 396, 397, 397, 392, 391, 392, 397, 398, 398, 393, 392,\n    393, 398, 399, 399, 394, 393, 400, 401, 402, 402, 403, 400, 403, 402, 404,\n    404, 405, 403, 405, 404, 406, 406, 407, 405, 407, 406, 408, 408, 409, 407,\n    401, 410, 411, 411, 402, 401, 402, 411, 412, 412, 404, 402, 404, 412, 413,\n    413, 406, 404, 406, 413, 414, 414, 408, 406, 410, 415, 416, 416, 411, 410,\n    411, 416, 417, 417, 412, 411, 412, 417, 418, 418, 413, 412, 413, 418, 419,\n    419, 414, 413, 415, 420, 421, 421, 416, 415, 416, 421, 422, 422, 417, 416,\n    417, 422, 423, 423, 418, 417, 418, 423, 424, 424, 419, 418, 425, 426, 427,\n    427, 428, 425, 428, 427, 429, 429, 430, 428, 430, 429, 431, 431, 432, 430,\n    432, 431, 433, 433, 434, 432, 426, 435, 436, 436, 427, 426, 427, 436, 437,\n    437, 429, 427, 429, 437, 438, 438, 431, 429, 431, 438, 439, 439, 433, 431,\n    435, 440, 441, 441, 436, 435, 436, 441, 442, 442, 437, 436, 437, 442, 443,\n    443, 438, 437, 438, 443, 444, 444, 439, 438, 440, 445, 446, 446, 441, 440,\n    441, 446, 447, 447, 442, 441, 442, 447, 448, 448, 443, 442, 443, 448, 449,\n    449, 444, 443, 450, 451, 452, 452, 453, 450, 453, 452, 454, 454, 455, 453,\n    455, 454, 456, 456, 457, 455, 457, 456, 458, 458, 459, 457, 451, 460, 461,\n    461, 452, 451, 452, 461, 462, 462, 454, 452, 454, 462, 463, 463, 456, 454,\n    456, 463, 464, 464, 458, 456, 460, 465, 466, 466, 461, 460, 461, 466, 467,\n    467, 462, 461, 462, 467, 468, 468, 463, 462, 463, 468, 469, 469, 464, 463,\n    465, 470, 471, 471, 466, 465, 466, 471, 472, 472, 467, 466, 467, 472, 473,\n    473, 468, 467, 468, 473, 474, 474, 469, 468, 475, 476, 477, 477, 478, 475,\n    478, 477, 479, 479, 480, 478, 480, 479, 481, 481, 482, 480, 482, 481, 483,\n    483, 484, 482, 476, 485, 486, 486, 477, 476, 477, 486, 487, 487, 479, 477,\n    479, 487, 488, 488, 481, 479, 481, 488, 489, 489, 483, 481, 485, 490, 491,\n    491, 486, 485, 486, 491, 492, 492, 487, 486, 487, 492, 493, 493, 488, 487,\n    488, 493, 494, 494, 489, 488, 490, 495, 496, 496, 491, 490, 491, 496, 497,\n    497, 492, 491, 492, 497, 498, 498, 493, 492, 493, 498, 499, 499, 494, 493,\n    500, 501, 502, 502, 503, 500, 503, 502, 504, 504, 505, 503, 505, 504, 506,\n    506, 507, 505, 507, 506, 508, 508, 509, 507, 501, 510, 511, 511, 502, 501,\n    502, 511, 512, 512, 504, 502, 504, 512, 513, 513, 506, 504, 506, 513, 514,\n    514, 508, 506, 510, 515, 516, 516, 511, 510, 511, 516, 517, 517, 512, 511,\n    512, 517, 518, 518, 513, 512, 513, 518, 519, 519, 514, 513, 515, 520, 521,\n    521, 516, 515, 516, 521, 522, 522, 517, 516, 517, 522, 523, 523, 518, 517,\n    518, 523, 524, 524, 519, 518, 525, 526, 527, 527, 528, 525, 528, 527, 529,\n    529, 530, 528, 530, 529, 531, 531, 532, 530, 532, 531, 533, 533, 534, 532,\n    526, 535, 536, 536, 527, 526, 527, 536, 537, 537, 529, 527, 529, 537, 538,\n    538, 531, 529, 531, 538, 539, 539, 533, 531, 535, 540, 541, 541, 536, 535,\n    536, 541, 542, 542, 537, 536, 537, 542, 543, 543, 538, 537, 538, 543, 544,\n    544, 539, 538, 540, 545, 546, 546, 541, 540, 541, 546, 547, 547, 542, 541,\n    542, 547, 548, 548, 543, 542, 543, 548, 549, 549, 544, 543, 550, 551, 552,\n    552, 553, 550, 553, 552, 554, 554, 555, 553, 555, 554, 556, 556, 557, 555,\n    557, 556, 558, 558, 559, 557, 551, 560, 561, 561, 552, 551, 552, 561, 562,\n    562, 554, 552, 554, 562, 563, 563, 556, 554, 556, 563, 564, 564, 558, 556,\n    560, 565, 566, 566, 561, 560, 561, 566, 567, 567, 562, 561, 562, 567, 568,\n    568, 563, 562, 563, 568, 569, 569, 564, 563, 565, 570, 571, 571, 566, 565,\n    566, 571, 572, 572, 567, 566, 567, 572, 573, 573, 568, 567, 568, 573, 574,\n    574, 569, 568, 575, 576, 577, 577, 578, 575, 578, 577, 579, 579, 580, 578,\n    580, 579, 581, 581, 582, 580, 582, 581, 583, 583, 584, 582, 576, 585, 586,\n    586, 577, 576, 577, 586, 587, 587, 579, 577, 579, 587, 588, 588, 581, 579,\n    581, 588, 589, 589, 583, 581, 585, 590, 591, 591, 586, 585, 586, 591, 592,\n    592, 587, 586, 587, 592, 593, 593, 588, 587, 588, 593, 594, 594, 589, 588,\n    590, 595, 596, 596, 591, 590, 591, 596, 597, 597, 592, 591, 592, 597, 598,\n    598, 593, 592, 593, 598, 599, 599, 594, 593, 600, 601, 602, 602, 603, 600,\n    603, 602, 604, 604, 605, 603, 605, 604, 606, 606, 607, 605, 607, 606, 608,\n    608, 609, 607, 601, 610, 611, 611, 602, 601, 602, 611, 612, 612, 604, 602,\n    604, 612, 613, 613, 606, 604, 606, 613, 614, 614, 608, 606, 610, 615, 616,\n    616, 611, 610, 611, 616, 617, 617, 612, 611, 612, 617, 618, 618, 613, 612,\n    613, 618, 619, 619, 614, 613, 615, 620, 621, 621, 616, 615, 616, 621, 622,\n    622, 617, 616, 617, 622, 623, 623, 618, 617, 618, 623, 624, 624, 619, 618,\n    625, 626, 627, 627, 628, 625, 628, 627, 629, 629, 630, 628, 630, 629, 631,\n    631, 632, 630, 632, 631, 633, 633, 634, 632, 626, 635, 636, 636, 627, 626,\n    627, 636, 637, 637, 629, 627, 629, 637, 638, 638, 631, 629, 631, 638, 639,\n    639, 633, 631, 635, 640, 641, 641, 636, 635, 636, 641, 642, 642, 637, 636,\n    637, 642, 643, 643, 638, 637, 638, 643, 644, 644, 639, 638, 640, 645, 646,\n    646, 641, 640, 641, 646, 647, 647, 642, 641, 642, 647, 648, 648, 643, 642,\n    643, 648, 649, 649, 644, 643, 650, 651, 652, 652, 653, 650, 653, 652, 654,\n    654, 655, 653, 655, 654, 656, 656, 657, 655, 657, 656, 658, 658, 659, 657,\n    651, 660, 661, 661, 652, 651, 652, 661, 662, 662, 654, 652, 654, 662, 663,\n    663, 656, 654, 656, 663, 664, 664, 658, 656, 660, 665, 666, 666, 661, 660,\n    661, 666, 667, 667, 662, 661, 662, 667, 668, 668, 663, 662, 663, 668, 669,\n    669, 664, 663, 665, 670, 671, 671, 666, 665, 666, 671, 672, 672, 667, 666,\n    667, 672, 673, 673, 668, 667, 668, 673, 674, 674, 669, 668, 675, 676, 677,\n    677, 678, 675, 678, 677, 679, 679, 680, 678, 680, 679, 681, 681, 682, 680,\n    682, 681, 683, 683, 684, 682, 676, 685, 686, 686, 677, 676, 677, 686, 687,\n    687, 679, 677, 679, 687, 688, 688, 681, 679, 681, 688, 689, 689, 683, 681,\n    685, 690, 691, 691, 686, 685, 686, 691, 692, 692, 687, 686, 687, 692, 693,\n    693, 688, 687, 688, 693, 694, 694, 689, 688, 690, 695, 696, 696, 691, 690,\n    691, 696, 697, 697, 692, 691, 692, 697, 698, 698, 693, 692, 693, 698, 699,\n    699, 694, 693, 700, 701, 702, 702, 703, 700, 703, 702, 704, 704, 705, 703,\n    705, 704, 706, 706, 707, 705, 707, 706, 708, 708, 709, 707, 701, 710, 711,\n    711, 702, 701, 702, 711, 712, 712, 704, 702, 704, 712, 713, 713, 706, 704,\n    706, 713, 714, 714, 708, 706, 710, 715, 716, 716, 711, 710, 711, 716, 717,\n    717, 712, 711, 712, 717, 718, 718, 713, 712, 713, 718, 719, 719, 714, 713,\n    715, 720, 721, 721, 716, 715, 716, 721, 722, 722, 717, 716, 717, 722, 723,\n    723, 718, 717, 718, 723, 724, 724, 719, 718, 725, 726, 727, 727, 728, 725,\n    728, 727, 729, 729, 730, 728, 730, 729, 731, 731, 732, 730, 732, 731, 733,\n    733, 734, 732, 726, 735, 736, 736, 727, 726, 727, 736, 737, 737, 729, 727,\n    729, 737, 738, 738, 731, 729, 731, 738, 739, 739, 733, 731, 735, 740, 741,\n    741, 736, 735, 736, 741, 742, 742, 737, 736, 737, 742, 743, 743, 738, 737,\n    738, 743, 744, 744, 739, 738, 740, 745, 746, 746, 741, 740, 741, 746, 747,\n    747, 742, 741, 742, 747, 748, 748, 743, 742, 743, 748, 749, 749, 744, 743,\n    750, 751, 752, 752, 753, 750, 753, 752, 754, 754, 755, 753, 755, 754, 756,\n    756, 757, 755, 757, 756, 758, 758, 759, 757, 751, 760, 761, 761, 752, 751,\n    752, 761, 762, 762, 754, 752, 754, 762, 763, 763, 756, 754, 756, 763, 764,\n    764, 758, 756, 760, 765, 766, 766, 761, 760, 761, 766, 767, 767, 762, 761,\n    762, 767, 768, 768, 763, 762, 763, 768, 769, 769, 764, 763, 765, 770, 771,\n    771, 766, 765, 766, 771, 772, 772, 767, 766, 767, 772, 773, 773, 768, 767,\n    768, 773, 774, 774, 769, 768, 775, 776, 777, 777, 778, 775, 778, 777, 779,\n    779, 780, 778, 780, 779, 781, 781, 782, 780, 782, 781, 783, 783, 784, 782,\n    776, 785, 786, 786, 777, 776, 777, 786, 787, 787, 779, 777, 779, 787, 788,\n    788, 781, 779, 781, 788, 789, 789, 783, 781, 785, 790, 791, 791, 786, 785,\n    786, 791, 792, 792, 787, 786, 787, 792, 793, 793, 788, 787, 788, 793, 794,\n    794, 789, 788, 790, 795, 796, 796, 791, 790, 791, 796, 797, 797, 792, 791,\n    792, 797, 798, 798, 793, 792, 793, 798, 799, 799, 794, 793};\n"
  },
  {
    "path": "teapots/choreographer-30fps/src/main/java/com/sample/choreographer/ChoreographerApplication.java",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.sample.choreographer;\n\nimport javax.microedition.khronos.opengles.GL10;\n\nimport android.app.Application;\nimport android.content.Context;\nimport android.content.pm.ApplicationInfo;\nimport android.content.pm.PackageManager;\nimport android.content.pm.PackageManager.NameNotFoundException;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport android.graphics.Matrix;\nimport android.opengl.GLUtils;\nimport android.util.Log;\nimport android.widget.Toast;\n\npublic class ChoreographerApplication extends Application {\n    public void onCreate(){\n        super.onCreate();\t\n        Log.w(\"native-activity\", \"onCreate\");\n\n        final PackageManager pm = getApplicationContext().getPackageManager();\n        ApplicationInfo ai;\n        try {\n            ai = pm.getApplicationInfo( this.getPackageName(), 0);\n        } catch (final NameNotFoundException e) {\n            ai = null;\n        }\n        final String applicationName = (String) (ai != null ? pm.getApplicationLabel(ai) : \"(unknown)\");\n        Toast.makeText(this, applicationName, Toast.LENGTH_SHORT).show();\n    }\n}\n"
  },
  {
    "path": "teapots/choreographer-30fps/src/main/java/com/sample/choreographer/ChoreographerNativeActivity.java",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.sample.choreographer;\n\nimport android.annotation.SuppressLint;\nimport android.annotation.TargetApi;\nimport android.app.NativeActivity;\nimport android.os.Bundle;\nimport android.os.Looper;\nimport android.view.Choreographer;\nimport android.view.Gravity;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup.MarginLayoutParams;\nimport android.view.WindowManager.LayoutParams;\nimport android.widget.LinearLayout;\nimport android.widget.PopupWindow;\nimport android.widget.TextView;\n\npublic class ChoreographerNativeActivity extends NativeActivity\n        implements Choreographer.FrameCallback{\n\n    static {\n        // Load native library to invoke chreographerCallback().\n        System.loadLibrary(\"ChoreographerNativeActivity\");\n    }\n\n    Boolean use_choreographer = false;\n\n    // Choreographer callback.\n    @TargetApi(16)\n    @Override\n    public void doFrame(long frameTimeNanos) {\n        Choreographer.getInstance().postFrameCallback(this);\n        choregrapherCallback(frameTimeNanos);\n    }\n\n    @TargetApi(16)\n    protected void startChoreographer() {\n        Looper.prepare();\n        Choreographer.getInstance().postFrameCallback(this);\n        use_choreographer = true;\n    }\n\n    @TargetApi(16)\n    protected void stopChoreographer() {\n        use_choreographer = false;\n    }\n\n    protected native void choregrapherCallback(long frameTimeNamos);\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        //Hide toolbar\n        int SDK_INT = android.os.Build.VERSION.SDK_INT;\n        if(SDK_INT >= 19) {\n            setImmersiveSticky();\n            View decorView = getWindow().getDecorView();\n            decorView.setOnSystemUiVisibilityChangeListener\n                    (new View.OnSystemUiVisibilityChangeListener() {\n                        @Override\n                        public void onSystemUiVisibilityChange(int visibility) {\n                            setImmersiveSticky();\n                        }\n                    });\n        }\n    }\n\n    @TargetApi(19)\n    protected void onResume() {\n        super.onResume();\n\n        //Hide toolbar\n        int SDK_INT = android.os.Build.VERSION.SDK_INT;\n        if(SDK_INT >= 11 && SDK_INT < 14) {\n            getWindow().getDecorView().setSystemUiVisibility(View.STATUS_BAR_HIDDEN);\n        } else if(SDK_INT >= 14 && SDK_INT < 19) {\n            getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN |\n                    View.SYSTEM_UI_FLAG_LOW_PROFILE);\n        } else if(SDK_INT >= 19) {\n            setImmersiveSticky();\n        }\n\n        if (use_choreographer) {\n            Choreographer.getInstance().postFrameCallback(this);\n        }\n    }\n\n    protected void onPause()\n    {\n        super.onPause();\n        if (use_choreographer) {\n            Choreographer.getInstance().removeFrameCallback(this);\n        }\n    }\n\n    // Our popup window, you will call it from your C/C++ code later\n\n    @TargetApi(19)\n    void setImmersiveSticky() {\n        View decorView = getWindow().getDecorView();\n        decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN\n                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION\n                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY\n                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN\n                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION\n                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);\n    }\n\n    ChoreographerNativeActivity _activity;\n    PopupWindow _popupWindow;\n    TextView _label;\n\n    @SuppressLint(\"InflateParams\")\n    public void showUI()\n    {\n        if( _popupWindow != null )\n            return;\n\n        _activity = this;\n\n        this.runOnUiThread(new Runnable()  {\n            @Override\n            public void run()  {\n                LayoutInflater layoutInflater\n                        = (LayoutInflater)getBaseContext()\n                        .getSystemService(LAYOUT_INFLATER_SERVICE);\n                View popupView = layoutInflater.inflate(R.layout.widgets, null);\n                _popupWindow = new PopupWindow(\n                        popupView,\n                        LayoutParams.WRAP_CONTENT,\n                        LayoutParams.WRAP_CONTENT);\n\n                LinearLayout mainLayout = new LinearLayout(_activity);\n                MarginLayoutParams params = new MarginLayoutParams(LayoutParams.WRAP_CONTENT,\n                        LayoutParams.WRAP_CONTENT);\n                params.setMargins(0, 0, 0, 0);\n                _activity.setContentView(mainLayout, params);\n\n                // Show our UI over NativeActivity window\n                _popupWindow.showAtLocation(mainLayout, Gravity.TOP | Gravity.START, 10, 10);\n                _popupWindow.update();\n\n                _label = (TextView)popupView.findViewById(R.id.textViewFPS);\n            }});\n    }\n\n    public void updateFPS(final float fFPS)\n    {\n        if( _label == null )\n            return;\n\n        _activity = this;\n        this.runOnUiThread(new Runnable()  {\n            @Override\n            public void run()  {\n                _label.setText(String.format(\"%2.2f FPS\", fFPS));\n            }});\n    }\n}\n"
  },
  {
    "path": "teapots/choreographer-30fps/src/main/java/com/sample/helper/NDKHelper.java",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.sample.helper;\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.nio.ByteBuffer;\n\nimport javax.microedition.khronos.opengles.GL10;\n\nimport android.R.bool;\nimport android.opengl.GLES30;\n\nimport android.annotation.TargetApi;\nimport android.app.Activity;\nimport android.app.NativeActivity;\nimport android.content.Context;\nimport android.content.pm.ApplicationInfo;\nimport android.content.pm.PackageManager;\nimport android.content.pm.PackageManager.NameNotFoundException;\nimport android.graphics.Bitmap;\nimport android.graphics.Bitmap.CompressFormat;\nimport android.graphics.BitmapFactory;\nimport android.graphics.Matrix;\nimport android.media.AudioManager;\nimport android.media.AudioTrack;\nimport android.opengl.GLUtils;\nimport android.os.Build;\nimport android.util.Log;\nimport android.view.View;\nimport android.view.View.MeasureSpec;\n\n@TargetApi(Build.VERSION_CODES.GINGERBREAD)\npublic class NDKHelper {\n\n    public NDKHelper(NativeActivity act) {\n        activity = act;\n    }\n\n    public void loadLibrary(String soname) {\n        if (soname.isEmpty() == false) {\n            System.loadLibrary(soname);\n            loadedSO = true;\n        }\n    }\n\n    public static Boolean checkSOLoaded() {\n        if (loadedSO == false) {\n            Log.e(\"NDKHelper\",\n                    \"--------------------------------------------\\n\"\n                            + \".so has not been loaded. To use JUI helper, please initialize with \\n\"\n                            + \"NDKHelper::Init( ANativeActivity* activity, const char* helper_class_name, const char* native_soname);\\n\"\n                            + \"--------------------------------------------\\n\");\n            return false;\n        } else\n            return true;\n    }\n\n    private static boolean loadedSO = false;\n    NativeActivity activity;\n\n\n\n    //\n    // Load Bitmap\n    // Java helper is useful decoding PNG, TIFF etc rather than linking libPng\n    // etc separately\n    //\n    private int nextPOT(int i) {\n        int pot = 1;\n        while (pot < i)\n            pot <<= 1;\n        return pot;\n    }\n\n    private Bitmap scaleBitmap(Bitmap bitmapToScale, float newWidth,\n                               float newHeight) {\n        if (bitmapToScale == null)\n            return null;\n        // get the original width and height\n        int width = bitmapToScale.getWidth();\n        int height = bitmapToScale.getHeight();\n        // create a matrix for the manipulation\n        Matrix matrix = new Matrix();\n\n        // resize the bit map\n        matrix.postScale(newWidth / width, newHeight / height);\n\n        // recreate the new Bitmap and set it back\n        return Bitmap.createBitmap(bitmapToScale, 0, 0,\n                bitmapToScale.getWidth(), bitmapToScale.getHeight(), matrix,\n                true);\n    }\n\n    public class TextureInformation {\n        boolean ret;\n        boolean alphaChannel;\n        int originalWidth;\n        int originalHeight;\n        Object image;\n    }\n\n    public Object loadTexture(String path) {\n        Bitmap bitmap = null;\n        TextureInformation info = new TextureInformation();\n        try {\n            String str = path;\n            if (!path.startsWith(\"/\")) {\n                str = \"/\" + path;\n            }\n\n            File file = new File(activity.getExternalFilesDir(null), str);\n            if (file.canRead()) {\n                bitmap = BitmapFactory.decodeStream(new FileInputStream(file));\n            } else {\n                bitmap = BitmapFactory.decodeStream(activity.getResources()\n                        .getAssets().open(path));\n            }\n            // Matrix matrix = new Matrix();\n            // // resize the bit map\n            // matrix.postScale(-1F, 1F);\n            //\n            // // recreate the new Bitmap and set it back\n            // bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),\n            // bitmap.getHeight(), matrix, true);\n\n        } catch (Exception e) {\n            Log.w(\"NDKHelper\", \"Coundn't load a file:\" + path);\n            info.ret = false;\n            return info;\n        }\n\n        if (bitmap != null) {\n            GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);\n        }\n        info.ret = true;\n        info.alphaChannel = bitmap.hasAlpha();\n        info.originalWidth = getBitmapWidth(bitmap);\n        info.originalHeight = getBitmapHeight(bitmap);\n\n        return info;\n    }\n\n    public Object loadCubemapTexture(String path, int face, int miplevel, boolean sRGB) {\n        Bitmap bitmap = null;\n        TextureInformation info = new TextureInformation();\n        try {\n            String str = path;\n            if (!path.startsWith(\"/\")) {\n                str = \"/\" + path;\n            }\n\n            File file = new File(activity.getExternalFilesDir(null), str);\n            if (file.canRead()) {\n                bitmap = BitmapFactory.decodeStream(new FileInputStream(file));\n            } else {\n                bitmap = BitmapFactory.decodeStream(activity.getResources()\n                        .getAssets().open(path));\n            }\n        } catch (Exception e) {\n            Log.w(\"NDKHelper\", \"Coundn't load a file:\" + path);\n            info.ret = false;\n            return info;\n        }\n\n        if (bitmap != null) {\n            if (sRGB)\n            {\n//        \t\tGLUtils.texImage2D(face, miplevel, bitmap, 0);\n//        \t\tGLUtils.texImage2D(face, miplevel,\n//        \t\t\t\tGLUtils.getInternalFormat(bitmap), bitmap, 0);\n//        \t\tint i = GLUtils.getInternalFormat(bitmap);\n//        \t\tif( i == GL10.GL_RGBA)\n//        \t\t{\n//            \t\tGLUtils.texImage2D(face, miplevel,\n//            \t\t\t\tGLES30.GL_SRGB, bitmap, 0);\n//        \t\t}\n                //Leave them for now\n                GLUtils.texImage2D(face, miplevel, bitmap, 0);\n            }\n            else\n                GLUtils.texImage2D(face, miplevel, bitmap, 0);\n        }\n        info.ret = true;\n        info.alphaChannel = bitmap.hasAlpha();\n        info.originalWidth = getBitmapWidth(bitmap);\n        info.originalHeight = getBitmapHeight(bitmap);\n\n        return info;\n\n    }\n\n    public Object loadImage(String path) {\n        Bitmap bitmap = null;\n        TextureInformation info = new TextureInformation();\n        try {\n            String str = path;\n            if (!path.startsWith(\"/\")) {\n                str = \"/\" + path;\n            }\n\n            File file = new File(activity.getExternalFilesDir(null), str);\n            if (file.canRead()) {\n                bitmap = BitmapFactory.decodeStream(new FileInputStream(file));\n            } else {\n                bitmap = BitmapFactory.decodeStream(activity.getResources()\n                        .getAssets().open(path));\n            }\n        } catch (Exception e) {\n            Log.w(\"NDKHelper\", \"Coundn't load a file:\" + path);\n            info.ret = false;\n            return info;\n        }\n\n        if (bitmap != null) {\n            GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);\n        }\n        info.ret = true;\n        info.alphaChannel = bitmap.hasAlpha();\n        info.originalWidth = getBitmapWidth(bitmap);\n        info.originalHeight = getBitmapHeight(bitmap);\n\n        int iBytes = bitmap.getWidth() * bitmap.getHeight() * 4;\n        ByteBuffer buffer = ByteBuffer.allocateDirect(iBytes);\n\n        bitmap.copyPixelsToBuffer(buffer);\n        info.image = buffer;\n        return info;\n    }\n\n    public Bitmap openBitmap(String path, boolean iScalePOT) {\n        Bitmap bitmap = null;\n        try {\n            bitmap = BitmapFactory.decodeStream(activity.getResources()\n                    .getAssets().open(path));\n            if (iScalePOT) {\n                int originalWidth = getBitmapWidth(bitmap);\n                int originalHeight = getBitmapHeight(bitmap);\n                int width = nextPOT(originalWidth);\n                int height = nextPOT(originalHeight);\n                if (originalWidth != width || originalHeight != height) {\n                    // Scale it\n                    bitmap = scaleBitmap(bitmap, width, height);\n                }\n            }\n\n        } catch (Exception e) {\n            Log.w(\"NDKHelper\", \"Coundn't load a file:\" + path);\n        }\n\n        return bitmap;\n    }\n\n    public int getBitmapWidth(Bitmap bmp) {\n        return bmp.getWidth();\n    }\n\n    public int getBitmapHeight(Bitmap bmp) {\n        return bmp.getHeight();\n    }\n\n    public void getBitmapPixels(Bitmap bmp, int[] pixels) {\n        int w = bmp.getWidth();\n        int h = bmp.getHeight();\n        bmp.getPixels(pixels, 0, w, 0, 0, w, h);\n    }\n\n    public void closeBitmap(Bitmap bmp) {\n        bmp.recycle();\n    }\n\n    public String getNativeLibraryDirectory(Context appContext) {\n        ApplicationInfo ai = activity.getApplicationInfo();\n\n        Log.w(\"NDKHelper\", \"ai.nativeLibraryDir:\" + ai.nativeLibraryDir);\n\n        if ((ai.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0\n                || (ai.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {\n            return ai.nativeLibraryDir;\n        }\n        return \"/system/lib/\";\n    }\n\n    public String getApplicationName() {\n        final PackageManager pm = activity.getPackageManager();\n        ApplicationInfo ai;\n        try {\n            ai = pm.getApplicationInfo(activity.getPackageName(), 0);\n        } catch (final NameNotFoundException e) {\n            ai = null;\n        }\n        String applicationName = (String) (ai != null ? pm\n                .getApplicationLabel(ai) : \"(unknown)\");\n        return applicationName;\n    }\n\n    public String getStringResource(String resourceName)\n    {\n        int id = activity.getResources().getIdentifier(resourceName, \"string\", activity.getPackageName());\n        String value = id == 0 ? \"\" : (String)activity.getResources().getText(id);\n        return value;\n    }\n\n    //\n    // Audio related helpers\n    //\n    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)\n    public int getNativeAudioBufferSize() {\n        int SDK_INT = android.os.Build.VERSION.SDK_INT;\n        if (SDK_INT >= 17) {\n            AudioManager am = (AudioManager) activity\n                    .getSystemService(Context.AUDIO_SERVICE);\n            String framesPerBuffer = am\n                    .getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);\n            return Integer.parseInt(framesPerBuffer);\n        } else {\n            return 0;\n        }\n    }\n\n    public int getNativeAudioSampleRate() {\n        return AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_SYSTEM);\n    }\n\n    /*\n     * Helper to execute function in UIThread\n     */\n    public void runOnUIThread(final long p) {\n        if (checkSOLoaded()) {\n            activity.runOnUiThread(new Runnable() {\n                @Override\n                public void run() {\n                    RunOnUiThreadHandler(p);\n                }\n            });\n        }\n        return;\n    }\n\n    /*\n     * Native code helper for RunOnUiThread\n     */\n    native public void RunOnUiThreadHandler(long pointer);\n}\n"
  },
  {
    "path": "teapots/choreographer-30fps/src/main/res/layout/widgets.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:gravity=\"top\"\n    android:orientation=\"vertical\" >\n\n    <TextView\n        android:id=\"@+id/textViewFPS\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"end\"\n        android:text=\"@string/fps\"\n        android:textAppearance=\"?android:attr/textAppearanceMedium\"\n        android:textColor=\"@android:color/white\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "teapots/choreographer-30fps/src/main/res/values/strings.xml",
    "content": "<resources>\n\n    <string name=\"app_name\">Choreographer</string>\n    <string name=\"fps\">0.0 FPS</string>\n\n</resources>\n"
  },
  {
    "path": "teapots/choreographer-30fps/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!--\n        Base application theme, dependent on API level. This theme is replaced\n        by AppBaseTheme from res/values-vXX/styles.xml on newer devices.\n    -->\n    <style name=\"AppBaseTheme\" parent=\"android:Theme.Light\">\n        <!--\n            Theme customizations available in newer API levels can go in\n            res/values-vXX/styles.xml, while customizations related to\n            backward-compatibility can go here.\n        -->\n    </style>\n\n    <!-- Application theme. -->\n    <style name=\"AppTheme\" parent=\"AppBaseTheme\">\n        <!-- All customizations that are NOT specific to a particular API-level can go here. -->\n    </style>\n\n</resources>"
  },
  {
    "path": "teapots/choreographer-30fps/src/main/res/values-v11/styles.xml",
    "content": "<resources>\n\n    <!--\n        Base application theme for API 11+. This theme completely replaces\n        AppBaseTheme from res/values/styles.xml on API 11+ devices.\n    -->\n    <style name=\"AppBaseTheme\" parent=\"android:Theme.Holo.Light\">\n        <!-- API 11 theme customizations can go here. -->\n    </style>\n\n</resources>"
  },
  {
    "path": "teapots/choreographer-30fps/src/main/res/values-v14/styles.xml",
    "content": "<resources>\n\n    <!--\n        Base application theme for API 14+. This theme completely replaces\n        AppBaseTheme from BOTH res/values/styles.xml and\n        res/values-v11/styles.xml on API 14+ devices.\n    -->\n    <style name=\"AppBaseTheme\" parent=\"android:Theme.Holo.Light.DarkActionBar\">\n        <!-- API 14 theme customizations can go here. -->\n    </style>\n\n</resources>"
  },
  {
    "path": "teapots/classic-teapot/build.gradle",
    "content": "plugins {\n    id \"ndksamples.android.application\"\n}\n\nandroid {\n    namespace 'com.sample.teapot'\n\n    defaultConfig {\n        applicationId = 'com.sample.teapot'\n        externalNativeBuild {\n            cmake {\n                arguments '-DANDROID_STL=c++_static'\n            }\n        }\n    }\n\n    externalNativeBuild {\n        cmake {\n            path 'src/main/cpp/CMakeLists.txt'\n        }\n    }\n}\n\ndependencies {\n    implementation libs.appcompat\n    implementation libs.androidx.constraintlayout\n}\n"
  },
  {
    "path": "teapots/classic-teapot/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:versionCode=\"1\"\n          android:versionName=\"1.0\" >\n\n  <uses-feature android:glEsVersion=\"0x00020000\"></uses-feature>\n\n  <application\n      android:allowBackup=\"false\"\n      android:fullBackupContent=\"false\"\n      android:supportsRtl=\"true\"\n      android:icon=\"@mipmap/ic_launcher\"\n      android:label=\"@string/app_name\"\n      android:theme=\"@style/AppTheme\"\n      android:name=\"com.sample.teapot.TeapotApplication\"\n      >\n\n    <!-- Our activity is the built-in NativeActivity framework class.\n         This will take care of integrating with our NDK code. -->\n    <activity android:name=\"com.sample.teapot.TeapotNativeActivity\"\n              android:label=\"@string/app_name\"\n              android:configChanges=\"orientation|keyboardHidden\"\n        android:exported=\"true\">\n      <!-- Tell NativeActivity the name of our .so -->\n      <meta-data android:name=\"android.app.lib_name\"\n                 android:value=\"TeapotNativeActivity\" />\n      <intent-filter>\n        <action android:name=\"android.intent.action.MAIN\" />\n        <category android:name=\"android.intent.category.LAUNCHER\" />\n      </intent-filter>\n    </activity>\n  </application>\n</manifest>\n"
  },
  {
    "path": "teapots/classic-teapot/src/main/assets/Shaders/ShaderPlain.fsh",
    "content": "//\n// Copyright (C) 2015 The Android Open Source Project\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n//  ShaderPlain.fsh\n//\n\n#define USE_PHONG (1)\n\nuniform lowp vec3       vMaterialAmbient;\nuniform lowp vec4       vMaterialSpecular;\n\nvarying lowp vec4 colorDiffuse;\n\n#if USE_PHONG\nuniform highp vec3      vLight0;\nvarying mediump vec3 position;\nvarying mediump vec3 normal;\n#else\nvarying lowp vec4 colorSpecular;\n#endif\n\nvoid main()\n{\n#if USE_PHONG\n    mediump vec3 halfVector = normalize(-vLight0 + position);\n    mediump float NdotH = max(dot(normalize(normal), halfVector), 0.0);\n    mediump float fPower = vMaterialSpecular.w;\n    mediump float specular = pow(NdotH, fPower);\n\n    lowp vec4 colorSpecular = vec4( vMaterialSpecular.xyz * specular, 1 );\n    gl_FragColor = colorDiffuse + colorSpecular;\n#else\n    gl_FragColor = colorDiffuse + colorSpecular;\n#endif\n}\n"
  },
  {
    "path": "teapots/classic-teapot/src/main/assets/Shaders/VS_ShaderPlain.vsh",
    "content": "//\n// Copyright (C) 2015 The Android Open Source Project\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n//  ShaderPlain.vsh\n//\n\n#define USE_PHONG (1)\n\nattribute highp vec3    myVertex;\nattribute highp vec3    myNormal;\nattribute mediump vec2  myUV;\nattribute mediump vec4  myBone;\n\nvarying mediump vec2    texCoord;\nvarying lowp    vec4    colorDiffuse;\n\n#if USE_PHONG\nvarying mediump vec3 position;\nvarying mediump vec3 normal;\n#else\nvarying lowp    vec4    colorSpecular;\n#endif\n\nuniform highp mat4      uMVMatrix;\nuniform highp mat4      uPMatrix;\n\nuniform highp vec3      vLight0;\n\nuniform lowp vec4       vMaterialDiffuse;\nuniform lowp vec3       vMaterialAmbient;\nuniform lowp vec4       vMaterialSpecular;\n\nvoid main(void)\n{\n    highp vec4 p = vec4(myVertex,1);\n    gl_Position = uPMatrix * p;\n\n    texCoord = myUV;\n\n    highp vec3 worldNormal = vec3(mat3(uMVMatrix[0].xyz, uMVMatrix[1].xyz, uMVMatrix[2].xyz) * myNormal);\n    highp vec3 ecPosition = p.xyz;\n\n    colorDiffuse = dot( worldNormal, normalize(-vLight0+ecPosition) ) * vMaterialDiffuse  + vec4( vMaterialAmbient, 1 );\n\n#if USE_PHONG\n    normal = worldNormal;\n    position = ecPosition;\n#else\n    highp vec3 halfVector = normalize(ecPosition - vLight0);\n\n    highp float NdotH = max(-dot(worldNormal, halfVector), 0.0);\n    float fPower = vMaterialSpecular.w;\n    highp float specular = min( pow(NdotH, fPower), 1.0);\n    colorSpecular = vec4( vMaterialSpecular.xyz * specular, 1 );\n#endif\n}\n"
  },
  {
    "path": "teapots/classic-teapot/src/main/cpp/CMakeLists.txt",
    "content": "#\n# Copyright (C) The Android Open Source Project\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\ncmake_minimum_required(VERSION 3.22.1)\nproject(TeapotNativeActivity LANGUAGES C CXX)\n\ninclude(AppLibrary)\n\n# build the ndk-helper library\nget_filename_component(commonDir ${CMAKE_CURRENT_SOURCE_DIR}/../../../../common ABSOLUTE)\nget_filename_component(ndkHelperSrc ${commonDir}/ndk_helper ABSOLUTE)\nadd_subdirectory(${ndkHelperSrc}\n    ndkHelperBin/${CMAKE_BUILD_TYPE}/${ANDROID_ABI})\n\n# now build app's shared lib\nadd_app_library(${PROJECT_NAME}\n    SHARED\n    TeapotNativeActivity.cpp\n    TeapotRenderer.cpp\n)\n\n# Export ANativeActivity_onCreate(),\n# Refer to: https://github.com/android-ndk/ndk/issues/381.\nset_target_properties(${PROJECT_NAME}\n    PROPERTIES LINK_FLAGS \"-u ANativeActivity_onCreate\")\n\n# add lib dependencies\ntarget_link_libraries(${PROJECT_NAME}\n    PRIVATE\n    NdkHelper\n)\n"
  },
  {
    "path": "teapots/classic-teapot/src/main/cpp/TeapotNativeActivity.cpp",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//--------------------------------------------------------------------------------\n// Include files\n//--------------------------------------------------------------------------------\n#include <android/log.h>\n#include <android/native_window_jni.h>\n#include <android/sensor.h>\n#include <android_native_app_glue.h>\n#include <errno.h>\n#include <jni.h>\n\n#include \"NDKHelper.h\"\n#include \"TeapotRenderer.h\"\n\n//-------------------------------------------------------------------------\n// Preprocessor\n//-------------------------------------------------------------------------\n#define HELPER_CLASS_NAME \\\n  \"com/sample/helper/NDKHelper\"  // Class name of helper function\n//-------------------------------------------------------------------------\n// Shared state for our app.\n//-------------------------------------------------------------------------\nstruct android_app;\nclass Engine {\n  TeapotRenderer renderer_;\n\n  ndk_helper::GLContext* gl_context_;\n\n  bool initialized_resources_;\n  bool has_focus_;\n\n  ndk_helper::DoubletapDetector doubletap_detector_;\n  ndk_helper::PinchDetector pinch_detector_;\n  ndk_helper::DragDetector drag_detector_;\n  ndk_helper::PerfMonitor monitor_;\n\n  ndk_helper::TapCamera tap_camera_;\n\n  android_app* app_;\n\n  ASensorManager* sensor_manager_;\n  const ASensor* accelerometer_sensor_;\n  ASensorEventQueue* sensor_event_queue_;\n\n  void UpdateFPS(float fFPS);\n  void ShowUI();\n  void TransformPosition(ndk_helper::Vec2& vec);\n\n public:\n  static void HandleCmd(struct android_app* app, int32_t cmd);\n  static int32_t HandleInput(android_app* app, AInputEvent* event);\n\n  Engine();\n  ~Engine();\n  void SetState(android_app* app);\n  int InitDisplay(android_app* app);\n  void LoadResources();\n  void UnloadResources();\n  void DrawFrame();\n  void TermDisplay();\n  void TrimMemory();\n  bool IsReady();\n\n  void UpdatePosition(AInputEvent* event, int32_t iIndex, float& fX, float& fY);\n\n  void InitSensors();\n  void ProcessSensors(int32_t id);\n  void SuspendSensors();\n  void ResumeSensors();\n};\n\n//-------------------------------------------------------------------------\n// Ctor\n//-------------------------------------------------------------------------\nEngine::Engine()\n    : initialized_resources_(false),\n      has_focus_(false),\n      app_(NULL),\n      sensor_manager_(NULL),\n      accelerometer_sensor_(NULL),\n      sensor_event_queue_(NULL) {\n  gl_context_ = ndk_helper::GLContext::GetInstance();\n}\n\n//-------------------------------------------------------------------------\n// Dtor\n//-------------------------------------------------------------------------\nEngine::~Engine() {}\n\n/**\n * Load resources\n */\nvoid Engine::LoadResources() {\n  renderer_.Init();\n  renderer_.Bind(&tap_camera_);\n}\n\n/**\n * Unload resources\n */\nvoid Engine::UnloadResources() { renderer_.Unload(); }\n\n/**\n * Initialize an EGL context for the current display.\n */\nint Engine::InitDisplay(android_app* app) {\n  if (!initialized_resources_) {\n    gl_context_->Init(app_->window);\n    LoadResources();\n    initialized_resources_ = true;\n  } else if (app->window != gl_context_->GetANativeWindow()) {\n    // Re-initialize ANativeWindow.\n    // On some devices, ANativeWindow is re-created when the app is resumed\n    assert(gl_context_->GetANativeWindow());\n    UnloadResources();\n    gl_context_->Invalidate();\n    app_ = app;\n    gl_context_->Init(app->window);\n    LoadResources();\n    initialized_resources_ = true;\n  } else {\n    // initialize OpenGL ES and EGL\n    if (EGL_SUCCESS == gl_context_->Resume(app_->window)) {\n      UnloadResources();\n      LoadResources();\n    } else {\n      assert(0);\n    }\n  }\n\n  ShowUI();\n\n  // Initialize GL state.\n  glEnable(GL_CULL_FACE);\n  glEnable(GL_DEPTH_TEST);\n  glDepthFunc(GL_LEQUAL);\n\n  // Note that screen size might have been changed\n  glViewport(0, 0, gl_context_->GetScreenWidth(),\n             gl_context_->GetScreenHeight());\n  renderer_.UpdateViewport();\n\n  tap_camera_.SetFlip(1.f, -1.f, -1.f);\n  tap_camera_.SetPinchTransformFactor(2.f, 2.f, 8.f);\n\n  return 0;\n}\n\n/**\n * Just the current frame in the display.\n */\nvoid Engine::DrawFrame() {\n  float fps;\n  if (monitor_.Update(fps)) {\n    UpdateFPS(fps);\n  }\n  renderer_.Update(monitor_.GetCurrentTime());\n\n  // Just fill the screen with a color.\n  glClearColor(0.5f, 0.5f, 0.5f, 1.f);\n  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n  renderer_.Render();\n\n  // Swap\n  if (EGL_SUCCESS != gl_context_->Swap()) {\n    UnloadResources();\n    LoadResources();\n  }\n}\n\n/**\n * Tear down the EGL context currently associated with the display.\n */\nvoid Engine::TermDisplay() { gl_context_->Suspend(); }\n\nvoid Engine::TrimMemory() {\n  LOGI(\"Trimming memory\");\n  gl_context_->Invalidate();\n}\n/**\n * Process the next input event.\n */\nint32_t Engine::HandleInput(android_app* app, AInputEvent* event) {\n  Engine* eng = (Engine*)app->userData;\n  if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION) {\n    ndk_helper::GESTURE_STATE doubleTapState =\n        eng->doubletap_detector_.Detect(event);\n    ndk_helper::GESTURE_STATE dragState = eng->drag_detector_.Detect(event);\n    ndk_helper::GESTURE_STATE pinchState = eng->pinch_detector_.Detect(event);\n\n    // Double tap detector has a priority over other detectors\n    if (doubleTapState == ndk_helper::GESTURE_STATE_ACTION) {\n      // Detect double tap\n      eng->tap_camera_.Reset(true);\n    } else {\n      // Handle drag state\n      if (dragState & ndk_helper::GESTURE_STATE_START) {\n        // Otherwise, start dragging\n        ndk_helper::Vec2 v;\n        eng->drag_detector_.GetPointer(v);\n        eng->TransformPosition(v);\n        eng->tap_camera_.BeginDrag(v);\n      } else if (dragState & ndk_helper::GESTURE_STATE_MOVE) {\n        ndk_helper::Vec2 v;\n        eng->drag_detector_.GetPointer(v);\n        eng->TransformPosition(v);\n        eng->tap_camera_.Drag(v);\n      } else if (dragState & ndk_helper::GESTURE_STATE_END) {\n        eng->tap_camera_.EndDrag();\n      }\n\n      // Handle pinch state\n      if (pinchState & ndk_helper::GESTURE_STATE_START) {\n        // Start new pinch\n        ndk_helper::Vec2 v1;\n        ndk_helper::Vec2 v2;\n        eng->pinch_detector_.GetPointers(v1, v2);\n        eng->TransformPosition(v1);\n        eng->TransformPosition(v2);\n        eng->tap_camera_.BeginPinch(v1, v2);\n      } else if (pinchState & ndk_helper::GESTURE_STATE_MOVE) {\n        // Multi touch\n        // Start new pinch\n        ndk_helper::Vec2 v1;\n        ndk_helper::Vec2 v2;\n        eng->pinch_detector_.GetPointers(v1, v2);\n        eng->TransformPosition(v1);\n        eng->TransformPosition(v2);\n        eng->tap_camera_.Pinch(v1, v2);\n      }\n    }\n    return 1;\n  }\n  return 0;\n}\n\n/**\n * Process the next main command.\n */\nvoid Engine::HandleCmd(struct android_app* app, int32_t cmd) {\n  Engine* eng = (Engine*)app->userData;\n  switch (cmd) {\n    case APP_CMD_SAVE_STATE:\n      break;\n    case APP_CMD_INIT_WINDOW:\n      // The window is being shown, get it ready.\n      if (app->window != NULL) {\n        eng->InitDisplay(app);\n        eng->has_focus_ = true;\n        eng->DrawFrame();\n      }\n      break;\n    case APP_CMD_TERM_WINDOW:\n      // The window is being hidden or closed, clean it up.\n      eng->TermDisplay();\n      eng->has_focus_ = false;\n      break;\n    case APP_CMD_STOP:\n      break;\n    case APP_CMD_GAINED_FOCUS:\n      eng->ResumeSensors();\n      // Start animation\n      eng->has_focus_ = true;\n      break;\n    case APP_CMD_LOST_FOCUS:\n      eng->SuspendSensors();\n      // Also stop animating.\n      eng->has_focus_ = false;\n      eng->DrawFrame();\n      break;\n    case APP_CMD_LOW_MEMORY:\n      // Free up GL resources\n      eng->TrimMemory();\n      break;\n  }\n}\n\n//-------------------------------------------------------------------------\n// Sensor handlers\n//-------------------------------------------------------------------------\nvoid Engine::InitSensors() {\n  sensor_manager_ = ndk_helper::AcquireASensorManagerInstance(app_);\n  accelerometer_sensor_ = ASensorManager_getDefaultSensor(\n      sensor_manager_, ASENSOR_TYPE_ACCELEROMETER);\n  sensor_event_queue_ = ASensorManager_createEventQueue(\n      sensor_manager_, app_->looper, LOOPER_ID_USER, NULL, NULL);\n}\n\nvoid Engine::ProcessSensors(int32_t id) {\n  // If a sensor has data, process it now.\n  if (id == LOOPER_ID_USER) {\n    if (accelerometer_sensor_ != NULL) {\n      ASensorEvent event;\n      while (ASensorEventQueue_getEvents(sensor_event_queue_, &event, 1) > 0) {\n      }\n    }\n  }\n}\n\nvoid Engine::ResumeSensors() {\n  // When our app gains focus, we start monitoring the accelerometer.\n  if (accelerometer_sensor_ != NULL) {\n    ASensorEventQueue_enableSensor(sensor_event_queue_, accelerometer_sensor_);\n    // We'd like to get 60 events per second (in us).\n    ASensorEventQueue_setEventRate(sensor_event_queue_, accelerometer_sensor_,\n                                   (1000L / 60) * 1000);\n  }\n}\n\nvoid Engine::SuspendSensors() {\n  // When our app loses focus, we stop monitoring the accelerometer.\n  // This is to avoid consuming battery while not being used.\n  if (accelerometer_sensor_ != NULL) {\n    ASensorEventQueue_disableSensor(sensor_event_queue_, accelerometer_sensor_);\n  }\n}\n\n//-------------------------------------------------------------------------\n// Misc\n//-------------------------------------------------------------------------\nvoid Engine::SetState(android_app* state) {\n  app_ = state;\n  doubletap_detector_.SetConfiguration(app_->config);\n  drag_detector_.SetConfiguration(app_->config);\n  pinch_detector_.SetConfiguration(app_->config);\n}\n\nbool Engine::IsReady() {\n  if (has_focus_) return true;\n\n  return false;\n}\n\nvoid Engine::TransformPosition(ndk_helper::Vec2& vec) {\n  vec = ndk_helper::Vec2(2.0f, 2.0f) * vec /\n            ndk_helper::Vec2(gl_context_->GetScreenWidth(),\n                             gl_context_->GetScreenHeight()) -\n        ndk_helper::Vec2(1.f, 1.f);\n}\n\nvoid Engine::ShowUI() {\n  JNIEnv* jni;\n  app_->activity->vm->AttachCurrentThread(&jni, NULL);\n\n  // Default class retrieval\n  jclass clazz = jni->GetObjectClass(app_->activity->clazz);\n  jmethodID methodID = jni->GetMethodID(clazz, \"showUI\", \"()V\");\n  jni->CallVoidMethod(app_->activity->clazz, methodID);\n\n  app_->activity->vm->DetachCurrentThread();\n  return;\n}\n\nvoid Engine::UpdateFPS(float fFPS) {\n  JNIEnv* jni;\n  app_->activity->vm->AttachCurrentThread(&jni, NULL);\n\n  // Default class retrieval\n  jclass clazz = jni->GetObjectClass(app_->activity->clazz);\n  jmethodID methodID = jni->GetMethodID(clazz, \"updateFPS\", \"(F)V\");\n  jni->CallVoidMethod(app_->activity->clazz, methodID, fFPS);\n\n  app_->activity->vm->DetachCurrentThread();\n  return;\n}\n\nEngine g_engine;\n\n/**\n * This is the main entry point of a native application that is using\n * android_native_app_glue.  It runs in its own thread, with its own\n * event loop for receiving input events and doing other things.\n */\nvoid android_main(android_app* state) {\n  g_engine.SetState(state);\n\n  // Init helper functions\n  ndk_helper::JNIHelper::Init(state->activity, HELPER_CLASS_NAME);\n\n  state->userData = &g_engine;\n  state->onAppCmd = Engine::HandleCmd;\n  state->onInputEvent = Engine::HandleInput;\n\n#ifdef USE_NDK_PROFILER\n  monstartup(\"libTeapotNativeActivity.so\");\n#endif\n\n  // Prepare to monitor accelerometer\n  g_engine.InitSensors();\n\n  // loop waiting for stuff to do.\n  while (!state->destroyRequested) {\n    // If not animating, we will block forever waiting for events.\n    // If animating, we loop until all events are read, then continue\n    // to draw the next frame of animation.\n    android_poll_source* source = nullptr;\n    auto result = ALooper_pollOnce(g_engine.IsReady() ? 0 : -1, nullptr,\n                                   nullptr, (void**)&source);\n    if (result == ALOOPER_POLL_ERROR) {\n      LOGE(\"ALooper_pollOnce returned an error\");\n      std::abort();\n    }\n\n    // Process this event.\n    if (source != NULL) source->process(state, source);\n\n    g_engine.ProcessSensors(result);\n\n    if (g_engine.IsReady()) {\n      // Drawing is throttled to the screen update rate, so there\n      // is no need to do timing here.\n      g_engine.DrawFrame();\n    }\n  }\n  g_engine.TermDisplay();\n}\n"
  },
  {
    "path": "teapots/classic-teapot/src/main/cpp/TeapotRenderer.cpp",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//--------------------------------------------------------------------------------\n// TeapotRenderer.cpp\n// Render a teapot\n//--------------------------------------------------------------------------------\n//--------------------------------------------------------------------------------\n// Include files\n//--------------------------------------------------------------------------------\n#include \"TeapotRenderer.h\"\n\n//--------------------------------------------------------------------------------\n// Teapot model data\n//--------------------------------------------------------------------------------\n#include \"teapot.inl\"\n\n//--------------------------------------------------------------------------------\n// Ctor\n//--------------------------------------------------------------------------------\nTeapotRenderer::TeapotRenderer() {}\n\n//--------------------------------------------------------------------------------\n// Dtor\n//--------------------------------------------------------------------------------\nTeapotRenderer::~TeapotRenderer() { Unload(); }\n\nvoid TeapotRenderer::Init() {\n  // Settings\n  glFrontFace(GL_CCW);\n\n  // Load shader\n  LoadShaders(&shader_param_, \"Shaders/VS_ShaderPlain.vsh\",\n              \"Shaders/ShaderPlain.fsh\");\n\n  // Create Index buffer\n  num_indices_ = sizeof(teapotIndices) / sizeof(teapotIndices[0]);\n  glGenBuffers(1, &ibo_);\n  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo_);\n  glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(teapotIndices), teapotIndices,\n               GL_STATIC_DRAW);\n  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);\n\n  // Create VBO\n  num_vertices_ = sizeof(teapotPositions) / sizeof(teapotPositions[0]) / 3;\n  int32_t stride = sizeof(TEAPOT_VERTEX);\n  int32_t index = 0;\n  TEAPOT_VERTEX* p = new TEAPOT_VERTEX[num_vertices_];\n  for (int32_t i = 0; i < num_vertices_; ++i) {\n    p[i].pos[0] = teapotPositions[index];\n    p[i].pos[1] = teapotPositions[index + 1];\n    p[i].pos[2] = teapotPositions[index + 2];\n\n    p[i].normal[0] = teapotNormals[index];\n    p[i].normal[1] = teapotNormals[index + 1];\n    p[i].normal[2] = teapotNormals[index + 2];\n    index += 3;\n  }\n  glGenBuffers(1, &vbo_);\n  glBindBuffer(GL_ARRAY_BUFFER, vbo_);\n  glBufferData(GL_ARRAY_BUFFER, stride * num_vertices_, p, GL_STATIC_DRAW);\n  glBindBuffer(GL_ARRAY_BUFFER, 0);\n\n  delete[] p;\n\n  UpdateViewport();\n  mat_model_ = ndk_helper::Mat4::Translation(0, 0, -15.f);\n\n  ndk_helper::Mat4 mat = ndk_helper::Mat4::RotationX(M_PI / 3);\n  mat_model_ = mat * mat_model_;\n}\n\nvoid TeapotRenderer::UpdateViewport() {\n  // Init Projection matrices\n  int32_t viewport[4];\n  glGetIntegerv(GL_VIEWPORT, viewport);\n\n  const float CAM_NEAR = 5.f;\n  const float CAM_FAR = 10000.f;\n  if (viewport[2] < viewport[3]) {\n    float aspect =\n        static_cast<float>(viewport[2]) / static_cast<float>(viewport[3]);\n    mat_projection_ =\n        ndk_helper::Mat4::Perspective(aspect, 1.0f, CAM_NEAR, CAM_FAR);\n  } else {\n    float aspect =\n        static_cast<float>(viewport[3]) / static_cast<float>(viewport[2]);\n    mat_projection_ =\n        ndk_helper::Mat4::Perspective(1.0f, aspect, CAM_NEAR, CAM_FAR);\n  }\n}\n\nvoid TeapotRenderer::Unload() {\n  if (vbo_) {\n    glDeleteBuffers(1, &vbo_);\n    vbo_ = 0;\n  }\n\n  if (ibo_) {\n    glDeleteBuffers(1, &ibo_);\n    ibo_ = 0;\n  }\n\n  if (shader_param_.program_) {\n    glDeleteProgram(shader_param_.program_);\n    shader_param_.program_ = 0;\n  }\n}\n\nvoid TeapotRenderer::Update(float) {\n  const float CAM_X = 0.f;\n  const float CAM_Y = 0.f;\n  const float CAM_Z = 700.f;\n\n  mat_view_ = ndk_helper::Mat4::LookAt(ndk_helper::Vec3(CAM_X, CAM_Y, CAM_Z),\n                                       ndk_helper::Vec3(0.f, 0.f, 0.f),\n                                       ndk_helper::Vec3(0.f, 1.f, 0.f));\n\n  if (camera_) {\n    camera_->Update();\n    mat_view_ = camera_->GetTransformMatrix() * mat_view_ *\n                camera_->GetRotationMatrix() * mat_model_;\n  } else {\n    mat_view_ = mat_view_ * mat_model_;\n  }\n}\n\nvoid TeapotRenderer::Render() {\n  //\n  // Feed Projection and Model View matrices to the shaders\n  ndk_helper::Mat4 mat_vp = mat_projection_ * mat_view_;\n\n  // Bind the VBO\n  glBindBuffer(GL_ARRAY_BUFFER, vbo_);\n\n  int32_t iStride = sizeof(TEAPOT_VERTEX);\n  // Pass the vertex data\n  glVertexAttribPointer(ATTRIB_VERTEX, 3, GL_FLOAT, GL_FALSE, iStride, nullptr);\n  glEnableVertexAttribArray(ATTRIB_VERTEX);\n\n  glVertexAttribPointer(ATTRIB_NORMAL, 3, GL_FLOAT, GL_FALSE, iStride,\n                        reinterpret_cast<void*>(3 * sizeof(GLfloat)));\n  glEnableVertexAttribArray(ATTRIB_NORMAL);\n\n  // Bind the IB\n  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo_);\n\n  glUseProgram(shader_param_.program_);\n\n  TEAPOT_MATERIALS material = {\n      {1.0f, 0.5f, 0.5f},\n      {1.0f, 1.0f, 1.0f, 10.f},\n      {0.1f, 0.1f, 0.1f},\n  };\n\n  // Update uniforms\n  glUniform4f(shader_param_.material_diffuse_, material.diffuse_color[0],\n              material.diffuse_color[1], material.diffuse_color[2], 1.f);\n\n  glUniform4f(shader_param_.material_specular_, material.specular_color[0],\n              material.specular_color[1], material.specular_color[2],\n              material.specular_color[3]);\n  //\n  // using glUniform3fv here was troublesome\n  //\n  glUniform3f(shader_param_.material_ambient_, material.ambient_color[0],\n              material.ambient_color[1], material.ambient_color[2]);\n\n  glUniformMatrix4fv(shader_param_.matrix_projection_, 1, GL_FALSE,\n                     mat_vp.Ptr());\n  glUniformMatrix4fv(shader_param_.matrix_view_, 1, GL_FALSE, mat_view_.Ptr());\n  glUniform3f(shader_param_.light0_, 100.f, -200.f, -600.f);\n\n  glDrawElements(GL_TRIANGLES, num_indices_, GL_UNSIGNED_SHORT, nullptr);\n\n  glBindBuffer(GL_ARRAY_BUFFER, 0);\n  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);\n}\n\nbool TeapotRenderer::LoadShaders(SHADER_PARAMS* params, const char* strVsh,\n                                 const char* strFsh) {\n  GLuint program;\n  GLuint vert_shader, frag_shader;\n\n  // Create shader program\n  program = glCreateProgram();\n  LOGI(\"Created Shader %d\", program);\n\n  // Create and compile vertex shader\n  if (!ndk_helper::shader::CompileShader(&vert_shader, GL_VERTEX_SHADER,\n                                         strVsh)) {\n    LOGI(\"Failed to compile vertex shader\");\n    glDeleteProgram(program);\n    return false;\n  }\n\n  // Create and compile fragment shader\n  if (!ndk_helper::shader::CompileShader(&frag_shader, GL_FRAGMENT_SHADER,\n                                         strFsh)) {\n    LOGI(\"Failed to compile fragment shader\");\n    glDeleteProgram(program);\n    return false;\n  }\n\n  // Attach vertex shader to program\n  glAttachShader(program, vert_shader);\n\n  // Attach fragment shader to program\n  glAttachShader(program, frag_shader);\n\n  // Bind attribute locations\n  // this needs to be done prior to linking\n  glBindAttribLocation(program, ATTRIB_VERTEX, \"myVertex\");\n  glBindAttribLocation(program, ATTRIB_NORMAL, \"myNormal\");\n  glBindAttribLocation(program, ATTRIB_UV, \"myUV\");\n\n  // Link program\n  if (!ndk_helper::shader::LinkProgram(program)) {\n    LOGI(\"Failed to link program: %d\", program);\n\n    if (vert_shader) {\n      glDeleteShader(vert_shader);\n      vert_shader = 0;\n    }\n    if (frag_shader) {\n      glDeleteShader(frag_shader);\n      frag_shader = 0;\n    }\n    if (program) {\n      glDeleteProgram(program);\n    }\n\n    return false;\n  }\n\n  // Get uniform locations\n  params->matrix_projection_ = glGetUniformLocation(program, \"uPMatrix\");\n  params->matrix_view_ = glGetUniformLocation(program, \"uMVMatrix\");\n\n  params->light0_ = glGetUniformLocation(program, \"vLight0\");\n  params->material_diffuse_ = glGetUniformLocation(program, \"vMaterialDiffuse\");\n  params->material_ambient_ = glGetUniformLocation(program, \"vMaterialAmbient\");\n  params->material_specular_ =\n      glGetUniformLocation(program, \"vMaterialSpecular\");\n\n  // Release vertex and fragment shaders\n  if (vert_shader) glDeleteShader(vert_shader);\n  if (frag_shader) glDeleteShader(frag_shader);\n\n  params->program_ = program;\n  return true;\n}\n\nbool TeapotRenderer::Bind(ndk_helper::TapCamera* camera) {\n  camera_ = camera;\n  return true;\n}\n"
  },
  {
    "path": "teapots/classic-teapot/src/main/cpp/TeapotRenderer.h",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//--------------------------------------------------------------------------------\n// Teapot Renderer.h\n// Renderer for teapots\n//--------------------------------------------------------------------------------\n#ifndef _TEAPOTRENDERER_H\n#define _TEAPOTRENDERER_H\n\n//--------------------------------------------------------------------------------\n// Include files\n//--------------------------------------------------------------------------------\n#include <EGL/egl.h>\n#include <GLES/gl.h>\n#include <android/log.h>\n#include <android/native_window_jni.h>\n#include <android/sensor.h>\n#include <android_native_app_glue.h>\n#include <errno.h>\n#include <jni.h>\n\n#include <vector>\n\n#define CLASS_NAME \"android/app/NativeActivity\"\n#define APPLICATION_CLASS_NAME \"com/sample/teapot/TeapotApplication\"\n\n#include \"NDKHelper.h\"\n\nstruct TEAPOT_VERTEX {\n  float pos[3];\n  float normal[3];\n};\n\nenum SHADER_ATTRIBUTES {\n  ATTRIB_VERTEX,\n  ATTRIB_NORMAL,\n  ATTRIB_UV,\n};\n\nstruct SHADER_PARAMS {\n  GLuint program_;\n  GLuint light0_;\n  GLuint material_diffuse_;\n  GLuint material_ambient_;\n  GLuint material_specular_;\n\n  GLuint matrix_projection_;\n  GLuint matrix_view_;\n};\n\nstruct TEAPOT_MATERIALS {\n  float diffuse_color[3];\n  float specular_color[4];\n  float ambient_color[3];\n};\n\nclass TeapotRenderer {\n  int32_t num_indices_;\n  int32_t num_vertices_;\n  GLuint ibo_;\n  GLuint vbo_;\n\n  SHADER_PARAMS shader_param_;\n  bool LoadShaders(SHADER_PARAMS* params, const char* strVsh,\n                   const char* strFsh);\n\n  ndk_helper::Mat4 mat_projection_;\n  ndk_helper::Mat4 mat_view_;\n  ndk_helper::Mat4 mat_model_;\n\n  ndk_helper::TapCamera* camera_;\n\n public:\n  TeapotRenderer();\n  virtual ~TeapotRenderer();\n  void Init();\n  void Render();\n  void Update(float dTime);\n  bool Bind(ndk_helper::TapCamera* camera);\n  void Unload();\n  void UpdateViewport();\n};\n\n#endif\n"
  },
  {
    "path": "teapots/classic-teapot/src/main/cpp/libTeapotNativeActivity.map.txt",
    "content": "LIBNDK_CAMERA {\n  global:\n    ANativeActivity_onCreate;\n  local:\n    *;\n};\n"
  },
  {
    "path": "teapots/classic-teapot/src/main/cpp/teapot.inl",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//\n// Teapot.inl\n// Derived from WebGL sample\n// https://github.com/KhronosGroup/WebGL/blob/master/sdk/demos/google/shiny-teapot/teapot-streams.js\n//\n\nfloat teapotPositions[] = {17.83489990234375,\n                           0,\n                           30.573999404907227,\n                           16.452699661254883,\n                           -7.000179767608643,\n                           30.573999404907227,\n                           16.223100662231445,\n                           -6.902520179748535,\n                           31.51460075378418,\n                           17.586000442504883,\n                           0,\n                           31.51460075378418,\n                           16.48940086364746,\n                           -7.015810012817383,\n                           31.828100204467773,\n                           17.87470054626465,\n                           0,\n                           31.828100204467773,\n                           17.031099319458008,\n                           -7.246280193328857,\n                           31.51460075378418,\n                           18.46190071105957,\n                           0,\n                           31.51460075378418,\n                           17.62779998779297,\n                           -7.500199794769287,\n                           30.573999404907227,\n                           19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           12.662699699401855,\n                           -12.662699699401855,\n                           30.573999404907227,\n                           12.486100196838379,\n                           -12.486100196838379,\n                           31.51460075378418,\n                           12.690999984741211,\n                           -12.690999984741211,\n                           31.828100204467773,\n                           13.10789966583252,\n                           -13.10789966583252,\n                           31.51460075378418,\n                           13.56719970703125,\n                           -13.56719970703125,\n                           30.573999404907227,\n                           7.000179767608643,\n                           -16.452699661254883,\n                           30.573999404907227,\n                           6.902520179748535,\n                           -16.223100662231445,\n                           31.51460075378418,\n                           7.015810012817383,\n                           -16.48940086364746,\n                           31.828100204467773,\n                           7.246280193328857,\n                           -17.031099319458008,\n                           31.51460075378418,\n                           7.500199794769287,\n                           -17.62779998779297,\n                           30.573999404907227,\n                           0,\n                           -17.83489990234375,\n                           30.573999404907227,\n                           0,\n                           -17.586000442504883,\n                           31.51460075378418,\n                           0,\n                           -17.87470054626465,\n                           31.828100204467773,\n                           0,\n                           -18.46190071105957,\n                           31.51460075378418,\n                           0,\n                           -19.108800888061523,\n                           30.573999404907227,\n                           0,\n                           -17.83489990234375,\n                           30.573999404907227,\n                           -7.483870029449463,\n                           -16.452699661254883,\n                           30.573999404907227,\n                           -7.106579780578613,\n                           -16.223100662231445,\n                           31.51460075378418,\n                           0,\n                           -17.586000442504883,\n                           31.51460075378418,\n                           -7.07627010345459,\n                           -16.48940086364746,\n                           31.828100204467773,\n                           0,\n                           -17.87470054626465,\n                           31.828100204467773,\n                           -7.25383996963501,\n                           -17.031099319458008,\n                           31.51460075378418,\n                           0,\n                           -18.46190071105957,\n                           31.51460075378418,\n                           -7.500199794769287,\n                           -17.62779998779297,\n                           30.573999404907227,\n                           0,\n                           -19.108800888061523,\n                           30.573999404907227,\n                           -13.092700004577637,\n                           -12.662699699401855,\n                           30.573999404907227,\n                           -12.667499542236328,\n                           -12.486100196838379,\n                           31.51460075378418,\n                           -12.744799613952637,\n                           -12.690999984741211,\n                           31.828100204467773,\n                           -13.11460018157959,\n                           -13.10789966583252,\n                           31.51460075378418,\n                           -13.56719970703125,\n                           -13.56719970703125,\n                           30.573999404907227,\n                           -16.61389923095703,\n                           -7.000179767608643,\n                           30.573999404907227,\n                           -16.291099548339844,\n                           -6.902520179748535,\n                           31.51460075378418,\n                           -16.50950050354004,\n                           -7.015810012817383,\n                           31.828100204467773,\n                           -17.033599853515625,\n                           -7.246280193328857,\n                           31.51460075378418,\n                           -17.62779998779297,\n                           -7.500199794769287,\n                           30.573999404907227,\n                           -17.83489990234375,\n                           0,\n                           30.573999404907227,\n                           -17.586000442504883,\n                           0,\n                           31.51460075378418,\n                           -17.87470054626465,\n                           0,\n                           31.828100204467773,\n                           -18.46190071105957,\n                           0,\n                           31.51460075378418,\n                           -19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           -17.83489990234375,\n                           0,\n                           30.573999404907227,\n                           -16.452699661254883,\n                           7.000179767608643,\n                           30.573999404907227,\n                           -16.223100662231445,\n                           6.902520179748535,\n                           31.51460075378418,\n                           -17.586000442504883,\n                           0,\n                           31.51460075378418,\n                           -16.48940086364746,\n                           7.015810012817383,\n                           31.828100204467773,\n                           -17.87470054626465,\n                           0,\n                           31.828100204467773,\n                           -17.031099319458008,\n                           7.246280193328857,\n                           31.51460075378418,\n                           -18.46190071105957,\n                           0,\n                           31.51460075378418,\n                           -17.62779998779297,\n                           7.500199794769287,\n                           30.573999404907227,\n                           -19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           -12.662699699401855,\n                           12.662699699401855,\n                           30.573999404907227,\n                           -12.486100196838379,\n                           12.486100196838379,\n                           31.51460075378418,\n                           -12.690999984741211,\n                           12.690999984741211,\n                           31.828100204467773,\n                           -13.10789966583252,\n                           13.10789966583252,\n                           31.51460075378418,\n                           -13.56719970703125,\n                           13.56719970703125,\n                           30.573999404907227,\n                           -7.000179767608643,\n                           16.452699661254883,\n                           30.573999404907227,\n                           -6.902520179748535,\n                           16.223100662231445,\n                           31.51460075378418,\n                           -7.015810012817383,\n                           16.48940086364746,\n                           31.828100204467773,\n                           -7.246280193328857,\n                           17.031099319458008,\n                           31.51460075378418,\n                           -7.500199794769287,\n                           17.62779998779297,\n                           30.573999404907227,\n                           0,\n                           17.83489990234375,\n                           30.573999404907227,\n                           0,\n                           17.586000442504883,\n                           31.51460075378418,\n                           0,\n                           17.87470054626465,\n                           31.828100204467773,\n                           0,\n                           18.46190071105957,\n                           31.51460075378418,\n                           0,\n                           19.108800888061523,\n                           30.573999404907227,\n                           0,\n                           17.83489990234375,\n                           30.573999404907227,\n                           7.000179767608643,\n                           16.452699661254883,\n                           30.573999404907227,\n                           6.902520179748535,\n                           16.223100662231445,\n                           31.51460075378418,\n                           0,\n                           17.586000442504883,\n                           31.51460075378418,\n                           7.015810012817383,\n                           16.48940086364746,\n                           31.828100204467773,\n                           0,\n                           17.87470054626465,\n                           31.828100204467773,\n                           7.246280193328857,\n                           17.031099319458008,\n                           31.51460075378418,\n                           0,\n                           18.46190071105957,\n                           31.51460075378418,\n                           7.500199794769287,\n                           17.62779998779297,\n                           30.573999404907227,\n                           0,\n                           19.108800888061523,\n                           30.573999404907227,\n                           12.662699699401855,\n                           12.662699699401855,\n                           30.573999404907227,\n                           12.486100196838379,\n                           12.486100196838379,\n                           31.51460075378418,\n                           12.690999984741211,\n                           12.690999984741211,\n                           31.828100204467773,\n                           13.10789966583252,\n                           13.10789966583252,\n                           31.51460075378418,\n                           13.56719970703125,\n                           13.56719970703125,\n                           30.573999404907227,\n                           16.452699661254883,\n                           7.000179767608643,\n                           30.573999404907227,\n                           16.223100662231445,\n                           6.902520179748535,\n                           31.51460075378418,\n                           16.48940086364746,\n                           7.015810012817383,\n                           31.828100204467773,\n                           17.031099319458008,\n                           7.246280193328857,\n                           31.51460075378418,\n                           17.62779998779297,\n                           7.500199794769287,\n                           30.573999404907227,\n                           17.83489990234375,\n                           0,\n                           30.573999404907227,\n                           17.586000442504883,\n                           0,\n                           31.51460075378418,\n                           17.87470054626465,\n                           0,\n                           31.828100204467773,\n                           18.46190071105957,\n                           0,\n                           31.51460075378418,\n                           19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           17.62779998779297,\n                           -7.500199794769287,\n                           30.573999404907227,\n                           19.785400390625,\n                           -8.418190002441406,\n                           25.572900772094727,\n                           21.447599411010742,\n                           0,\n                           25.572900772094727,\n                           21.667600631713867,\n                           -9.218990325927734,\n                           20.661399841308594,\n                           23.487899780273438,\n                           0,\n                           20.661399841308594,\n                           22.99880027770996,\n                           -9.785409927368164,\n                           15.928999900817871,\n                           24.930999755859375,\n                           0,\n                           15.928999900817871,\n                           23.503799438476562,\n                           -10.000300407409668,\n                           11.465299606323242,\n                           25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           13.56719970703125,\n                           -13.56719970703125,\n                           30.573999404907227,\n                           15.227800369262695,\n                           -15.227800369262695,\n                           25.572900772094727,\n                           16.67639923095703,\n                           -16.67639923095703,\n                           20.661399841308594,\n                           17.701000213623047,\n                           -17.701000213623047,\n                           15.928999900817871,\n                           18.089599609375,\n                           -18.089599609375,\n                           11.465299606323242,\n                           7.500199794769287,\n                           -17.62779998779297,\n                           30.573999404907227,\n                           8.418190002441406,\n                           -19.785400390625,\n                           25.572900772094727,\n                           9.218990325927734,\n                           -21.667600631713867,\n                           20.661399841308594,\n                           9.785409927368164,\n                           -22.99880027770996,\n                           15.928999900817871,\n                           10.000300407409668,\n                           -23.503799438476562,\n                           11.465299606323242,\n                           0,\n                           -19.108800888061523,\n                           30.573999404907227,\n                           0,\n                           -21.447599411010742,\n                           25.572900772094727,\n                           0,\n                           -23.487899780273438,\n                           20.661399841308594,\n                           0,\n                           -24.930999755859375,\n                           15.928999900817871,\n                           0,\n                           -25.4783992767334,\n                           11.465299606323242,\n                           0,\n                           -19.108800888061523,\n                           30.573999404907227,\n                           -7.500199794769287,\n                           -17.62779998779297,\n                           30.573999404907227,\n                           -8.418190002441406,\n                           -19.785400390625,\n                           25.572900772094727,\n                           0,\n                           -21.447599411010742,\n                           25.572900772094727,\n                           -9.218990325927734,\n                           -21.667600631713867,\n                           20.661399841308594,\n                           0,\n                           -23.487899780273438,\n                           20.661399841308594,\n                           -9.785409927368164,\n                           -22.99880027770996,\n                           15.928999900817871,\n                           0,\n                           -24.930999755859375,\n                           15.928999900817871,\n                           -10.000300407409668,\n                           -23.503799438476562,\n                           11.465299606323242,\n                           0,\n                           -25.4783992767334,\n                           11.465299606323242,\n                           -13.56719970703125,\n                           -13.56719970703125,\n                           30.573999404907227,\n                           -15.227800369262695,\n                           -15.227800369262695,\n                           25.572900772094727,\n                           -16.67639923095703,\n                           -16.67639923095703,\n                           20.661399841308594,\n                           -17.701000213623047,\n                           -17.701000213623047,\n                           15.928999900817871,\n                           -18.089599609375,\n                           -18.089599609375,\n                           11.465299606323242,\n                           -17.62779998779297,\n                           -7.500199794769287,\n                           30.573999404907227,\n                           -19.785400390625,\n                           -8.418190002441406,\n                           25.572900772094727,\n                           -21.667600631713867,\n                           -9.218990325927734,\n                           20.661399841308594,\n                           -22.99880027770996,\n                           -9.785409927368164,\n                           15.928999900817871,\n                           -23.503799438476562,\n                           -10.000300407409668,\n                           11.465299606323242,\n                           -19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           -21.447599411010742,\n                           0,\n                           25.572900772094727,\n                           -23.487899780273438,\n                           0,\n                           20.661399841308594,\n                           -24.930999755859375,\n                           0,\n                           15.928999900817871,\n                           -25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           -19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           -17.62779998779297,\n                           7.500199794769287,\n                           30.573999404907227,\n                           -19.785400390625,\n                           8.418190002441406,\n                           25.572900772094727,\n                           -21.447599411010742,\n                           0,\n                           25.572900772094727,\n                           -21.667600631713867,\n                           9.218990325927734,\n                           20.661399841308594,\n                           -23.487899780273438,\n                           0,\n                           20.661399841308594,\n                           -22.99880027770996,\n                           9.785409927368164,\n                           15.928999900817871,\n                           -24.930999755859375,\n                           0,\n                           15.928999900817871,\n                           -23.503799438476562,\n                           10.000300407409668,\n                           11.465299606323242,\n                           -25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           -13.56719970703125,\n                           13.56719970703125,\n                           30.573999404907227,\n                           -15.227800369262695,\n                           15.227800369262695,\n                           25.572900772094727,\n                           -16.67639923095703,\n                           16.67639923095703,\n                           20.661399841308594,\n                           -17.701000213623047,\n                           17.701000213623047,\n                           15.928999900817871,\n                           -18.089599609375,\n                           18.089599609375,\n                           11.465299606323242,\n                           -7.500199794769287,\n                           17.62779998779297,\n                           30.573999404907227,\n                           -8.418190002441406,\n                           19.785400390625,\n                           25.572900772094727,\n                           -9.218990325927734,\n                           21.667600631713867,\n                           20.661399841308594,\n                           -9.785409927368164,\n                           22.99880027770996,\n                           15.928999900817871,\n                           -10.000300407409668,\n                           23.503799438476562,\n                           11.465299606323242,\n                           0,\n                           19.108800888061523,\n                           30.573999404907227,\n                           0,\n                           21.447599411010742,\n                           25.572900772094727,\n                           0,\n                           23.487899780273438,\n                           20.661399841308594,\n                           0,\n                           24.930999755859375,\n                           15.928999900817871,\n                           0,\n                           25.4783992767334,\n                           11.465299606323242,\n                           0,\n                           19.108800888061523,\n                           30.573999404907227,\n                           7.500199794769287,\n                           17.62779998779297,\n                           30.573999404907227,\n                           8.418190002441406,\n                           19.785400390625,\n                           25.572900772094727,\n                           0,\n                           21.447599411010742,\n                           25.572900772094727,\n                           9.218990325927734,\n                           21.667600631713867,\n                           20.661399841308594,\n                           0,\n                           23.487899780273438,\n                           20.661399841308594,\n                           9.785409927368164,\n                           22.99880027770996,\n                           15.928999900817871,\n                           0,\n                           24.930999755859375,\n                           15.928999900817871,\n                           10.000300407409668,\n                           23.503799438476562,\n                           11.465299606323242,\n                           0,\n                           25.4783992767334,\n                           11.465299606323242,\n                           13.56719970703125,\n                           13.56719970703125,\n                           30.573999404907227,\n                           15.227800369262695,\n                           15.227800369262695,\n                           25.572900772094727,\n                           16.67639923095703,\n                           16.67639923095703,\n                           20.661399841308594,\n                           17.701000213623047,\n                           17.701000213623047,\n                           15.928999900817871,\n                           18.089599609375,\n                           18.089599609375,\n                           11.465299606323242,\n                           17.62779998779297,\n                           7.500199794769287,\n                           30.573999404907227,\n                           19.785400390625,\n                           8.418190002441406,\n                           25.572900772094727,\n                           21.667600631713867,\n                           9.218990325927734,\n                           20.661399841308594,\n                           22.99880027770996,\n                           9.785409927368164,\n                           15.928999900817871,\n                           23.503799438476562,\n                           10.000300407409668,\n                           11.465299606323242,\n                           19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           21.447599411010742,\n                           0,\n                           25.572900772094727,\n                           23.487899780273438,\n                           0,\n                           20.661399841308594,\n                           24.930999755859375,\n                           0,\n                           15.928999900817871,\n                           25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           23.503799438476562,\n                           -10.000300407409668,\n                           11.465299606323242,\n                           22.5856990814209,\n                           -9.609620094299316,\n                           7.688300132751465,\n                           24.48310089111328,\n                           0,\n                           7.688300132751465,\n                           20.565799713134766,\n                           -8.750229835510254,\n                           4.89661979675293,\n                           22.29360008239746,\n                           0,\n                           4.89661979675293,\n                           18.54599952697754,\n                           -7.890830039978027,\n                           3.0006699562072754,\n                           20.104000091552734,\n                           0,\n                           3.0006699562072754,\n                           17.62779998779297,\n                           -7.500199794769287,\n                           1.9108799695968628,\n                           19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           18.089599609375,\n                           -18.089599609375,\n                           11.465299606323242,\n                           17.382999420166016,\n                           -17.382999420166016,\n                           7.688300132751465,\n                           15.828399658203125,\n                           -15.828399658203125,\n                           4.89661979675293,\n                           14.273900032043457,\n                           -14.273900032043457,\n                           3.0006699562072754,\n                           13.56719970703125,\n                           -13.56719970703125,\n                           1.9108799695968628,\n                           10.000300407409668,\n                           -23.503799438476562,\n                           11.465299606323242,\n                           9.609620094299316,\n                           -22.5856990814209,\n                           7.688300132751465,\n                           8.750229835510254,\n                           -20.565799713134766,\n                           4.89661979675293,\n                           7.890830039978027,\n                           -18.54599952697754,\n                           3.0006699562072754,\n                           7.500199794769287,\n                           -17.62779998779297,\n                           1.9108799695968628,\n                           0,\n                           -25.4783992767334,\n                           11.465299606323242,\n                           0,\n                           -24.48310089111328,\n                           7.688300132751465,\n                           0,\n                           -22.29360008239746,\n                           4.89661979675293,\n                           0,\n                           -20.104000091552734,\n                           3.0006699562072754,\n                           0,\n                           -19.108800888061523,\n                           1.9108799695968628,\n                           0,\n                           -25.4783992767334,\n                           11.465299606323242,\n                           -10.000300407409668,\n                           -23.503799438476562,\n                           11.465299606323242,\n                           -9.609620094299316,\n                           -22.5856990814209,\n                           7.688300132751465,\n                           0,\n                           -24.48310089111328,\n                           7.688300132751465,\n                           -8.750229835510254,\n                           -20.565799713134766,\n                           4.89661979675293,\n                           0,\n                           -22.29360008239746,\n                           4.89661979675293,\n                           -7.890830039978027,\n                           -18.54599952697754,\n                           3.0006699562072754,\n                           0,\n                           -20.104000091552734,\n                           3.0006699562072754,\n                           -7.500199794769287,\n                           -17.62779998779297,\n                           1.9108799695968628,\n                           0,\n                           -19.108800888061523,\n                           1.9108799695968628,\n                           -18.089599609375,\n                           -18.089599609375,\n                           11.465299606323242,\n                           -17.382999420166016,\n                           -17.382999420166016,\n                           7.688300132751465,\n                           -15.828399658203125,\n                           -15.828399658203125,\n                           4.89661979675293,\n                           -14.273900032043457,\n                           -14.273900032043457,\n                           3.0006699562072754,\n                           -13.56719970703125,\n                           -13.56719970703125,\n                           1.9108799695968628,\n                           -23.503799438476562,\n                           -10.000300407409668,\n                           11.465299606323242,\n                           -22.5856990814209,\n                           -9.609620094299316,\n                           7.688300132751465,\n                           -20.565799713134766,\n                           -8.750229835510254,\n                           4.89661979675293,\n                           -18.54599952697754,\n                           -7.890830039978027,\n                           3.0006699562072754,\n                           -17.62779998779297,\n                           -7.500199794769287,\n                           1.9108799695968628,\n                           -25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           -24.48310089111328,\n                           0,\n                           7.688300132751465,\n                           -22.29360008239746,\n                           0,\n                           4.89661979675293,\n                           -20.104000091552734,\n                           0,\n                           3.0006699562072754,\n                           -19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           -25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           -23.503799438476562,\n                           10.000300407409668,\n                           11.465299606323242,\n                           -22.5856990814209,\n                           9.609620094299316,\n                           7.688300132751465,\n                           -24.48310089111328,\n                           0,\n                           7.688300132751465,\n                           -20.565799713134766,\n                           8.750229835510254,\n                           4.89661979675293,\n                           -22.29360008239746,\n                           0,\n                           4.89661979675293,\n                           -18.54599952697754,\n                           7.890830039978027,\n                           3.0006699562072754,\n                           -20.104000091552734,\n                           0,\n                           3.0006699562072754,\n                           -17.62779998779297,\n                           7.500199794769287,\n                           1.9108799695968628,\n                           -19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           -18.089599609375,\n                           18.089599609375,\n                           11.465299606323242,\n                           -17.382999420166016,\n                           17.382999420166016,\n                           7.688300132751465,\n                           -15.828399658203125,\n                           15.828399658203125,\n                           4.89661979675293,\n                           -14.273900032043457,\n                           14.273900032043457,\n                           3.0006699562072754,\n                           -13.56719970703125,\n                           13.56719970703125,\n                           1.9108799695968628,\n                           -10.000300407409668,\n                           23.503799438476562,\n                           11.465299606323242,\n                           -9.609620094299316,\n                           22.5856990814209,\n                           7.688300132751465,\n                           -8.750229835510254,\n                           20.565799713134766,\n                           4.89661979675293,\n                           -7.890830039978027,\n                           18.54599952697754,\n                           3.0006699562072754,\n                           -7.500199794769287,\n                           17.62779998779297,\n                           1.9108799695968628,\n                           0,\n                           25.4783992767334,\n                           11.465299606323242,\n                           0,\n                           24.48310089111328,\n                           7.688300132751465,\n                           0,\n                           22.29360008239746,\n                           4.89661979675293,\n                           0,\n                           20.104000091552734,\n                           3.0006699562072754,\n                           0,\n                           19.108800888061523,\n                           1.9108799695968628,\n                           0,\n                           25.4783992767334,\n                           11.465299606323242,\n                           10.000300407409668,\n                           23.503799438476562,\n                           11.465299606323242,\n                           9.609620094299316,\n                           22.5856990814209,\n                           7.688300132751465,\n                           0,\n                           24.48310089111328,\n                           7.688300132751465,\n                           8.750229835510254,\n                           20.565799713134766,\n                           4.89661979675293,\n                           0,\n                           22.29360008239746,\n                           4.89661979675293,\n                           7.890830039978027,\n                           18.54599952697754,\n                           3.0006699562072754,\n                           0,\n                           20.104000091552734,\n                           3.0006699562072754,\n                           7.500199794769287,\n                           17.62779998779297,\n                           1.9108799695968628,\n                           0,\n                           19.108800888061523,\n                           1.9108799695968628,\n                           18.089599609375,\n                           18.089599609375,\n                           11.465299606323242,\n                           17.382999420166016,\n                           17.382999420166016,\n                           7.688300132751465,\n                           15.828399658203125,\n                           15.828399658203125,\n                           4.89661979675293,\n                           14.273900032043457,\n                           14.273900032043457,\n                           3.0006699562072754,\n                           13.56719970703125,\n                           13.56719970703125,\n                           1.9108799695968628,\n                           23.503799438476562,\n                           10.000300407409668,\n                           11.465299606323242,\n                           22.5856990814209,\n                           9.609620094299316,\n                           7.688300132751465,\n                           20.565799713134766,\n                           8.750229835510254,\n                           4.89661979675293,\n                           18.54599952697754,\n                           7.890830039978027,\n                           3.0006699562072754,\n                           17.62779998779297,\n                           7.500199794769287,\n                           1.9108799695968628,\n                           25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           24.48310089111328,\n                           0,\n                           7.688300132751465,\n                           22.29360008239746,\n                           0,\n                           4.89661979675293,\n                           20.104000091552734,\n                           0,\n                           3.0006699562072754,\n                           19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           17.62779998779297,\n                           -7.500199794769287,\n                           1.9108799695968628,\n                           17.228500366210938,\n                           -7.330269813537598,\n                           1.2092299461364746,\n                           18.675800323486328,\n                           0,\n                           1.2092299461364746,\n                           15.093799591064453,\n                           -6.422039985656738,\n                           0.5971490144729614,\n                           16.361900329589844,\n                           0,\n                           0.5971490144729614,\n                           9.819259643554688,\n                           -4.177840232849121,\n                           0.16421599686145782,\n                           10.644200325012207,\n                           0,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           13.56719970703125,\n                           -13.56719970703125,\n                           1.9108799695968628,\n                           13.25979995727539,\n                           -13.25979995727539,\n                           1.2092299461364746,\n                           11.616900444030762,\n                           -11.616900444030762,\n                           0.5971490144729614,\n                           7.557370185852051,\n                           -7.557370185852051,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           7.500199794769287,\n                           -17.62779998779297,\n                           1.9108799695968628,\n                           7.330269813537598,\n                           -17.228500366210938,\n                           1.2092299461364746,\n                           6.422039985656738,\n                           -15.093799591064453,\n                           0.5971490144729614,\n                           4.177840232849121,\n                           -9.819259643554688,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           -19.108800888061523,\n                           1.9108799695968628,\n                           0,\n                           -18.675800323486328,\n                           1.2092299461364746,\n                           0,\n                           -16.361900329589844,\n                           0.5971490144729614,\n                           0,\n                           -10.644200325012207,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           -19.108800888061523,\n                           1.9108799695968628,\n                           -7.500199794769287,\n                           -17.62779998779297,\n                           1.9108799695968628,\n                           -7.330269813537598,\n                           -17.228500366210938,\n                           1.2092299461364746,\n                           0,\n                           -18.675800323486328,\n                           1.2092299461364746,\n                           -6.422039985656738,\n                           -15.093799591064453,\n                           0.5971490144729614,\n                           0,\n                           -16.361900329589844,\n                           0.5971490144729614,\n                           -4.177840232849121,\n                           -9.819259643554688,\n                           0.16421599686145782,\n                           0,\n                           -10.644200325012207,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           -13.56719970703125,\n                           -13.56719970703125,\n                           1.9108799695968628,\n                           -13.25979995727539,\n                           -13.25979995727539,\n                           1.2092299461364746,\n                           -11.616900444030762,\n                           -11.616900444030762,\n                           0.5971490144729614,\n                           -7.557370185852051,\n                           -7.557370185852051,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           -17.62779998779297,\n                           -7.500199794769287,\n                           1.9108799695968628,\n                           -17.228500366210938,\n                           -7.330269813537598,\n                           1.2092299461364746,\n                           -15.093799591064453,\n                           -6.422039985656738,\n                           0.5971490144729614,\n                           -9.819259643554688,\n                           -4.177840232849121,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           -19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           -18.675800323486328,\n                           0,\n                           1.2092299461364746,\n                           -16.361900329589844,\n                           0,\n                           0.5971490144729614,\n                           -10.644200325012207,\n                           0,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           -19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           -17.62779998779297,\n                           7.500199794769287,\n                           1.9108799695968628,\n                           -17.228500366210938,\n                           7.330269813537598,\n                           1.2092299461364746,\n                           -18.675800323486328,\n                           0,\n                           1.2092299461364746,\n                           -15.093799591064453,\n                           6.422039985656738,\n                           0.5971490144729614,\n                           -16.361900329589844,\n                           0,\n                           0.5971490144729614,\n                           -9.819259643554688,\n                           4.177840232849121,\n                           0.16421599686145782,\n                           -10.644200325012207,\n                           0,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           -13.56719970703125,\n                           13.56719970703125,\n                           1.9108799695968628,\n                           -13.25979995727539,\n                           13.25979995727539,\n                           1.2092299461364746,\n                           -11.616900444030762,\n                           11.616900444030762,\n                           0.5971490144729614,\n                           -7.557370185852051,\n                           7.557370185852051,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           -7.500199794769287,\n                           17.62779998779297,\n                           1.9108799695968628,\n                           -7.330269813537598,\n                           17.228500366210938,\n                           1.2092299461364746,\n                           -6.422039985656738,\n                           15.093799591064453,\n                           0.5971490144729614,\n                           -4.177840232849121,\n                           9.819259643554688,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           19.108800888061523,\n                           1.9108799695968628,\n                           0,\n                           18.675800323486328,\n                           1.2092299461364746,\n                           0,\n                           16.361900329589844,\n                           0.5971490144729614,\n                           0,\n                           10.644200325012207,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           19.108800888061523,\n                           1.9108799695968628,\n                           7.500199794769287,\n                           17.62779998779297,\n                           1.9108799695968628,\n                           7.330269813537598,\n                           17.228500366210938,\n                           1.2092299461364746,\n                           0,\n                           18.675800323486328,\n                           1.2092299461364746,\n                           6.422039985656738,\n                           15.093799591064453,\n                           0.5971490144729614,\n                           0,\n                           16.361900329589844,\n                           0.5971490144729614,\n                           4.177840232849121,\n                           9.819259643554688,\n                           0.16421599686145782,\n                           0,\n                           10.644200325012207,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           13.56719970703125,\n                           13.56719970703125,\n                           1.9108799695968628,\n                           13.25979995727539,\n                           13.25979995727539,\n                           1.2092299461364746,\n                           11.616900444030762,\n                           11.616900444030762,\n                           0.5971490144729614,\n                           7.557370185852051,\n                           7.557370185852051,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           17.62779998779297,\n                           7.500199794769287,\n                           1.9108799695968628,\n                           17.228500366210938,\n                           7.330269813537598,\n                           1.2092299461364746,\n                           15.093799591064453,\n                           6.422039985656738,\n                           0.5971490144729614,\n                           9.819259643554688,\n                           4.177840232849121,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           18.675800323486328,\n                           0,\n                           1.2092299461364746,\n                           16.361900329589844,\n                           0,\n                           0.5971490144729614,\n                           10.644200325012207,\n                           0,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           -20.382699966430664,\n                           0,\n                           25.796899795532227,\n                           -20.1835994720459,\n                           -2.149739980697632,\n                           26.244699478149414,\n                           -26.511600494384766,\n                           -2.149739980697632,\n                           26.192899703979492,\n                           -26.334299087524414,\n                           0,\n                           25.752099990844727,\n                           -31.156299591064453,\n                           -2.149739980697632,\n                           25.830400466918945,\n                           -30.733299255371094,\n                           0,\n                           25.438600540161133,\n                           -34.016998291015625,\n                           -2.149739980697632,\n                           24.846500396728516,\n                           -33.46030044555664,\n                           0,\n                           24.587600708007812,\n                           -34.99290084838867,\n                           -2.149739980697632,\n                           22.930500030517578,\n                           -34.39580154418945,\n                           0,\n                           22.930500030517578,\n                           -19.74570083618164,\n                           -2.8663198947906494,\n                           27.229999542236328,\n                           -26.901599884033203,\n                           -2.8663198947906494,\n                           27.162799835205078,\n                           -32.08679962158203,\n                           -2.8663198947906494,\n                           26.69260025024414,\n                           -35.241798400878906,\n                           -2.8663198947906494,\n                           25.416200637817383,\n                           -36.30670166015625,\n                           -2.8663198947906494,\n                           22.930500030517578,\n                           -19.30780029296875,\n                           -2.149739980697632,\n                           28.215299606323242,\n                           -27.29159927368164,\n                           -2.149739980697632,\n                           28.132699966430664,\n                           -33.017398834228516,\n                           -2.149739980697632,\n                           27.55470085144043,\n                           -36.46649932861328,\n                           -2.149739980697632,\n                           25.98579978942871,\n                           -37.620399475097656,\n                           -2.149739980697632,\n                           22.930500030517578,\n                           -19.108800888061523,\n                           0,\n                           28.66320037841797,\n                           -27.468900680541992,\n                           0,\n                           28.57360076904297,\n                           -33.440399169921875,\n                           0,\n                           27.94659996032715,\n                           -37.02330017089844,\n                           0,\n                           26.244699478149414,\n                           -38.21760177612305,\n                           0,\n                           22.930500030517578,\n                           -19.108800888061523,\n                           0,\n                           28.66320037841797,\n                           -19.30780029296875,\n                           2.149739980697632,\n                           28.215299606323242,\n                           -27.29159927368164,\n                           2.149739980697632,\n                           28.132699966430664,\n                           -27.468900680541992,\n                           0,\n                           28.57360076904297,\n                           -33.017398834228516,\n                           2.149739980697632,\n                           27.55470085144043,\n                           -33.440399169921875,\n                           0,\n                           27.94659996032715,\n                           -36.46649932861328,\n                           2.149739980697632,\n                           25.98579978942871,\n                           -37.02330017089844,\n                           0,\n                           26.244699478149414,\n                           -37.620399475097656,\n                           2.149739980697632,\n                           22.930500030517578,\n                           -38.21760177612305,\n                           0,\n                           22.930500030517578,\n                           -19.74570083618164,\n                           2.8663198947906494,\n                           27.229999542236328,\n                           -26.901599884033203,\n                           2.8663198947906494,\n                           27.162799835205078,\n                           -32.08679962158203,\n                           2.8663198947906494,\n                           26.69260025024414,\n                           -35.241798400878906,\n                           2.8663198947906494,\n                           25.416200637817383,\n                           -36.30670166015625,\n                           2.8663198947906494,\n                           22.930500030517578,\n                           -20.1835994720459,\n                           2.149739980697632,\n                           26.244699478149414,\n                           -26.511600494384766,\n                           2.149739980697632,\n                           26.192899703979492,\n                           -31.156299591064453,\n                           2.149739980697632,\n                           25.830400466918945,\n                           -34.016998291015625,\n                           2.149739980697632,\n                           24.846500396728516,\n                           -34.99290084838867,\n                           2.149739980697632,\n                           22.930500030517578,\n                           -20.382699966430664,\n                           0,\n                           25.796899795532227,\n                           -26.334299087524414,\n                           0,\n                           25.752099990844727,\n                           -30.733299255371094,\n                           0,\n                           25.438600540161133,\n                           -33.46030044555664,\n                           0,\n                           24.587600708007812,\n                           -34.39580154418945,\n                           0,\n                           22.930500030517578,\n                           -34.39580154418945,\n                           0,\n                           22.930500030517578,\n                           -34.99290084838867,\n                           -2.149739980697632,\n                           22.930500030517578,\n                           -34.44089889526367,\n                           -2.149739980697632,\n                           20.082199096679688,\n                           -33.89820098876953,\n                           0,\n                           20.33289909362793,\n                           -32.711299896240234,\n                           -2.149739980697632,\n                           16.81529998779297,\n                           -32.32569885253906,\n                           0,\n                           17.197900772094727,\n                           -29.69420051574707,\n                           -2.149739980697632,\n                           13.590499877929688,\n                           -29.558900833129883,\n                           0,\n                           14.062899589538574,\n                           -25.279300689697266,\n                           -2.149739980697632,\n                           10.8681001663208,\n                           -25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           -36.30670166015625,\n                           -2.8663198947906494,\n                           22.930500030517578,\n                           -35.6348991394043,\n                           -2.8663198947906494,\n                           19.530500411987305,\n                           -33.55979919433594,\n                           -2.8663198947906494,\n                           15.973699569702148,\n                           -29.99180030822754,\n                           -2.8663198947906494,\n                           12.551300048828125,\n                           -24.841400146484375,\n                           -2.8663198947906494,\n                           9.554389953613281,\n                           -37.620399475097656,\n                           -2.149739980697632,\n                           22.930500030517578,\n                           -36.82889938354492,\n                           -2.149739980697632,\n                           18.97879981994629,\n                           -34.408199310302734,\n                           -2.149739980697632,\n                           15.132100105285645,\n                           -30.289499282836914,\n                           -2.149739980697632,\n                           11.512200355529785,\n                           -24.403499603271484,\n                           -2.149739980697632,\n                           8.240659713745117,\n                           -38.21760177612305,\n                           0,\n                           22.930500030517578,\n                           -37.37160110473633,\n                           0,\n                           18.728099822998047,\n                           -34.79389953613281,\n                           0,\n                           14.749600410461426,\n                           -30.424800872802734,\n                           0,\n                           11.039799690246582,\n                           -24.204500198364258,\n                           0,\n                           7.643509864807129,\n                           -38.21760177612305,\n                           0,\n                           22.930500030517578,\n                           -37.620399475097656,\n                           2.149739980697632,\n                           22.930500030517578,\n                           -36.82889938354492,\n                           2.149739980697632,\n                           18.97879981994629,\n                           -37.37160110473633,\n                           0,\n                           18.728099822998047,\n                           -34.408199310302734,\n                           2.149739980697632,\n                           15.132100105285645,\n                           -34.79389953613281,\n                           0,\n                           14.749600410461426,\n                           -30.289499282836914,\n                           2.149739980697632,\n                           11.512200355529785,\n                           -30.424800872802734,\n                           0,\n                           11.039799690246582,\n                           -24.403499603271484,\n                           2.149739980697632,\n                           8.240659713745117,\n                           -24.204500198364258,\n                           0,\n                           7.643509864807129,\n                           -36.30670166015625,\n                           2.8663198947906494,\n                           22.930500030517578,\n                           -35.6348991394043,\n                           2.8663198947906494,\n                           19.530500411987305,\n                           -33.55979919433594,\n                           2.8663198947906494,\n                           15.973699569702148,\n                           -29.99180030822754,\n                           2.8663198947906494,\n                           12.551300048828125,\n                           -24.841400146484375,\n                           2.8663198947906494,\n                           9.554389953613281,\n                           -34.99290084838867,\n                           2.149739980697632,\n                           22.930500030517578,\n                           -34.44089889526367,\n                           2.149739980697632,\n                           20.082199096679688,\n                           -32.711299896240234,\n                           2.149739980697632,\n                           16.81529998779297,\n                           -29.69420051574707,\n                           2.149739980697632,\n                           13.590499877929688,\n                           -25.279300689697266,\n                           2.149739980697632,\n                           10.8681001663208,\n                           -34.39580154418945,\n                           0,\n                           22.930500030517578,\n                           -33.89820098876953,\n                           0,\n                           20.33289909362793,\n                           -32.32569885253906,\n                           0,\n                           17.197900772094727,\n                           -29.558900833129883,\n                           0,\n                           14.062899589538574,\n                           -25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           21.656600952148438,\n                           0,\n                           18.15329933166504,\n                           21.656600952148438,\n                           -4.729420185089111,\n                           16.511199951171875,\n                           28.233999252319336,\n                           -4.270359992980957,\n                           18.339000701904297,\n                           27.76740074157715,\n                           0,\n                           19.55660057067871,\n                           31.011899948120117,\n                           -3.2604401111602783,\n                           22.221399307250977,\n                           30.4148006439209,\n                           0,\n                           22.930500030517578,\n                           32.59560012817383,\n                           -2.2505099773406982,\n                           26.764400482177734,\n                           31.867900848388672,\n                           0,\n                           27.020999908447266,\n                           35.5900993347168,\n                           -1.791450023651123,\n                           30.573999404907227,\n                           34.39580154418945,\n                           0,\n                           30.573999404907227,\n                           21.656600952148438,\n                           -6.3059000968933105,\n                           12.89840030670166,\n                           29.260299682617188,\n                           -5.693819999694824,\n                           15.660200119018555,\n                           32.32569885253906,\n                           -4.347249984741211,\n                           20.661399841308594,\n                           34.19670104980469,\n                           -3.0006699562072754,\n                           26.199899673461914,\n                           38.21760177612305,\n                           -2.3886001110076904,\n                           30.573999404907227,\n                           21.656600952148438,\n                           -4.729420185089111,\n                           9.285670280456543,\n                           30.286699295043945,\n                           -4.270359992980957,\n                           12.981499671936035,\n                           33.639400482177734,\n                           -3.2604401111602783,\n                           19.101299285888672,\n                           35.79790115356445,\n                           -2.2505099773406982,\n                           25.635400772094727,\n                           40.845001220703125,\n                           -1.791450023651123,\n                           30.573999404907227,\n                           21.656600952148438,\n                           0,\n                           7.643509864807129,\n                           30.75320053100586,\n                           0,\n                           11.763799667358398,\n                           34.23659896850586,\n                           0,\n                           18.392200469970703,\n                           36.52560043334961,\n                           0,\n                           25.378799438476562,\n                           42.03929901123047,\n                           0,\n                           30.573999404907227,\n                           21.656600952148438,\n                           0,\n                           7.643509864807129,\n                           21.656600952148438,\n                           4.729420185089111,\n                           9.285670280456543,\n                           30.286699295043945,\n                           4.270359992980957,\n                           12.981499671936035,\n                           30.75320053100586,\n                           0,\n                           11.763799667358398,\n                           33.639400482177734,\n                           3.2604401111602783,\n                           19.101299285888672,\n                           34.23659896850586,\n                           0,\n                           18.392200469970703,\n                           35.79790115356445,\n                           2.2505099773406982,\n                           25.635400772094727,\n                           36.52560043334961,\n                           0,\n                           25.378799438476562,\n                           40.845001220703125,\n                           1.791450023651123,\n                           30.573999404907227,\n                           42.03929901123047,\n                           0,\n                           30.573999404907227,\n                           21.656600952148438,\n                           6.3059000968933105,\n                           12.89840030670166,\n                           29.260299682617188,\n                           5.693819999694824,\n                           15.660200119018555,\n                           32.32569885253906,\n                           4.347249984741211,\n                           20.661399841308594,\n                           34.19670104980469,\n                           3.0006699562072754,\n                           26.199899673461914,\n                           38.21760177612305,\n                           2.3886001110076904,\n                           30.573999404907227,\n                           21.656600952148438,\n                           4.729420185089111,\n                           16.511199951171875,\n                           28.233999252319336,\n                           4.270359992980957,\n                           18.339000701904297,\n                           31.011899948120117,\n                           3.2604401111602783,\n                           22.221399307250977,\n                           32.59560012817383,\n                           2.2505099773406982,\n                           26.764400482177734,\n                           35.5900993347168,\n                           1.791450023651123,\n                           30.573999404907227,\n                           21.656600952148438,\n                           0,\n                           18.15329933166504,\n                           27.76740074157715,\n                           0,\n                           19.55660057067871,\n                           30.4148006439209,\n                           0,\n                           22.930500030517578,\n                           31.867900848388672,\n                           0,\n                           27.020999908447266,\n                           34.39580154418945,\n                           0,\n                           30.573999404907227,\n                           34.39580154418945,\n                           0,\n                           30.573999404907227,\n                           35.5900993347168,\n                           -1.791450023651123,\n                           30.573999404907227,\n                           36.59049987792969,\n                           -1.679479956626892,\n                           31.137699127197266,\n                           35.3114013671875,\n                           0,\n                           31.111499786376953,\n                           37.18870162963867,\n                           -1.4331599473953247,\n                           31.332599639892578,\n                           35.98820114135742,\n                           0,\n                           31.290599822998047,\n                           37.206600189208984,\n                           -1.1868300437927246,\n                           31.1481990814209,\n                           36.187198638916016,\n                           0,\n                           31.111499786376953,\n                           36.46590042114258,\n                           -1.074869990348816,\n                           30.573999404907227,\n                           35.669700622558594,\n                           0,\n                           30.573999404907227,\n                           38.21760177612305,\n                           -2.3886001110076904,\n                           30.573999404907227,\n                           39.40439987182617,\n                           -2.2393100261688232,\n                           31.195499420166016,\n                           39.829898834228516,\n                           -1.9108799695968628,\n                           31.424999237060547,\n                           39.44919967651367,\n                           -1.582450032234192,\n                           31.229000091552734,\n                           38.21760177612305,\n                           -1.4331599473953247,\n                           30.573999404907227,\n                           40.845001220703125,\n                           -1.791450023651123,\n                           30.573999404907227,\n                           42.218299865722656,\n                           -1.679479956626892,\n                           31.25320053100586,\n                           42.47100067138672,\n                           -1.4331599473953247,\n                           31.51740074157715,\n                           41.69169998168945,\n                           -1.1868300437927246,\n                           31.309900283813477,\n                           39.969200134277344,\n                           -1.074869990348816,\n                           30.573999404907227,\n                           42.03929901123047,\n                           0,\n                           30.573999404907227,\n                           43.49729919433594,\n                           0,\n                           31.279399871826172,\n                           43.67150115966797,\n                           0,\n                           31.55929946899414,\n                           42.71110153198242,\n                           0,\n                           31.346599578857422,\n                           40.76539993286133,\n                           0,\n                           30.573999404907227,\n                           42.03929901123047,\n                           0,\n                           30.573999404907227,\n                           40.845001220703125,\n                           1.791450023651123,\n                           30.573999404907227,\n                           42.218299865722656,\n                           1.679479956626892,\n                           31.25320053100586,\n                           43.49729919433594,\n                           0,\n                           31.279399871826172,\n                           42.47100067138672,\n                           1.4331599473953247,\n                           31.51740074157715,\n                           43.67150115966797,\n                           0,\n                           31.55929946899414,\n                           41.69169998168945,\n                           1.1868300437927246,\n                           31.309900283813477,\n                           42.71110153198242,\n                           0,\n                           31.346599578857422,\n                           39.969200134277344,\n                           1.074869990348816,\n                           30.573999404907227,\n                           40.76539993286133,\n                           0,\n                           30.573999404907227,\n                           38.21760177612305,\n                           2.3886001110076904,\n                           30.573999404907227,\n                           39.40439987182617,\n                           2.2393100261688232,\n                           31.195499420166016,\n                           39.829898834228516,\n                           1.9108799695968628,\n                           31.424999237060547,\n                           39.44919967651367,\n                           1.582450032234192,\n                           31.229000091552734,\n                           38.21760177612305,\n                           1.4331599473953247,\n                           30.573999404907227,\n                           35.5900993347168,\n                           1.791450023651123,\n                           30.573999404907227,\n                           36.59049987792969,\n                           1.679479956626892,\n                           31.137699127197266,\n                           37.18870162963867,\n                           1.4331599473953247,\n                           31.332599639892578,\n                           37.206600189208984,\n                           1.1868300437927246,\n                           31.1481990814209,\n                           36.46590042114258,\n                           1.074869990348816,\n                           30.573999404907227,\n                           34.39580154418945,\n                           0,\n                           30.573999404907227,\n                           35.3114013671875,\n                           0,\n                           31.111499786376953,\n                           35.98820114135742,\n                           0,\n                           31.290599822998047,\n                           36.187198638916016,\n                           0,\n                           31.111499786376953,\n                           35.669700622558594,\n                           0,\n                           30.573999404907227,\n                           0,\n                           0,\n                           40.12839889526367,\n                           0,\n                           0,\n                           40.12839889526367,\n                           4.004499912261963,\n                           -1.7077000141143799,\n                           39.501399993896484,\n                           4.339280128479004,\n                           0,\n                           39.501399993896484,\n                           3.8207099437713623,\n                           -1.6290700435638428,\n                           37.97869873046875,\n                           4.140230178833008,\n                           0,\n                           37.97869873046875,\n                           2.314160108566284,\n                           -0.985912024974823,\n                           36.09769821166992,\n                           2.5080299377441406,\n                           0,\n                           36.09769821166992,\n                           2.3503799438476562,\n                           -1.0000300407409668,\n                           34.39580154418945,\n                           2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           3.0849199295043945,\n                           -3.0849199295043945,\n                           39.501399993896484,\n                           2.943150043487549,\n                           -2.943150043487549,\n                           37.97869873046875,\n                           1.782039999961853,\n                           -1.782039999961853,\n                           36.09769821166992,\n                           1.8089599609375,\n                           -1.8089599609375,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           1.7077000141143799,\n                           -4.004499912261963,\n                           39.501399993896484,\n                           1.6290700435638428,\n                           -3.8207099437713623,\n                           37.97869873046875,\n                           0.985912024974823,\n                           -2.314160108566284,\n                           36.09769821166992,\n                           1.0000300407409668,\n                           -2.3503799438476562,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           0,\n                           -4.339280128479004,\n                           39.501399993896484,\n                           0,\n                           -4.140230178833008,\n                           37.97869873046875,\n                           0,\n                           -2.5080299377441406,\n                           36.09769821166992,\n                           0,\n                           -2.547840118408203,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -1.7077000141143799,\n                           -4.004499912261963,\n                           39.501399993896484,\n                           0,\n                           -4.339280128479004,\n                           39.501399993896484,\n                           -1.6290700435638428,\n                           -3.8207099437713623,\n                           37.97869873046875,\n                           0,\n                           -4.140230178833008,\n                           37.97869873046875,\n                           -0.985912024974823,\n                           -2.314160108566284,\n                           36.09769821166992,\n                           0,\n                           -2.5080299377441406,\n                           36.09769821166992,\n                           -1.0000300407409668,\n                           -2.3503799438476562,\n                           34.39580154418945,\n                           0,\n                           -2.547840118408203,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -3.0849199295043945,\n                           -3.0849199295043945,\n                           39.501399993896484,\n                           -2.943150043487549,\n                           -2.943150043487549,\n                           37.97869873046875,\n                           -1.782039999961853,\n                           -1.782039999961853,\n                           36.09769821166992,\n                           -1.8089599609375,\n                           -1.8089599609375,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -4.004499912261963,\n                           -1.7077000141143799,\n                           39.501399993896484,\n                           -3.8207099437713623,\n                           -1.6290700435638428,\n                           37.97869873046875,\n                           -2.314160108566284,\n                           -0.985912024974823,\n                           36.09769821166992,\n                           -2.3503799438476562,\n                           -1.0000300407409668,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -4.339280128479004,\n                           0,\n                           39.501399993896484,\n                           -4.140230178833008,\n                           0,\n                           37.97869873046875,\n                           -2.5080299377441406,\n                           0,\n                           36.09769821166992,\n                           -2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -4.004499912261963,\n                           1.7077000141143799,\n                           39.501399993896484,\n                           -4.339280128479004,\n                           0,\n                           39.501399993896484,\n                           -3.8207099437713623,\n                           1.6290700435638428,\n                           37.97869873046875,\n                           -4.140230178833008,\n                           0,\n                           37.97869873046875,\n                           -2.314160108566284,\n                           0.985912024974823,\n                           36.09769821166992,\n                           -2.5080299377441406,\n                           0,\n                           36.09769821166992,\n                           -2.3503799438476562,\n                           1.0000300407409668,\n                           34.39580154418945,\n                           -2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -3.0849199295043945,\n                           3.0849199295043945,\n                           39.501399993896484,\n                           -2.943150043487549,\n                           2.943150043487549,\n                           37.97869873046875,\n                           -1.782039999961853,\n                           1.782039999961853,\n                           36.09769821166992,\n                           -1.8089599609375,\n                           1.8089599609375,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -1.7077000141143799,\n                           4.004499912261963,\n                           39.501399993896484,\n                           -1.6290700435638428,\n                           3.8207099437713623,\n                           37.97869873046875,\n                           -0.985912024974823,\n                           2.314160108566284,\n                           36.09769821166992,\n                           -1.0000300407409668,\n                           2.3503799438476562,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           0,\n                           4.339280128479004,\n                           39.501399993896484,\n                           0,\n                           4.140230178833008,\n                           37.97869873046875,\n                           0,\n                           2.5080299377441406,\n                           36.09769821166992,\n                           0,\n                           2.547840118408203,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           0,\n                           0,\n                           40.12839889526367,\n                           1.7077000141143799,\n                           4.004499912261963,\n                           39.501399993896484,\n                           0,\n                           4.339280128479004,\n                           39.501399993896484,\n                           1.6290700435638428,\n                           3.8207099437713623,\n                           37.97869873046875,\n                           0,\n                           4.140230178833008,\n                           37.97869873046875,\n                           0.985912024974823,\n                           2.314160108566284,\n                           36.09769821166992,\n                           0,\n                           2.5080299377441406,\n                           36.09769821166992,\n                           1.0000300407409668,\n                           2.3503799438476562,\n                           34.39580154418945,\n                           0,\n                           2.547840118408203,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           3.0849199295043945,\n                           3.0849199295043945,\n                           39.501399993896484,\n                           2.943150043487549,\n                           2.943150043487549,\n                           37.97869873046875,\n                           1.782039999961853,\n                           1.782039999961853,\n                           36.09769821166992,\n                           1.8089599609375,\n                           1.8089599609375,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           4.004499912261963,\n                           1.7077000141143799,\n                           39.501399993896484,\n                           3.8207099437713623,\n                           1.6290700435638428,\n                           37.97869873046875,\n                           2.314160108566284,\n                           0.985912024974823,\n                           36.09769821166992,\n                           2.3503799438476562,\n                           1.0000300407409668,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           4.339280128479004,\n                           0,\n                           39.501399993896484,\n                           4.140230178833008,\n                           0,\n                           37.97869873046875,\n                           2.5080299377441406,\n                           0,\n                           36.09769821166992,\n                           2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           2.3503799438476562,\n                           -1.0000300407409668,\n                           34.39580154418945,\n                           5.361800193786621,\n                           -2.2813100814819336,\n                           33.261199951171875,\n                           5.812250137329102,\n                           0,\n                           33.261199951171875,\n                           9.695320129394531,\n                           -4.125110149383545,\n                           32.484901428222656,\n                           10.50979995727539,\n                           0,\n                           32.484901428222656,\n                           13.58810043334961,\n                           -5.781400203704834,\n                           31.708599090576172,\n                           14.729700088500977,\n                           0,\n                           31.708599090576172,\n                           15.27750015258789,\n                           -6.5001702308654785,\n                           30.573999404907227,\n                           16.56089973449707,\n                           0,\n                           30.573999404907227,\n                           1.8089599609375,\n                           -1.8089599609375,\n                           34.39580154418945,\n                           4.126699924468994,\n                           -4.126699924468994,\n                           33.261199951171875,\n                           7.461979866027832,\n                           -7.461979866027832,\n                           32.484901428222656,\n                           10.458100318908691,\n                           -10.458100318908691,\n                           31.708599090576172,\n                           11.758299827575684,\n                           -11.758299827575684,\n                           30.573999404907227,\n                           1.0000300407409668,\n                           -2.3503799438476562,\n                           34.39580154418945,\n                           2.2813100814819336,\n                           -5.361800193786621,\n                           33.261199951171875,\n                           4.125110149383545,\n                           -9.695320129394531,\n                           32.484901428222656,\n                           5.781400203704834,\n                           -13.58810043334961,\n                           31.708599090576172,\n                           6.5001702308654785,\n                           -15.27750015258789,\n                           30.573999404907227,\n                           0,\n                           -2.547840118408203,\n                           34.39580154418945,\n                           0,\n                           -5.812250137329102,\n                           33.261199951171875,\n                           0,\n                           -10.50979995727539,\n                           32.484901428222656,\n                           0,\n                           -14.729700088500977,\n                           31.708599090576172,\n                           0,\n                           -16.56089973449707,\n                           30.573999404907227,\n                           0,\n                           -2.547840118408203,\n                           34.39580154418945,\n                           -1.0000300407409668,\n                           -2.3503799438476562,\n                           34.39580154418945,\n                           -2.2813100814819336,\n                           -5.361800193786621,\n                           33.261199951171875,\n                           0,\n                           -5.812250137329102,\n                           33.261199951171875,\n                           -4.125110149383545,\n                           -9.695320129394531,\n                           32.484901428222656,\n                           0,\n                           -10.50979995727539,\n                           32.484901428222656,\n                           -5.781400203704834,\n                           -13.58810043334961,\n                           31.708599090576172,\n                           0,\n                           -14.729700088500977,\n                           31.708599090576172,\n                           -6.5001702308654785,\n                           -15.27750015258789,\n                           30.573999404907227,\n                           0,\n                           -16.56089973449707,\n                           30.573999404907227,\n                           -1.8089599609375,\n                           -1.8089599609375,\n                           34.39580154418945,\n                           -4.126699924468994,\n                           -4.126699924468994,\n                           33.261199951171875,\n                           -7.461979866027832,\n                           -7.461979866027832,\n                           32.484901428222656,\n                           -10.458100318908691,\n                           -10.458100318908691,\n                           31.708599090576172,\n                           -11.758299827575684,\n                           -11.758299827575684,\n                           30.573999404907227,\n                           -2.3503799438476562,\n                           -1.0000300407409668,\n                           34.39580154418945,\n                           -5.361800193786621,\n                           -2.2813100814819336,\n                           33.261199951171875,\n                           -9.695320129394531,\n                           -4.125110149383545,\n                           32.484901428222656,\n                           -13.58810043334961,\n                           -5.781400203704834,\n                           31.708599090576172,\n                           -15.27750015258789,\n                           -6.5001702308654785,\n                           30.573999404907227,\n                           -2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           -5.812250137329102,\n                           0,\n                           33.261199951171875,\n                           -10.50979995727539,\n                           0,\n                           32.484901428222656,\n                           -14.729700088500977,\n                           0,\n                           31.708599090576172,\n                           -16.56089973449707,\n                           0,\n                           30.573999404907227,\n                           -2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           -2.3503799438476562,\n                           1.0000300407409668,\n                           34.39580154418945,\n                           -5.361800193786621,\n                           2.2813100814819336,\n                           33.261199951171875,\n                           -5.812250137329102,\n                           0,\n                           33.261199951171875,\n                           -9.695320129394531,\n                           4.125110149383545,\n                           32.484901428222656,\n                           -10.50979995727539,\n                           0,\n                           32.484901428222656,\n                           -13.58810043334961,\n                           5.781400203704834,\n                           31.708599090576172,\n                           -14.729700088500977,\n                           0,\n                           31.708599090576172,\n                           -15.27750015258789,\n                           6.5001702308654785,\n                           30.573999404907227,\n                           -16.56089973449707,\n                           0,\n                           30.573999404907227,\n                           -1.8089599609375,\n                           1.8089599609375,\n                           34.39580154418945,\n                           -4.126699924468994,\n                           4.126699924468994,\n                           33.261199951171875,\n                           -7.461979866027832,\n                           7.461979866027832,\n                           32.484901428222656,\n                           -10.458100318908691,\n                           10.458100318908691,\n                           31.708599090576172,\n                           -11.758299827575684,\n                           11.758299827575684,\n                           30.573999404907227,\n                           -1.0000300407409668,\n                           2.3503799438476562,\n                           34.39580154418945,\n                           -2.2813100814819336,\n                           5.361800193786621,\n                           33.261199951171875,\n                           -4.125110149383545,\n                           9.695320129394531,\n                           32.484901428222656,\n                           -5.781400203704834,\n                           13.58810043334961,\n                           31.708599090576172,\n                           -6.5001702308654785,\n                           15.27750015258789,\n                           30.573999404907227,\n                           0,\n                           2.547840118408203,\n                           34.39580154418945,\n                           0,\n                           5.812250137329102,\n                           33.261199951171875,\n                           0,\n                           10.50979995727539,\n                           32.484901428222656,\n                           0,\n                           14.729700088500977,\n                           31.708599090576172,\n                           0,\n                           16.56089973449707,\n                           30.573999404907227,\n                           0,\n                           2.547840118408203,\n                           34.39580154418945,\n                           1.0000300407409668,\n                           2.3503799438476562,\n                           34.39580154418945,\n                           2.2813100814819336,\n                           5.361800193786621,\n                           33.261199951171875,\n                           0,\n                           5.812250137329102,\n                           33.261199951171875,\n                           4.125110149383545,\n                           9.695320129394531,\n                           32.484901428222656,\n                           0,\n                           10.50979995727539,\n                           32.484901428222656,\n                           5.781400203704834,\n                           13.58810043334961,\n                           31.708599090576172,\n                           0,\n                           14.729700088500977,\n                           31.708599090576172,\n                           6.5001702308654785,\n                           15.27750015258789,\n                           30.573999404907227,\n                           0,\n                           16.56089973449707,\n                           30.573999404907227,\n                           1.8089599609375,\n                           1.8089599609375,\n                           34.39580154418945,\n                           4.126699924468994,\n                           4.126699924468994,\n                           33.261199951171875,\n                           7.461979866027832,\n                           7.461979866027832,\n                           32.484901428222656,\n                           10.458100318908691,\n                           10.458100318908691,\n                           31.708599090576172,\n                           11.758299827575684,\n                           11.758299827575684,\n                           30.573999404907227,\n                           2.3503799438476562,\n                           1.0000300407409668,\n                           34.39580154418945,\n                           5.361800193786621,\n                           2.2813100814819336,\n                           33.261199951171875,\n                           9.695320129394531,\n                           4.125110149383545,\n                           32.484901428222656,\n                           13.58810043334961,\n                           5.781400203704834,\n                           31.708599090576172,\n                           15.27750015258789,\n                           6.5001702308654785,\n                           30.573999404907227,\n                           2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           5.812250137329102,\n                           0,\n                           33.261199951171875,\n                           10.50979995727539,\n                           0,\n                           32.484901428222656,\n                           14.729700088500977,\n                           0,\n                           31.708599090576172,\n                           16.56089973449707,\n                           0,\n                           30.573999404907227};\n\nfloat teapotNormals[] = {-0.9667419791221619,\n                         0,\n                         -0.25575199723243713,\n                         -0.8930140137672424,\n                         0.3698819875717163,\n                         -0.2563450038433075,\n                         -0.8934370279312134,\n                         0.36910200119018555,\n                         0.2559970021247864,\n                         -0.9668239951133728,\n                         0,\n                         0.2554430067539215,\n                         -0.0838799998164177,\n                         0.03550700098276138,\n                         0.9958429932594299,\n                         -0.09205400198698044,\n                         0,\n                         0.9957540035247803,\n                         0.629721999168396,\n                         -0.2604379951953888,\n                         0.7318620085716248,\n                         0.6820489764213562,\n                         0,\n                         0.7313070297241211,\n                         0.803725004196167,\n                         -0.3325839936733246,\n                         0.4933690130710602,\n                         0.8703010082244873,\n                         0,\n                         0.4925200045108795,\n                         -0.6834070086479187,\n                         0.6834070086479187,\n                         -0.2567310035228729,\n                         -0.6835309863090515,\n                         0.6835309863090515,\n                         0.25606799125671387,\n                         -0.06492599844932556,\n                         0.06492500007152557,\n                         0.9957759976387024,\n                         0.48139700293540955,\n                         -0.48139700293540955,\n                         0.7324709892272949,\n                         0.6148040294647217,\n                         -0.6148040294647217,\n                         0.4939970076084137,\n                         -0.3698819875717163,\n                         0.8930140137672424,\n                         -0.2563450038433075,\n                         -0.36910200119018555,\n                         0.8934370279312134,\n                         0.2559959888458252,\n                         -0.03550700098276138,\n                         0.0838790014386177,\n                         0.9958429932594299,\n                         0.26043900847435,\n                         -0.6297230124473572,\n                         0.7318609952926636,\n                         0.3325839936733246,\n                         -0.803725004196167,\n                         0.4933690130710602,\n                         -0.002848000032827258,\n                         0.9661769866943359,\n                         -0.25786298513412476,\n                         -0.001921999966725707,\n                         0.9670090079307556,\n                         0.2547360062599182,\n                         -0.00026500000967644155,\n                         0.09227199852466583,\n                         0.9957339763641357,\n                         0.00002300000051036477,\n                         -0.6820600032806396,\n                         0.7312960028648376,\n                         0,\n                         -0.8703010082244873,\n                         0.4925200045108795,\n                         -0.002848000032827258,\n                         0.9661769866943359,\n                         -0.25786298513412476,\n                         0.37905800342559814,\n                         0.852770984172821,\n                         -0.35929998755455017,\n                         0.37711000442504883,\n                         0.9140909910202026,\n                         0.14908500015735626,\n                         -0.001921999966725707,\n                         0.9670090079307556,\n                         0.2547360062599182,\n                         0.0275030005723238,\n                         0.12255500257015228,\n                         0.9920809864997864,\n                         -0.00026500000967644155,\n                         0.09227199852466583,\n                         0.9957339763641357,\n                         -0.26100900769233704,\n                         -0.6353650093078613,\n                         0.7267630100250244,\n                         0.00002300000051036477,\n                         -0.6820600032806396,\n                         0.7312960028648376,\n                         -0.33248499035835266,\n                         -0.8042709827423096,\n                         0.4925459921360016,\n                         0,\n                         -0.8703010082244873,\n                         0.4925200045108795,\n                         0.6635469794273376,\n                         0.6252639889717102,\n                         -0.4107919931411743,\n                         0.712664008140564,\n                         0.6976209878921509,\n                         0.07372400164604187,\n                         0.09972699731588364,\n                         0.12198299914598465,\n                         0.98750901222229,\n                         -0.4873189926147461,\n                         -0.4885669946670532,\n                         0.7237560153007507,\n                         -0.6152420043945312,\n                         -0.6154839992523193,\n                         0.4926010072231293,\n                         0.8800280094146729,\n                         0.3387089967727661,\n                         -0.3329069912433624,\n                         0.9172769784927368,\n                         0.36149299144744873,\n                         0.16711199283599854,\n                         0.11358699947595596,\n                         0.04806999862194061,\n                         0.9923650026321411,\n                         -0.6341490149497986,\n                         -0.2618879973888397,\n                         0.7275090217590332,\n                         -0.8041260242462158,\n                         -0.33270499110221863,\n                         0.49263399839401245,\n                         0.9666900038719177,\n                         -0.010453999973833561,\n                         -0.2557379901409149,\n                         0.967441976070404,\n                         -0.00810300000011921,\n                         0.25296199321746826,\n                         0.0934389978647232,\n                         -0.0012799999676644802,\n                         0.9956240057945251,\n                         -0.6821659803390503,\n                         0.0003429999924264848,\n                         0.7311969995498657,\n                         -0.8703219890594482,\n                         0.00005400000009103678,\n                         0.492482990026474,\n                         0.9666900038719177,\n                         -0.010453999973833561,\n                         -0.2557379901409149,\n                         0.8930140137672424,\n                         -0.3698819875717163,\n                         -0.2563450038433075,\n                         0.8934370279312134,\n                         -0.36910200119018555,\n                         0.2559970021247864,\n                         0.967441976070404,\n                         -0.00810300000011921,\n                         0.25296199321746826,\n                         0.0838799998164177,\n                         -0.03550700098276138,\n                         0.9958429932594299,\n                         0.0934389978647232,\n                         -0.0012799999676644802,\n                         0.9956240057945251,\n                         -0.629721999168396,\n                         0.2604379951953888,\n                         0.7318620085716248,\n                         -0.6821659803390503,\n                         0.0003429999924264848,\n                         0.7311969995498657,\n                         -0.803725004196167,\n                         0.3325839936733246,\n                         0.4933690130710602,\n                         -0.8703219890594482,\n                         0.00005400000009103678,\n                         0.492482990026474,\n                         0.6834070086479187,\n                         -0.6834070086479187,\n                         -0.2567310035228729,\n                         0.6835309863090515,\n                         -0.6835309863090515,\n                         0.25606799125671387,\n                         0.06492599844932556,\n                         -0.06492500007152557,\n                         0.9957759976387024,\n                         -0.48139700293540955,\n                         0.48139700293540955,\n                         0.7324709892272949,\n                         -0.6148040294647217,\n                         0.6148040294647217,\n                         0.4939970076084137,\n                         0.3698819875717163,\n                         -0.8930140137672424,\n                         -0.2563450038433075,\n                         0.36910200119018555,\n                         -0.8934370279312134,\n                         0.2559959888458252,\n                         0.03550700098276138,\n                         -0.0838790014386177,\n                         0.9958429932594299,\n                         -0.26043900847435,\n                         0.6297230124473572,\n                         0.7318609952926636,\n                         -0.3325839936733246,\n                         0.803725004196167,\n                         0.4933690130710602,\n                         0,\n                         -0.9667419791221619,\n                         -0.25575199723243713,\n                         0,\n                         -0.9668239951133728,\n                         0.2554430067539215,\n                         0,\n                         -0.09205400198698044,\n                         0.9957540035247803,\n                         0,\n                         0.6820489764213562,\n                         0.7313070297241211,\n                         0,\n                         0.8703010082244873,\n                         0.4925200045108795,\n                         0,\n                         -0.9667419791221619,\n                         -0.25575199723243713,\n                         -0.3698819875717163,\n                         -0.8930140137672424,\n                         -0.2563450038433075,\n                         -0.36910200119018555,\n                         -0.8934370279312134,\n                         0.2559970021247864,\n                         0,\n                         -0.9668239951133728,\n                         0.2554430067539215,\n                         -0.03550700098276138,\n                         -0.0838799998164177,\n                         0.9958429932594299,\n                         0,\n                         -0.09205400198698044,\n                         0.9957540035247803,\n                         0.2604379951953888,\n                         0.629721999168396,\n                         0.7318620085716248,\n                         0,\n                         0.6820489764213562,\n                         0.7313070297241211,\n                         0.3325839936733246,\n                         0.803725004196167,\n                         0.4933690130710602,\n                         0,\n                         0.8703010082244873,\n                         0.4925200045108795,\n                         -0.6834070086479187,\n                         -0.6834070086479187,\n                         -0.2567310035228729,\n                         -0.6835309863090515,\n                         -0.6835309863090515,\n                         0.25606799125671387,\n                         -0.06492500007152557,\n                         -0.06492599844932556,\n                         0.9957759976387024,\n                         0.48139700293540955,\n                         0.48139700293540955,\n                         0.7324709892272949,\n                         0.6148040294647217,\n                         0.6148040294647217,\n                         0.4939970076084137,\n                         -0.8930140137672424,\n                         -0.3698819875717163,\n                         -0.2563450038433075,\n                         -0.8934370279312134,\n                         -0.36910200119018555,\n                         0.2559959888458252,\n                         -0.0838790014386177,\n                         -0.03550700098276138,\n                         0.9958429932594299,\n                         0.6297230124473572,\n                         0.26043900847435,\n                         0.7318609952926636,\n                         0.803725004196167,\n                         0.3325839936733246,\n                         0.4933690130710602,\n                         -0.9667419791221619,\n                         0,\n                         -0.25575199723243713,\n                         -0.9668239951133728,\n                         0,\n                         0.2554430067539215,\n                         -0.09205400198698044,\n                         0,\n                         0.9957540035247803,\n                         0.6820489764213562,\n                         0,\n                         0.7313070297241211,\n                         0.8703010082244873,\n                         0,\n                         0.4925200045108795,\n                         0.8703010082244873,\n                         0,\n                         0.4925200045108795,\n                         0.803725004196167,\n                         -0.3325839936733246,\n                         0.4933690130710602,\n                         0.8454390168190002,\n                         -0.34983500838279724,\n                         0.40354499220848083,\n                         0.9153209924697876,\n                         0,\n                         0.4027250111103058,\n                         0.8699960112571716,\n                         -0.36004599928855896,\n                         0.33685898780822754,\n                         0.9418079853057861,\n                         0,\n                         0.33615100383758545,\n                         0.9041929841041565,\n                         -0.37428000569343567,\n                         0.20579099655151367,\n                         0.9786900281906128,\n                         0,\n                         0.20534199476242065,\n                         0.9218789935112,\n                         -0.38175201416015625,\n                         -0.06636899709701538,\n                         0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         0.6148040294647217,\n                         -0.6148040294647217,\n                         0.4939970076084137,\n                         0.6468020081520081,\n                         -0.6468020081520081,\n                         0.40409600734710693,\n                         0.6656550168991089,\n                         -0.6656550168991089,\n                         0.3373520076274872,\n                         0.6919230222702026,\n                         -0.6919230222702026,\n                         0.20611999928951263,\n                         0.7055429816246033,\n                         -0.7055429816246033,\n                         -0.06647899746894836,\n                         0.3325839936733246,\n                         -0.803725004196167,\n                         0.4933690130710602,\n                         0.34983500838279724,\n                         -0.8454390168190002,\n                         0.40354499220848083,\n                         0.36004701256752014,\n                         -0.8699960112571716,\n                         0.33685800433158875,\n                         0.37428000569343567,\n                         -0.9041929841041565,\n                         0.20579099655151367,\n                         0.38175201416015625,\n                         -0.9218789935112,\n                         -0.06636899709701538,\n                         0,\n                         -0.8703010082244873,\n                         0.4925200045108795,\n                         0,\n                         -0.9153209924697876,\n                         0.4027250111103058,\n                         0,\n                         -0.9418079853057861,\n                         0.33615100383758545,\n                         0,\n                         -0.9786900281906128,\n                         0.20534199476242065,\n                         0,\n                         -0.9978039860725403,\n                         -0.06623899936676025,\n                         0,\n                         -0.8703010082244873,\n                         0.4925200045108795,\n                         -0.33248499035835266,\n                         -0.8042709827423096,\n                         0.4925459921360016,\n                         -0.34983500838279724,\n                         -0.8454390168190002,\n                         0.40354499220848083,\n                         0,\n                         -0.9153209924697876,\n                         0.4027250111103058,\n                         -0.36004599928855896,\n                         -0.8699960112571716,\n                         0.33685898780822754,\n                         0,\n                         -0.9418079853057861,\n                         0.33615100383758545,\n                         -0.37428000569343567,\n                         -0.9041929841041565,\n                         0.20579099655151367,\n                         0,\n                         -0.9786900281906128,\n                         0.20534199476242065,\n                         -0.38175201416015625,\n                         -0.9218789935112,\n                         -0.06636899709701538,\n                         0,\n                         -0.9978039860725403,\n                         -0.06623899936676025,\n                         -0.6152420043945312,\n                         -0.6154839992523193,\n                         0.4926010072231293,\n                         -0.6468020081520081,\n                         -0.6468020081520081,\n                         0.40409600734710693,\n                         -0.6656550168991089,\n                         -0.6656550168991089,\n                         0.3373520076274872,\n                         -0.6919230222702026,\n                         -0.6919230222702026,\n                         0.20611999928951263,\n                         -0.7055429816246033,\n                         -0.7055429816246033,\n                         -0.06647899746894836,\n                         -0.8041260242462158,\n                         -0.33270499110221863,\n                         0.49263399839401245,\n                         -0.8454390168190002,\n                         -0.34983500838279724,\n                         0.40354499220848083,\n                         -0.8699960112571716,\n                         -0.36004701256752014,\n                         0.33685800433158875,\n                         -0.9041929841041565,\n                         -0.37428000569343567,\n                         0.20579099655151367,\n                         -0.9218789935112,\n                         -0.38175201416015625,\n                         -0.06636899709701538,\n                         -0.8703219890594482,\n                         0.00005400000009103678,\n                         0.492482990026474,\n                         -0.9153209924697876,\n                         0,\n                         0.4027250111103058,\n                         -0.9418079853057861,\n                         0,\n                         0.33615100383758545,\n                         -0.9786900281906128,\n                         0,\n                         0.20534199476242065,\n                         -0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         -0.8703219890594482,\n                         0.00005400000009103678,\n                         0.492482990026474,\n                         -0.803725004196167,\n                         0.3325839936733246,\n                         0.4933690130710602,\n                         -0.8454390168190002,\n                         0.34983500838279724,\n                         0.40354499220848083,\n                         -0.9153209924697876,\n                         0,\n                         0.4027250111103058,\n                         -0.8699960112571716,\n                         0.36004599928855896,\n                         0.33685898780822754,\n                         -0.9418079853057861,\n                         0,\n                         0.33615100383758545,\n                         -0.9041929841041565,\n                         0.37428000569343567,\n                         0.20579099655151367,\n                         -0.9786900281906128,\n                         0,\n                         0.20534199476242065,\n                         -0.9218789935112,\n                         0.38175201416015625,\n                         -0.06636899709701538,\n                         -0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         -0.6148040294647217,\n                         0.6148040294647217,\n                         0.4939970076084137,\n                         -0.6468020081520081,\n                         0.6468020081520081,\n                         0.40409600734710693,\n                         -0.6656550168991089,\n                         0.6656550168991089,\n                         0.3373520076274872,\n                         -0.6919230222702026,\n                         0.6919230222702026,\n                         0.20611999928951263,\n                         -0.7055429816246033,\n                         0.7055429816246033,\n                         -0.06647899746894836,\n                         -0.3325839936733246,\n                         0.803725004196167,\n                         0.4933690130710602,\n                         -0.34983500838279724,\n                         0.8454390168190002,\n                         0.40354499220848083,\n                         -0.36004701256752014,\n                         0.8699960112571716,\n                         0.33685800433158875,\n                         -0.37428000569343567,\n                         0.9041929841041565,\n                         0.20579099655151367,\n                         -0.38175201416015625,\n                         0.9218789935112,\n                         -0.06636899709701538,\n                         0,\n                         0.8703010082244873,\n                         0.4925200045108795,\n                         0,\n                         0.9153209924697876,\n                         0.4027250111103058,\n                         0,\n                         0.9418079853057861,\n                         0.33615100383758545,\n                         0,\n                         0.9786900281906128,\n                         0.20534199476242065,\n                         0,\n                         0.9978039860725403,\n                         -0.06623899936676025,\n                         0,\n                         0.8703010082244873,\n                         0.4925200045108795,\n                         0.3325839936733246,\n                         0.803725004196167,\n                         0.4933690130710602,\n                         0.34983500838279724,\n                         0.8454390168190002,\n                         0.40354499220848083,\n                         0,\n                         0.9153209924697876,\n                         0.4027250111103058,\n                         0.36004599928855896,\n                         0.8699960112571716,\n                         0.33685898780822754,\n                         0,\n                         0.9418079853057861,\n                         0.33615100383758545,\n                         0.37428000569343567,\n                         0.9041929841041565,\n                         0.20579099655151367,\n                         0,\n                         0.9786900281906128,\n                         0.20534199476242065,\n                         0.38175201416015625,\n                         0.9218789935112,\n                         -0.06636899709701538,\n                         0,\n                         0.9978039860725403,\n                         -0.06623899936676025,\n                         0.6148040294647217,\n                         0.6148040294647217,\n                         0.4939970076084137,\n                         0.6468020081520081,\n                         0.6468020081520081,\n                         0.40409600734710693,\n                         0.6656550168991089,\n                         0.6656550168991089,\n                         0.3373520076274872,\n                         0.6919230222702026,\n                         0.6919230222702026,\n                         0.20611999928951263,\n                         0.7055429816246033,\n                         0.7055429816246033,\n                         -0.06647899746894836,\n                         0.803725004196167,\n                         0.3325839936733246,\n                         0.4933690130710602,\n                         0.8454390168190002,\n                         0.34983500838279724,\n                         0.40354499220848083,\n                         0.8699960112571716,\n                         0.36004701256752014,\n                         0.33685800433158875,\n                         0.9041929841041565,\n                         0.37428000569343567,\n                         0.20579099655151367,\n                         0.9218789935112,\n                         0.38175201416015625,\n                         -0.06636899709701538,\n                         0.8703010082244873,\n                         0,\n                         0.4925200045108795,\n                         0.9153209924697876,\n                         0,\n                         0.4027250111103058,\n                         0.9418079853057861,\n                         0,\n                         0.33615100383758545,\n                         0.9786900281906128,\n                         0,\n                         0.20534199476242065,\n                         0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         0.9218789935112,\n                         -0.38175201416015625,\n                         -0.06636899709701538,\n                         0.8314369916915894,\n                         -0.3441790044307709,\n                         -0.4361799955368042,\n                         0.9001820087432861,\n                         0,\n                         -0.4355129897594452,\n                         0.6735119819641113,\n                         -0.2785939872264862,\n                         -0.6846650242805481,\n                         0.7296109795570374,\n                         0,\n                         -0.6838629841804504,\n                         0.6403989791870117,\n                         -0.26487401127815247,\n                         -0.7209240198135376,\n                         0.6939510107040405,\n                         0,\n                         -0.7200220227241516,\n                         0.7329490184783936,\n                         -0.303166002035141,\n                         -0.6089959740638733,\n                         0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         0.7055429816246033,\n                         -0.7055429816246033,\n                         -0.06647899746894836,\n                         0.6360920071601868,\n                         -0.6360920071601868,\n                         -0.4367780089378357,\n                         0.5149649977684021,\n                         -0.5149649977684021,\n                         -0.6852890253067017,\n                         0.48965099453926086,\n                         -0.48965099453926086,\n                         -0.7214459776878357,\n                         0.5605549812316895,\n                         -0.5605549812316895,\n                         -0.6095539927482605,\n                         0.38175201416015625,\n                         -0.9218789935112,\n                         -0.06636899709701538,\n                         0.3441790044307709,\n                         -0.8314369916915894,\n                         -0.4361799955368042,\n                         0.2785939872264862,\n                         -0.6735119819641113,\n                         -0.6846650242805481,\n                         0.26487401127815247,\n                         -0.6403989791870117,\n                         -0.7209240198135376,\n                         0.303166002035141,\n                         -0.7329490184783936,\n                         -0.6089959740638733,\n                         0,\n                         -0.9978039860725403,\n                         -0.06623899936676025,\n                         0,\n                         -0.9001820087432861,\n                         -0.4355129897594452,\n                         0,\n                         -0.7296109795570374,\n                         -0.6838629841804504,\n                         0,\n                         -0.6939510107040405,\n                         -0.7200220227241516,\n                         0,\n                         -0.7939500212669373,\n                         -0.6079840064048767,\n                         0,\n                         -0.9978039860725403,\n                         -0.06623899936676025,\n                         -0.38175201416015625,\n                         -0.9218789935112,\n                         -0.06636899709701538,\n                         -0.3441790044307709,\n                         -0.8314369916915894,\n                         -0.4361799955368042,\n                         0,\n                         -0.9001820087432861,\n                         -0.4355129897594452,\n                         -0.2785939872264862,\n                         -0.6735119819641113,\n                         -0.6846650242805481,\n                         0,\n                         -0.7296109795570374,\n                         -0.6838629841804504,\n                         -0.26487401127815247,\n                         -0.6403989791870117,\n                         -0.7209240198135376,\n                         0,\n                         -0.6939510107040405,\n                         -0.7200220227241516,\n                         -0.303166002035141,\n                         -0.7329490184783936,\n                         -0.6089959740638733,\n                         0,\n                         -0.7939500212669373,\n                         -0.6079840064048767,\n                         -0.7055429816246033,\n                         -0.7055429816246033,\n                         -0.06647899746894836,\n                         -0.6360920071601868,\n                         -0.6360920071601868,\n                         -0.4367780089378357,\n                         -0.5149649977684021,\n                         -0.5149649977684021,\n                         -0.6852890253067017,\n                         -0.48965099453926086,\n                         -0.48965099453926086,\n                         -0.7214459776878357,\n                         -0.5605549812316895,\n                         -0.5605549812316895,\n                         -0.6095539927482605,\n                         -0.9218789935112,\n                         -0.38175201416015625,\n                         -0.06636899709701538,\n                         -0.8314369916915894,\n                         -0.3441790044307709,\n                         -0.4361799955368042,\n                         -0.6735119819641113,\n                         -0.2785939872264862,\n                         -0.6846650242805481,\n                         -0.6403989791870117,\n                         -0.26487401127815247,\n                         -0.7209240198135376,\n                         -0.7329490184783936,\n                         -0.303166002035141,\n                         -0.6089959740638733,\n                         -0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         -0.9001820087432861,\n                         0,\n                         -0.4355129897594452,\n                         -0.7296109795570374,\n                         0,\n                         -0.6838629841804504,\n                         -0.6939510107040405,\n                         0,\n                         -0.7200220227241516,\n                         -0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         -0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         -0.9218789935112,\n                         0.38175201416015625,\n                         -0.06636899709701538,\n                         -0.8314369916915894,\n                         0.3441790044307709,\n                         -0.4361799955368042,\n                         -0.9001820087432861,\n                         0,\n                         -0.4355129897594452,\n                         -0.6735119819641113,\n                         0.2785939872264862,\n                         -0.6846650242805481,\n                         -0.7296109795570374,\n                         0,\n                         -0.6838629841804504,\n                         -0.6403989791870117,\n                         0.26487401127815247,\n                         -0.7209240198135376,\n                         -0.6939510107040405,\n                         0,\n                         -0.7200220227241516,\n                         -0.7329490184783936,\n                         0.303166002035141,\n                         -0.6089959740638733,\n                         -0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         -0.7055429816246033,\n                         0.7055429816246033,\n                         -0.06647899746894836,\n                         -0.6360920071601868,\n                         0.6360920071601868,\n                         -0.4367780089378357,\n                         -0.5149649977684021,\n                         0.5149649977684021,\n                         -0.6852890253067017,\n                         -0.48965099453926086,\n                         0.48965099453926086,\n                         -0.7214459776878357,\n                         -0.5605549812316895,\n                         0.5605549812316895,\n                         -0.6095539927482605,\n                         -0.38175201416015625,\n                         0.9218789935112,\n                         -0.06636899709701538,\n                         -0.3441790044307709,\n                         0.8314369916915894,\n                         -0.4361799955368042,\n                         -0.2785939872264862,\n                         0.6735119819641113,\n                         -0.6846650242805481,\n                         -0.26487401127815247,\n                         0.6403989791870117,\n                         -0.7209240198135376,\n                         -0.303166002035141,\n                         0.7329490184783936,\n                         -0.6089959740638733,\n                         0,\n                         0.9978039860725403,\n                         -0.06623899936676025,\n                         0,\n                         0.9001820087432861,\n                         -0.4355129897594452,\n                         0,\n                         0.7296109795570374,\n                         -0.6838629841804504,\n                         0,\n                         0.6939510107040405,\n                         -0.7200220227241516,\n                         0,\n                         0.7939500212669373,\n                         -0.6079840064048767,\n                         0,\n                         0.9978039860725403,\n                         -0.06623899936676025,\n                         0.38175201416015625,\n                         0.9218789935112,\n                         -0.06636899709701538,\n                         0.3441790044307709,\n                         0.8314369916915894,\n                         -0.4361799955368042,\n                         0,\n                         0.9001820087432861,\n                         -0.4355129897594452,\n                         0.2785939872264862,\n                         0.6735119819641113,\n                         -0.6846650242805481,\n                         0,\n                         0.7296109795570374,\n                         -0.6838629841804504,\n                         0.26487401127815247,\n                         0.6403989791870117,\n                         -0.7209240198135376,\n                         0,\n                         0.6939510107040405,\n                         -0.7200220227241516,\n                         0.303166002035141,\n                         0.7329490184783936,\n                         -0.6089959740638733,\n                         0,\n                         0.7939500212669373,\n                         -0.6079840064048767,\n                         0.7055429816246033,\n                         0.7055429816246033,\n                         -0.06647899746894836,\n                         0.6360920071601868,\n                         0.6360920071601868,\n                         -0.4367780089378357,\n                         0.5149649977684021,\n                         0.5149649977684021,\n                         -0.6852890253067017,\n                         0.48965099453926086,\n                         0.48965099453926086,\n                         -0.7214459776878357,\n                         0.5605549812316895,\n                         0.5605549812316895,\n                         -0.6095539927482605,\n                         0.9218789935112,\n                         0.38175201416015625,\n                         -0.06636899709701538,\n                         0.8314369916915894,\n                         0.3441790044307709,\n                         -0.4361799955368042,\n                         0.6735119819641113,\n                         0.2785939872264862,\n                         -0.6846650242805481,\n                         0.6403989791870117,\n                         0.26487401127815247,\n                         -0.7209240198135376,\n                         0.7329490184783936,\n                         0.303166002035141,\n                         -0.6089959740638733,\n                         0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         0.9001820087432861,\n                         0,\n                         -0.4355129897594452,\n                         0.7296109795570374,\n                         0,\n                         -0.6838629841804504,\n                         0.6939510107040405,\n                         0,\n                         -0.7200220227241516,\n                         0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         0.7329490184783936,\n                         -0.303166002035141,\n                         -0.6089959740638733,\n                         0.576229989528656,\n                         -0.23821599781513214,\n                         -0.7818009853363037,\n                         0.6238600015640259,\n                         0,\n                         -0.7815359830856323,\n                         0.16362899541854858,\n                         -0.06752700358629227,\n                         -0.9842079877853394,\n                         0.17729100584983826,\n                         0,\n                         -0.984158992767334,\n                         0.04542100057005882,\n                         -0.018735000863671303,\n                         -0.9987919926643372,\n                         0.04920699819922447,\n                         0,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         0,\n                         -1,\n                         0.5605549812316895,\n                         -0.5605549812316895,\n                         -0.6095539927482605,\n                         0.44041600823402405,\n                         -0.44041600823402405,\n                         -0.7823479771614075,\n                         0.12490200251340866,\n                         -0.12490200251340866,\n                         -0.9842759966850281,\n                         0.034662000834941864,\n                         -0.034662000834941864,\n                         -0.9987980127334595,\n                         0,\n                         0,\n                         -1,\n                         0.303166002035141,\n                         -0.7329490184783936,\n                         -0.6089959740638733,\n                         0.23821599781513214,\n                         -0.576229989528656,\n                         -0.7818009853363037,\n                         0.06752700358629227,\n                         -0.16362899541854858,\n                         -0.9842079877853394,\n                         0.018735000863671303,\n                         -0.04542100057005882,\n                         -0.9987919926643372,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         -0.7939500212669373,\n                         -0.6079840064048767,\n                         0,\n                         -0.6238600015640259,\n                         -0.7815359830856323,\n                         0,\n                         -0.17729100584983826,\n                         -0.984158992767334,\n                         0,\n                         -0.04920699819922447,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         -0.7939500212669373,\n                         -0.6079840064048767,\n                         -0.303166002035141,\n                         -0.7329490184783936,\n                         -0.6089959740638733,\n                         -0.23821599781513214,\n                         -0.576229989528656,\n                         -0.7818009853363037,\n                         0,\n                         -0.6238600015640259,\n                         -0.7815359830856323,\n                         -0.06752700358629227,\n                         -0.16362899541854858,\n                         -0.9842079877853394,\n                         0,\n                         -0.17729100584983826,\n                         -0.984158992767334,\n                         -0.018735000863671303,\n                         -0.04542100057005882,\n                         -0.9987919926643372,\n                         0,\n                         -0.04920699819922447,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         0,\n                         -1,\n                         -0.5605549812316895,\n                         -0.5605549812316895,\n                         -0.6095539927482605,\n                         -0.44041600823402405,\n                         -0.44041600823402405,\n                         -0.7823479771614075,\n                         -0.12490200251340866,\n                         -0.12490200251340866,\n                         -0.9842759966850281,\n                         -0.034662000834941864,\n                         -0.034662000834941864,\n                         -0.9987980127334595,\n                         0,\n                         0,\n                         -1,\n                         -0.7329490184783936,\n                         -0.303166002035141,\n                         -0.6089959740638733,\n                         -0.576229989528656,\n                         -0.23821599781513214,\n                         -0.7818009853363037,\n                         -0.16362899541854858,\n                         -0.06752700358629227,\n                         -0.9842079877853394,\n                         -0.04542100057005882,\n                         -0.018735000863671303,\n                         -0.9987919926643372,\n                         0,\n                         0,\n                         -1,\n                         -0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         -0.6238600015640259,\n                         0,\n                         -0.7815359830856323,\n                         -0.17729100584983826,\n                         0,\n                         -0.984158992767334,\n                         -0.04920699819922447,\n                         0,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         -0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         -0.7329490184783936,\n                         0.303166002035141,\n                         -0.6089959740638733,\n                         -0.576229989528656,\n                         0.23821599781513214,\n                         -0.7818009853363037,\n                         -0.6238600015640259,\n                         0,\n                         -0.7815359830856323,\n                         -0.16362899541854858,\n                         0.06752700358629227,\n                         -0.9842079877853394,\n                         -0.17729100584983826,\n                         0,\n                         -0.984158992767334,\n                         -0.04542100057005882,\n                         0.018735000863671303,\n                         -0.9987919926643372,\n                         -0.04920699819922447,\n                         0,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         0,\n                         -1,\n                         -0.5605549812316895,\n                         0.5605549812316895,\n                         -0.6095539927482605,\n                         -0.44041600823402405,\n                         0.44041600823402405,\n                         -0.7823479771614075,\n                         -0.12490200251340866,\n                         0.12490200251340866,\n                         -0.9842759966850281,\n                         -0.034662000834941864,\n                         0.034662000834941864,\n                         -0.9987980127334595,\n                         0,\n                         0,\n                         -1,\n                         -0.303166002035141,\n                         0.7329490184783936,\n                         -0.6089959740638733,\n                         -0.23821599781513214,\n                         0.576229989528656,\n                         -0.7818009853363037,\n                         -0.06752700358629227,\n                         0.16362899541854858,\n                         -0.9842079877853394,\n                         -0.018735000863671303,\n                         0.04542100057005882,\n                         -0.9987919926643372,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         0.7939500212669373,\n                         -0.6079840064048767,\n                         0,\n                         0.6238600015640259,\n                         -0.7815359830856323,\n                         0,\n                         0.17729100584983826,\n                         -0.984158992767334,\n                         0,\n                         0.04920699819922447,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         0.7939500212669373,\n                         -0.6079840064048767,\n                         0.303166002035141,\n                         0.7329490184783936,\n                         -0.6089959740638733,\n                         0.23821599781513214,\n                         0.576229989528656,\n                         -0.7818009853363037,\n                         0,\n                         0.6238600015640259,\n                         -0.7815359830856323,\n                         0.06752700358629227,\n                         0.16362899541854858,\n                         -0.9842079877853394,\n                         0,\n                         0.17729100584983826,\n                         -0.984158992767334,\n                         0.018735000863671303,\n                         0.04542100057005882,\n                         -0.9987919926643372,\n                         0,\n                         0.04920699819922447,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         0,\n                         -1,\n                         0.5605549812316895,\n                         0.5605549812316895,\n                         -0.6095539927482605,\n                         0.44041600823402405,\n                         0.44041600823402405,\n                         -0.7823479771614075,\n                         0.12490200251340866,\n                         0.12490200251340866,\n                         -0.9842759966850281,\n                         0.034662000834941864,\n                         0.034662000834941864,\n                         -0.9987980127334595,\n                         0,\n                         0,\n                         -1,\n                         0.7329490184783936,\n                         0.303166002035141,\n                         -0.6089959740638733,\n                         0.576229989528656,\n                         0.23821599781513214,\n                         -0.7818009853363037,\n                         0.16362899541854858,\n                         0.06752700358629227,\n                         -0.9842079877853394,\n                         0.04542100057005882,\n                         0.018735000863671303,\n                         -0.9987919926643372,\n                         0,\n                         0,\n                         -1,\n                         0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         0.6238600015640259,\n                         0,\n                         -0.7815359830856323,\n                         0.17729100584983826,\n                         0,\n                         -0.984158992767334,\n                         0.04920699819922447,\n                         0,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0.007784999907016754,\n                         0.00021499999274965376,\n                         -0.999970018863678,\n                         0.007038000039756298,\n                         -0.5829259753227234,\n                         -0.8124949932098389,\n                         0.0361270010471344,\n                         -0.5456140041351318,\n                         -0.837257981300354,\n                         0.03913800045847893,\n                         0.0009879999561235309,\n                         -0.9992330074310303,\n                         0.16184599697589874,\n                         -0.5630490183830261,\n                         -0.8104209899902344,\n                         0.17951199412345886,\n                         0.0043680001981556416,\n                         -0.9837459921836853,\n                         0.4823650121688843,\n                         -0.6427459716796875,\n                         -0.5951480269432068,\n                         0.6122999787330627,\n                         0.010459000244736671,\n                         -0.790556013584137,\n                         0.7387199997901917,\n                         -0.6641989946365356,\n                         -0.11459299921989441,\n                         0.9861519932746887,\n                         0.006668999791145325,\n                         -0.16570700705051422,\n                         -0.0019079999765381217,\n                         -0.9867690205574036,\n                         0.1621209979057312,\n                         0.002761000068858266,\n                         -0.9998499751091003,\n                         0.017105000093579292,\n                         0.010532000102102757,\n                         -0.9972469806671143,\n                         0.07339800149202347,\n                         -0.06604000180959702,\n                         -0.9893029928207397,\n                         0.13006900250911713,\n                         -0.09442699700593948,\n                         -0.9953929781913757,\n                         0.016594000160694122,\n                         -0.009201999753713608,\n                         -0.4902929961681366,\n                         0.8715090155601501,\n                         -0.04860600084066391,\n                         -0.5394579768180847,\n                         0.8406090140342712,\n                         -0.22329799830913544,\n                         -0.5527390241622925,\n                         0.8028810024261475,\n                         -0.5963649749755859,\n                         -0.5751349925994873,\n                         0.5599709749221802,\n                         -0.8033369779586792,\n                         -0.5916029810905457,\n                         0.06823500245809555,\n                         -0.01056000031530857,\n                         -0.00010299999848939478,\n                         0.9999439716339111,\n                         -0.05879800021648407,\n                         -0.0007089999853633344,\n                         0.9982699751853943,\n                         -0.28071001172065735,\n                         -0.0032679999712854624,\n                         0.9597870111465454,\n                         -0.7497230172157288,\n                         -0.004267000127583742,\n                         0.6617379784584045,\n                         -0.9973509907722473,\n                         -0.0020580000709742308,\n                         0.07271400094032288,\n                         -0.01056000031530857,\n                         -0.00010299999848939478,\n                         0.9999439716339111,\n                         -0.008791999891400337,\n                         0.49032899737358093,\n                         0.8714929819107056,\n                         -0.04649300128221512,\n                         0.5387560129165649,\n                         0.8411779999732971,\n                         -0.05879800021648407,\n                         -0.0007089999853633344,\n                         0.9982699751853943,\n                         -0.21790899336338043,\n                         0.5491610169410706,\n                         0.8068069815635681,\n                         -0.28071001172065735,\n                         -0.0032679999712854624,\n                         0.9597870111465454,\n                         -0.5972909927368164,\n                         0.5741199851036072,\n                         0.560027003288269,\n                         -0.7497230172157288,\n                         -0.004267000127583742,\n                         0.6617379784584045,\n                         -0.8040000200271606,\n                         0.5912910103797913,\n                         0.0629120022058487,\n                         -0.9973509907722473,\n                         -0.0020580000709742308,\n                         0.07271400094032288,\n                         -0.0018050000071525574,\n                         0.986840009689331,\n                         0.16169099509716034,\n                         0.0020310000982135534,\n                         0.999891996383667,\n                         0.014553000219166279,\n                         0.009215000085532665,\n                         0.9981520175933838,\n                         0.060068998485803604,\n                         -0.059335000813007355,\n                         0.9917230010032654,\n                         0.11386600136756897,\n                         -0.08690100163221359,\n                         0.9961410164833069,\n                         0.01228999998420477,\n                         0.006417000200599432,\n                         0.5830950140953064,\n                         -0.812379002571106,\n                         0.03378299996256828,\n                         0.5453730225563049,\n                         -0.8375130295753479,\n                         0.1571130007505417,\n                         0.562188982963562,\n                         -0.8119469881057739,\n                         0.4844059944152832,\n                         0.6465290188789368,\n                         -0.5893650054931641,\n                         0.7388700246810913,\n                         0.6661880016326904,\n                         -0.10131999850273132,\n                         0.007784999907016754,\n                         0.00021499999274965376,\n                         -0.999970018863678,\n                         0.03913800045847893,\n                         0.0009879999561235309,\n                         -0.9992330074310303,\n                         0.17951199412345886,\n                         0.0043680001981556416,\n                         -0.9837459921836853,\n                         0.6122999787330627,\n                         0.010459000244736671,\n                         -0.790556013584137,\n                         0.9861519932746887,\n                         0.006668999791145325,\n                         -0.16570700705051422,\n                         0.9861519932746887,\n                         0.006668999791145325,\n                         -0.16570700705051422,\n                         0.7387199997901917,\n                         -0.6641989946365356,\n                         -0.11459299921989441,\n                         0.7256090044975281,\n                         -0.6373609900474548,\n                         0.25935098528862,\n                         0.94651198387146,\n                         0.0033569999504834414,\n                         0.3226499855518341,\n                         0.6459450125694275,\n                         -0.6077200174331665,\n                         0.46198800206184387,\n                         0.8258299827575684,\n                         0.007451999932527542,\n                         0.5638700127601624,\n                         0.5316150188446045,\n                         -0.5586140155792236,\n                         0.6366599798202515,\n                         0.6500110030174255,\n                         0.006936000194400549,\n                         0.759893000125885,\n                         0.4249640107154846,\n                         -0.5955389738082886,\n                         0.6817179918289185,\n                         0.5324289798736572,\n                         0.005243999883532524,\n                         0.8464580178260803,\n                         -0.09442699700593948,\n                         -0.9953929781913757,\n                         0.016594000160694122,\n                         -0.04956100136041641,\n                         -0.9985759854316711,\n                         -0.01975500024855137,\n                         -0.03781700134277344,\n                         -0.998649001121521,\n                         -0.035624999552965164,\n                         -0.0379129983484745,\n                         -0.9986140131950378,\n                         -0.03651199862360954,\n                         -0.1688539981842041,\n                         -0.9395300149917603,\n                         -0.2979460060596466,\n                         -0.8033369779586792,\n                         -0.5916029810905457,\n                         0.06823500245809555,\n                         -0.7423409819602966,\n                         -0.5995240211486816,\n                         -0.2991659939289093,\n                         -0.6196020245552063,\n                         -0.5795029997825623,\n                         -0.5294060111045837,\n                         -0.483707994222641,\n                         -0.5438370108604431,\n                         -0.6857600212097168,\n                         -0.44529199600219727,\n                         -0.4131770133972168,\n                         -0.7943549752235413,\n                         -0.9973509907722473,\n                         -0.0020580000709742308,\n                         0.07271400094032288,\n                         -0.9265130162239075,\n                         -0.0019950000569224358,\n                         -0.3762570023536682,\n                         -0.7539200186729431,\n                         -0.004317000042647123,\n                         -0.6569520235061646,\n                         -0.5662239789962769,\n                         -0.003461000043898821,\n                         -0.8242440223693848,\n                         -0.4818040132522583,\n                         -0.0018500000005587935,\n                         -0.8762770295143127,\n                         -0.9973509907722473,\n                         -0.0020580000709742308,\n                         0.07271400094032288,\n                         -0.8040000200271606,\n                         0.5912910103797913,\n                         0.0629120022058487,\n                         -0.7446749806404114,\n                         0.5989770293235779,\n                         -0.29442399740219116,\n                         -0.9265130162239075,\n                         -0.0019950000569224358,\n                         -0.3762570023536682,\n                         -0.6219490170478821,\n                         0.5781649947166443,\n                         -0.5281140208244324,\n                         -0.7539200186729431,\n                         -0.004317000042647123,\n                         -0.6569520235061646,\n                         -0.48117101192474365,\n                         0.5428280234336853,\n                         -0.6883400082588196,\n                         -0.5662239789962769,\n                         -0.003461000043898821,\n                         -0.8242440223693848,\n                         -0.43805500864982605,\n                         0.41574400663375854,\n                         -0.7970349788665771,\n                         -0.4818040132522583,\n                         -0.0018500000005587935,\n                         -0.8762770295143127,\n                         -0.08690100163221359,\n                         0.9961410164833069,\n                         0.01228999998420477,\n                         -0.04433799907565117,\n                         0.9988710284233093,\n                         -0.017055999487638474,\n                         -0.026177000254392624,\n                         0.9992600083351135,\n                         -0.02816700004041195,\n                         -0.025293000042438507,\n                         0.9992780089378357,\n                         -0.028332000598311424,\n                         -0.15748199820518494,\n                         0.9441670179367065,\n                         -0.28939300775527954,\n                         0.7388700246810913,\n                         0.6661880016326904,\n                         -0.10131999850273132,\n                         0.7282440066337585,\n                         0.63714200258255,\n                         0.25240999460220337,\n                         0.6470540165901184,\n                         0.6082550287246704,\n                         0.4597249925136566,\n                         0.5229939818382263,\n                         0.5621700286865234,\n                         0.6406570076942444,\n                         0.4099780023097992,\n                         0.6046689748764038,\n                         0.6828569769859314,\n                         0.9861519932746887,\n                         0.006668999791145325,\n                         -0.16570700705051422,\n                         0.94651198387146,\n                         0.0033569999504834414,\n                         0.3226499855518341,\n                         0.8258299827575684,\n                         0.007451999932527542,\n                         0.5638700127601624,\n                         0.6500110030174255,\n                         0.006936000194400549,\n                         0.759893000125885,\n                         0.5324289798736572,\n                         0.005243999883532524,\n                         0.8464580178260803,\n                         -0.230786994099617,\n                         0.006523000076413155,\n                         0.9729819893836975,\n                         -0.15287800133228302,\n                         -0.7101899981498718,\n                         0.6872109770774841,\n                         -0.31672099232673645,\n                         -0.7021129727363586,\n                         0.6377500295639038,\n                         -0.5489360094070435,\n                         0.0015109999803826213,\n                         0.8358629941940308,\n                         -0.6010670065879822,\n                         -0.645330011844635,\n                         0.471451997756958,\n                         -0.8756710290908813,\n                         -0.009891999885439873,\n                         0.4828070104122162,\n                         -0.635890007019043,\n                         -0.629800021648407,\n                         0.4460900127887726,\n                         -0.8775539994239807,\n                         -0.01909100078046322,\n                         0.47909700870513916,\n                         -0.4357450008392334,\n                         -0.670009970664978,\n                         0.6010090112686157,\n                         -0.6961889863014221,\n                         -0.02449600026011467,\n                         0.7174400091171265,\n                         0.11111299693584442,\n                         -0.9901599884033203,\n                         -0.08506900072097778,\n                         0.22330999374389648,\n                         -0.9747260212898254,\n                         0.006539999973028898,\n                         0.19009700417518616,\n                         -0.9694579839706421,\n                         0.15496399998664856,\n                         0.005270000081509352,\n                         -0.9818699955940247,\n                         0.18948200345039368,\n                         -0.011750999838113785,\n                         -0.9690240025520325,\n                         0.24668699502944946,\n                         0.3439059853553772,\n                         -0.5994120240211487,\n                         -0.7227950096130371,\n                         0.5724899768829346,\n                         -0.5916270017623901,\n                         -0.5676559805870056,\n                         0.7874360084533691,\n                         -0.5605109930038452,\n                         -0.2564600110054016,\n                         0.6470969915390015,\n                         -0.6981409788131714,\n                         -0.3063740134239197,\n                         0.4275279939174652,\n                         -0.7535750269889832,\n                         -0.49934399127960205,\n                         0.4109260141849518,\n                         -0.0012839999981224537,\n                         -0.9116680026054382,\n                         0.6715199947357178,\n                         0.0008989999769255519,\n                         -0.7409859895706177,\n                         0.9220259785652161,\n                         0.00725199980661273,\n                         -0.3870599865913391,\n                         0.8469099998474121,\n                         0.01385399978607893,\n                         -0.5315560102462769,\n                         0.5359240174293518,\n                         0.010503999888896942,\n                         -0.8442010283470154,\n                         0.4109260141849518,\n                         -0.0012839999981224537,\n                         -0.9116680026054382,\n                         0.3411880135536194,\n                         0.6009309887886047,\n                         -0.7228230237960815,\n                         0.5786640048027039,\n                         0.591838002204895,\n                         -0.5611389875411987,\n                         0.6715199947357178,\n                         0.0008989999769255519,\n                         -0.7409859895706177,\n                         0.7848690152168274,\n                         0.5665420293807983,\n                         -0.25102001428604126,\n                         0.9220259785652161,\n                         0.00725199980661273,\n                         -0.3870599865913391,\n                         0.6426810026168823,\n                         0.7039899826049805,\n                         -0.3022570013999939,\n                         0.8469099998474121,\n                         0.01385399978607893,\n                         -0.5315560102462769,\n                         0.4185889959335327,\n                         0.7581170201301575,\n                         -0.5000420212745667,\n                         0.5359240174293518,\n                         0.010503999888896942,\n                         -0.8442010283470154,\n                         0.11580599844455719,\n                         0.9901139736175537,\n                         -0.07913900166749954,\n                         0.23281100392341614,\n                         0.9724410176277161,\n                         0.012564999982714653,\n                         0.20666299760341644,\n                         0.9662799835205078,\n                         0.15360000729560852,\n                         0.02449899911880493,\n                         0.9865779876708984,\n                         0.16144299507141113,\n                         0.0033809999004006386,\n                         0.9774550199508667,\n                         0.2111150026321411,\n                         -0.13491199910640717,\n                         0.7135509848594666,\n                         0.6874909996986389,\n                         -0.31953999400138855,\n                         0.7050619721412659,\n                         0.6330729722976685,\n                         -0.6039019823074341,\n                         0.6499029994010925,\n                         0.4614419937133789,\n                         -0.6318150162696838,\n                         0.6400719881057739,\n                         0.43716898560523987,\n                         -0.4243049919605255,\n                         0.6667500138282776,\n                         0.6127070188522339,\n                         -0.230786994099617,\n                         0.006523000076413155,\n                         0.9729819893836975,\n                         -0.5489360094070435,\n                         0.0015109999803826213,\n                         0.8358629941940308,\n                         -0.8756710290908813,\n                         -0.009891999885439873,\n                         0.4828070104122162,\n                         -0.8775539994239807,\n                         -0.01909100078046322,\n                         0.47909700870513916,\n                         -0.6961889863014221,\n                         -0.02449600026011467,\n                         0.7174400091171265,\n                         -0.6961889863014221,\n                         -0.02449600026011467,\n                         0.7174400091171265,\n                         -0.4357450008392334,\n                         -0.670009970664978,\n                         0.6010090112686157,\n                         -0.25985801219940186,\n                         -0.5525479912757874,\n                         0.7919380068778992,\n                         -0.42579901218414307,\n                         -0.010804999619722366,\n                         0.9047530293464661,\n                         0.009537000209093094,\n                         0.021669000387191772,\n                         0.9997199773788452,\n                         0.022041000425815582,\n                         -0.001623000018298626,\n                         0.9997559785842896,\n                         0.4101540148258209,\n                         0.8490809798240662,\n                         0.3329179883003235,\n                         0.9995980262756348,\n                         -0.01155600044876337,\n                         0.02587899938225746,\n                         0.5415220260620117,\n                         0.6370009779930115,\n                         -0.5486199855804443,\n                         0.7095860242843628,\n                         -0.009670999832451344,\n                         -0.7045519948005676,\n                         -0.011750999838113785,\n                         -0.9690240025520325,\n                         0.24668699502944946,\n                         0.046310000121593475,\n                         -0.8891720175743103,\n                         0.45522499084472656,\n                         -0.010688000358641148,\n                         -0.14889900386333466,\n                         0.9887949824333191,\n                         -0.04437499865889549,\n                         0.7291200160980225,\n                         0.6829460263252258,\n                         0.12282499670982361,\n                         0.9923850297927856,\n                         0.009232000447809696,\n                         0.4275279939174652,\n                         -0.7535750269889832,\n                         -0.49934399127960205,\n                         0.48183900117874146,\n                         -0.857479989528656,\n                         -0.18044300377368927,\n                         0.45527198910713196,\n                         -0.49992498755455017,\n                         0.7367510199546814,\n                         -0.22054199874401093,\n                         0.3582780063152313,\n                         0.9071930050849915,\n                         -0.23591899871826172,\n                         0.7157959938049316,\n                         0.6572499871253967,\n                         0.5359240174293518,\n                         0.010503999888896942,\n                         -0.8442010283470154,\n                         0.7280910015106201,\n                         0.015584999695420265,\n                         -0.6853029727935791,\n                         0.8887389898300171,\n                         0.016679000109434128,\n                         0.4581089913845062,\n                         -0.26009801030158997,\n                         -0.0007999999797903001,\n                         0.965582013130188,\n                         -0.37161099910736084,\n                         0.004416999872773886,\n                         0.9283779859542847,\n                         0.5359240174293518,\n                         0.010503999888896942,\n                         -0.8442010283470154,\n                         0.4185889959335327,\n                         0.7581170201301575,\n                         -0.5000420212745667,\n                         0.4801650047302246,\n                         0.8588529825210571,\n                         -0.17836299538612366,\n                         0.7280910015106201,\n                         0.015584999695420265,\n                         -0.6853029727935791,\n                         0.4881030023097992,\n                         0.49794700741767883,\n                         0.7168020009994507,\n                         0.8887389898300171,\n                         0.016679000109434128,\n                         0.4581089913845062,\n                         -0.2220049947500229,\n                         -0.36189401149749756,\n                         0.9053990244865417,\n                         -0.26009801030158997,\n                         -0.0007999999797903001,\n                         0.965582013130188,\n                         -0.23540399968624115,\n                         -0.7104769945144653,\n                         0.6631799936294556,\n                         -0.37161099910736084,\n                         0.004416999872773886,\n                         0.9283779859542847,\n                         0.0033809999004006386,\n                         0.9774550199508667,\n                         0.2111150026321411,\n                         0.058719001710414886,\n                         0.8971999883651733,\n                         0.437703013420105,\n                         0.0013249999610707164,\n                         0.164000004529953,\n                         0.9864590167999268,\n                         -0.04418899863958359,\n                         -0.7303190231323242,\n                         0.6816750168800354,\n                         0.13880200684070587,\n                         -0.9897300004959106,\n                         -0.034189000725746155,\n                         -0.4243049919605255,\n                         0.6667500138282776,\n                         0.6127070188522339,\n                         -0.25888898968696594,\n                         0.5453789830207825,\n                         0.7972059845924377,\n                         0.012268000282347202,\n                         -0.01928500086069107,\n                         0.9997389912605286,\n                         0.3986299932003021,\n                         -0.8456630110740662,\n                         0.3548929989337921,\n                         0.5375639796257019,\n                         -0.6107370257377625,\n                         -0.5813990235328674,\n                         -0.6961889863014221,\n                         -0.02449600026011467,\n                         0.7174400091171265,\n                         -0.42579901218414307,\n                         -0.010804999619722366,\n                         0.9047530293464661,\n                         0.022041000425815582,\n                         -0.001623000018298626,\n                         0.9997559785842896,\n                         0.9995980262756348,\n                         -0.01155600044876337,\n                         0.02587899938225746,\n                         0.7095860242843628,\n                         -0.009670999832451344,\n                         -0.7045519948005676,\n                         0,\n                         0,\n                         1,\n                         0,\n                         0,\n                         1,\n                         0.7626410126686096,\n                         -0.31482499837875366,\n                         0.5650339722633362,\n                         0.8245400190353394,\n                         -0.00001700000029813964,\n                         0.5658029913902283,\n                         0.8479819893836975,\n                         -0.3500339984893799,\n                         -0.39799800515174866,\n                         0.917701005935669,\n                         -0.00003300000025774352,\n                         -0.397271990776062,\n                         0.8641409873962402,\n                         -0.35644200444221497,\n                         -0.3552600145339966,\n                         0.9352689981460571,\n                         -0.00011200000153621659,\n                         -0.3539389967918396,\n                         0.7209920287132263,\n                         -0.29793301224708557,\n                         0.6256250143051147,\n                         0.7807120084762573,\n                         -0.00007500000356230885,\n                         0.6248909831047058,\n                         0,\n                         0,\n                         1,\n                         0.5833569765090942,\n                         -0.5833380222320557,\n                         0.5651649832725525,\n                         0.648485004901886,\n                         -0.6484479904174805,\n                         -0.3987259864807129,\n                         0.6608719825744629,\n                         -0.6607480049133301,\n                         -0.35589399933815,\n                         0.5518630146980286,\n                         -0.5517799854278564,\n                         0.6252880096435547,\n                         0,\n                         0,\n                         1,\n                         0.31482499837875366,\n                         -0.762628972530365,\n                         0.5650510191917419,\n                         0.35004499554634094,\n                         -0.8479880094528198,\n                         -0.39797601103782654,\n                         0.35647401213645935,\n                         -0.8641520142555237,\n                         -0.35519900918006897,\n                         0.29798200726509094,\n                         -0.7210670113563538,\n                         0.6255149841308594,\n                         0,\n                         0,\n                         1,\n                         -0.00001700000029813964,\n                         -0.8245400190353394,\n                         0.5658029913902283,\n                         -0.00003300000025774352,\n                         -0.917701005935669,\n                         -0.397271990776062,\n                         -0.00011200000153621659,\n                         -0.9352689981460571,\n                         -0.3539389967918396,\n                         -0.00007500000356230885,\n                         -0.7807120084762573,\n                         0.6248900294303894,\n                         0,\n                         0,\n                         1,\n                         0,\n                         0,\n                         1,\n                         -0.31482499837875366,\n                         -0.7626410126686096,\n                         0.5650339722633362,\n                         -0.00001700000029813964,\n                         -0.8245400190353394,\n                         0.5658029913902283,\n                         -0.3500339984893799,\n                         -0.8479819893836975,\n                         -0.39799800515174866,\n                         -0.00003300000025774352,\n                         -0.917701005935669,\n                         -0.397271990776062,\n                         -0.35644200444221497,\n                         -0.8641409873962402,\n                         -0.3552600145339966,\n                         -0.00011200000153621659,\n                         -0.9352689981460571,\n                         -0.3539389967918396,\n                         -0.29793301224708557,\n                         -0.7209920287132263,\n                         0.6256250143051147,\n                         -0.00007500000356230885,\n                         -0.7807120084762573,\n                         0.6248900294303894,\n                         0,\n                         0,\n                         1,\n                         -0.5833380222320557,\n                         -0.5833569765090942,\n                         0.5651649832725525,\n                         -0.6484479904174805,\n                         -0.648485004901886,\n                         -0.3987259864807129,\n                         -0.6607480049133301,\n                         -0.6608719825744629,\n                         -0.35589399933815,\n                         -0.5517799854278564,\n                         -0.5518630146980286,\n                         0.6252880096435547,\n                         0,\n                         0,\n                         1,\n                         -0.762628972530365,\n                         -0.31482499837875366,\n                         0.5650510191917419,\n                         -0.8479880094528198,\n                         -0.35004499554634094,\n                         -0.39797601103782654,\n                         -0.8641520142555237,\n                         -0.35647401213645935,\n                         -0.35519900918006897,\n                         -0.7210670113563538,\n                         -0.29798200726509094,\n                         0.6255149841308594,\n                         0,\n                         0,\n                         1,\n                         -0.8245400190353394,\n                         0.00001700000029813964,\n                         0.5658029913902283,\n                         -0.917701005935669,\n                         0.00003300000025774352,\n                         -0.397271990776062,\n                         -0.9352689981460571,\n                         0.00011200000153621659,\n                         -0.3539389967918396,\n                         -0.7807120084762573,\n                         0.00007500000356230885,\n                         0.6248900294303894,\n                         0,\n                         0,\n                         1,\n                         0,\n                         0,\n                         1,\n                         -0.7626410126686096,\n                         0.31482499837875366,\n                         0.5650339722633362,\n                         -0.8245400190353394,\n                         0.00001700000029813964,\n                         0.5658029913902283,\n                         -0.8479819893836975,\n                         0.3500339984893799,\n                         -0.39799800515174866,\n                         -0.917701005935669,\n                         0.00003300000025774352,\n                         -0.397271990776062,\n                         -0.8641409873962402,\n                         0.35644200444221497,\n                         -0.3552600145339966,\n                         -0.9352689981460571,\n                         0.00011200000153621659,\n                         -0.3539389967918396,\n                         -0.7209920287132263,\n                         0.29793301224708557,\n                         0.6256250143051147,\n                         -0.7807120084762573,\n                         0.00007500000356230885,\n                         0.6248900294303894,\n                         0,\n                         0,\n                         1,\n                         -0.5833569765090942,\n                         0.5833380222320557,\n                         0.5651649832725525,\n                         -0.648485004901886,\n                         0.6484479904174805,\n                         -0.3987259864807129,\n                         -0.6608719825744629,\n                         0.6607480049133301,\n                         -0.35589399933815,\n                         -0.5518630146980286,\n                         0.5517799854278564,\n                         0.6252880096435547,\n                         0,\n                         0,\n                         1,\n                         -0.31482499837875366,\n                         0.762628972530365,\n                         0.5650510191917419,\n                         -0.35004499554634094,\n                         0.8479880094528198,\n                         -0.39797601103782654,\n                         -0.35647401213645935,\n                         0.8641520142555237,\n                         -0.35519900918006897,\n                         -0.29798200726509094,\n                         0.7210670113563538,\n                         0.6255149841308594,\n                         0,\n                         0,\n                         1,\n                         0.00001700000029813964,\n                         0.8245400190353394,\n                         0.5658029913902283,\n                         0.00003300000025774352,\n                         0.917701005935669,\n                         -0.397271990776062,\n                         0.00011200000153621659,\n                         0.9352689981460571,\n                         -0.3539389967918396,\n                         0.00007500000356230885,\n                         0.7807120084762573,\n                         0.6248900294303894,\n                         0,\n                         0,\n                         1,\n                         0,\n                         0,\n                         1,\n                         0.31482499837875366,\n                         0.7626410126686096,\n                         0.5650339722633362,\n                         0.00001700000029813964,\n                         0.8245400190353394,\n                         0.5658029913902283,\n                         0.3500339984893799,\n                         0.8479819893836975,\n                         -0.39799800515174866,\n                         0.00003300000025774352,\n                         0.917701005935669,\n                         -0.397271990776062,\n                         0.35644200444221497,\n                         0.8641409873962402,\n                         -0.3552600145339966,\n                         0.00011200000153621659,\n                         0.9352689981460571,\n                         -0.3539389967918396,\n                         0.29793301224708557,\n                         0.7209920287132263,\n                         0.6256250143051147,\n                         0.00007500000356230885,\n                         0.7807120084762573,\n                         0.6248900294303894,\n                         0,\n                         0,\n                         1,\n                         0.5833380222320557,\n                         0.5833569765090942,\n                         0.5651649832725525,\n                         0.6484479904174805,\n                         0.648485004901886,\n                         -0.3987259864807129,\n                         0.6607480049133301,\n                         0.6608719825744629,\n                         -0.35589399933815,\n                         0.5517799854278564,\n                         0.5518630146980286,\n                         0.6252880096435547,\n                         0,\n                         0,\n                         1,\n                         0.762628972530365,\n                         0.31482499837875366,\n                         0.5650510191917419,\n                         0.8479880094528198,\n                         0.35004499554634094,\n                         -0.39797601103782654,\n                         0.8641520142555237,\n                         0.35647401213645935,\n                         -0.35519900918006897,\n                         0.7210670113563538,\n                         0.29798200726509094,\n                         0.6255149841308594,\n                         0,\n                         0,\n                         1,\n                         0.8245400190353394,\n                         -0.00001700000029813964,\n                         0.5658029913902283,\n                         0.917701005935669,\n                         -0.00003300000025774352,\n                         -0.397271990776062,\n                         0.9352689981460571,\n                         -0.00011200000153621659,\n                         -0.3539389967918396,\n                         0.7807120084762573,\n                         -0.00007500000356230885,\n                         0.6248909831047058,\n                         0.7807120084762573,\n                         -0.00007500000356230885,\n                         0.6248909831047058,\n                         0.7209920287132263,\n                         -0.29793301224708557,\n                         0.6256250143051147,\n                         0.21797800064086914,\n                         -0.0902160033583641,\n                         0.9717749953269958,\n                         0.23658299446105957,\n                         0,\n                         0.9716110229492188,\n                         0.1595889925956726,\n                         -0.06596100330352783,\n                         0.9849770069122314,\n                         0.17308400571346283,\n                         0,\n                         0.9849069714546204,\n                         0.3504979908466339,\n                         -0.1447400003671646,\n                         0.9253119826316833,\n                         0.37970298528671265,\n                         0,\n                         0.925108015537262,\n                         0.48558899760246277,\n                         -0.20147399604320526,\n                         0.8506529927253723,\n                         0.5266720056533813,\n                         0,\n                         0.8500679731369019,\n                         0.5518630146980286,\n                         -0.5517799854278564,\n                         0.6252880096435547,\n                         0.16663099825382233,\n                         -0.16663099825382233,\n                         0.9718379974365234,\n                         0.12190800160169601,\n                         -0.12190800160169601,\n                         0.9850260019302368,\n                         0.2676680088043213,\n                         -0.2676680088043213,\n                         0.9255849719047546,\n                         0.37131500244140625,\n                         -0.37131500244140625,\n                         0.8510289788246155,\n                         0.29798200726509094,\n                         -0.7210670113563538,\n                         0.6255149841308594,\n                         0.0902160033583641,\n                         -0.21797800064086914,\n                         0.9717749953269958,\n                         0.06596100330352783,\n                         -0.1595889925956726,\n                         0.9849770069122314,\n                         0.1447400003671646,\n                         -0.3504979908466339,\n                         0.9253119826316833,\n                         0.20147399604320526,\n                         -0.48558899760246277,\n                         0.8506529927253723,\n                         -0.00007500000356230885,\n                         -0.7807120084762573,\n                         0.6248900294303894,\n                         0,\n                         -0.23658299446105957,\n                         0.9716110229492188,\n                         0,\n                         -0.17308400571346283,\n                         0.9849069714546204,\n                         0,\n                         -0.37970298528671265,\n                         0.925108015537262,\n                         0,\n                         -0.5266720056533813,\n                         0.8500679731369019,\n                         -0.00007500000356230885,\n                         -0.7807120084762573,\n                         0.6248900294303894,\n                         -0.29793301224708557,\n                         -0.7209920287132263,\n                         0.6256250143051147,\n                         -0.0902160033583641,\n                         -0.21797800064086914,\n                         0.9717749953269958,\n                         0,\n                         -0.23658299446105957,\n                         0.9716110229492188,\n                         -0.06596100330352783,\n                         -0.1595889925956726,\n                         0.9849770069122314,\n                         0,\n                         -0.17308400571346283,\n                         0.9849069714546204,\n                         -0.1447400003671646,\n                         -0.3504979908466339,\n                         0.9253119826316833,\n                         0,\n                         -0.37970298528671265,\n                         0.925108015537262,\n                         -0.20147399604320526,\n                         -0.48558899760246277,\n                         0.8506529927253723,\n                         0,\n                         -0.5266720056533813,\n                         0.8500679731369019,\n                         -0.5517799854278564,\n                         -0.5518630146980286,\n                         0.6252880096435547,\n                         -0.16663099825382233,\n                         -0.16663099825382233,\n                         0.9718379974365234,\n                         -0.12190800160169601,\n                         -0.12190800160169601,\n                         0.9850260019302368,\n                         -0.2676680088043213,\n                         -0.2676680088043213,\n                         0.9255849719047546,\n                         -0.37131500244140625,\n                         -0.37131500244140625,\n                         0.8510289788246155,\n                         -0.7210670113563538,\n                         -0.29798200726509094,\n                         0.6255149841308594,\n                         -0.21797800064086914,\n                         -0.0902160033583641,\n                         0.9717749953269958,\n                         -0.1595889925956726,\n                         -0.06596100330352783,\n                         0.9849770069122314,\n                         -0.3504979908466339,\n                         -0.1447400003671646,\n                         0.9253119826316833,\n                         -0.48558899760246277,\n                         -0.20147399604320526,\n                         0.8506529927253723,\n                         -0.7807120084762573,\n                         0.00007500000356230885,\n                         0.6248900294303894,\n                         -0.23658299446105957,\n                         0,\n                         0.9716110229492188,\n                         -0.17308400571346283,\n                         0,\n                         0.9849069714546204,\n                         -0.37970298528671265,\n                         0,\n                         0.925108015537262,\n                         -0.5266720056533813,\n                         0,\n                         0.8500679731369019,\n                         -0.7807120084762573,\n                         0.00007500000356230885,\n                         0.6248900294303894,\n                         -0.7209920287132263,\n                         0.29793301224708557,\n                         0.6256250143051147,\n                         -0.21797800064086914,\n                         0.0902160033583641,\n                         0.9717749953269958,\n                         -0.23658299446105957,\n                         0,\n                         0.9716110229492188,\n                         -0.1595889925956726,\n                         0.06596100330352783,\n                         0.9849770069122314,\n                         -0.17308400571346283,\n                         0,\n                         0.9849069714546204,\n                         -0.3504979908466339,\n                         0.1447400003671646,\n                         0.9253119826316833,\n                         -0.37970298528671265,\n                         0,\n                         0.925108015537262,\n                         -0.48558899760246277,\n                         0.20147399604320526,\n                         0.8506529927253723,\n                         -0.5266720056533813,\n                         0,\n                         0.8500679731369019,\n                         -0.5518630146980286,\n                         0.5517799854278564,\n                         0.6252880096435547,\n                         -0.16663099825382233,\n                         0.16663099825382233,\n                         0.9718379974365234,\n                         -0.12190800160169601,\n                         0.12190800160169601,\n                         0.9850260019302368,\n                         -0.2676680088043213,\n                         0.2676680088043213,\n                         0.9255849719047546,\n                         -0.37131500244140625,\n                         0.37131500244140625,\n                         0.8510289788246155,\n                         -0.29798200726509094,\n                         0.7210670113563538,\n                         0.6255149841308594,\n                         -0.0902160033583641,\n                         0.21797800064086914,\n                         0.9717749953269958,\n                         -0.06596100330352783,\n                         0.1595889925956726,\n                         0.9849770069122314,\n                         -0.1447400003671646,\n                         0.3504979908466339,\n                         0.9253119826316833,\n                         -0.20147399604320526,\n                         0.48558899760246277,\n                         0.8506529927253723,\n                         0.00007500000356230885,\n                         0.7807120084762573,\n                         0.6248900294303894,\n                         0,\n                         0.23658299446105957,\n                         0.9716110229492188,\n                         0,\n                         0.17308400571346283,\n                         0.9849069714546204,\n                         0,\n                         0.37970298528671265,\n                         0.925108015537262,\n                         0,\n                         0.5266720056533813,\n                         0.8500679731369019,\n                         0.00007500000356230885,\n                         0.7807120084762573,\n                         0.6248900294303894,\n                         0.29793301224708557,\n                         0.7209920287132263,\n                         0.6256250143051147,\n                         0.0902160033583641,\n                         0.21797800064086914,\n                         0.9717749953269958,\n                         0,\n                         0.23658299446105957,\n                         0.9716110229492188,\n                         0.06596100330352783,\n                         0.1595889925956726,\n                         0.9849770069122314,\n                         0,\n                         0.17308400571346283,\n                         0.9849069714546204,\n                         0.1447400003671646,\n                         0.3504979908466339,\n                         0.9253119826316833,\n                         0,\n                         0.37970298528671265,\n                         0.925108015537262,\n                         0.20147399604320526,\n                         0.48558899760246277,\n                         0.8506529927253723,\n                         0,\n                         0.5266720056533813,\n                         0.8500679731369019,\n                         0.5517799854278564,\n                         0.5518630146980286,\n                         0.6252880096435547,\n                         0.16663099825382233,\n                         0.16663099825382233,\n                         0.9718379974365234,\n                         0.12190800160169601,\n                         0.12190800160169601,\n                         0.9850260019302368,\n                         0.2676680088043213,\n                         0.2676680088043213,\n                         0.9255849719047546,\n                         0.37131500244140625,\n                         0.37131500244140625,\n                         0.8510289788246155,\n                         0.7210670113563538,\n                         0.29798200726509094,\n                         0.6255149841308594,\n                         0.21797800064086914,\n                         0.0902160033583641,\n                         0.9717749953269958,\n                         0.1595889925956726,\n                         0.06596100330352783,\n                         0.9849770069122314,\n                         0.3504979908466339,\n                         0.1447400003671646,\n                         0.9253119826316833,\n                         0.48558899760246277,\n                         0.20147399604320526,\n                         0.8506529927253723,\n                         0.7807120084762573,\n                         -0.00007500000356230885,\n                         0.6248909831047058,\n                         0.23658299446105957,\n                         0,\n                         0.9716110229492188,\n                         0.17308400571346283,\n                         0,\n                         0.9849069714546204,\n                         0.37970298528671265,\n                         0,\n                         0.925108015537262,\n                         0.5266720056533813,\n                         0,\n                         0.8500679731369019};\n\nfloat teapotTangents[] = {0.012897999957203865,\n                          0.998727023601532,\n                          -0.048757001757621765,\n                          0.3861910104751587,\n                          0.9210079908370972,\n                          -0.016421999782323837,\n                          0.38136398792266846,\n                          0.9230089783668518,\n                          0.000155999994603917,\n                          0.012866999953985214,\n                          0.9987300038337708,\n                          0.04870200157165527,\n                          0.3750790059566498,\n                          0.9061710238456726,\n                          -0.0007169999880716205,\n                          0.19210100173950195,\n                          0.9812139868736267,\n                          0.01775900088250637,\n                          0.3782620131969452,\n                          0.9142940044403076,\n                          -0.00011300000187475234,\n                          0.10451500117778778,\n                          0.9897350072860718,\n                          -0.09747499972581863,\n                          0.3655939996242523,\n                          0.9257190227508545,\n                          0.028463000431656837,\n                          0.04767199978232384,\n                          0.9953050017356873,\n                          -0.08423800021409988,\n                          0.7092679738998413,\n                          0.7031199932098389,\n                          -0.016364000737667084,\n                          0.7061989903450012,\n                          0.7061989903450012,\n                          0,\n                          0.6937360167503357,\n                          0.6937360167503357,\n                          0,\n                          0.6997770071029663,\n                          0.6997770071029663,\n                          0,\n                          0.6924030184745789,\n                          0.7150859832763672,\n                          0.02822900004684925,\n                          0.9243540167808533,\n                          0.37810400128364563,\n                          -0.01657800003886223,\n                          0.9230089783668518,\n                          0.38136398792266846,\n                          -0.000155999994603917,\n                          0.9061710238456726,\n                          0.3750790059566498,\n                          0.0007169999880716205,\n                          0.9142940044403076,\n                          0.3782620131969452,\n                          0.00011300000187475234,\n                          0.9133660197257996,\n                          0.39544400572776794,\n                          0.028490999713540077,\n                          0.9987040162086487,\n                          0.015853000804781914,\n                          0.04836999997496605,\n                          0.9987369775772095,\n                          0.014649000018835068,\n                          -0.04806999862194061,\n                          0.9812150001525879,\n                          0.19211700558662415,\n                          -0.01754000037908554,\n                          0.9897350072860718,\n                          0.10452800244092941,\n                          0.09745799750089645,\n                          0.9953050017356873,\n                          0.04767199978232384,\n                          0.08423800021409988,\n                          0.9988179802894592,\n                          -0.009758999571204185,\n                          -0.047600001096725464,\n                          0.9094679951667786,\n                          -0.4095839858055115,\n                          -0.012636999599635601,\n                          0.9240090250968933,\n                          -0.3811509907245636,\n                          -0.0003150000120513141,\n                          0.9987890124320984,\n                          -0.01066299993544817,\n                          0.04801800101995468,\n                          0.9072269797325134,\n                          -0.37142300605773926,\n                          0.0207310002297163,\n                          0.9814350008964539,\n                          -0.19095200300216675,\n                          0.01795700006186962,\n                          0.914870023727417,\n                          -0.3771440088748932,\n                          -0.0011480000102892518,\n                          0.989749014377594,\n                          -0.10442499816417694,\n                          -0.09742700308561325,\n                          0.925815999507904,\n                          -0.3653950095176697,\n                          0.028308000415563583,\n                          0.9953050017356873,\n                          -0.04767199978232384,\n                          -0.08423800021409988,\n                          0.6768929958343506,\n                          -0.7314029932022095,\n                          -0.01988700032234192,\n                          0.6994619965553284,\n                          -0.7145140171051025,\n                          -0.00029799999902024865,\n                          0.6940590143203735,\n                          -0.6933979988098145,\n                          0.015560000203549862,\n                          0.7002580165863037,\n                          -0.6996300220489502,\n                          -0.000783999974373728,\n                          0.715142011642456,\n                          -0.6923869848251343,\n                          0.028078999370336533,\n                          0.351936012506485,\n                          -0.933899998664856,\n                          -0.019843999296426773,\n                          0.36654001474380493,\n                          -0.9298419952392578,\n                          -0.0005210000090301037,\n                          0.37116900086402893,\n                          -0.9084830284118652,\n                          0.00152299995534122,\n                          0.3776479959487915,\n                          -0.9147650003433228,\n                          -0.00011000000085914508,\n                          0.39533698558807373,\n                          -0.9134349822998047,\n                          0.028410999104380608,\n                          0.0013210000470280647,\n                          -0.9989479780197144,\n                          0.045830998569726944,\n                          0.003897000104188919,\n                          -0.9988909959793091,\n                          -0.04690299928188324,\n                          0.18705999851226807,\n                          -0.9821630120277405,\n                          -0.018818000331521034,\n                          0.10363999754190445,\n                          -0.9898579716682434,\n                          0.09715499728918076,\n                          0.04757700115442276,\n                          -0.9953129887580872,\n                          0.08418799936771393,\n                          -0.02296699956059456,\n                          -0.9986780285835266,\n                          -0.04599199816584587,\n                          -0.3861910104751587,\n                          -0.9210079908370972,\n                          -0.016421999782323837,\n                          -0.38136398792266846,\n                          -0.9230089783668518,\n                          0.000155999994603917,\n                          -0.020431000739336014,\n                          -0.9987260103225708,\n                          0.04614400118589401,\n                          -0.3750790059566498,\n                          -0.9061710238456726,\n                          -0.0007169999880716205,\n                          -0.19216600060462952,\n                          -0.9812189936637878,\n                          0.01677200011909008,\n                          -0.3782620131969452,\n                          -0.9142940044403076,\n                          -0.00011300000187475234,\n                          -0.10471200197935104,\n                          -0.9897390007972717,\n                          -0.09722500294446945,\n                          -0.3655939996242523,\n                          -0.9257190227508545,\n                          0.028463000431656837,\n                          -0.047710999846458435,\n                          -0.9953050017356873,\n                          -0.08420699834823608,\n                          -0.7092679738998413,\n                          -0.7031199932098389,\n                          -0.016364000737667084,\n                          -0.7061989903450012,\n                          -0.7061989903450012,\n                          0,\n                          -0.6937360167503357,\n                          -0.6937360167503357,\n                          0,\n                          -0.6997770071029663,\n                          -0.6997770071029663,\n                          0,\n                          -0.6924030184745789,\n                          -0.7150859832763672,\n                          0.02822900004684925,\n                          -0.9243540167808533,\n                          -0.37810400128364563,\n                          -0.01657800003886223,\n                          -0.9230089783668518,\n                          -0.38136398792266846,\n                          -0.000155999994603917,\n                          -0.9061710238456726,\n                          -0.3750790059566498,\n                          0.0007169999880716205,\n                          -0.9142940044403076,\n                          -0.3782620131969452,\n                          0.00011300000187475234,\n                          -0.9133660197257996,\n                          -0.39544400572776794,\n                          0.028490999713540077,\n                          -0.998727023601532,\n                          -0.012897999957203865,\n                          0.048757001757621765,\n                          -0.9987300038337708,\n                          -0.012866999953985214,\n                          -0.04870200157165527,\n                          -0.9812139868736267,\n                          -0.19210100173950195,\n                          -0.01775900088250637,\n                          -0.9897350072860718,\n                          -0.10451500117778778,\n                          0.09747499972581863,\n                          -0.9953050017356873,\n                          -0.04767199978232384,\n                          0.08423800021409988,\n                          -0.998727023601532,\n                          0.012897999957203865,\n                          -0.048757001757621765,\n                          -0.9210079908370972,\n                          0.3861910104751587,\n                          -0.016421999782323837,\n                          -0.9230089783668518,\n                          0.38136398792266846,\n                          0.000155999994603917,\n                          -0.9987300038337708,\n                          0.012866999953985214,\n                          0.04870200157165527,\n                          -0.9061710238456726,\n                          0.3750790059566498,\n                          -0.0007169999880716205,\n                          -0.9812139868736267,\n                          0.19210100173950195,\n                          0.01775900088250637,\n                          -0.9142940044403076,\n                          0.3782620131969452,\n                          -0.00011300000187475234,\n                          -0.9897350072860718,\n                          0.10451500117778778,\n                          -0.09747499972581863,\n                          -0.9257190227508545,\n                          0.3655939996242523,\n                          0.028463000431656837,\n                          -0.9953050017356873,\n                          0.04767199978232384,\n                          -0.08423800021409988,\n                          -0.7031199932098389,\n                          0.7092679738998413,\n                          -0.016364000737667084,\n                          -0.7061989903450012,\n                          0.7061989903450012,\n                          0,\n                          -0.6937360167503357,\n                          0.6937360167503357,\n                          0,\n                          -0.6997770071029663,\n                          0.6997770071029663,\n                          0,\n                          -0.7150859832763672,\n                          0.6924030184745789,\n                          0.02822900004684925,\n                          -0.37810400128364563,\n                          0.9243540167808533,\n                          -0.01657800003886223,\n                          -0.38136398792266846,\n                          0.9230089783668518,\n                          -0.000155999994603917,\n                          -0.3750790059566498,\n                          0.9061710238456726,\n                          0.0007169999880716205,\n                          -0.3782620131969452,\n                          0.9142940044403076,\n                          0.00011300000187475234,\n                          -0.39544400572776794,\n                          0.9133660197257996,\n                          0.028490999713540077,\n                          -0.012897999957203865,\n                          0.998727023601532,\n                          0.048757001757621765,\n                          -0.012866999953985214,\n                          0.9987300038337708,\n                          -0.04870200157165527,\n                          -0.19210100173950195,\n                          0.9812139868736267,\n                          -0.01775900088250637,\n                          -0.10451500117778778,\n                          0.9897350072860718,\n                          0.09747499972581863,\n                          -0.04767199978232384,\n                          0.9953050017356873,\n                          0.08423800021409988,\n                          0.04767199978232384,\n                          0.9953050017356873,\n                          -0.08423800021409988,\n                          0.39544400572776794,\n                          0.9133660197257996,\n                          -0.028490999713540077,\n                          0.38111698627471924,\n                          0.9210190176963806,\n                          -0.000015999999959603883,\n                          0.031922999769449234,\n                          0.9968529939651489,\n                          -0.07255599647760391,\n                          0.3815299868583679,\n                          0.9219080209732056,\n                          0.0000019999999949504854,\n                          0.022261999547481537,\n                          0.9978039860725403,\n                          -0.06237399950623512,\n                          0.3821389973163605,\n                          0.9231889843940735,\n                          0.00001700000029813964,\n                          0.008317999541759491,\n                          0.9991790056228638,\n                          -0.03964800015091896,\n                          0.38228899240493774,\n                          0.9239469766616821,\n                          -0.004430000204592943,\n                          0.0008660000166855752,\n                          0.9999139904975891,\n                          0.013048999942839146,\n                          0.7150859832763672,\n                          0.6924030184745789,\n                          -0.02822900004684925,\n                          0.7048519849777222,\n                          0.7048519849777222,\n                          0,\n                          0.7055330276489258,\n                          0.7055330276489258,\n                          0,\n                          0.7065179944038391,\n                          0.7065179944038391,\n                          0,\n                          0.7068390250205994,\n                          0.707252025604248,\n                          -0.004379999823868275,\n                          0.9257190227508545,\n                          0.3655939996242523,\n                          -0.028463000431656837,\n                          0.9210180044174194,\n                          0.38111698627471924,\n                          0.000015999999959603883,\n                          0.9219080209732056,\n                          0.3815299868583679,\n                          -0.0000019999999949504854,\n                          0.9231889843940735,\n                          0.3821389973163605,\n                          -0.00001700000029813964,\n                          0.9237229824066162,\n                          0.38283199071884155,\n                          -0.004399999976158142,\n                          0.9953050017356873,\n                          0.04767199978232384,\n                          0.08423800021409988,\n                          0.9968529939651489,\n                          0.031922999769449234,\n                          0.07255599647760391,\n                          0.9978039860725403,\n                          0.022261999547481537,\n                          0.06237399950623512,\n                          0.9991790056228638,\n                          0.008317999541759491,\n                          0.03964800015091896,\n                          0.9999139904975891,\n                          0.0008660000166855752,\n                          -0.013048999942839146,\n                          0.9953050017356873,\n                          -0.04767199978232384,\n                          -0.08423800021409988,\n                          0.9135000109672546,\n                          -0.3951619863510132,\n                          -0.02861100062727928,\n                          0.9210190176963806,\n                          -0.38111698627471924,\n                          -0.000015999999959603883,\n                          0.9968529939651489,\n                          -0.031922999769449234,\n                          -0.07255599647760391,\n                          0.9219080209732056,\n                          -0.3815299868583679,\n                          0.0000019999999949504854,\n                          0.9978039860725403,\n                          -0.022261999547481537,\n                          -0.06237399950623512,\n                          0.9231889843940735,\n                          -0.3821389973163605,\n                          0.00001700000029813964,\n                          0.9991790056228638,\n                          -0.008317999541759491,\n                          -0.03964800015091896,\n                          0.9239469766616821,\n                          -0.38228899240493774,\n                          -0.004430000204592943,\n                          0.9999139904975891,\n                          -0.0008660000166855752,\n                          0.013048999942839146,\n                          0.6925899982452393,\n                          -0.7149369716644287,\n                          -0.028262000530958176,\n                          0.7048519849777222,\n                          -0.7048519849777222,\n                          0,\n                          0.7055330276489258,\n                          -0.7055330276489258,\n                          0,\n                          0.7065179944038391,\n                          -0.7065179944038391,\n                          0,\n                          0.707252025604248,\n                          -0.7068390250205994,\n                          -0.004379999823868275,\n                          0.3656100034713745,\n                          -0.9257280230522156,\n                          -0.02841299958527088,\n                          0.38111698627471924,\n                          -0.9210180044174194,\n                          0.000015999999959603883,\n                          0.3815299868583679,\n                          -0.9219080209732056,\n                          -0.0000019999999949504854,\n                          0.3821389973163605,\n                          -0.9231889843940735,\n                          -0.00001700000029813964,\n                          0.38283199071884155,\n                          -0.9237229824066162,\n                          -0.004399999976158142,\n                          0.04757700115442276,\n                          -0.9953129887580872,\n                          0.08418799936771393,\n                          0.031922999769449234,\n                          -0.9968529939651489,\n                          0.07255599647760391,\n                          0.022261999547481537,\n                          -0.9978039860725403,\n                          0.06237399950623512,\n                          0.008317999541759491,\n                          -0.9991790056228638,\n                          0.03964800015091896,\n                          0.0008660000166855752,\n                          -0.9999139904975891,\n                          -0.013048999942839146,\n                          -0.047710999846458435,\n                          -0.9953050017356873,\n                          -0.08420699834823608,\n                          -0.39544400572776794,\n                          -0.9133660197257996,\n                          -0.028490999713540077,\n                          -0.38111698627471924,\n                          -0.9210190176963806,\n                          -0.000015999999959603883,\n                          -0.031922999769449234,\n                          -0.9968529939651489,\n                          -0.07255599647760391,\n                          -0.3815299868583679,\n                          -0.9219080209732056,\n                          0.0000019999999949504854,\n                          -0.022261999547481537,\n                          -0.9978039860725403,\n                          -0.06237399950623512,\n                          -0.3821389973163605,\n                          -0.9231889843940735,\n                          0.00001700000029813964,\n                          -0.008317999541759491,\n                          -0.9991790056228638,\n                          -0.03964800015091896,\n                          -0.38228899240493774,\n                          -0.9239469766616821,\n                          -0.004430000204592943,\n                          -0.0008660000166855752,\n                          -0.9999139904975891,\n                          0.013048999942839146,\n                          -0.7150859832763672,\n                          -0.6924030184745789,\n                          -0.02822900004684925,\n                          -0.7048519849777222,\n                          -0.7048519849777222,\n                          0,\n                          -0.7055330276489258,\n                          -0.7055330276489258,\n                          0,\n                          -0.7065179944038391,\n                          -0.7065179944038391,\n                          0,\n                          -0.7068390250205994,\n                          -0.707252025604248,\n                          -0.004379999823868275,\n                          -0.9257190227508545,\n                          -0.3655939996242523,\n                          -0.028463000431656837,\n                          -0.9210180044174194,\n                          -0.38111698627471924,\n                          0.000015999999959603883,\n                          -0.9219080209732056,\n                          -0.3815299868583679,\n                          -0.0000019999999949504854,\n                          -0.9231889843940735,\n                          -0.3821389973163605,\n                          -0.00001700000029813964,\n                          -0.9237229824066162,\n                          -0.38283199071884155,\n                          -0.004399999976158142,\n                          -0.9953050017356873,\n                          -0.04767199978232384,\n                          0.08423800021409988,\n                          -0.9968529939651489,\n                          -0.031922999769449234,\n                          0.07255599647760391,\n                          -0.9978039860725403,\n                          -0.022261999547481537,\n                          0.06237399950623512,\n                          -0.9991790056228638,\n                          -0.008317999541759491,\n                          0.03964800015091896,\n                          -0.9999139904975891,\n                          -0.0008660000166855752,\n                          -0.013048999942839146,\n                          -0.9953050017356873,\n                          0.04767199978232384,\n                          -0.08423800021409988,\n                          -0.9133660197257996,\n                          0.39544400572776794,\n                          -0.028490999713540077,\n                          -0.9210190176963806,\n                          0.38111698627471924,\n                          -0.000015999999959603883,\n                          -0.9968529939651489,\n                          0.031922999769449234,\n                          -0.07255599647760391,\n                          -0.9219080209732056,\n                          0.3815299868583679,\n                          0.0000019999999949504854,\n                          -0.9978039860725403,\n                          0.022261999547481537,\n                          -0.06237399950623512,\n                          -0.9231889843940735,\n                          0.3821389973163605,\n                          0.00001700000029813964,\n                          -0.9991790056228638,\n                          0.008317999541759491,\n                          -0.03964800015091896,\n                          -0.9239469766616821,\n                          0.38228899240493774,\n                          -0.004430000204592943,\n                          -0.9999139904975891,\n                          0.0008660000166855752,\n                          0.013048999942839146,\n                          -0.6924030184745789,\n                          0.7150859832763672,\n                          -0.02822900004684925,\n                          -0.7048519849777222,\n                          0.7048519849777222,\n                          0,\n                          -0.7055330276489258,\n                          0.7055330276489258,\n                          0,\n                          -0.7065179944038391,\n                          0.7065179944038391,\n                          0,\n                          -0.707252025604248,\n                          0.7068390250205994,\n                          -0.004379999823868275,\n                          -0.3655939996242523,\n                          0.9257190227508545,\n                          -0.028463000431656837,\n                          -0.38111698627471924,\n                          0.9210180044174194,\n                          0.000015999999959603883,\n                          -0.3815299868583679,\n                          0.9219080209732056,\n                          -0.0000019999999949504854,\n                          -0.3821389973163605,\n                          0.9231889843940735,\n                          -0.00001700000029813964,\n                          -0.38283199071884155,\n                          0.9237229824066162,\n                          -0.004399999976158142,\n                          -0.04767199978232384,\n                          0.9953050017356873,\n                          0.08423800021409988,\n                          -0.031922999769449234,\n                          0.9968529939651489,\n                          0.07255599647760391,\n                          -0.022261999547481537,\n                          0.9978039860725403,\n                          0.06237399950623512,\n                          -0.008317999541759491,\n                          0.9991790056228638,\n                          0.03964800015091896,\n                          -0.0008660000166855752,\n                          0.9999139904975891,\n                          -0.013048999942839146,\n                          0.0008660000166855752,\n                          0.9999139904975891,\n                          0.013048999942839146,\n                          0.38283199071884155,\n                          0.9237229824066162,\n                          0.004399999976158142,\n                          0.38101500272750854,\n                          0.9204739928245544,\n                          -0.00003899999865097925,\n                          0.03731299936771393,\n                          0.9963229894638062,\n                          0.07712399959564209,\n                          0.37877199053764343,\n                          0.9154880046844482,\n                          0.00008399999933317304,\n                          0.09151100367307663,\n                          0.9910060167312622,\n                          0.097632996737957,\n                          0.378387987613678,\n                          0.9145749807357788,\n                          0.00009999999747378752,\n                          0.10134600102901459,\n                          0.9900450110435486,\n                          0.09767600148916245,\n                          0.356795996427536,\n                          0.9266510009765625,\n                          -0.03188199922442436,\n                          0.07246600091457367,\n                          0.9928709864616394,\n                          0.09463199973106384,\n                          0.707252025604248,\n                          0.7068390250205994,\n                          0.004379999823868275,\n                          0.7044739723205566,\n                          0.7044739723205566,\n                          0,\n                          0.7006790041923523,\n                          0.7006790041923523,\n                          0,\n                          0.6999930143356323,\n                          0.6999930143356323,\n                          0,\n                          0.6847820281982422,\n                          0.7192310094833374,\n                          -0.03167999908328056,\n                          0.9239469766616821,\n                          0.38228899240493774,\n                          0.004430000204592943,\n                          0.9204739928245544,\n                          0.38101500272750854,\n                          0.00003899999865097925,\n                          0.9154880046844482,\n                          0.37877199053764343,\n                          -0.00008399999933317304,\n                          0.9145749807357788,\n                          0.378387987613678,\n                          -0.00009999999747378752,\n                          0.9078760147094727,\n                          0.40216198563575745,\n                          -0.03206299990415573,\n                          0.9999139904975891,\n                          0.0008660000166855752,\n                          -0.013048999942839146,\n                          0.9963229894638062,\n                          0.03731299936771393,\n                          -0.07712399959564209,\n                          0.9910060167312622,\n                          0.09151100367307663,\n                          -0.097632996737957,\n                          0.9900450110435486,\n                          0.10134600102901459,\n                          -0.09767600148916245,\n                          0.9928709864616394,\n                          0.07246600091457367,\n                          -0.09463199973106384,\n                          0.9999139904975891,\n                          -0.0008660000166855752,\n                          0.013048999942839146,\n                          0.9237229824066162,\n                          -0.38283199071884155,\n                          0.004399999976158142,\n                          0.9204739928245544,\n                          -0.38101500272750854,\n                          -0.00003899999865097925,\n                          0.9963229894638062,\n                          -0.03731299936771393,\n                          0.07712399959564209,\n                          0.9154880046844482,\n                          -0.37877199053764343,\n                          0.00008399999933317304,\n                          0.9910060167312622,\n                          -0.09151100367307663,\n                          0.097632996737957,\n                          0.9145749807357788,\n                          -0.378387987613678,\n                          0.00009999999747378752,\n                          0.9900450110435486,\n                          -0.10134600102901459,\n                          0.09767600148916245,\n                          0.9266510009765625,\n                          -0.356795996427536,\n                          -0.03188199922442436,\n                          0.9928709864616394,\n                          -0.07246600091457367,\n                          0.09463199973106384,\n                          0.7068390250205994,\n                          -0.707252025604248,\n                          0.004379999823868275,\n                          0.7044739723205566,\n                          -0.7044739723205566,\n                          0,\n                          0.7006790041923523,\n                          -0.7006790041923523,\n                          0,\n                          0.6999930143356323,\n                          -0.6999930143356323,\n                          0,\n                          0.7192310094833374,\n                          -0.6847820281982422,\n                          -0.03167999908328056,\n                          0.38228899240493774,\n                          -0.9239469766616821,\n                          0.004430000204592943,\n                          0.38101500272750854,\n                          -0.9204739928245544,\n                          0.00003899999865097925,\n                          0.37877199053764343,\n                          -0.9154880046844482,\n                          -0.00008399999933317304,\n                          0.378387987613678,\n                          -0.9145749807357788,\n                          -0.00009999999747378752,\n                          0.40216198563575745,\n                          -0.9078760147094727,\n                          -0.03206299990415573,\n                          0.0008660000166855752,\n                          -0.9999139904975891,\n                          -0.013048999942839146,\n                          0.03731299936771393,\n                          -0.9963229894638062,\n                          -0.07712399959564209,\n                          0.09151100367307663,\n                          -0.9910060167312622,\n                          -0.097632996737957,\n                          0.10134600102901459,\n                          -0.9900450110435486,\n                          -0.09767600148916245,\n                          0.07246600091457367,\n                          -0.9928709864616394,\n                          -0.09463199973106384,\n                          -0.0008660000166855752,\n                          -0.9999139904975891,\n                          0.013048999942839146,\n                          -0.38283199071884155,\n                          -0.9237229824066162,\n                          0.004399999976158142,\n                          -0.38101500272750854,\n                          -0.9204739928245544,\n                          -0.00003899999865097925,\n                          -0.03731299936771393,\n                          -0.9963229894638062,\n                          0.07712399959564209,\n                          -0.37877199053764343,\n                          -0.9154880046844482,\n                          0.00008399999933317304,\n                          -0.09151100367307663,\n                          -0.9910060167312622,\n                          0.097632996737957,\n                          -0.378387987613678,\n                          -0.9145749807357788,\n                          0.00009999999747378752,\n                          -0.10134600102901459,\n                          -0.9900450110435486,\n                          0.09767600148916245,\n                          -0.356795996427536,\n                          -0.9266510009765625,\n                          -0.03188199922442436,\n                          -0.07246600091457367,\n                          -0.9928709864616394,\n                          0.09463199973106384,\n                          -0.707252025604248,\n                          -0.7068390250205994,\n                          0.004379999823868275,\n                          -0.7044739723205566,\n                          -0.7044739723205566,\n                          0,\n                          -0.7006790041923523,\n                          -0.7006790041923523,\n                          0,\n                          -0.6999930143356323,\n                          -0.6999930143356323,\n                          0,\n                          -0.6847820281982422,\n                          -0.7192310094833374,\n                          -0.03167999908328056,\n                          -0.9239469766616821,\n                          -0.38228899240493774,\n                          0.004430000204592943,\n                          -0.9204739928245544,\n                          -0.38101500272750854,\n                          0.00003899999865097925,\n                          -0.9154880046844482,\n                          -0.37877199053764343,\n                          -0.00008399999933317304,\n                          -0.9145749807357788,\n                          -0.378387987613678,\n                          -0.00009999999747378752,\n                          -0.9078760147094727,\n                          -0.40216198563575745,\n                          -0.03206299990415573,\n                          -0.9999139904975891,\n                          -0.0008660000166855752,\n                          -0.013048999942839146,\n                          -0.9963229894638062,\n                          -0.03731299936771393,\n                          -0.07712399959564209,\n                          -0.9910060167312622,\n                          -0.09151100367307663,\n                          -0.097632996737957,\n                          -0.9900450110435486,\n                          -0.10134600102901459,\n                          -0.09767600148916245,\n                          -0.9928709864616394,\n                          -0.07246600091457367,\n                          -0.09463199973106384,\n                          -0.9999139904975891,\n                          0.0008660000166855752,\n                          0.013048999942839146,\n                          -0.9237229824066162,\n                          0.38283199071884155,\n                          0.004399999976158142,\n                          -0.9204739928245544,\n                          0.38101500272750854,\n                          -0.00003899999865097925,\n                          -0.9963229894638062,\n                          0.03731299936771393,\n                          0.07712399959564209,\n                          -0.9154880046844482,\n                          0.37877199053764343,\n                          0.00008399999933317304,\n                          -0.9910060167312622,\n                          0.09151100367307663,\n                          0.097632996737957,\n                          -0.9145749807357788,\n                          0.378387987613678,\n                          0.00009999999747378752,\n                          -0.9900450110435486,\n                          0.10134600102901459,\n                          0.09767600148916245,\n                          -0.9266510009765625,\n                          0.356795996427536,\n                          -0.03188199922442436,\n                          -0.9928709864616394,\n                          0.07246600091457367,\n                          0.09463199973106384,\n                          -0.7068390250205994,\n                          0.707252025604248,\n                          0.004379999823868275,\n                          -0.7044739723205566,\n                          0.7044739723205566,\n                          0,\n                          -0.7006790041923523,\n                          0.7006790041923523,\n                          0,\n                          -0.6999930143356323,\n                          0.6999930143356323,\n                          0,\n                          -0.7192310094833374,\n                          0.6847820281982422,\n                          -0.03167999908328056,\n                          -0.38228899240493774,\n                          0.9239469766616821,\n                          0.004430000204592943,\n                          -0.38101500272750854,\n                          0.9204739928245544,\n                          0.00003899999865097925,\n                          -0.37877199053764343,\n                          0.9154880046844482,\n                          -0.00008399999933317304,\n                          -0.378387987613678,\n                          0.9145749807357788,\n                          -0.00009999999747378752,\n                          -0.40216198563575745,\n                          0.9078760147094727,\n                          -0.03206299990415573,\n                          -0.0008660000166855752,\n                          0.9999139904975891,\n                          -0.013048999942839146,\n                          -0.03731299936771393,\n                          0.9963229894638062,\n                          -0.07712399959564209,\n                          -0.09151100367307663,\n                          0.9910060167312622,\n                          -0.097632996737957,\n                          -0.10134600102901459,\n                          0.9900450110435486,\n                          -0.09767600148916245,\n                          -0.07246600091457367,\n                          0.9928709864616394,\n                          -0.09463199973106384,\n                          0.07246600091457367,\n                          0.9928709864616394,\n                          0.09463199973106384,\n                          0.40216198563575745,\n                          0.9078760147094727,\n                          0.03206299990415573,\n                          0.37766799330711365,\n                          0.912958025932312,\n                          0.00018099999579135329,\n                          0.11919300258159637,\n                          0.9883019924163818,\n                          0.09514500200748444,\n                          0.37516000866889954,\n                          0.906607985496521,\n                          0.00016799999866634607,\n                          0.187733992934227,\n                          0.9816380143165588,\n                          0.03381900116801262,\n                          0.2823430001735687,\n                          0.767549991607666,\n                          -0.1682250052690506,\n                          0.12883399426937103,\n                          0.6540690064430237,\n                          -0.32698601484298706,\n                          0.06457000225782394,\n                          0.32701900601387024,\n                          -0.6666669845581055,\n                          0,\n                          0,\n                          -1,\n                          0.7192320227622986,\n                          0.6847820281982422,\n                          0.03167999908328056,\n                          0.6987630128860474,\n                          0.6987630128860474,\n                          0,\n                          0.694034993648529,\n                          0.694034993648529,\n                          0,\n                          0.5551990270614624,\n                          0.6008960008621216,\n                          -0.16825300455093384,\n                          0.1854030042886734,\n                          0.27701398730278015,\n                          -0.6666669845581055,\n                          0.9266499876976013,\n                          0.3567950129508972,\n                          0.03188199922442436,\n                          0.912958025932312,\n                          0.37766799330711365,\n                          -0.00018099999579135329,\n                          0.906607985496521,\n                          0.37516000866889954,\n                          -0.00016799999866634607,\n                          0.742605984210968,\n                          0.3426159918308258,\n                          -0.1683180034160614,\n                          0.27701398730278015,\n                          0.1854030042886734,\n                          -0.6666669845581055,\n                          0.9928709864616394,\n                          0.07246600091457367,\n                          -0.09463199973106384,\n                          0.9883019924163818,\n                          0.11919300258159637,\n                          -0.09514500200748444,\n                          0.9816370010375977,\n                          0.187733992934227,\n                          -0.03381900116801262,\n                          0.9811030030250549,\n                          0.19325199723243713,\n                          -0.009519999846816063,\n                          0.49052900075912476,\n                          0.0968559980392456,\n                          -0.5,\n                          0.9928709864616394,\n                          -0.07246600091457367,\n                          0.09463199973106384,\n                          0.9078760147094727,\n                          -0.40216198563575745,\n                          0.03206299990415573,\n                          0.912958025932312,\n                          -0.37766799330711365,\n                          0.00018099999579135329,\n                          0.9883019924163818,\n                          -0.11919300258159637,\n                          0.09514500200748444,\n                          0.906607985496521,\n                          -0.37516000866889954,\n                          0.00016799999866634607,\n                          0.9816380143165588,\n                          -0.187733992934227,\n                          0.03381900116801262,\n                          0.767549991607666,\n                          -0.2823430001735687,\n                          -0.1682250052690506,\n                          0.6540690064430237,\n                          -0.12883399426937103,\n                          -0.32698601484298706,\n                          0.32701900601387024,\n                          -0.06457000225782394,\n                          -0.6666669845581055,\n                          0,\n                          0,\n                          -1,\n                          0.6847820281982422,\n                          -0.7192320227622986,\n                          0.03167999908328056,\n                          0.6987630128860474,\n                          -0.6987630128860474,\n                          0,\n                          0.694034993648529,\n                          -0.694034993648529,\n                          0,\n                          0.6008960008621216,\n                          -0.5551990270614624,\n                          -0.16825300455093384,\n                          0.27701398730278015,\n                          -0.1854030042886734,\n                          -0.6666669845581055,\n                          0.3567950129508972,\n                          -0.9266499876976013,\n                          0.03188199922442436,\n                          0.37766799330711365,\n                          -0.912958025932312,\n                          -0.00018099999579135329,\n                          0.37516000866889954,\n                          -0.906607985496521,\n                          -0.00016799999866634607,\n                          0.3426159918308258,\n                          -0.742605984210968,\n                          -0.1683180034160614,\n                          0.1854030042886734,\n                          -0.27701398730278015,\n                          -0.6666669845581055,\n                          0.07246600091457367,\n                          -0.9928709864616394,\n                          -0.09463199973106384,\n                          0.11919300258159637,\n                          -0.9883019924163818,\n                          -0.09514500200748444,\n                          0.187733992934227,\n                          -0.9816370010375977,\n                          -0.03381900116801262,\n                          0.19325199723243713,\n                          -0.9811030030250549,\n                          -0.009519999846816063,\n                          0.0968559980392456,\n                          -0.49052900075912476,\n                          -0.5,\n                          -0.07246600091457367,\n                          -0.9928709864616394,\n                          0.09463199973106384,\n                          -0.40216198563575745,\n                          -0.9078760147094727,\n                          0.03206299990415573,\n                          -0.37766799330711365,\n                          -0.912958025932312,\n                          0.00018099999579135329,\n                          -0.11919300258159637,\n                          -0.9883019924163818,\n                          0.09514500200748444,\n                          -0.37516000866889954,\n                          -0.906607985496521,\n                          0.00016799999866634607,\n                          -0.187733992934227,\n                          -0.9816380143165588,\n                          0.03381900116801262,\n                          -0.2823430001735687,\n                          -0.767549991607666,\n                          -0.1682250052690506,\n                          -0.12883399426937103,\n                          -0.6540690064430237,\n                          -0.32698601484298706,\n                          -0.06457000225782394,\n                          -0.32701900601387024,\n                          -0.6666669845581055,\n                          0,\n                          0,\n                          -1,\n                          -0.7192320227622986,\n                          -0.6847820281982422,\n                          0.03167999908328056,\n                          -0.6987630128860474,\n                          -0.6987630128860474,\n                          0,\n                          -0.694034993648529,\n                          -0.694034993648529,\n                          0,\n                          -0.5551990270614624,\n                          -0.6008960008621216,\n                          -0.16825300455093384,\n                          -0.1854030042886734,\n                          -0.27701398730278015,\n                          -0.6666669845581055,\n                          -0.9266499876976013,\n                          -0.3567950129508972,\n                          0.03188199922442436,\n                          -0.912958025932312,\n                          -0.37766799330711365,\n                          -0.00018099999579135329,\n                          -0.906607985496521,\n                          -0.37516000866889954,\n                          -0.00016799999866634607,\n                          -0.742605984210968,\n                          -0.3426159918308258,\n                          -0.1683180034160614,\n                          -0.27701398730278015,\n                          -0.1854030042886734,\n                          -0.6666669845581055,\n                          -0.9928709864616394,\n                          -0.07246600091457367,\n                          -0.09463199973106384,\n                          -0.9883019924163818,\n                          -0.11919300258159637,\n                          -0.09514500200748444,\n                          -0.9816370010375977,\n                          -0.187733992934227,\n                          -0.03381900116801262,\n                          -0.9811030030250549,\n                          -0.19325199723243713,\n                          -0.009519999846816063,\n                          -0.49052900075912476,\n                          -0.0968559980392456,\n                          -0.5,\n                          -0.9928709864616394,\n                          0.07246600091457367,\n                          0.09463199973106384,\n                          -0.9078760147094727,\n                          0.40216198563575745,\n                          0.03206299990415573,\n                          -0.912958025932312,\n                          0.37766799330711365,\n                          0.00018099999579135329,\n                          -0.9883019924163818,\n                          0.11919300258159637,\n                          0.09514500200748444,\n                          -0.906607985496521,\n                          0.37516000866889954,\n                          0.00016799999866634607,\n                          -0.9816380143165588,\n                          0.187733992934227,\n                          0.03381900116801262,\n                          -0.767549991607666,\n                          0.2823430001735687,\n                          -0.1682250052690506,\n                          -0.6540690064430237,\n                          0.12883399426937103,\n                          -0.32698601484298706,\n                          -0.32701900601387024,\n                          0.06457000225782394,\n                          -0.6666669845581055,\n                          0,\n                          0,\n                          -1,\n                          -0.6847820281982422,\n                          0.7192320227622986,\n                          0.03167999908328056,\n                          -0.6987630128860474,\n                          0.6987630128860474,\n                          0,\n                          -0.694034993648529,\n                          0.694034993648529,\n                          0,\n                          -0.6008960008621216,\n                          0.5551990270614624,\n                          -0.16825300455093384,\n                          -0.27701398730278015,\n                          0.1854030042886734,\n                          -0.6666669845581055,\n                          -0.3567950129508972,\n                          0.9266499876976013,\n                          0.03188199922442436,\n                          -0.37766799330711365,\n                          0.912958025932312,\n                          -0.00018099999579135329,\n                          -0.37516000866889954,\n                          0.906607985496521,\n                          -0.00016799999866634607,\n                          -0.3426159918308258,\n                          0.742605984210968,\n                          -0.1683180034160614,\n                          -0.1854030042886734,\n                          0.27701398730278015,\n                          -0.6666669845581055,\n                          -0.07246600091457367,\n                          0.9928709864616394,\n                          -0.09463199973106384,\n                          -0.11919300258159637,\n                          0.9883019924163818,\n                          -0.09514500200748444,\n                          -0.187733992934227,\n                          0.9816370010375977,\n                          -0.03381900116801262,\n                          -0.19325199723243713,\n                          0.9811030030250549,\n                          -0.009519999846816063,\n                          -0.0968559980392456,\n                          0.49052900075912476,\n                          -0.5,\n                          -0.006597999949008226,\n                          0.9961680173873901,\n                          0.0001630000042496249,\n                          -0.043907999992370605,\n                          0.779125988483429,\n                          -0.55936598777771,\n                          0.23287899792194366,\n                          0.79271000623703,\n                          -0.506534993648529,\n                          0.11139900237321854,\n                          0.9923329949378967,\n                          0.0053449999541044235,\n                          0.4521920084953308,\n                          0.7370989918708801,\n                          -0.42180201411247253,\n                          0.17797799408435822,\n                          0.9827970266342163,\n                          0.036841001361608505,\n                          0.6075379848480225,\n                          0.7066869735717773,\n                          -0.270797997713089,\n                          0.11894699931144714,\n                          0.9864829778671265,\n                          0.10517799854278564,\n                          0.6583719849586487,\n                          0.7438470125198364,\n                          -0.06727500259876251,\n                          0.0010629999451339245,\n                          0.99891597032547,\n                          0.04653400182723999,\n                          -0.1622990071773529,\n                          -0.14869500696659088,\n                          -0.9069569706916809,\n                          0.3020159900188446,\n                          -0.014301000162959099,\n                          -0.8847119808197021,\n                          0.7048640251159668,\n                          -0.042514998465776443,\n                          -0.6788020133972168,\n                          0.8948519825935364,\n                          -0.11078000068664551,\n                          -0.38824599981307983,\n                          0.9622920155525208,\n                          -0.09367900341749191,\n                          -0.14349600672721863,\n                          -0.12511900067329407,\n                          -0.8479049801826477,\n                          -0.4783349931240082,\n                          0.11315400153398514,\n                          -0.8153669834136963,\n                          -0.5167160034179688,\n                          0.3956319987773895,\n                          -0.7910019755363464,\n                          -0.4345270097255707,\n                          0.5244609713554382,\n                          -0.8012329936027527,\n                          -0.2643829882144928,\n                          0.571465015411377,\n                          -0.7902160286903381,\n                          -0.12332800030708313,\n                          -0.0943560004234314,\n                          -0.9955379962921143,\n                          -0.0010989999864250422,\n                          0.012040999718010426,\n                          -0.9965500235557556,\n                          0,\n                          0.09501499682664871,\n                          -0.9936969876289368,\n                          0.02440500073134899,\n                          0.03737499937415123,\n                          -0.9978089928627014,\n                          0.035909999161958694,\n                          -0.0008800000068731606,\n                          -0.9973530173301697,\n                          -0.04031199961900711,\n                          0.007164000067859888,\n                          -0.9961649775505066,\n                          -0.00002700000004551839,\n                          0.043988000601530075,\n                          -0.8330309987068176,\n                          0.4691329896450043,\n                          -0.2334270030260086,\n                          -0.7983189821243286,\n                          0.49840399622917175,\n                          -0.10737399756908417,\n                          -0.9927549958229065,\n                          -0.007029999978840351,\n                          -0.45147499442100525,\n                          -0.7576299905776978,\n                          0.39375001192092896,\n                          -0.15364399552345276,\n                          -0.9863160252571106,\n                          -0.048294998705387115,\n                          -0.5575600266456604,\n                          -0.7753210067749023,\n                          0.2001740038394928,\n                          -0.07242999970912933,\n                          -0.9923030138015747,\n                          -0.08845999836921692,\n                          -0.5877019762992859,\n                          -0.8041930198669434,\n                          0.04768599942326546,\n                          0.0005830000154674053,\n                          -0.9997940063476562,\n                          -0.020301999524235725,\n                          0.13663700222969055,\n                          -0.14665700495243073,\n                          0.8966140151023865,\n                          -0.3045389950275421,\n                          -0.012237999588251114,\n                          0.8833180069923401,\n                          -0.7020289897918701,\n                          -0.033987998962402344,\n                          0.6724730134010315,\n                          -0.8890330195426941,\n                          -0.09636799991130829,\n                          0.37605398893356323,\n                          -0.9668099880218506,\n                          -0.08601800352334976,\n                          0.1358419954776764,\n                          0.12022499740123749,\n                          0.7918559908866882,\n                          0.5693140029907227,\n                          -0.11313500255346298,\n                          0.8111780285835266,\n                          0.5236610174179077,\n                          -0.39790698885917664,\n                          0.7734419703483582,\n                          0.45853298902511597,\n                          -0.5793390274047852,\n                          0.7346490025520325,\n                          0.32973799109458923,\n                          -0.6447499990463257,\n                          0.7340419888496399,\n                          0.12459299713373184,\n                          0.09378799796104431,\n                          0.9955919981002808,\n                          0.000944000028539449,\n                          -0.01607999950647354,\n                          0.9964879751205444,\n                          0.00035600000410340726,\n                          -0.11933200061321259,\n                          0.9912199974060059,\n                          -0.01737299934029579,\n                          -0.08618299663066864,\n                          0.9940080046653748,\n                          -0.053598999977111816,\n                          -0.004110999871045351,\n                          0.9980229735374451,\n                          0.015703000128269196,\n                          0.010142000392079353,\n                          0.9933879971504211,\n                          0.10034400224685669,\n                          0.6597890257835388,\n                          0.7114480137825012,\n                          0.12964099645614624,\n                          0.5634239912033081,\n                          0.7594000101089478,\n                          0.289902001619339,\n                          -0.021227000281214714,\n                          0.9976930022239685,\n                          0.05189099907875061,\n                          0.3972559869289398,\n                          0.7709670066833496,\n                          0.45872700214385986,\n                          -0.05054600164294243,\n                          0.9957669973373413,\n                          0.060869000852108,\n                          0.11805199831724167,\n                          0.7611619830131531,\n                          0.5692800283432007,\n                          -0.11414600163698196,\n                          0.9869359731674194,\n                          0.08862999826669693,\n                          -0.0012870000209659338,\n                          0.7195389866828918,\n                          0.6293820142745972,\n                          -0.18971200287342072,\n                          0.9752820134162903,\n                          0.11328700184822083,\n                          0.9685969948768616,\n                          -0.08966200053691864,\n                          0.13331100344657898,\n                          0.8902140259742737,\n                          -0.051961999386548996,\n                          0.39323100447654724,\n                          0.6728280186653137,\n                          -0.050324998795986176,\n                          0.6965069770812988,\n                          0.25133201479911804,\n                          -0.04306900128722191,\n                          0.9169719815254211,\n                          -0.19813700020313263,\n                          -0.2512879967689514,\n                          0.9046909809112549,\n                          0.5937719941139221,\n                          -0.8024669885635376,\n                          0.03307799994945526,\n                          0.5571249723434448,\n                          -0.7907459735870361,\n                          0.2022089958190918,\n                          0.4313510060310364,\n                          -0.8083119988441467,\n                          0.37996000051498413,\n                          0.19395600259304047,\n                          -0.8197799921035767,\n                          0.5133119821548462,\n                          -0.1517219990491867,\n                          -0.8084930181503296,\n                          0.5055829882621765,\n                          0.0035200000274926424,\n                          -0.9997940063476562,\n                          0.019979000091552734,\n                          0.01159599982202053,\n                          -0.9981369972229004,\n                          -0.02326199971139431,\n                          0.01310999970883131,\n                          -0.9988970160484314,\n                          -0.008480999618768692,\n                          -0.02485400065779686,\n                          -0.9978809952735901,\n                          0.021263999864459038,\n                          -0.11335399746894836,\n                          -0.9881970286369324,\n                          0.06441199779510498,\n                          -0.0035459999926388264,\n                          -0.9954169988632202,\n                          -0.07682599872350693,\n                          -0.5816869735717773,\n                          -0.7760900259017944,\n                          -0.13957500457763672,\n                          -0.5260769724845886,\n                          -0.790789008140564,\n                          -0.2781960070133209,\n                          0.017288999632000923,\n                          -0.9983699917793274,\n                          -0.03728000074625015,\n                          -0.36800798773765564,\n                          -0.7982890009880066,\n                          -0.4405499994754791,\n                          0.03743100166320801,\n                          -0.9973520040512085,\n                          -0.03640099987387657,\n                          -0.09636899828910828,\n                          -0.7829139828681946,\n                          -0.5500450134277344,\n                          0.10426300019025803,\n                          -0.9894949793815613,\n                          -0.06746900081634521,\n                          0.10083399713039398,\n                          -0.8161320090293884,\n                          -0.48112401366233826,\n                          0.18510299921035767,\n                          -0.9776470065116882,\n                          -0.09971100091934204,\n                          -0.9615049958229065,\n                          -0.08203399926424026,\n                          -0.14958199858665466,\n                          -0.8876789808273315,\n                          -0.04622500017285347,\n                          -0.39955899119377136,\n                          -0.6675580143928528,\n                          -0.03723999857902527,\n                          -0.7007560133934021,\n                          -0.245511993765831,\n                          -0.03216199949383736,\n                          -0.9151920080184937,\n                          0.15477199852466583,\n                          -0.24929499626159668,\n                          -0.8975690007209778,\n                          -0.6700729727745056,\n                          0.7402250170707703,\n                          -0.01942499913275242,\n                          -0.5923460125923157,\n                          0.7624830007553101,\n                          -0.21566900610923767,\n                          -0.45611900091171265,\n                          0.7868310213088989,\n                          -0.39906400442123413,\n                          -0.21001900732517242,\n                          0.8031420111656189,\n                          -0.5333020091056824,\n                          0.05119999870657921,\n                          0.7096909880638123,\n                          -0.6591699719429016,\n                          -0.014175999909639359,\n                          0.9989240169525146,\n                          -0.04416000097990036,\n                          -0.0065449997782707214,\n                          0.9983869791030884,\n                          0.008813999593257904,\n                          0.0023960000835359097,\n                          0.9989259839057922,\n                          -0.016711000353097916,\n                          0.03813000023365021,\n                          0.9969249963760376,\n                          -0.04171599820256233,\n                          0.11744900047779083,\n                          0.986670970916748,\n                          -0.0799890011548996,\n                          -0.02072799950838089,\n                          -0.997963011264801,\n                          0.0017740000039339066,\n                          0.10236400365829468,\n                          -0.695684015750885,\n                          -0.6961740255355835,\n                          0.28174999356269836,\n                          -0.7065439820289612,\n                          -0.6379269957542419,\n                          -0.027713999152183533,\n                          -0.9983959794044495,\n                          -0.016395000740885735,\n                          0.4621469974517822,\n                          -0.7501789927482605,\n                          -0.43765199184417725,\n                          -0.014942999929189682,\n                          -0.9960020184516907,\n                          -0.04751100018620491,\n                          0.6121799945831299,\n                          -0.7355859875679016,\n                          -0.1658719927072525,\n                          0.08200599998235703,\n                          -0.9833409786224365,\n                          0.11102399975061417,\n                          0.7232419848442078,\n                          -0.6012910008430481,\n                          -0.14595800638198853,\n                          0.32238098978996277,\n                          -0.9036369919776917,\n                          0.28197699785232544,\n                          0.1188960000872612,\n                          0.09661199897527695,\n                          -0.9692260026931763,\n                          0.3230240046977997,\n                          0.06791900098323822,\n                          -0.9069269895553589,\n                          0.6287810206413269,\n                          0.00962899997830391,\n                          -0.711097002029419,\n                          0.8952469825744629,\n                          -0.060169998556375504,\n                          -0.3366979956626892,\n                          0.9689210057258606,\n                          -0.04508800059556961,\n                          -0.13095800578594208,\n                          0.06500200182199478,\n                          0.7708680033683777,\n                          -0.6083509922027588,\n                          0.1816529929637909,\n                          0.7457069754600525,\n                          -0.593995988368988,\n                          0.37600401043891907,\n                          0.7467949986457825,\n                          -0.4776870012283325,\n                          0.6288849711418152,\n                          0.7020969986915588,\n                          -0.27160701155662537,\n                          0.8230010271072388,\n                          0.5295370221138,\n                          -0.09450399875640869,\n                          -0.12820099294185638,\n                          0.9899809956550598,\n                          -0.05917999893426895,\n                          -0.11097600311040878,\n                          0.9872509837150574,\n                          -0.09937400370836258,\n                          -0.06767299771308899,\n                          0.9865689873695374,\n                          -0.1427209973335266,\n                          -0.0003349999897181988,\n                          0.9967420101165771,\n                          0.025443999096751213,\n                          0.29019099473953247,\n                          0.9243509769439697,\n                          0.1957239955663681,\n                          0.07294999808073044,\n                          0.9949049949645996,\n                          0.03147900104522705,\n                          -0.04948300123214722,\n                          0.7695090174674988,\n                          0.6163870096206665,\n                          -0.24193400144577026,\n                          0.7750219702720642,\n                          0.5679330229759216,\n                          0.05620399862527847,\n                          0.9959489703178406,\n                          0.052143000066280365,\n                          -0.4294399917125702,\n                          0.779321014881134,\n                          0.41615501046180725,\n                          0.023887999355793,\n                          0.9943940043449402,\n                          0.07553800195455551,\n                          -0.6655910015106201,\n                          0.6939520239830017,\n                          0.20106400549411774,\n                          -0.09678799659013748,\n                          0.9791589975357056,\n                          -0.12869000434875488,\n                          -0.7716730237007141,\n                          0.5443729758262634,\n                          0.1793539971113205,\n                          -0.417836993932724,\n                          0.8721759915351868,\n                          -0.2544029951095581,\n                          -0.09499499946832657,\n                          0.08934500068426132,\n                          0.9787889719009399,\n                          -0.3299880027770996,\n                          0.06701900064945221,\n                          0.9273520112037659,\n                          -0.6511250138282776,\n                          0.023523999378085136,\n                          0.7280719876289368,\n                          -0.9116759896278381,\n                          -0.033263999968767166,\n                          0.34162598848342896,\n                          -0.9896330237388611,\n                          -0.013496000319719315,\n                          0.07834099978208542,\n                          -0.07044100016355515,\n                          -0.6954740285873413,\n                          0.7080140113830566,\n                          -0.21969600021839142,\n                          -0.6959800124168396,\n                          0.6642320156097412,\n                          -0.4075010120868683,\n                          -0.7370589971542358,\n                          0.5047789812088013,\n                          -0.5866039991378784,\n                          -0.7473030090332031,\n                          0.24636299908161163,\n                          -0.799036979675293,\n                          -0.5617390275001526,\n                          0.05794600024819374,\n                          0.07605399936437607,\n                          -0.9967970252037048,\n                          0.02472200058400631,\n                          0.08756300061941147,\n                          -0.9926980137825012,\n                          0.05929899960756302,\n                          0.07250799983739853,\n                          -0.9901790022850037,\n                          0.11122000217437744,\n                          0.015556000173091888,\n                          -0.9970260262489319,\n                          -0.011235999874770641,\n                          -0.194814994931221,\n                          -0.9439409971237183,\n                          -0.22127500176429749,\n                          0.3417310118675232,\n                          -0.8896859884262085,\n                          0.3012309968471527,\n                          0.8375009894371033,\n                          -0.4931910037994385,\n                          0.05739299952983856,\n                          0.8273029923439026,\n                          -0.4684619903564453,\n                          -0.05539099872112274,\n                          0.5311300158500671,\n                          -0.8121910095214844,\n                          0.24026300013065338,\n                          0.8069959878921509,\n                          -0.47689300775527954,\n                          0.002638000063598156,\n                          0.644743025302887,\n                          -0.7642210125923157,\n                          -0.015455000102519989,\n                          0.8856800198554993,\n                          -0.4464530050754547,\n                          0.047488000243902206,\n                          -0.011536000296473503,\n                          -0.999845027923584,\n                          -0.0008730000117793679,\n                          0.7597830295562744,\n                          -0.6229599714279175,\n                          0.026636000722646713,\n                          0.321245014667511,\n                          -0.8855000138282776,\n                          0.3356960117816925,\n                          0.998091995716095,\n                          -0.005673000123351812,\n                          0.025262000039219856,\n                          0.9941530227661133,\n                          0.046904999762773514,\n                          -0.00951599981635809,\n                          0.9838590025901794,\n                          -0.00041700000292621553,\n                          0.010572000406682491,\n                          0.990556001663208,\n                          0.01886500045657158,\n                          0.04422200098633766,\n                          0.9921990036964417,\n                          -0.12290599942207336,\n                          0.011202000081539154,\n                          0.828000009059906,\n                          0.5258169770240784,\n                          -0.0846100002527237,\n                          0.8704839944839478,\n                          0.4878079891204834,\n                          0.00635599996894598,\n                          0.7773939967155457,\n                          0.5659670233726501,\n                          -0.09634699672460556,\n                          0.8190580010414124,\n                          0.4740380048751831,\n                          0.01190400030463934,\n                          0.9017590284347534,\n                          0.3486430048942566,\n                          -0.05601400136947632,\n                          0.41038599610328674,\n                          0.870602011680603,\n                          0.27135801315307617,\n                          0.3019320070743561,\n                          0.8897680044174194,\n                          0.34101900458335876,\n                          0.13912299275398254,\n                          0.9423390030860901,\n                          -0.3042120039463043,\n                          0.6167309880256653,\n                          0.7692840099334717,\n                          0.1667650043964386,\n                          0.5558350086212158,\n                          0.8010749816894531,\n                          0.21867799758911133,\n                          -0.4410029947757721,\n                          0.8555399775505066,\n                          -0.2693159878253937,\n                          -0.8639690279960632,\n                          0.464356005191803,\n                          -0.019222000613808632,\n                          -0.8705710172653198,\n                          0.4855479896068573,\n                          -0.005623999983072281,\n                          -0.33969300985336304,\n                          0.8762779831886292,\n                          -0.34097298979759216,\n                          -0.7608209848403931,\n                          0.5840269923210144,\n                          0.11236599832773209,\n                          -0.16763299703598022,\n                          0.9419429898262024,\n                          0.29091599583625793,\n                          -0.8260639905929565,\n                          0.47304999828338623,\n                          -0.0134699996560812,\n                          -0.6006280183792114,\n                          0.7822970151901245,\n                          -0.1611420065164566,\n                          -0.8495870232582092,\n                          0.4440779983997345,\n                          0.17417700588703156,\n                          -0.5251449942588806,\n                          0.8236340284347534,\n                          -0.21412399411201477,\n                          -0.9991480112075806,\n                          0.0017519999528303742,\n                          0.007890000008046627,\n                          -0.9946579933166504,\n                          0.06129400059580803,\n                          0.007796999998390675,\n                          -0.9840919971466064,\n                          0.008732999674975872,\n                          -0.0001289999927394092,\n                          -0.9916059970855713,\n                          0.015207000076770782,\n                          -0.04798699915409088,\n                          -0.9899899959564209,\n                          -0.13816699385643005,\n                          -0.019433999434113503,\n                          -0.7927820086479187,\n                          -0.5669599771499634,\n                          0.06795799732208252,\n                          -0.8363490104675293,\n                          -0.4685719907283783,\n                          0.048955000936985016,\n                          -0.8138830065727234,\n                          -0.4743089973926544,\n                          0.0008379999781027436,\n                          -0.8869869709014893,\n                          -0.4417180120944977,\n                          -0.05625399947166443,\n                          -0.7898640036582947,\n                          -0.5522750020027161,\n                          -0.15016800165176392,\n                          -0.297340989112854,\n                          -0.8998129963874817,\n                          -0.3192580044269562,\n                          -0.49759799242019653,\n                          -0.8317790031433105,\n                          -0.24411599338054657,\n                          -0.6295620203018188,\n                          -0.7765420079231262,\n                          0.01261799968779087,\n                          -0.011338000185787678,\n                          -0.9998990297317505,\n                          -0.008561000227928162,\n                          -0.3547320067882538,\n                          -0.8679590225219727,\n                          -0.3453510105609894,\n                          0.09618999809026718,\n                          0.49066001176834106,\n                          -0.5,\n                          0.1851000040769577,\n                          0.27721700072288513,\n                          -0.6666669845581055,\n                          0.32566601037979126,\n                          0.76139897108078,\n                          -0.18199099600315094,\n                          0.062401000410318375,\n                          0.9939020276069641,\n                          -0.09090700000524521,\n                          0.3803209960460663,\n                          0.9214360117912292,\n                          -0.00007100000220816582,\n                          0.030918000265955925,\n                          0.9969729781150818,\n                          0.07133600115776062,\n                          0.3804109990596771,\n                          0.9220889806747437,\n                          0.0001630000042496249,\n                          0.02471200004220009,\n                          0.9975799918174744,\n                          0.06498300284147263,\n                          0.35510900616645813,\n                          0.926891028881073,\n                          0.03216100111603737,\n                          0.07657899707555771,\n                          0.9924740195274353,\n                          -0.09555599838495255,\n                          0.27721700072288513,\n                          0.1851000040769577,\n                          -0.6666669845581055,\n                          0.5929989814758301,\n                          0.5781109929084778,\n                          -0.18205299973487854,\n                          0.7048519849777222,\n                          0.7048519849777222,\n                          0,\n                          0.7052720189094543,\n                          0.7054179906845093,\n                          -0.00002499999936844688,\n                          0.6835219860076904,\n                          0.7199410200119019,\n                          0.03204600140452385,\n                          0.3271070122718811,\n                          0.06412599980831146,\n                          -0.6666669845581055,\n                          0.7694699764251709,\n                          0.3061000108718872,\n                          -0.18225300312042236,\n                          0.9214379787445068,\n                          0.38033199310302734,\n                          0.0000670000008540228,\n                          0.9220880270004272,\n                          0.3804430067539215,\n                          -0.00016799999866634607,\n                          0.9071130156517029,\n                          0.403003990650177,\n                          0.032437000423669815,\n                          0,\n                          0,\n                          -1,\n                          0.6626030206680298,\n                          0.04157499969005585,\n                          -0.272724986076355,\n                          0.9969789981842041,\n                          0.03082600049674511,\n                          -0.07129299640655518,\n                          0.9975910186767578,\n                          0.024447999894618988,\n                          -0.06492199748754501,\n                          0.9925040006637573,\n                          0.07630900293588638,\n                          0.09545700252056122,\n                          0.49066001176834106,\n                          -0.09618999809026718,\n                          -0.5,\n                          0.27721700072288513,\n                          -0.1851000040769577,\n                          -0.6666669845581055,\n                          0.76139897108078,\n                          -0.32566601037979126,\n                          -0.18199099600315094,\n                          0.9939020276069641,\n                          -0.062401000410318375,\n                          -0.09090700000524521,\n                          0.9214360117912292,\n                          -0.3803209960460663,\n                          -0.00007100000220816582,\n                          0.9969729781150818,\n                          -0.030918000265955925,\n                          0.07133600115776062,\n                          0.9220889806747437,\n                          -0.3804109990596771,\n                          0.0001630000042496249,\n                          0.9975799918174744,\n                          -0.02471200004220009,\n                          0.06498300284147263,\n                          0.926891028881073,\n                          -0.35510900616645813,\n                          0.03216100111603737,\n                          0.9924740195274353,\n                          -0.07657899707555771,\n                          -0.09555599838495255,\n                          0.1851000040769577,\n                          -0.27721700072288513,\n                          -0.6666669845581055,\n                          0.5781109929084778,\n                          -0.5929989814758301,\n                          -0.18205299973487854,\n                          0.7048519849777222,\n                          -0.7048519849777222,\n                          0,\n                          0.7054179906845093,\n                          -0.7052720189094543,\n                          -0.00002499999936844688,\n                          0.7199410200119019,\n                          -0.6835219860076904,\n                          0.03204600140452385,\n                          0.06412599980831146,\n                          -0.3271070122718811,\n                          -0.6666669845581055,\n                          0.3061000108718872,\n                          -0.7694699764251709,\n                          -0.18225300312042236,\n                          0.38033199310302734,\n                          -0.9214379787445068,\n                          0.0000670000008540228,\n                          0.3804430067539215,\n                          -0.9220880270004272,\n                          -0.00016799999866634607,\n                          0.403003990650177,\n                          -0.9071130156517029,\n                          0.032437000423669815,\n                          0,\n                          0,\n                          -1,\n                          0.04157499969005585,\n                          -0.6626030206680298,\n                          -0.272724986076355,\n                          0.03082600049674511,\n                          -0.9969789981842041,\n                          -0.07129299640655518,\n                          0.024447999894618988,\n                          -0.9975910186767578,\n                          -0.06492199748754501,\n                          0.07630900293588638,\n                          -0.9925040006637573,\n                          0.09545700252056122,\n                          -0.09618999809026718,\n                          -0.49066001176834106,\n                          -0.5,\n                          -0.1851000040769577,\n                          -0.27721700072288513,\n                          -0.6666669845581055,\n                          -0.32566601037979126,\n                          -0.76139897108078,\n                          -0.18199099600315094,\n                          -0.062401000410318375,\n                          -0.9939020276069641,\n                          -0.09090700000524521,\n                          -0.3803209960460663,\n                          -0.9214360117912292,\n                          -0.00007100000220816582,\n                          -0.030918000265955925,\n                          -0.9969729781150818,\n                          0.07133600115776062,\n                          -0.3804109990596771,\n                          -0.9220889806747437,\n                          0.0001630000042496249,\n                          -0.02471200004220009,\n                          -0.9975799918174744,\n                          0.06498300284147263,\n                          -0.35510900616645813,\n                          -0.926891028881073,\n                          0.03216100111603737,\n                          -0.07657899707555771,\n                          -0.9924740195274353,\n                          -0.09555599838495255,\n                          -0.27721700072288513,\n                          -0.1851000040769577,\n                          -0.6666669845581055,\n                          -0.5929989814758301,\n                          -0.5781109929084778,\n                          -0.18205299973487854,\n                          -0.7048519849777222,\n                          -0.7048519849777222,\n                          0,\n                          -0.7052720189094543,\n                          -0.7054179906845093,\n                          -0.00002499999936844688,\n                          -0.6835219860076904,\n                          -0.7199410200119019,\n                          0.03204600140452385,\n                          -0.3271070122718811,\n                          -0.06412599980831146,\n                          -0.6666669845581055,\n                          -0.7694699764251709,\n                          -0.3061000108718872,\n                          -0.18225300312042236,\n                          -0.9214379787445068,\n                          -0.38033199310302734,\n                          0.0000670000008540228,\n                          -0.9220880270004272,\n                          -0.3804430067539215,\n                          -0.00016799999866634607,\n                          -0.9071130156517029,\n                          -0.403003990650177,\n                          0.032437000423669815,\n                          0,\n                          0,\n                          -1,\n                          -0.6626030206680298,\n                          -0.04157499969005585,\n                          -0.272724986076355,\n                          -0.9969789981842041,\n                          -0.03082600049674511,\n                          -0.07129299640655518,\n                          -0.9975910186767578,\n                          -0.024447999894618988,\n                          -0.06492199748754501,\n                          -0.9925040006637573,\n                          -0.07630900293588638,\n                          0.09545700252056122,\n                          -0.49066001176834106,\n                          0.09618999809026718,\n                          -0.5,\n                          -0.27721700072288513,\n                          0.1851000040769577,\n                          -0.6666669845581055,\n                          -0.76139897108078,\n                          0.32566601037979126,\n                          -0.18199099600315094,\n                          -0.9939020276069641,\n                          0.062401000410318375,\n                          -0.09090700000524521,\n                          -0.9214360117912292,\n                          0.3803209960460663,\n                          -0.00007100000220816582,\n                          -0.9969729781150818,\n                          0.030918000265955925,\n                          0.07133600115776062,\n                          -0.9220889806747437,\n                          0.3804109990596771,\n                          0.0001630000042496249,\n                          -0.9975799918174744,\n                          0.02471200004220009,\n                          0.06498300284147263,\n                          -0.926891028881073,\n                          0.35510900616645813,\n                          0.03216100111603737,\n                          -0.9924740195274353,\n                          0.07657899707555771,\n                          -0.09555599838495255,\n                          -0.1851000040769577,\n                          0.27721700072288513,\n                          -0.6666669845581055,\n                          -0.5781109929084778,\n                          0.5929989814758301,\n                          -0.18205299973487854,\n                          -0.7048519849777222,\n                          0.7048519849777222,\n                          0,\n                          -0.7054179906845093,\n                          0.7052720189094543,\n                          -0.00002499999936844688,\n                          -0.7199410200119019,\n                          0.6835219860076904,\n                          0.03204600140452385,\n                          -0.06412599980831146,\n                          0.3271070122718811,\n                          -0.6666669845581055,\n                          -0.3061000108718872,\n                          0.7694699764251709,\n                          -0.18225300312042236,\n                          -0.38033199310302734,\n                          0.9214379787445068,\n                          0.0000670000008540228,\n                          -0.3804430067539215,\n                          0.9220880270004272,\n                          -0.00016799999866634607,\n                          -0.403003990650177,\n                          0.9071130156517029,\n                          0.032437000423669815,\n                          0,\n                          0,\n                          -1,\n                          -0.04157499969005585,\n                          0.6626030206680298,\n                          -0.272724986076355,\n                          -0.03082600049674511,\n                          0.9969789981842041,\n                          -0.07129299640655518,\n                          -0.024447999894618988,\n                          0.9975910186767578,\n                          -0.06492199748754501,\n                          -0.07630900293588638,\n                          0.9925040006637573,\n                          0.09545700252056122,\n                          0.07657899707555771,\n                          0.9924740195274353,\n                          -0.09555599838495255,\n                          0.40307098627090454,\n                          0.9070649743080139,\n                          -0.03255299851298332,\n                          0.3753640055656433,\n                          0.9070209860801697,\n                          0.000007000000096013537,\n                          0.18306200206279755,\n                          0.9820899963378906,\n                          -0.04457399994134903,\n                          0.3751649856567383,\n                          0.9065750241279602,\n                          -0.00007400000322377309,\n                          0.18801499903202057,\n                          0.9816100001335144,\n                          -0.03304100036621094,\n                          0.3759070038795471,\n                          0.908607006072998,\n                          -0.00026199998683296144,\n                          0.16623400151729584,\n                          0.983722984790802,\n                          -0.06822899729013443,\n                          0.33324098587036133,\n                          0.9290030002593994,\n                          0.029803000390529633,\n                          0.14071400463581085,\n                          0.9862040281295776,\n                          -0.08718100190162659,\n                          0.7198299765586853,\n                          0.6836559772491455,\n                          -0.032017000019550323,\n                          0.6943539977073669,\n                          0.6943539977073669,\n                          0,\n                          0.694034993648529,\n                          0.694034993648529,\n                          0,\n                          0.6955100297927856,\n                          0.6955100297927856,\n                          0,\n                          0.6639170050621033,\n                          0.7306150197982788,\n                          0.029100999236106873,\n                          0.9268649816513062,\n                          0.35523301362991333,\n                          -0.03203999996185303,\n                          0.9070209860801697,\n                          0.3753649890422821,\n                          -0.000007000000096013537,\n                          0.9065750241279602,\n                          0.3751649856567383,\n                          0.00007300000288523734,\n                          0.908607006072998,\n                          0.3759070038795471,\n                          0.00026199998683296144,\n                          0.8926259875297546,\n                          0.4211460053920746,\n                          0.028991999104619026,\n                          0.9924740195274353,\n                          0.07646500319242477,\n                          0.09565100073814392,\n                          0.9820899963378906,\n                          0.18306200206279755,\n                          0.04457399994134903,\n                          0.9816100001335144,\n                          0.18801499903202057,\n                          0.03304100036621094,\n                          0.983722984790802,\n                          0.16623400151729584,\n                          0.06822899729013443,\n                          0.9862040281295776,\n                          0.14071400463581085,\n                          0.08718100190162659,\n                          0.9924740195274353,\n                          -0.07657899707555771,\n                          -0.09555599838495255,\n                          0.9070649743080139,\n                          -0.40307098627090454,\n                          -0.03255299851298332,\n                          0.9070209860801697,\n                          -0.3753640055656433,\n                          0.000007000000096013537,\n                          0.9820899963378906,\n                          -0.18306200206279755,\n                          -0.04457399994134903,\n                          0.9065750241279602,\n                          -0.3751649856567383,\n                          -0.00007400000322377309,\n                          0.9816100001335144,\n                          -0.18801499903202057,\n                          -0.03304100036621094,\n                          0.908607006072998,\n                          -0.3759070038795471,\n                          -0.00026199998683296144,\n                          0.983722984790802,\n                          -0.16623400151729584,\n                          -0.06822899729013443,\n                          0.9290030002593994,\n                          -0.33324098587036133,\n                          0.029803000390529633,\n                          0.9862040281295776,\n                          -0.14071400463581085,\n                          -0.08718100190162659,\n                          0.6836559772491455,\n                          -0.7198299765586853,\n                          -0.032017000019550323,\n                          0.6943539977073669,\n                          -0.6943539977073669,\n                          0,\n                          0.694034993648529,\n                          -0.694034993648529,\n                          0,\n                          0.6955100297927856,\n                          -0.6955100297927856,\n                          0,\n                          0.7306150197982788,\n                          -0.6639170050621033,\n                          0.029100999236106873,\n                          0.35523301362991333,\n                          -0.9268649816513062,\n                          -0.03203999996185303,\n                          0.3753649890422821,\n                          -0.9070209860801697,\n                          -0.000007000000096013537,\n                          0.3751649856567383,\n                          -0.9065750241279602,\n                          0.00007300000288523734,\n                          0.3759070038795471,\n                          -0.908607006072998,\n                          0.00026199998683296144,\n                          0.4211460053920746,\n                          -0.8926259875297546,\n                          0.028991999104619026,\n                          0.07646500319242477,\n                          -0.9924740195274353,\n                          0.09565100073814392,\n                          0.18306200206279755,\n                          -0.9820899963378906,\n                          0.04457399994134903,\n                          0.18801499903202057,\n                          -0.9816100001335144,\n                          0.03304100036621094,\n                          0.16623400151729584,\n                          -0.983722984790802,\n                          0.06822899729013443,\n                          0.14071400463581085,\n                          -0.9862040281295776,\n                          0.08718100190162659,\n                          -0.07657899707555771,\n                          -0.9924740195274353,\n                          -0.09555599838495255,\n                          -0.40307098627090454,\n                          -0.9070649743080139,\n                          -0.03255299851298332,\n                          -0.3753640055656433,\n                          -0.9070209860801697,\n                          0.000007000000096013537,\n                          -0.18306200206279755,\n                          -0.9820899963378906,\n                          -0.04457399994134903,\n                          -0.3751649856567383,\n                          -0.9065750241279602,\n                          -0.00007400000322377309,\n                          -0.18801499903202057,\n                          -0.9816100001335144,\n                          -0.03304100036621094,\n                          -0.3759070038795471,\n                          -0.908607006072998,\n                          -0.00026199998683296144,\n                          -0.16623400151729584,\n                          -0.983722984790802,\n                          -0.06822899729013443,\n                          -0.33324098587036133,\n                          -0.9290030002593994,\n                          0.029803000390529633,\n                          -0.14071400463581085,\n                          -0.9862040281295776,\n                          -0.08718100190162659,\n                          -0.7198299765586853,\n                          -0.6836559772491455,\n                          -0.032017000019550323,\n                          -0.6943539977073669,\n                          -0.6943539977073669,\n                          0,\n                          -0.694034993648529,\n                          -0.694034993648529,\n                          0,\n                          -0.6955100297927856,\n                          -0.6955100297927856,\n                          0,\n                          -0.6639170050621033,\n                          -0.7306150197982788,\n                          0.029100999236106873,\n                          -0.9268649816513062,\n                          -0.35523301362991333,\n                          -0.03203999996185303,\n                          -0.9070209860801697,\n                          -0.3753649890422821,\n                          -0.000007000000096013537,\n                          -0.9065750241279602,\n                          -0.3751649856567383,\n                          0.00007300000288523734,\n                          -0.908607006072998,\n                          -0.3759070038795471,\n                          0.00026199998683296144,\n                          -0.8926259875297546,\n                          -0.4211460053920746,\n                          0.028991999104619026,\n                          -0.9924740195274353,\n                          -0.07646500319242477,\n                          0.09565100073814392,\n                          -0.9820899963378906,\n                          -0.18306200206279755,\n                          0.04457399994134903,\n                          -0.9816100001335144,\n                          -0.18801499903202057,\n                          0.03304100036621094,\n                          -0.983722984790802,\n                          -0.16623400151729584,\n                          0.06822899729013443,\n                          -0.9862040281295776,\n                          -0.14071400463581085,\n                          0.08718100190162659,\n                          -0.9924740195274353,\n                          0.07657899707555771,\n                          -0.09555599838495255,\n                          -0.9070649743080139,\n                          0.40307098627090454,\n                          -0.03255299851298332,\n                          -0.9070209860801697,\n                          0.3753640055656433,\n                          0.000007000000096013537,\n                          -0.9820899963378906,\n                          0.18306200206279755,\n                          -0.04457399994134903,\n                          -0.9065750241279602,\n                          0.3751649856567383,\n                          -0.00007400000322377309,\n                          -0.9816100001335144,\n                          0.18801499903202057,\n                          -0.03304100036621094,\n                          -0.908607006072998,\n                          0.3759070038795471,\n                          -0.00026199998683296144,\n                          -0.983722984790802,\n                          0.16623400151729584,\n                          -0.06822899729013443,\n                          -0.9290030002593994,\n                          0.33324098587036133,\n                          0.029803000390529633,\n                          -0.9862040281295776,\n                          0.14071400463581085,\n                          -0.08718100190162659,\n                          -0.6836559772491455,\n                          0.7198299765586853,\n                          -0.032017000019550323,\n                          -0.6943539977073669,\n                          0.6943539977073669,\n                          0,\n                          -0.694034993648529,\n                          0.694034993648529,\n                          0,\n                          -0.6955100297927856,\n                          0.6955100297927856,\n                          0,\n                          -0.7306150197982788,\n                          0.6639170050621033,\n                          0.029100999236106873,\n                          -0.35523301362991333,\n                          0.9268649816513062,\n                          -0.03203999996185303,\n                          -0.3753649890422821,\n                          0.9070209860801697,\n                          -0.000007000000096013537,\n                          -0.3751649856567383,\n                          0.9065750241279602,\n                          0.00007300000288523734,\n                          -0.3759070038795471,\n                          0.908607006072998,\n                          0.00026199998683296144,\n                          -0.4211460053920746,\n                          0.8926259875297546,\n                          0.028991999104619026,\n                          -0.07646500319242477,\n                          0.9924740195274353,\n                          0.09565100073814392,\n                          -0.18306200206279755,\n                          0.9820899963378906,\n                          0.04457399994134903,\n                          -0.18801499903202057,\n                          0.9816100001335144,\n                          0.03304100036621094,\n                          -0.16623400151729584,\n                          0.983722984790802,\n                          0.06822899729013443,\n                          -0.14071400463581085,\n                          0.9862040281295776,\n                          0.08718100190162659};\n\nfloat teapotBinormals[] = {0.2554270029067993,\n                           -0.05043400079011917,\n                           -0.9655119776725769,\n                           0.2302899956703186,\n                           -0.11379700154066086,\n                           -0.9664459824562073,\n                           -0.23653900623321533,\n                           0.09789499640464783,\n                           -0.9666780233383179,\n                           -0.2551180124282837,\n                           0.05037299916148186,\n                           -0.9655969738960266,\n                           -0.9201610088348389,\n                           0.38079801201820374,\n                           -0.09108299762010574,\n                           -0.9770479798316956,\n                           0.1929199993610382,\n                           -0.09032399952411652,\n                           -0.6762400269508362,\n                           0.2798590064048767,\n                           0.6814529895782471,\n                           -0.723800003528595,\n                           0.1429159939289093,\n                           0.6750479936599731,\n                           -0.4681990146636963,\n                           0.1581760048866272,\n                           0.869350016117096,\n                           -0.4902079999446869,\n                           0.09679199755191803,\n                           0.8662149906158447,\n                           0.16952399909496307,\n                           -0.1934960037469864,\n                           -0.9663439989089966,\n                           -0.18106800317764282,\n                           0.18106800317764282,\n                           -0.9666590094566345,\n                           -0.7041199803352356,\n                           0.7041199803352356,\n                           -0.09181900322437286,\n                           -0.5179349780082703,\n                           0.5179349780082703,\n                           0.6807990074157715,\n                           -0.37217798829078674,\n                           0.3260670006275177,\n                           0.8690019845962524,\n                           0.08221600204706192,\n                           -0.243368998169899,\n                           -0.9664430022239685,\n                           -0.09789499640464783,\n                           0.23653900623321533,\n                           -0.9666780233383179,\n                           -0.38079801201820374,\n                           0.9201610088348389,\n                           -0.09108199924230576,\n                           -0.2798590064048767,\n                           0.6762400269508362,\n                           0.6814540028572083,\n                           -0.21894000470638275,\n                           0.44305500388145447,\n                           0.8693490028381348,\n                           0.050822000950574875,\n                           -0.2573910057544708,\n                           -0.9649699926376343,\n                           -0.05021600052714348,\n                           0.25432100892066956,\n                           -0.965815007686615,\n                           -0.19291600584983826,\n                           0.9770249724388123,\n                           -0.09059000015258789,\n                           -0.14291299879550934,\n                           0.7237870097160339,\n                           0.6750609874725342,\n                           -0.09679199755191803,\n                           0.4902079999446869,\n                           0.8662149906158447,\n                           -0.048507001250982285,\n                           -0.2576940059661865,\n                           -0.965008020401001,\n                           -0.15833300352096558,\n                           -0.3227809965610504,\n                           -0.933135986328125,\n                           0.05656199902296066,\n                           0.13793900609016418,\n                           -0.9888240098953247,\n                           0.049150001257658005,\n                           0.2545199990272522,\n                           -0.9658179879188538,\n                           0.378387987613678,\n                           0.9173290133476257,\n                           -0.12381099909543991,\n                           0.1917950063943863,\n                           0.9772530198097229,\n                           -0.09050799906253815,\n                           0.2777239978313446,\n                           0.6716070175170898,\n                           0.6868870258331299,\n                           0.14281700551509857,\n                           0.7238019704818726,\n                           0.6750659942626953,\n                           0.15788200497627258,\n                           0.4674209952354431,\n                           0.8698220252990723,\n                           0.09679199755191803,\n                           0.4902079999446869,\n                           0.8662149906158447,\n                           -0.3139069974422455,\n                           -0.2657270133495331,\n                           -0.9115110039710999,\n                           0.05247500166296959,\n                           0.05178600177168846,\n                           -0.9972789883613586,\n                           0.699787974357605,\n                           0.6969379782676697,\n                           -0.15676100552082062,\n                           0.511929988861084,\n                           0.5116159915924072,\n                           0.6900550127029419,\n                           0.32515400648117065,\n                           0.37111398577690125,\n                           0.8697980046272278,\n                           -0.3181929886341095,\n                           -0.09987600147724152,\n                           -0.9427499771118164,\n                           0.1552799940109253,\n                           0.06176299974322319,\n                           -0.9859380125999451,\n                           0.9187250137329102,\n                           0.3751460015773773,\n                           -0.1233299970626831,\n                           0.6724870204925537,\n                           0.2775439918041229,\n                           0.6860979795455933,\n                           0.4424299895763397,\n                           0.21853800117969513,\n                           0.8697689771652222,\n                           -0.255948007106781,\n                           -0.04464200139045715,\n                           -0.9656590223312378,\n                           0.25306200981140137,\n                           0.046362001448869705,\n                           -0.9663389921188354,\n                           0.9778940081596375,\n                           0.18800100684165955,\n                           -0.09153299778699875,\n                           0.7238150238990784,\n                           0.14205799996852875,\n                           0.675212025642395,\n                           0.49017900228500366,\n                           0.0967010036110878,\n                           0.8662409782409668,\n                           -0.25491899251937866,\n                           0.05033399909734726,\n                           -0.9656509757041931,\n                           -0.2302899956703186,\n                           0.11379700154066086,\n                           -0.9664459824562073,\n                           0.23653900623321533,\n                           -0.09789499640464783,\n                           -0.9666780233383179,\n                           0.252265989780426,\n                           -0.04980999976396561,\n                           -0.9663749933242798,\n                           0.9201610088348389,\n                           -0.38079801201820374,\n                           -0.09108299762010574,\n                           0.9769039750099182,\n                           -0.19289200007915497,\n                           -0.09193000197410583,\n                           0.6762400269508362,\n                           -0.2798590064048767,\n                           0.6814529895782471,\n                           0.7236610054969788,\n                           -0.14288799464702606,\n                           0.6752020120620728,\n                           0.4681990146636963,\n                           -0.1581760048866272,\n                           0.869350016117096,\n                           0.4901660084724426,\n                           -0.09678400307893753,\n                           0.8662390112876892,\n                           -0.16952399909496307,\n                           0.1934960037469864,\n                           -0.9663439989089966,\n                           0.18106800317764282,\n                           -0.18106800317764282,\n                           -0.9666590094566345,\n                           0.7041199803352356,\n                           -0.7041199803352356,\n                           -0.09181900322437286,\n                           0.5179349780082703,\n                           -0.5179349780082703,\n                           0.6807990074157715,\n                           0.37217798829078674,\n                           -0.3260670006275177,\n                           0.8690019845962524,\n                           -0.08221600204706192,\n                           0.243368998169899,\n                           -0.9664430022239685,\n                           0.09789499640464783,\n                           -0.23653900623321533,\n                           -0.9666780233383179,\n                           0.38079801201820374,\n                           -0.9201610088348389,\n                           -0.09108199924230576,\n                           0.2798590064048767,\n                           -0.6762400269508362,\n                           0.6814540028572083,\n                           0.21894000470638275,\n                           -0.44305500388145447,\n                           0.8693490028381348,\n                           -0.05043400079011917,\n                           0.2554270029067993,\n                           -0.9655119776725769,\n                           0.05037299916148186,\n                           -0.2551180124282837,\n                           -0.9655969738960266,\n                           0.1929199993610382,\n                           -0.9770479798316956,\n                           -0.09032399952411652,\n                           0.1429159939289093,\n                           -0.723800003528595,\n                           0.6750479936599731,\n                           0.09679199755191803,\n                           -0.4902079999446869,\n                           0.8662149906158447,\n                           0.05043400079011917,\n                           0.2554270029067993,\n                           -0.9655119776725769,\n                           0.11379700154066086,\n                           0.2302899956703186,\n                           -0.9664459824562073,\n                           -0.09789499640464783,\n                           -0.23653900623321533,\n                           -0.9666780233383179,\n                           -0.05037299916148186,\n                           -0.2551180124282837,\n                           -0.9655969738960266,\n                           -0.38079801201820374,\n                           -0.9201610088348389,\n                           -0.09108299762010574,\n                           -0.1929199993610382,\n                           -0.9770479798316956,\n                           -0.09032399952411652,\n                           -0.2798590064048767,\n                           -0.6762400269508362,\n                           0.6814529895782471,\n                           -0.1429159939289093,\n                           -0.723800003528595,\n                           0.6750479936599731,\n                           -0.1581760048866272,\n                           -0.4681990146636963,\n                           0.869350016117096,\n                           -0.09679199755191803,\n                           -0.4902079999446869,\n                           0.8662149906158447,\n                           0.1934960037469864,\n                           0.16952399909496307,\n                           -0.9663439989089966,\n                           -0.18106800317764282,\n                           -0.18106800317764282,\n                           -0.9666590094566345,\n                           -0.7041199803352356,\n                           -0.7041199803352356,\n                           -0.09181900322437286,\n                           -0.5179349780082703,\n                           -0.5179349780082703,\n                           0.6807990074157715,\n                           -0.3260670006275177,\n                           -0.37217798829078674,\n                           0.8690019845962524,\n                           0.243368998169899,\n                           0.08221600204706192,\n                           -0.9664430022239685,\n                           -0.23653900623321533,\n                           -0.09789499640464783,\n                           -0.9666780233383179,\n                           -0.9201610088348389,\n                           -0.38079801201820374,\n                           -0.09108199924230576,\n                           -0.6762400269508362,\n                           -0.2798590064048767,\n                           0.6814540028572083,\n                           -0.44305500388145447,\n                           -0.21894000470638275,\n                           0.8693490028381348,\n                           0.2554270029067993,\n                           0.05043400079011917,\n                           -0.9655119776725769,\n                           -0.2551180124282837,\n                           -0.05037299916148186,\n                           -0.9655969738960266,\n                           -0.9770479798316956,\n                           -0.1929199993610382,\n                           -0.09032399952411652,\n                           -0.723800003528595,\n                           -0.1429159939289093,\n                           0.6750479936599731,\n                           -0.4902079999446869,\n                           -0.09679199755191803,\n                           0.8662149906158447,\n                           -0.4902079999446869,\n                           0.09679199755191803,\n                           0.8662149906158447,\n                           -0.44305500388145447,\n                           0.21893900632858276,\n                           0.8693490028381348,\n                           -0.37287598848342896,\n                           0.15431199967861176,\n                           0.9149600267410278,\n                           -0.4014579951763153,\n                           0.07926800101995468,\n                           0.9124410152435303,\n                           -0.3112579882144928,\n                           0.12881100177764893,\n                           0.9415550231933594,\n                           -0.33541300892829895,\n                           0.0662280023097992,\n                           0.939740002155304,\n                           -0.19015200436115265,\n                           0.07869099825620651,\n                           0.9785959720611572,\n                           -0.20517399907112122,\n                           0.040511999279260635,\n                           0.977886974811554,\n                           0.06301800161600113,\n                           -0.021289000287652016,\n                           0.9977849721908569,\n                           0.06623400002717972,\n                           -0.013078000396490097,\n                           0.9977179765701294,\n                           -0.3260670006275177,\n                           0.37217798829078674,\n                           0.8690019845962524,\n                           -0.285739004611969,\n                           0.285739004611969,\n                           0.9147170186042786,\n                           -0.23854400217533112,\n                           0.23854400217533112,\n                           0.9413790106773376,\n                           -0.14574900269508362,\n                           0.14574900269508362,\n                           0.9785270094871521,\n                           0.05011200159788132,\n                           -0.04390300065279007,\n                           0.9977779984474182,\n                           -0.1581760048866272,\n                           0.4681999981403351,\n                           0.869350016117096,\n                           -0.15431199967861176,\n                           0.37287598848342896,\n                           0.9149600267410278,\n                           -0.12881100177764893,\n                           0.3112579882144928,\n                           0.9415550231933594,\n                           -0.07869099825620651,\n                           0.19015100598335266,\n                           0.9785959720611572,\n                           0.02946699969470501,\n                           -0.05963199958205223,\n                           0.9977849721908569,\n                           -0.09679199755191803,\n                           0.4902079999446869,\n                           0.8662149906158447,\n                           -0.07926800101995468,\n                           0.4014579951763153,\n                           0.9124410152435303,\n                           -0.0662280023097992,\n                           0.33541300892829895,\n                           0.939740002155304,\n                           -0.040511999279260635,\n                           0.20517399907112122,\n                           0.977886974811554,\n                           0.013078000396490097,\n                           -0.06623400002717972,\n                           0.9977179765701294,\n                           0.09679199755191803,\n                           0.4902079999446869,\n                           0.8662149906158447,\n                           0.21858200430870056,\n                           0.4423219859600067,\n                           0.86981201171875,\n                           0.15431199967861176,\n                           0.37287598848342896,\n                           0.9149600267410278,\n                           0.07926800101995468,\n                           0.4014579951763153,\n                           0.9124410152435303,\n                           0.12881100177764893,\n                           0.3112579882144928,\n                           0.9415550231933594,\n                           0.0662280023097992,\n                           0.33541300892829895,\n                           0.939740002155304,\n                           0.07869099825620651,\n                           0.19015200436115265,\n                           0.9785959720611572,\n                           0.040511999279260635,\n                           0.20517399907112122,\n                           0.977886974811554,\n                           -0.021289000287652016,\n                           -0.06301800161600113,\n                           0.9977849721908569,\n                           -0.013078000396490097,\n                           -0.06623400002717972,\n                           0.9977179765701294,\n                           0.3711329996585846,\n                           0.3251489996910095,\n                           0.8697919845581055,\n                           0.285739004611969,\n                           0.285739004611969,\n                           0.9147170186042786,\n                           0.23854400217533112,\n                           0.23854400217533112,\n                           0.9413790106773376,\n                           0.14574900269508362,\n                           0.14574900269508362,\n                           0.9785270094871521,\n                           -0.04390300065279007,\n                           -0.05011200159788132,\n                           0.9977779984474182,\n                           0.46750199794769287,\n                           0.15794099867343903,\n                           0.8697680234909058,\n                           0.37287598848342896,\n                           0.15431199967861176,\n                           0.9149600267410278,\n                           0.3112579882144928,\n                           0.12881100177764893,\n                           0.9415550231933594,\n                           0.19015100598335266,\n                           0.07869099825620651,\n                           0.9785959720611572,\n                           -0.05963199958205223,\n                           -0.02946699969470501,\n                           0.9977849721908569,\n                           0.49017900228500366,\n                           0.0967010036110878,\n                           0.8662409782409668,\n                           0.4014579951763153,\n                           0.07926800101995468,\n                           0.9124410152435303,\n                           0.33541300892829895,\n                           0.0662280023097992,\n                           0.939740002155304,\n                           0.20517399907112122,\n                           0.040511999279260635,\n                           0.977886974811554,\n                           -0.06623400002717972,\n                           -0.013078000396490097,\n                           0.9977179765701294,\n                           0.4901660084724426,\n                           -0.09678400307893753,\n                           0.8662390112876892,\n                           0.44305500388145447,\n                           -0.21893900632858276,\n                           0.8693490028381348,\n                           0.37287598848342896,\n                           -0.15431199967861176,\n                           0.9149600267410278,\n                           0.4014579951763153,\n                           -0.07926800101995468,\n                           0.9124410152435303,\n                           0.3112579882144928,\n                           -0.12881100177764893,\n                           0.9415550231933594,\n                           0.33541300892829895,\n                           -0.0662280023097992,\n                           0.939740002155304,\n                           0.19015200436115265,\n                           -0.07869099825620651,\n                           0.9785959720611572,\n                           0.20517399907112122,\n                           -0.040511999279260635,\n                           0.977886974811554,\n                           -0.06301800161600113,\n                           0.021289000287652016,\n                           0.9977849721908569,\n                           -0.06623400002717972,\n                           0.013078000396490097,\n                           0.9977179765701294,\n                           0.3260670006275177,\n                           -0.37217798829078674,\n                           0.8690019845962524,\n                           0.285739004611969,\n                           -0.285739004611969,\n                           0.9147170186042786,\n                           0.23854400217533112,\n                           -0.23854400217533112,\n                           0.9413790106773376,\n                           0.14574900269508362,\n                           -0.14574900269508362,\n                           0.9785270094871521,\n                           -0.05011200159788132,\n                           0.04390300065279007,\n                           0.9977779984474182,\n                           0.1581760048866272,\n                           -0.4681999981403351,\n                           0.869350016117096,\n                           0.15431199967861176,\n                           -0.37287598848342896,\n                           0.9149600267410278,\n                           0.12881100177764893,\n                           -0.3112579882144928,\n                           0.9415550231933594,\n                           0.07869099825620651,\n                           -0.19015100598335266,\n                           0.9785959720611572,\n                           -0.02946699969470501,\n                           0.05963199958205223,\n                           0.9977849721908569,\n                           0.09679199755191803,\n                           -0.4902079999446869,\n                           0.8662149906158447,\n                           0.07926800101995468,\n                           -0.4014579951763153,\n                           0.9124410152435303,\n                           0.0662280023097992,\n                           -0.33541300892829895,\n                           0.939740002155304,\n                           0.040511999279260635,\n                           -0.20517399907112122,\n                           0.977886974811554,\n                           -0.013078000396490097,\n                           0.06623400002717972,\n                           0.9977179765701294,\n                           -0.09679199755191803,\n                           -0.4902079999446869,\n                           0.8662149906158447,\n                           -0.21893900632858276,\n                           -0.44305500388145447,\n                           0.8693490028381348,\n                           -0.15431199967861176,\n                           -0.37287598848342896,\n                           0.9149600267410278,\n                           -0.07926800101995468,\n                           -0.4014579951763153,\n                           0.9124410152435303,\n                           -0.12881100177764893,\n                           -0.3112579882144928,\n                           0.9415550231933594,\n                           -0.0662280023097992,\n                           -0.33541300892829895,\n                           0.939740002155304,\n                           -0.07869099825620651,\n                           -0.19015200436115265,\n                           0.9785959720611572,\n                           -0.040511999279260635,\n                           -0.20517399907112122,\n                           0.977886974811554,\n                           0.021289000287652016,\n                           0.06301800161600113,\n                           0.9977849721908569,\n                           0.013078000396490097,\n                           0.06623400002717972,\n                           0.9977179765701294,\n                           -0.37217798829078674,\n                           -0.3260670006275177,\n                           0.8690019845962524,\n                           -0.285739004611969,\n                           -0.285739004611969,\n                           0.9147170186042786,\n                           -0.23854400217533112,\n                           -0.23854400217533112,\n                           0.9413790106773376,\n                           -0.14574900269508362,\n                           -0.14574900269508362,\n                           0.9785270094871521,\n                           0.04390300065279007,\n                           0.05011200159788132,\n                           0.9977779984474182,\n                           -0.4681999981403351,\n                           -0.1581760048866272,\n                           0.869350016117096,\n                           -0.37287598848342896,\n                           -0.15431199967861176,\n                           0.9149600267410278,\n                           -0.3112579882144928,\n                           -0.12881100177764893,\n                           0.9415550231933594,\n                           -0.19015100598335266,\n                           -0.07869099825620651,\n                           0.9785959720611572,\n                           0.05963199958205223,\n                           0.02946699969470501,\n                           0.9977849721908569,\n                           -0.4902079999446869,\n                           -0.09679199755191803,\n                           0.8662149906158447,\n                           -0.4014579951763153,\n                           -0.07926800101995468,\n                           0.9124410152435303,\n                           -0.33541300892829895,\n                           -0.0662280023097992,\n                           0.939740002155304,\n                           -0.20517399907112122,\n                           -0.040511999279260635,\n                           0.977886974811554,\n                           0.06623400002717972,\n                           0.013078000396490097,\n                           0.9977179765701294,\n                           0.06623400002717972,\n                           -0.013078000396490097,\n                           0.9977179765701294,\n                           0.05963199958205223,\n                           -0.02946699969470501,\n                           0.9977849721908569,\n                           0.40303200483322144,\n                           -0.1667889952659607,\n                           0.8998590111732483,\n                           0.4339120090007782,\n                           -0.08567699790000916,\n                           0.8968719840049744,\n                           0.6326310038566589,\n                           -0.2618109881877899,\n                           0.7288579940795898,\n                           0.6777120232582092,\n                           -0.13381600379943848,\n                           0.723048985004425,\n                           0.6661339998245239,\n                           -0.27567601203918457,\n                           0.6930140256881714,\n                           0.7128540277481079,\n                           -0.14075499773025513,\n                           0.6870430111885071,\n                           0.5777599811553955,\n                           -0.19519099593162537,\n                           0.792523980140686,\n                           0.6036490201950073,\n                           -0.11919199675321579,\n                           0.7882900238037109,\n                           0.04390300065279007,\n                           -0.05011200159788132,\n                           0.9977779984474182,\n                           0.30884799361228943,\n                           -0.30884799361228943,\n                           0.8995699882507324,\n                           0.48457300662994385,\n                           -0.48457300662994385,\n                           0.7282710075378418,\n                           0.510138988494873,\n                           -0.510138988494873,\n                           0.6924710273742676,\n                           0.4591110050678253,\n                           -0.40222999453544617,\n                           0.7921029925346375,\n                           0.021289000287652016,\n                           -0.06301800161600113,\n                           0.9977849721908569,\n                           0.16678999364376068,\n                           -0.40303200483322144,\n                           0.8998590111732483,\n                           0.2618109881877899,\n                           -0.6326310038566589,\n                           0.7288579940795898,\n                           0.27567601203918457,\n                           -0.6661339998245239,\n                           0.6930140256881714,\n                           0.2701770067214966,\n                           -0.546737015247345,\n                           0.7925170063972473,\n                           0.013078000396490097,\n                           -0.06623400002717972,\n                           0.9977179765701294,\n                           0.08567599952220917,\n                           -0.4339120090007782,\n                           0.8968719840049744,\n                           0.13381600379943848,\n                           -0.6777120232582092,\n                           0.723048985004425,\n                           0.14075499773025513,\n                           -0.7128540277481079,\n                           0.6870430111885071,\n                           0.11919199675321579,\n                           -0.6036490201950073,\n                           0.7882900238037109,\n                           -0.013078000396490097,\n                           -0.06623400002717972,\n                           0.9977179765701294,\n                           -0.02946699969470501,\n                           -0.05963199958205223,\n                           0.9977849721908569,\n                           -0.1667889952659607,\n                           -0.40303200483322144,\n                           0.8998590111732483,\n                           -0.08567699790000916,\n                           -0.4339120090007782,\n                           0.8968719840049744,\n                           -0.2618109881877899,\n                           -0.6326310038566589,\n                           0.7288579940795898,\n                           -0.13381600379943848,\n                           -0.6777120232582092,\n                           0.723048985004425,\n                           -0.27567601203918457,\n                           -0.6661339998245239,\n                           0.6930140256881714,\n                           -0.14075499773025513,\n                           -0.7128540277481079,\n                           0.6870430111885071,\n                           -0.19519099593162537,\n                           -0.5777599811553955,\n                           0.792523980140686,\n                           -0.11919199675321579,\n                           -0.6036490201950073,\n                           0.7882900238037109,\n                           -0.05011200159788132,\n                           -0.04390300065279007,\n                           0.9977779984474182,\n                           -0.30884799361228943,\n                           -0.30884799361228943,\n                           0.8995699882507324,\n                           -0.48457300662994385,\n                           -0.48457300662994385,\n                           0.7282710075378418,\n                           -0.510138988494873,\n                           -0.510138988494873,\n                           0.6924710273742676,\n                           -0.40222999453544617,\n                           -0.4591110050678253,\n                           0.7921029925346375,\n                           -0.06301800161600113,\n                           -0.021289000287652016,\n                           0.9977849721908569,\n                           -0.40303200483322144,\n                           -0.16678999364376068,\n                           0.8998590111732483,\n                           -0.6326310038566589,\n                           -0.2618109881877899,\n                           0.7288579940795898,\n                           -0.6661339998245239,\n                           -0.27567601203918457,\n                           0.6930140256881714,\n                           -0.546737015247345,\n                           -0.2701770067214966,\n                           0.7925170063972473,\n                           -0.06623400002717972,\n                           -0.013078000396490097,\n                           0.9977179765701294,\n                           -0.4339120090007782,\n                           -0.08567599952220917,\n                           0.8968719840049744,\n                           -0.6777120232582092,\n                           -0.13381600379943848,\n                           0.723048985004425,\n                           -0.7128540277481079,\n                           -0.14075499773025513,\n                           0.6870430111885071,\n                           -0.6036490201950073,\n                           -0.11919199675321579,\n                           0.7882900238037109,\n                           -0.06623400002717972,\n                           0.013078000396490097,\n                           0.9977179765701294,\n                           -0.05963199958205223,\n                           0.02946699969470501,\n                           0.9977849721908569,\n                           -0.40303200483322144,\n                           0.1667889952659607,\n                           0.8998590111732483,\n                           -0.4339120090007782,\n                           0.08567699790000916,\n                           0.8968719840049744,\n                           -0.6326310038566589,\n                           0.2618109881877899,\n                           0.7288579940795898,\n                           -0.6777120232582092,\n                           0.13381600379943848,\n                           0.723048985004425,\n                           -0.6661339998245239,\n                           0.27567601203918457,\n                           0.6930140256881714,\n                           -0.7128540277481079,\n                           0.14075499773025513,\n                           0.6870430111885071,\n                           -0.5777599811553955,\n                           0.19519099593162537,\n                           0.792523980140686,\n                           -0.6036490201950073,\n                           0.11919199675321579,\n                           0.7882900238037109,\n                           -0.04390300065279007,\n                           0.05011200159788132,\n                           0.9977779984474182,\n                           -0.30884799361228943,\n                           0.30884799361228943,\n                           0.8995699882507324,\n                           -0.48457300662994385,\n                           0.48457300662994385,\n                           0.7282710075378418,\n                           -0.510138988494873,\n                           0.510138988494873,\n                           0.6924710273742676,\n                           -0.4591110050678253,\n                           0.40222999453544617,\n                           0.7921029925346375,\n                           -0.021289000287652016,\n                           0.06301800161600113,\n                           0.9977849721908569,\n                           -0.16678999364376068,\n                           0.40303200483322144,\n                           0.8998590111732483,\n                           -0.2618109881877899,\n                           0.6326310038566589,\n                           0.7288579940795898,\n                           -0.27567601203918457,\n                           0.6661339998245239,\n                           0.6930140256881714,\n                           -0.2701770067214966,\n                           0.546737015247345,\n                           0.7925170063972473,\n                           -0.013078000396490097,\n                           0.06623400002717972,\n                           0.9977179765701294,\n                           -0.08567599952220917,\n                           0.4339120090007782,\n                           0.8968719840049744,\n                           -0.13381600379943848,\n                           0.6777120232582092,\n                           0.723048985004425,\n                           -0.14075499773025513,\n                           0.7128540277481079,\n                           0.6870430111885071,\n                           -0.11919199675321579,\n                           0.6036490201950073,\n                           0.7882900238037109,\n                           0.013078000396490097,\n                           0.06623400002717972,\n                           0.9977179765701294,\n                           0.02946699969470501,\n                           0.05963199958205223,\n                           0.9977849721908569,\n                           0.1667889952659607,\n                           0.40303200483322144,\n                           0.8998590111732483,\n                           0.08567699790000916,\n                           0.4339120090007782,\n                           0.8968719840049744,\n                           0.2618109881877899,\n                           0.6326310038566589,\n                           0.7288579940795898,\n                           0.13381600379943848,\n                           0.6777120232582092,\n                           0.723048985004425,\n                           0.27567601203918457,\n                           0.6661339998245239,\n                           0.6930140256881714,\n                           0.14075499773025513,\n                           0.7128540277481079,\n                           0.6870430111885071,\n                           0.19519099593162537,\n                           0.5777599811553955,\n                           0.792523980140686,\n                           0.11919199675321579,\n                           0.6036490201950073,\n                           0.7882900238037109,\n                           0.05011200159788132,\n                           0.04390300065279007,\n                           0.9977779984474182,\n                           0.30884799361228943,\n                           0.30884799361228943,\n                           0.8995699882507324,\n                           0.48457300662994385,\n                           0.48457300662994385,\n                           0.7282710075378418,\n                           0.510138988494873,\n                           0.510138988494873,\n                           0.6924710273742676,\n                           0.40222999453544617,\n                           0.4591110050678253,\n                           0.7921029925346375,\n                           0.06301800161600113,\n                           0.021289000287652016,\n                           0.9977849721908569,\n                           0.40303200483322144,\n                           0.16678999364376068,\n                           0.8998590111732483,\n                           0.6326310038566589,\n                           0.2618109881877899,\n                           0.7288579940795898,\n                           0.6661339998245239,\n                           0.27567601203918457,\n                           0.6930140256881714,\n                           0.546737015247345,\n                           0.2701770067214966,\n                           0.7925170063972473,\n                           0.06623400002717972,\n                           0.013078000396490097,\n                           0.9977179765701294,\n                           0.4339120090007782,\n                           0.08567599952220917,\n                           0.8968719840049744,\n                           0.6777120232582092,\n                           0.13381600379943848,\n                           0.723048985004425,\n                           0.7128540277481079,\n                           0.14075499773025513,\n                           0.6870430111885071,\n                           0.6036490201950073,\n                           0.11919199675321579,\n                           0.7882900238037109,\n                           0.6036490201950073,\n                           -0.11919199675321579,\n                           0.7882900238037109,\n                           0.546737015247345,\n                           -0.2701770067214966,\n                           0.7925170063972473,\n                           0.7223830223083496,\n                           -0.2989569902420044,\n                           0.623528003692627,\n                           0.7723940014839172,\n                           -0.15251100063323975,\n                           0.616562008857727,\n                           0.9094089865684509,\n                           -0.3763520121574402,\n                           0.1770150065422058,\n                           0.9660869836807251,\n                           -0.19075599312782288,\n                           0.1740349978208542,\n                           0.9408230185508728,\n                           -0.3353259861469269,\n                           0.04907499998807907,\n                           0.9843119978904724,\n                           -0.16964000463485718,\n                           0.048493001610040665,\n                           0.9810580015182495,\n                           -0.1937119960784912,\n                           0,\n                           0.7071070075035095,\n                           -0.7071070075035095,\n                           0,\n                           0.40222999453544617,\n                           -0.4591110050678253,\n                           0.7921029925346375,\n                           0.5532029867172241,\n                           -0.5532029867172241,\n                           0.622842013835907,\n                           0.6959879994392395,\n                           -0.6959879994392395,\n                           0.17663900554180145,\n                           0.7403979897499084,\n                           -0.6703829765319824,\n                           0.048958998173475266,\n                           0.8310419917106628,\n                           -0.5562090277671814,\n                           0,\n                           0.19519099593162537,\n                           -0.5777599811553955,\n                           0.792523980140686,\n                           0.2989560067653656,\n                           -0.7223830223083496,\n                           0.623528003692627,\n                           0.3763520121574402,\n                           -0.9094089865684509,\n                           0.1770150065422058,\n                           0.4275760054588318,\n                           -0.902646005153656,\n                           0.04906899854540825,\n                           0.5562090277671814,\n                           -0.8310419917106628,\n                           0,\n                           0.11919199675321579,\n                           -0.6036490201950073,\n                           0.7882900238037109,\n                           0.15251100063323975,\n                           -0.7723940014839172,\n                           0.616562008857727,\n                           0.19075599312782288,\n                           -0.9660869836807251,\n                           0.1740349978208542,\n                           0.19348600506782532,\n                           -0.9799140095710754,\n                           0.048277001827955246,\n                           0.1937119960784912,\n                           -0.9810580015182495,\n                           0,\n                           -0.11919199675321579,\n                           -0.6036490201950073,\n                           0.7882900238037109,\n                           -0.2701770067214966,\n                           -0.546737015247345,\n                           0.7925170063972473,\n                           -0.2989569902420044,\n                           -0.7223830223083496,\n                           0.623528003692627,\n                           -0.15251100063323975,\n                           -0.7723940014839172,\n                           0.616562008857727,\n                           -0.3763520121574402,\n                           -0.9094089865684509,\n                           0.1770150065422058,\n                           -0.19075599312782288,\n                           -0.9660869836807251,\n                           0.1740349978208542,\n                           -0.3353259861469269,\n                           -0.9408230185508728,\n                           0.04907499998807907,\n                           -0.16964000463485718,\n                           -0.9843119978904724,\n                           0.04849399998784065,\n                           -0.1937119960784912,\n                           -0.9810580015182495,\n                           0,\n                           0.7071070075035095,\n                           -0.7071070075035095,\n                           0,\n                           -0.4591110050678253,\n                           -0.40222999453544617,\n                           0.7921029925346375,\n                           -0.5532029867172241,\n                           -0.5532029867172241,\n                           0.622842013835907,\n                           -0.6959879994392395,\n                           -0.6959879994392395,\n                           0.17663900554180145,\n                           -0.6703829765319824,\n                           -0.7403979897499084,\n                           0.048958998173475266,\n                           -0.5562090277671814,\n                           -0.8310419917106628,\n                           0,\n                           -0.5777599811553955,\n                           -0.19519099593162537,\n                           0.792523980140686,\n                           -0.7223830223083496,\n                           -0.2989560067653656,\n                           0.623528003692627,\n                           -0.9094089865684509,\n                           -0.3763520121574402,\n                           0.1770150065422058,\n                           -0.902646005153656,\n                           -0.4275760054588318,\n                           0.04906899854540825,\n                           -0.8310419917106628,\n                           -0.5562090277671814,\n                           0,\n                           -0.6036490201950073,\n                           -0.11919199675321579,\n                           0.7882900238037109,\n                           -0.7723940014839172,\n                           -0.15251100063323975,\n                           0.616562008857727,\n                           -0.9660869836807251,\n                           -0.19075599312782288,\n                           0.1740349978208542,\n                           -0.9799140095710754,\n                           -0.19348600506782532,\n                           0.048277001827955246,\n                           -0.9810580015182495,\n                           -0.1937119960784912,\n                           0,\n                           -0.6036490201950073,\n                           0.11919199675321579,\n                           0.7882900238037109,\n                           -0.546737015247345,\n                           0.2701770067214966,\n                           0.7925170063972473,\n                           -0.7223830223083496,\n                           0.2989569902420044,\n                           0.623528003692627,\n                           -0.7723940014839172,\n                           0.15251100063323975,\n                           0.616562008857727,\n                           -0.9094089865684509,\n                           0.3763520121574402,\n                           0.1770150065422058,\n                           -0.9660869836807251,\n                           0.19075599312782288,\n                           0.1740349978208542,\n                           -0.9408230185508728,\n                           0.3353259861469269,\n                           0.04907499998807907,\n                           -0.9843119978904724,\n                           0.16964000463485718,\n                           0.04849399998784065,\n                           -0.9810580015182495,\n                           0.1937119960784912,\n                           0,\n                           0.7071070075035095,\n                           -0.7071070075035095,\n                           0,\n                           -0.40222999453544617,\n                           0.4591110050678253,\n                           0.7921029925346375,\n                           -0.5532029867172241,\n                           0.5532029867172241,\n                           0.622842013835907,\n                           -0.6959879994392395,\n                           0.6959879994392395,\n                           0.17663900554180145,\n                           -0.7403979897499084,\n                           0.6703829765319824,\n                           0.048958998173475266,\n                           -0.8310419917106628,\n                           0.5562090277671814,\n                           0,\n                           -0.19519099593162537,\n                           0.5777599811553955,\n                           0.792523980140686,\n                           -0.2989560067653656,\n                           0.7223830223083496,\n                           0.623528003692627,\n                           -0.3763520121574402,\n                           0.9094089865684509,\n                           0.1770150065422058,\n                           -0.4275760054588318,\n                           0.902646005153656,\n                           0.04906899854540825,\n                           -0.5562090277671814,\n                           0.8310419917106628,\n                           0,\n                           -0.11919199675321579,\n                           0.6036490201950073,\n                           0.7882900238037109,\n                           -0.15251100063323975,\n                           0.7723940014839172,\n                           0.616562008857727,\n                           -0.19075599312782288,\n                           0.9660869836807251,\n                           0.1740349978208542,\n                           -0.19348600506782532,\n                           0.9799140095710754,\n                           0.048277001827955246,\n                           -0.1937119960784912,\n                           0.9810580015182495,\n                           0,\n                           0.11919199675321579,\n                           0.6036490201950073,\n                           0.7882900238037109,\n                           0.2701770067214966,\n                           0.546737015247345,\n                           0.7925170063972473,\n                           0.2989569902420044,\n                           0.7223830223083496,\n                           0.623528003692627,\n                           0.15251100063323975,\n                           0.7723940014839172,\n                           0.616562008857727,\n                           0.3763520121574402,\n                           0.9094089865684509,\n                           0.1770150065422058,\n                           0.19075599312782288,\n                           0.9660869836807251,\n                           0.1740349978208542,\n                           0.3353259861469269,\n                           0.9408230185508728,\n                           0.04907499998807907,\n                           0.16964000463485718,\n                           0.9843119978904724,\n                           0.04849399998784065,\n                           0.1937119960784912,\n                           0.9810580015182495,\n                           0,\n                           0.7071070075035095,\n                           -0.7071070075035095,\n                           0,\n                           0.4591110050678253,\n                           0.40222999453544617,\n                           0.7921029925346375,\n                           0.5532029867172241,\n                           0.5532029867172241,\n                           0.622842013835907,\n                           0.6959879994392395,\n                           0.6959879994392395,\n                           0.17663900554180145,\n                           0.6703829765319824,\n                           0.7403979897499084,\n                           0.048958998173475266,\n                           0.5562090277671814,\n                           0.8310419917106628,\n                           0,\n                           0.5777599811553955,\n                           0.19519099593162537,\n                           0.792523980140686,\n                           0.7223830223083496,\n                           0.2989560067653656,\n                           0.623528003692627,\n                           0.9094089865684509,\n                           0.3763520121574402,\n                           0.1770150065422058,\n                           0.902646005153656,\n                           0.4275760054588318,\n                           0.04906899854540825,\n                           0.8310419917106628,\n                           0.5562090277671814,\n                           0,\n                           0.6036490201950073,\n                           0.11919199675321579,\n                           0.7882900238037109,\n                           0.7723940014839172,\n                           0.15251100063323975,\n                           0.616562008857727,\n                           0.9660869836807251,\n                           0.19075599312782288,\n                           0.1740349978208542,\n                           0.9799150228500366,\n                           0.19348600506782532,\n                           0.048277001827955246,\n                           0.9810580015182495,\n                           0.1937119960784912,\n                           0,\n                           0.9999480247497559,\n                           0.006622000131756067,\n                           0.007786999922245741,\n                           0.9989290237426758,\n                           0.04125700145959854,\n                           -0.020945999771356583,\n                           0.9700260162353516,\n                           -0.18230900168418884,\n                           0.1606609970331192,\n                           0.9929869771003723,\n                           -0.1116809993982315,\n                           0.038782998919487,\n                           0.8677089810371399,\n                           -0.30993399024009705,\n                           0.38861599564552307,\n                           0.9675049781799316,\n                           -0.18179599940776825,\n                           0.17574100196361542,\n                           0.6127229928970337,\n                           -0.23797500133514404,\n                           0.753616988658905,\n                           0.781611979007721,\n                           -0.1585649996995926,\n                           0.6032750010490417,\n                           0.13049399852752686,\n                           -0.02585900016129017,\n                           0.9911119937896729,\n                           0.16583800315856934,\n                           -0.04606600105762482,\n                           0.9850770235061646,\n                           0.9847609996795654,\n                           -0.03004699945449829,\n                           -0.17129500210285187,\n                           0.9463850259780884,\n                           0.008138000033795834,\n                           0.3229379951953888,\n                           0.6942890286445618,\n                           0.06011800095438957,\n                           0.7171810269355774,\n                           0.405923992395401,\n                           0.09244199842214584,\n                           0.9092199802398682,\n                           0.1477230042219162,\n                           0.0024739999789744616,\n                           0.9890260100364685,\n                           0.991798996925354,\n                           -0.11557900160551071,\n                           -0.05454900115728378,\n                           0.9920099973678589,\n                           0.07202500104904175,\n                           0.10358300060033798,\n                           0.8882240056991577,\n                           0.2238840013742447,\n                           0.40116599202156067,\n                           0.6046879887580872,\n                           0.13691100478172302,\n                           0.7846069931983948,\n                           0.12908099591732025,\n                           -0.06111999973654747,\n                           0.989749014377594,\n                           0.9954820275306702,\n                           -0.09436299651861191,\n                           0.010502999648451805,\n                           0.9981970191001892,\n                           0.012060999870300293,\n                           0.05880200117826462,\n                           0.9550639986991882,\n                           0.09819000214338303,\n                           0.27966299653053284,\n                           0.6606940031051636,\n                           0.05169999971985817,\n                           0.7488729953765869,\n                           0.07273799926042557,\n                           -0.04034300148487091,\n                           0.9965350031852722,\n                           0.9999179840087891,\n                           0.007191000040620565,\n                           0.010560999624431133,\n                           0.9989050030708313,\n                           0.04436499997973442,\n                           -0.014883999712765217,\n                           0.9694769978523254,\n                           -0.17860299348831177,\n                           0.1679760068655014,\n                           0.9924619793891907,\n                           -0.10775599628686905,\n                           0.058378998190164566,\n                           0.8567489981651306,\n                           -0.28829601407051086,\n                           0.4276289939880371,\n                           0.9473999738693237,\n                           -0.16112199425697327,\n                           0.27653801441192627,\n                           0.5627779960632324,\n                           -0.19747799634933472,\n                           0.8026729822158813,\n                           0.6577669978141785,\n                           -0.11438000202178955,\n                           0.7444859743118286,\n                           0.07901199907064438,\n                           0.0013689999468624592,\n                           0.9968730211257935,\n                           0.07274100184440613,\n                           -0.02020600065588951,\n                           0.9971460103988647,\n                           0.9888780117034912,\n                           0.025808999314904213,\n                           -0.14647500216960907,\n                           0.9453979730606079,\n                           -0.006663000211119652,\n                           0.3258500099182129,\n                           0.6921399831771851,\n                           -0.04972299933433533,\n                           0.7200480103492737,\n                           0.3957499861717224,\n                           -0.08134900033473969,\n                           0.9147480130195618,\n                           0.13914500176906586,\n                           -0.00007899999764049426,\n                           0.9902719855308533,\n                           0.9924669861793518,\n                           -0.10311000049114227,\n                           -0.06616800278425217,\n                           0.9926300048828125,\n                           0.07926999777555466,\n                           0.09165900200605392,\n                           0.900858998298645,\n                           0.2553130090236664,\n                           0.3510949909687042,\n                           0.6513699889183044,\n                           0.18318000435829163,\n                           0.7363160252571106,\n                           0.15978699922561646,\n                           -0.02714099921286106,\n                           0.9867780208587646,\n                           0.9955620169639587,\n                           -0.09379199892282486,\n                           0.0077309999614953995,\n                           0.9991030097007751,\n                           0.01610800065100193,\n                           0.039149001240730286,\n                           0.9764699935913086,\n                           0.12068899720907211,\n                           0.17871999740600586,\n                           0.7859060168266296,\n                           0.10103499889373779,\n                           0.6100350022315979,\n                           0.16579000651836395,\n                           -0.014832000248134136,\n                           0.986050009727478,\n                           0.1655299961566925,\n                           -0.10078699886798859,\n                           0.9810410141944885,\n                           -0.0046790000051259995,\n                           -0.1750659942626953,\n                           0.9845460057258606,\n                           -0.3859579861164093,\n                           -0.06494200229644775,\n                           0.9202280044555664,\n                           -0.3219670057296753,\n                           -0.05600599944591522,\n                           0.9450929760932922,\n                           -0.6471610069274902,\n                           -0.11495299637317657,\n                           0.7536370158195496,\n                           -0.5616440176963806,\n                           -0.078855000436306,\n                           0.8236119747161865,\n                           -0.8379700183868408,\n                           -0.23749999701976776,\n                           0.4913240075111389,\n                           -0.7512590289115906,\n                           -0.1447169929742813,\n                           0.6439470052719116,\n                           -0.9052090048789978,\n                           -0.2807050049304962,\n                           0.3190630078315735,\n                           -0.8249419927597046,\n                           -0.2209009975194931,\n                           0.5202630162239075,\n                           -0.13363699615001678,\n                           0.0291920006275177,\n                           0.9905999898910522,\n                           -0.4039649963378906,\n                           0.0019519999623298645,\n                           0.9147719740867615,\n                           -0.7191359996795654,\n                           0.002443999983370304,\n                           0.6948649883270264,\n                           -0.9637579917907715,\n                           0.026884999126195908,\n                           0.26541900634765625,\n                           -0.9637719988822937,\n                           0.2207069993019104,\n                           -0.14977200329303741,\n                           0.03522900119423866,\n                           0.06716900318861008,\n                           0.9971190094947815,\n                           -0.3620629906654358,\n                           -0.01676199957728386,\n                           0.9320030212402344,\n                           -0.6534259915351868,\n                           0.007120999973267317,\n                           0.7569569945335388,\n                           -0.8528590202331543,\n                           0.11686599999666214,\n                           0.5088940262794495,\n                           -0.8814889788627625,\n                           0.3579840064048767,\n                           0.3079349994659424,\n                           0.0726580023765564,\n                           0.02018200047314167,\n                           0.9971529841423035,\n                           -0.37608298659324646,\n                           -0.025955000892281532,\n                           0.926222026348114,\n                           -0.6568350195884705,\n                           -0.015021000057458878,\n                           0.7538840174674988,\n                           -0.8238760232925415,\n                           0.03257700055837631,\n                           0.5658339858055115,\n                           -0.8688690066337585,\n                           0.13078700006008148,\n                           0.4774540066719055,\n                           0.07265599817037582,\n                           -0.07700400054454803,\n                           0.994379997253418,\n                           -0.0343950018286705,\n                           -0.151870995759964,\n                           0.9878020286560059,\n                           -0.40362000465393066,\n                           -0.05282000079751015,\n                           0.9134010076522827,\n                           -0.37586501240730286,\n                           -0.041078001260757446,\n                           0.9257640242576599,\n                           -0.6878190040588379,\n                           -0.0810059979557991,\n                           0.721347987651825,\n                           -0.6558970212936401,\n                           -0.052101001143455505,\n                           0.7530509829521179,\n                           -0.8708800077438354,\n                           -0.2062380015850067,\n                           0.44613200426101685,\n                           -0.8175939917564392,\n                           -0.12448199838399887,\n                           0.5621780157089233,\n                           -0.8926960229873657,\n                           -0.3055669963359833,\n                           0.33124300837516785,\n                           -0.8565059900283813,\n                           -0.21024300158023834,\n                           0.4713769853115082,\n                           -0.15155400335788727,\n                           -0.025412000715732574,\n                           0.9881219863891602,\n                           -0.41033700108528137,\n                           -0.0026420000940561295,\n                           0.9119300246238708,\n                           -0.7240620255470276,\n                           0.00047400000039488077,\n                           0.6897349953651428,\n                           -0.9655590057373047,\n                           -0.017078999429941177,\n                           0.2596229910850525,\n                           -0.973825991153717,\n                           -0.19711799919605255,\n                           -0.1131730005145073,\n                           0.06214199960231781,\n                           0.08235500007867813,\n                           0.9946640133857727,\n                           -0.3334290087223053,\n                           0.007625999860465527,\n                           0.9427440166473389,\n                           -0.608610987663269,\n                           0.04885999858379364,\n                           0.7919629812240601,\n                           -0.8253309726715088,\n                           0.14631199836730957,\n                           0.5453640222549438,\n                           -0.9105669856071472,\n                           0.3146660029888153,\n                           0.2680560052394867,\n                           0.16523399949073792,\n                           0.04589800164103508,\n                           0.985185980796814,\n                           -0.32260099053382874,\n                           -0.010471000336110592,\n                           0.9464769959449768,\n                           -0.5639140009880066,\n                           0.015166000463068485,\n                           0.8256940245628357,\n                           -0.758965015411377,\n                           0.05617399886250496,\n                           0.6487039923667908,\n                           -0.8382350206375122,\n                           0.14245299994945526,\n                           0.5263739824295044,\n                           0.9727830290794373,\n                           -0.019794000312685966,\n                           0.2308720052242279,\n                           0.9828159809112549,\n                           -0.036465998739004135,\n                           0.18095199763774872,\n                           0.9050639867782593,\n                           -0.02252200059592724,\n                           0.4246790111064911,\n                           0.8354039788246155,\n                           -0.03220000118017197,\n                           0.5486930012702942,\n                           0.6465700268745422,\n                           -0.045921001583337784,\n                           0.7614709734916687,\n                           0.4826749861240387,\n                           -0.04895399883389473,\n                           0.8744300007820129,\n                           0.4453999996185303,\n                           0.17256900668144226,\n                           0.8785430192947388,\n                           0.47231200337409973,\n                           0.13768500089645386,\n                           0.8706120252609253,\n                           0.4824250042438507,\n                           0.3898639976978302,\n                           0.7843930125236511,\n                           0.641398012638092,\n                           0.4275979995727539,\n                           0.6370000243186951,\n                           0.9863939881324768,\n                           0.0994419977068901,\n                           0.13091400265693665,\n                           0.9154840111732483,\n                           0.2120320051908493,\n                           0.34195101261138916,\n                           0.7246469855308533,\n                           0.245046004652977,\n                           0.6440799832344055,\n                           0.35685500502586365,\n                           0.17885500192642212,\n                           0.9168779850006104,\n                           0.14101800322532654,\n                           0.24263200163841248,\n                           0.9598140120506287,\n                           0.9366779923439026,\n                           0.16484400629997253,\n                           0.3089669942855835,\n                           0.7982620000839233,\n                           0.2441370040178299,\n                           0.5506129860877991,\n                           0.4769439995288849,\n                           0.2904820144176483,\n                           0.8295450210571289,\n                           0.4125959873199463,\n                           -0.017246000468730927,\n                           0.9107509851455688,\n                           0.341374009847641,\n                           -0.37689098715782166,\n                           0.8610560297966003,\n                           0.9026100039482117,\n                           0.14119599759578705,\n                           0.40664398670196533,\n                           0.7326020002365112,\n                           0.1491979956626892,\n                           0.6641039848327637,\n                           0.38115599751472473,\n                           0.15792299807071686,\n                           0.9109230041503906,\n                           0.5317370295524597,\n                           -0.02143399976193905,\n                           0.846638023853302,\n                           0.7915729880332947,\n                           -0.3539769947528839,\n                           0.49810999631881714,\n                           0.9087340235710144,\n                           -0.07959599792957306,\n                           0.40971601009368896,\n                           0.9386569857597351,\n                           -0.17680299282073975,\n                           0.29607900977134705,\n                           0.7781569957733154,\n                           -0.19467000663280487,\n                           0.5971400141716003,\n                           0.738847017288208,\n                           -0.07674700021743774,\n                           0.6694890260696411,\n                           0.43915998935699463,\n                           -0.22276799380779266,\n                           0.870352029800415,\n                           0.3863860070705414,\n                           -0.0790880024433136,\n                           0.918940007686615,\n                           0.3576120138168335,\n                           0.07325199991464615,\n                           0.9309930205345154,\n                           0.5227140188217163,\n                           0.16167999804019928,\n                           0.8370360136032104,\n                           0.4246380031108856,\n                           0.3233239948749542,\n                           0.845661997795105,\n                           0.733618974685669,\n                           0.48907899856567383,\n                           0.4718089997768402,\n                           0.9886019825935364,\n                           -0.10717800259590149,\n                           0.10573200136423111,\n                           0.9131960272789001,\n                           -0.22303399443626404,\n                           0.3410690128803253,\n                           0.7163559794425964,\n                           -0.25636500120162964,\n                           0.6489310264587402,\n                           0.35149699449539185,\n                           -0.15968100726604462,\n                           0.922469973564148,\n                           0.07999800145626068,\n                           -0.2107039988040924,\n                           0.9742709994316101,\n                           0.9883249998092651,\n                           0.04732999950647354,\n                           0.14482200145721436,\n                           0.9210500121116638,\n                           0.07413999736309052,\n                           0.3823229968547821,\n                           0.6804890036582947,\n                           0.11895299702882767,\n                           0.7230389714241028,\n                           0.4935390055179596,\n                           -0.10269299894571304,\n                           0.8636389970779419,\n                           0.3912479877471924,\n                           -0.4752289950847626,\n                           0.7880880236625671,\n                           0.9700270295143127,\n                           0.07970499992370605,\n                           0.2295520007610321,\n                           0.831250011920929,\n                           0.10592100024223328,\n                           0.5457149744033813,\n                           0.4774230122566223,\n                           0.13252699375152588,\n                           0.8686220049858093,\n                           0.47922399640083313,\n                           -0.0024129999801516533,\n                           0.877689003944397,\n                           0.6902980208396912,\n                           -0.29711300134658813,\n                           0.6597059965133667,\n                           0.6312130093574524,\n                           0.4550989866256714,\n                           0.628055989742279,\n                           0.26494699716567993,\n                           0.5426689982414246,\n                           0.797065019607544,\n                           0.4216960072517395,\n                           0.6728450059890747,\n                           0.6078259944915771,\n                           0.7324270009994507,\n                           0.5829970240592957,\n                           0.35166099667549133,\n                           0.5086709856987,\n                           0.8606399893760681,\n                           -0.023507000878453255,\n                           0.7640720009803772,\n                           0.6449369788169861,\n                           -0.015798000618815422,\n                           0.19029100239276886,\n                           0.2773289978504181,\n                           -0.9417420029640198,\n                           0.02588699944317341,\n                           0.0005750000127591193,\n                           -0.9996650218963623,\n                           -0.33045700192451477,\n                           -0.4387669861316681,\n                           -0.8356329798698425,\n                           -0.6271269917488098,\n                           -0.4645389914512634,\n                           -0.6252319812774658,\n                           -0.02311599999666214,\n                           0.2469020038843155,\n                           0.9687650203704834,\n                           -0.012950999662280083,\n                           0.45514100790023804,\n                           0.8903250098228455,\n                           -0.001180000021122396,\n                           0.9888520240783691,\n                           0.14889399707317352,\n                           0.019520999863743782,\n                           0.6841210126876831,\n                           -0.7291070222854614,\n                           0.012253000400960445,\n                           0.007784999907016754,\n                           -0.9998949766159058,\n                           0.3314639925956726,\n                           -0.3832260072231293,\n                           0.8621309995651245,\n                           0.08274699747562408,\n                           -0.16047699749469757,\n                           0.9835649728775024,\n                           -0.381630003452301,\n                           0.638043999671936,\n                           0.6687729954719543,\n                           -0.44988399744033813,\n                           0.787883996963501,\n                           -0.42052799463272095,\n                           -0.2780170142650604,\n                           0.5983560085296631,\n                           -0.7514500021934509,\n                           0.7378140091896057,\n                           -0.4918749928474426,\n                           0.4622659981250763,\n                           0.6153389811515808,\n                           -0.45540300011634827,\n                           0.6434019804000854,\n                           -0.43678900599479675,\n                           0.33411499857902527,\n                           0.8352140188217163,\n                           -0.7429530024528503,\n                           0.6388909816741943,\n                           -0.1995989978313446,\n                           -0.7432950139045715,\n                           0.5977380275726318,\n                           -0.3003700077533722,\n                           0.7197920083999634,\n                           0.5168960094451904,\n                           0.4633769989013672,\n                           0.22183099389076233,\n                           0.4485720098018646,\n                           0.8657789826393127,\n                           0.08203200250864029,\n                           0.15848000347614288,\n                           0.9839479923248291,\n                           0.5953459739685059,\n                           0.4811680018901825,\n                           0.6434599757194519,\n                           -0.37556400895118713,\n                           -0.6215270161628723,\n                           0.6875,\n                           -0.42666301131248474,\n                           -0.33534398674964905,\n                           0.8399419784545898,\n                           -0.44476398825645447,\n                           -0.7887529730796814,\n                           -0.42432600259780884,\n                           -0.7557309865951538,\n                           -0.6222699880599976,\n                           -0.20408600568771362,\n                           -0.4292669892311096,\n                           -0.5361850261688232,\n                           -0.7267979979515076,\n                           -0.7655900120735168,\n                           -0.5671039819717407,\n                           -0.30375200510025024,\n                           0.007348000071942806,\n                           -0.21113499999046326,\n                           0.9774289727210999,\n                           -0.01990099996328354,\n                           -0.4373210072517395,\n                           0.8990849852561951,\n                           -0.008775000460445881,\n                           -0.9864199757575989,\n                           0.16400499641895294,\n                           0.024855999276041985,\n                           -0.6829339861869812,\n                           -0.7300570011138916,\n                           0.014514000155031681,\n                           0.03655200079083443,\n                           -0.9992259740829468,\n                           0.40192899107933044,\n                           -0.4676550030708313,\n                           0.7872430086135864,\n                           0.41696101427078247,\n                           -0.6813820004463196,\n                           0.6015490293502808,\n                           0.5033609867095947,\n                           -0.8637740015983582,\n                           -0.022839000448584557,\n                           0.2058819979429245,\n                           -0.2945750057697296,\n                           -0.9331870079040527,\n                           -0.2351589947938919,\n                           0.5535579919815063,\n                           -0.7989199757575989,\n                           0.6533820033073425,\n                           -0.435588002204895,\n                           0.619156002998352,\n                           0.7555500268936157,\n                           -0.554410994052887,\n                           0.3489600121974945,\n                           0.7765160202980042,\n                           -0.6298360228538513,\n                           -0.01814199984073639,\n                           0.025975000113248825,\n                           0.008264999836683273,\n                           -0.9996280074119568,\n                           -0.6086519956588745,\n                           0.49536699056625366,\n                           -0.6198019981384277,\n                           -0.9813200235366821,\n                           0.19238099455833435,\n                           0,\n                           -0.831650972366333,\n                           0.5552989840507507,\n                           0,\n                           -0.4425640106201172,\n                           0.38308998942375183,\n                           0.8107889890670776,\n                           -0.5623509883880615,\n                           0.11026400327682495,\n                           0.8195139765739441,\n                           0.367917001247406,\n                           -0.15178599953651428,\n                           0.917385995388031,\n                           0.3960669934749603,\n                           -0.07774800062179565,\n                           0.9149240255355835,\n                           0.3283520042896271,\n                           -0.13562799990177155,\n                           0.9347670078277588,\n                           0.3530749976634979,\n                           -0.06952299922704697,\n                           0.9330080151557922,\n                           -0.5935590267181396,\n                           0.20035800337791443,\n                           0.7794510126113892,\n                           -0.6201800107955933,\n                           0.12245599925518036,\n                           0.7748429775238037,\n                           -0.5552989840507507,\n                           0.831650972366333,\n                           0,\n                           -0.2616960108280182,\n                           0.523730993270874,\n                           0.8106920123100281,\n                           0.2819640040397644,\n                           -0.2819199860095978,\n                           0.9170699715614319,\n                           0.25169798731803894,\n                           -0.25161200761795044,\n                           0.9345269799232483,\n                           -0.4710330069065094,\n                           0.41249701380729675,\n                           0.7797269821166992,\n                           -0.19238099455833435,\n                           0.9813200235366821,\n                           0,\n                           -0.04031100124120712,\n                           0.5840420126914978,\n                           0.8107219934463501,\n                           0.1517850011587143,\n                           -0.3678950071334839,\n                           0.9173960089683533,\n                           0.13561999797821045,\n                           -0.3282899856567383,\n                           0.9347900152206421,\n                           -0.27737799286842346,\n                           0.561601996421814,\n                           0.779528021812439,\n                           -1,\n                           0,\n                           0,\n                           0.29074999690055847,\n                           0.5413560271263123,\n                           0.7889220118522644,\n                           0.07767199724912643,\n                           -0.39607399702072144,\n                           0.9149270057678223,\n                           0.0693729966878891,\n                           -0.3530940115451813,\n                           0.9330130219459534,\n                           -0.12221000343561172,\n                           0.6202139854431152,\n                           0.7748550176620483,\n                           0.19238099455833435,\n                           0.9813200235366821,\n                           0,\n                           0.5552989840507507,\n                           0.831650972366333,\n                           0,\n                           0.38308998942375183,\n                           0.4425640106201172,\n                           0.8107889890670776,\n                           0.11026400327682495,\n                           0.5623509883880615,\n                           0.8195139765739441,\n                           -0.15178599953651428,\n                           -0.367917001247406,\n                           0.917385995388031,\n                           -0.07774800062179565,\n                           -0.3960669934749603,\n                           0.9149240255355835,\n                           -0.13562799990177155,\n                           -0.3283520042896271,\n                           0.9347670078277588,\n                           -0.06952299922704697,\n                           -0.3530749976634979,\n                           0.9330080151557922,\n                           0.20035800337791443,\n                           0.5935590267181396,\n                           0.7794510126113892,\n                           0.12245599925518036,\n                           0.6201800107955933,\n                           0.7748429775238037,\n                           0.831650972366333,\n                           0.5552989840507507,\n                           0,\n                           0.523730993270874,\n                           0.2616960108280182,\n                           0.8106920123100281,\n                           -0.2819199860095978,\n                           -0.2819640040397644,\n                           0.9170699715614319,\n                           -0.25161200761795044,\n                           -0.25169798731803894,\n                           0.9345269799232483,\n                           0.41249701380729675,\n                           0.4710330069065094,\n                           0.7797269821166992,\n                           0.9813200235366821,\n                           0.19238099455833435,\n                           0,\n                           0.5840420126914978,\n                           0.04031100124120712,\n                           0.8107219934463501,\n                           -0.3678950071334839,\n                           -0.1517850011587143,\n                           0.9173960089683533,\n                           -0.3282899856567383,\n                           -0.13561999797821045,\n                           0.9347900152206421,\n                           0.561601996421814,\n                           0.27737799286842346,\n                           0.779528021812439,\n                           -1,\n                           0,\n                           0,\n                           0.5413560271263123,\n                           -0.29074999690055847,\n                           0.7889220118522644,\n                           -0.39607399702072144,\n                           -0.07767199724912643,\n                           0.9149270057678223,\n                           -0.3530940115451813,\n                           -0.0693729966878891,\n                           0.9330130219459534,\n                           0.6202139854431152,\n                           0.12221000343561172,\n                           0.7748550176620483,\n                           0.9813200235366821,\n                           -0.19238099455833435,\n                           0,\n                           0.831650972366333,\n                           -0.5552989840507507,\n                           0,\n                           0.4425640106201172,\n                           -0.38308998942375183,\n                           0.8107889890670776,\n                           0.5623509883880615,\n                           -0.11026400327682495,\n                           0.8195139765739441,\n                           -0.367917001247406,\n                           0.15178599953651428,\n                           0.917385995388031,\n                           -0.3960669934749603,\n                           0.07774800062179565,\n                           0.9149240255355835,\n                           -0.3283520042896271,\n                           0.13562799990177155,\n                           0.9347670078277588,\n                           -0.3530749976634979,\n                           0.06952299922704697,\n                           0.9330080151557922,\n                           0.5935590267181396,\n                           -0.20035800337791443,\n                           0.7794510126113892,\n                           0.6201800107955933,\n                           -0.12245599925518036,\n                           0.7748429775238037,\n                           0.5552989840507507,\n                           -0.831650972366333,\n                           0,\n                           0.2616960108280182,\n                           -0.523730993270874,\n                           0.8106920123100281,\n                           -0.2819640040397644,\n                           0.2819199860095978,\n                           0.9170699715614319,\n                           -0.25169798731803894,\n                           0.25161200761795044,\n                           0.9345269799232483,\n                           0.4710330069065094,\n                           -0.41249701380729675,\n                           0.7797269821166992,\n                           0.19238099455833435,\n                           -0.9813200235366821,\n                           0,\n                           0.04031100124120712,\n                           -0.5840420126914978,\n                           0.8107219934463501,\n                           -0.1517850011587143,\n                           0.3678950071334839,\n                           0.9173960089683533,\n                           -0.13561999797821045,\n                           0.3282899856567383,\n                           0.9347900152206421,\n                           0.27737799286842346,\n                           -0.561601996421814,\n                           0.779528021812439,\n                           -1,\n                           0,\n                           0,\n                           -0.29074999690055847,\n                           -0.5413560271263123,\n                           0.7889220118522644,\n                           -0.07767199724912643,\n                           0.39607399702072144,\n                           0.9149270057678223,\n                           -0.0693729966878891,\n                           0.3530940115451813,\n                           0.9330130219459534,\n                           0.12221000343561172,\n                           -0.6202139854431152,\n                           0.7748550176620483,\n                           -0.19238099455833435,\n                           -0.9813200235366821,\n                           0,\n                           -0.5552989840507507,\n                           -0.831650972366333,\n                           0,\n                           -0.38308998942375183,\n                           -0.4425640106201172,\n                           0.8107889890670776,\n                           -0.11026400327682495,\n                           -0.5623509883880615,\n                           0.8195139765739441,\n                           0.15178599953651428,\n                           0.367917001247406,\n                           0.917385995388031,\n                           0.07774800062179565,\n                           0.3960669934749603,\n                           0.9149240255355835,\n                           0.13562799990177155,\n                           0.3283520042896271,\n                           0.9347670078277588,\n                           0.06952299922704697,\n                           0.3530749976634979,\n                           0.9330080151557922,\n                           -0.20035800337791443,\n                           -0.5935590267181396,\n                           0.7794510126113892,\n                           -0.12245599925518036,\n                           -0.6201800107955933,\n                           0.7748429775238037,\n                           -0.831650972366333,\n                           -0.5552989840507507,\n                           0,\n                           -0.523730993270874,\n                           -0.2616960108280182,\n                           0.8106920123100281,\n                           0.2819199860095978,\n                           0.2819640040397644,\n                           0.9170699715614319,\n                           0.25161200761795044,\n                           0.25169798731803894,\n                           0.9345269799232483,\n                           -0.41249701380729675,\n                           -0.4710330069065094,\n                           0.7797269821166992,\n                           -0.9813200235366821,\n                           -0.19238099455833435,\n                           0,\n                           -0.5840420126914978,\n                           -0.04031100124120712,\n                           0.8107219934463501,\n                           0.3678950071334839,\n                           0.1517850011587143,\n                           0.9173960089683533,\n                           0.3282899856567383,\n                           0.13561999797821045,\n                           0.9347900152206421,\n                           -0.561601996421814,\n                           -0.27737799286842346,\n                           0.779528021812439,\n                           -1,\n                           0,\n                           0,\n                           -0.5413560271263123,\n                           0.29074999690055847,\n                           0.7889220118522644,\n                           0.39607399702072144,\n                           0.07767199724912643,\n                           0.9149270057678223,\n                           0.3530940115451813,\n                           0.0693729966878891,\n                           0.9330130219459534,\n                           -0.6202139854431152,\n                           -0.12221000343561172,\n                           0.7748550176620483,\n                           -0.6201800107955933,\n                           0.12245599925518036,\n                           0.7748429775238037,\n                           -0.5616469979286194,\n                           0.27755099534988403,\n                           0.7794349789619446,\n                           -0.8979210257530212,\n                           0.37159600853919983,\n                           0.23590999841690063,\n                           -0.9542099833488464,\n                           0.18841099739074707,\n                           0.23234599828720093,\n                           -0.9101200103759766,\n                           0.3766449987888336,\n                           0.17268399894237518,\n                           -0.966795027256012,\n                           0.19089600443840027,\n                           0.16990099847316742,\n                           -0.8549879789352417,\n                           0.35383298993110657,\n                           0.3792079985141754,\n                           -0.9100499749183655,\n                           0.17969100177288055,\n                           0.3735229969024658,\n                           -0.8064150214195251,\n                           0.2724289894104004,\n                           0.5248600244522095,\n                           -0.8383409976959229,\n                           0.16553199291229248,\n                           0.5194069743156433,\n                           -0.4125959873199463,\n                           0.47094500064849854,\n                           0.7797279953956604,\n                           -0.687192976474762,\n                           0.687192976474762,\n                           0.23565199971199036,\n                           -0.6965190172195435,\n                           0.6965190172195435,\n                           0.17240400612354279,\n                           -0.6544880270957947,\n                           0.6544870138168335,\n                           0.37853899598121643,\n                           -0.6404970288276672,\n                           0.5611429810523987,\n                           0.5242909789085388,\n                           -0.20047900080680847,\n                           0.5933949947357178,\n                           0.7795450091362,\n                           -0.3715969920158386,\n                           0.8979210257530212,\n                           0.23590999841690063,\n                           -0.3766449987888336,\n                           0.9101200103759766,\n                           0.17268399894237518,\n                           -0.35383298993110657,\n                           0.8549879789352417,\n                           0.3792079985141754,\n                           -0.3770729899406433,\n                           0.7630789875984192,\n                           0.5249059796333313,\n                           -0.12245900183916092,\n                           0.6201940178871155,\n                           0.7748309969902039,\n                           -0.18841099739074707,\n                           0.9542099833488464,\n                           0.23234599828720093,\n                           -0.19089600443840027,\n                           0.966795027256012,\n                           0.16990099847316742,\n                           -0.17969200015068054,\n                           0.9100499749183655,\n                           0.3735229969024658,\n                           -0.16553199291229248,\n                           0.8383409976959229,\n                           0.5194069743156433,\n                           0.12245599925518036,\n                           0.6201800107955933,\n                           0.7748429775238037,\n                           0.27755099534988403,\n                           0.5616469979286194,\n                           0.7794349789619446,\n                           0.37159600853919983,\n                           0.8979210257530212,\n                           0.23590999841690063,\n                           0.18841099739074707,\n                           0.9542099833488464,\n                           0.23234599828720093,\n                           0.3766449987888336,\n                           0.9101200103759766,\n                           0.17268399894237518,\n                           0.19089600443840027,\n                           0.966795027256012,\n                           0.16990099847316742,\n                           0.35383298993110657,\n                           0.8549879789352417,\n                           0.3792079985141754,\n                           0.17969100177288055,\n                           0.9100499749183655,\n                           0.3735229969024658,\n                           0.2724289894104004,\n                           0.8064150214195251,\n                           0.5248600244522095,\n                           0.16553199291229248,\n                           0.8383409976959229,\n                           0.5194069743156433,\n                           0.47094500064849854,\n                           0.4125959873199463,\n                           0.7797279953956604,\n                           0.687192976474762,\n                           0.687192976474762,\n                           0.23565199971199036,\n                           0.6965190172195435,\n                           0.6965190172195435,\n                           0.17240400612354279,\n                           0.6544870138168335,\n                           0.6544880270957947,\n                           0.37853899598121643,\n                           0.5611429810523987,\n                           0.6404970288276672,\n                           0.5242909789085388,\n                           0.5933949947357178,\n                           0.20047900080680847,\n                           0.7795450091362,\n                           0.8979210257530212,\n                           0.3715969920158386,\n                           0.23590999841690063,\n                           0.9101200103759766,\n                           0.3766449987888336,\n                           0.17268399894237518,\n                           0.8549879789352417,\n                           0.35383298993110657,\n                           0.3792079985141754,\n                           0.7630789875984192,\n                           0.3770729899406433,\n                           0.5249059796333313,\n                           0.6201940178871155,\n                           0.12245900183916092,\n                           0.7748309969902039,\n                           0.9542099833488464,\n                           0.18841099739074707,\n                           0.23234599828720093,\n                           0.966795027256012,\n                           0.19089600443840027,\n                           0.16990099847316742,\n                           0.9100499749183655,\n                           0.17969200015068054,\n                           0.3735229969024658,\n                           0.8383409976959229,\n                           0.16553199291229248,\n                           0.5194069743156433,\n                           0.6201800107955933,\n                           -0.12245599925518036,\n                           0.7748429775238037,\n                           0.5616469979286194,\n                           -0.27755099534988403,\n                           0.7794349789619446,\n                           0.8979210257530212,\n                           -0.37159600853919983,\n                           0.23590999841690063,\n                           0.9542099833488464,\n                           -0.18841099739074707,\n                           0.23234599828720093,\n                           0.9101200103759766,\n                           -0.3766449987888336,\n                           0.17268399894237518,\n                           0.966795027256012,\n                           -0.19089600443840027,\n                           0.16990099847316742,\n                           0.8549879789352417,\n                           -0.35383298993110657,\n                           0.3792079985141754,\n                           0.9100499749183655,\n                           -0.17969100177288055,\n                           0.3735229969024658,\n                           0.8064150214195251,\n                           -0.2724289894104004,\n                           0.5248600244522095,\n                           0.8383409976959229,\n                           -0.16553199291229248,\n                           0.5194069743156433,\n                           0.4125959873199463,\n                           -0.47094500064849854,\n                           0.7797279953956604,\n                           0.687192976474762,\n                           -0.687192976474762,\n                           0.23565199971199036,\n                           0.6965190172195435,\n                           -0.6965190172195435,\n                           0.17240400612354279,\n                           0.6544880270957947,\n                           -0.6544870138168335,\n                           0.37853899598121643,\n                           0.6404970288276672,\n                           -0.5611429810523987,\n                           0.5242909789085388,\n                           0.20047900080680847,\n                           -0.5933949947357178,\n                           0.7795450091362,\n                           0.3715969920158386,\n                           -0.8979210257530212,\n                           0.23590999841690063,\n                           0.3766449987888336,\n                           -0.9101200103759766,\n                           0.17268399894237518,\n                           0.35383298993110657,\n                           -0.8549879789352417,\n                           0.3792079985141754,\n                           0.3770729899406433,\n                           -0.7630789875984192,\n                           0.5249059796333313,\n                           0.12245900183916092,\n                           -0.6201940178871155,\n                           0.7748309969902039,\n                           0.18841099739074707,\n                           -0.9542099833488464,\n                           0.23234599828720093,\n                           0.19089600443840027,\n                           -0.966795027256012,\n                           0.16990099847316742,\n                           0.17969200015068054,\n                           -0.9100499749183655,\n                           0.3735229969024658,\n                           0.16553199291229248,\n                           -0.8383409976959229,\n                           0.5194069743156433,\n                           -0.12245599925518036,\n                           -0.6201800107955933,\n                           0.7748429775238037,\n                           -0.27755099534988403,\n                           -0.5616469979286194,\n                           0.7794349789619446,\n                           -0.37159600853919983,\n                           -0.8979210257530212,\n                           0.23590999841690063,\n                           -0.18841099739074707,\n                           -0.9542099833488464,\n                           0.23234599828720093,\n                           -0.3766449987888336,\n                           -0.9101200103759766,\n                           0.17268399894237518,\n                           -0.19089600443840027,\n                           -0.966795027256012,\n                           0.16990099847316742,\n                           -0.35383298993110657,\n                           -0.8549879789352417,\n                           0.3792079985141754,\n                           -0.17969100177288055,\n                           -0.9100499749183655,\n                           0.3735229969024658,\n                           -0.2724289894104004,\n                           -0.8064150214195251,\n                           0.5248600244522095,\n                           -0.16553199291229248,\n                           -0.8383409976959229,\n                           0.5194069743156433,\n                           -0.47094500064849854,\n                           -0.4125959873199463,\n                           0.7797279953956604,\n                           -0.687192976474762,\n                           -0.687192976474762,\n                           0.23565199971199036,\n                           -0.6965190172195435,\n                           -0.6965190172195435,\n                           0.17240400612354279,\n                           -0.6544870138168335,\n                           -0.6544880270957947,\n                           0.37853899598121643,\n                           -0.5611429810523987,\n                           -0.6404970288276672,\n                           0.5242909789085388,\n                           -0.5933949947357178,\n                           -0.20047900080680847,\n                           0.7795450091362,\n                           -0.8979210257530212,\n                           -0.3715969920158386,\n                           0.23590999841690063,\n                           -0.9101200103759766,\n                           -0.3766449987888336,\n                           0.17268399894237518,\n                           -0.8549879789352417,\n                           -0.35383298993110657,\n                           0.3792079985141754,\n                           -0.7630789875984192,\n                           -0.3770729899406433,\n                           0.5249059796333313,\n                           -0.6201940178871155,\n                           -0.12245900183916092,\n                           0.7748309969902039,\n                           -0.9542099833488464,\n                           -0.18841099739074707,\n                           0.23234599828720093,\n                           -0.966795027256012,\n                           -0.19089600443840027,\n                           0.16990099847316742,\n                           -0.9100499749183655,\n                           -0.17969200015068054,\n                           0.3735229969024658,\n                           -0.8383409976959229,\n                           -0.16553199291229248,\n                           0.5194069743156433};\n\nfloat teapotTexCoords[] = {2,\n                           2,\n                           0,\n                           1.75,\n                           2,\n                           0,\n                           1.75,\n                           1.975000023841858,\n                           0,\n                           2,\n                           1.975000023841858,\n                           0,\n                           1.75,\n                           1.9500000476837158,\n                           0,\n                           2,\n                           1.9500000476837158,\n                           0,\n                           1.75,\n                           1.9249999523162842,\n                           0,\n                           2,\n                           1.9249999523162842,\n                           0,\n                           1.75,\n                           1.899999976158142,\n                           0,\n                           2,\n                           1.899999976158142,\n                           0,\n                           1.5,\n                           2,\n                           0,\n                           1.5,\n                           1.975000023841858,\n                           0,\n                           1.5,\n                           1.9500000476837158,\n                           0,\n                           1.5,\n                           1.9249999523162842,\n                           0,\n                           1.5,\n                           1.899999976158142,\n                           0,\n                           1.25,\n                           2,\n                           0,\n                           1.25,\n                           1.975000023841858,\n                           0,\n                           1.25,\n                           1.9500000476837158,\n                           0,\n                           1.25,\n                           1.9249999523162842,\n                           0,\n                           1.25,\n                           1.899999976158142,\n                           0,\n                           1,\n                           2,\n                           0,\n                           1,\n                           1.975000023841858,\n                           0,\n                           1,\n                           1.9500000476837158,\n                           0,\n                           1,\n                           1.9249999523162842,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           1,\n                           2,\n                           0,\n                           0.75,\n                           2,\n                           0,\n                           0.75,\n                           1.975000023841858,\n                           0,\n                           1,\n                           1.975000023841858,\n                           0,\n                           0.75,\n                           1.9500000476837158,\n                           0,\n                           1,\n                           1.9500000476837158,\n                           0,\n                           0.75,\n                           1.9249999523162842,\n                           0,\n                           1,\n                           1.9249999523162842,\n                           0,\n                           0.75,\n                           1.899999976158142,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           0.5,\n                           2,\n                           0,\n                           0.5,\n                           1.975000023841858,\n                           0,\n                           0.5,\n                           1.9500000476837158,\n                           0,\n                           0.5,\n                           1.9249999523162842,\n                           0,\n                           0.5,\n                           1.899999976158142,\n                           0,\n                           0.25,\n                           2,\n                           0,\n                           0.25,\n                           1.975000023841858,\n                           0,\n                           0.25,\n                           1.9500000476837158,\n                           0,\n                           0.25,\n                           1.9249999523162842,\n                           0,\n                           0.25,\n                           1.899999976158142,\n                           0,\n                           0,\n                           2,\n                           0,\n                           0,\n                           1.975000023841858,\n                           0,\n                           0,\n                           1.9500000476837158,\n                           0,\n                           0,\n                           1.9249999523162842,\n                           0,\n                           0,\n                           1.899999976158142,\n                           0,\n                           2,\n                           2,\n                           0,\n                           1.75,\n                           2,\n                           0,\n                           1.75,\n                           1.975000023841858,\n                           0,\n                           2,\n                           1.975000023841858,\n                           0,\n                           1.75,\n                           1.9500000476837158,\n                           0,\n                           2,\n                           1.9500000476837158,\n                           0,\n                           1.75,\n                           1.9249999523162842,\n                           0,\n                           2,\n                           1.9249999523162842,\n                           0,\n                           1.75,\n                           1.899999976158142,\n                           0,\n                           2,\n                           1.899999976158142,\n                           0,\n                           1.5,\n                           2,\n                           0,\n                           1.5,\n                           1.975000023841858,\n                           0,\n                           1.5,\n                           1.9500000476837158,\n                           0,\n                           1.5,\n                           1.9249999523162842,\n                           0,\n                           1.5,\n                           1.899999976158142,\n                           0,\n                           1.25,\n                           2,\n                           0,\n                           1.25,\n                           1.975000023841858,\n                           0,\n                           1.25,\n                           1.9500000476837158,\n                           0,\n                           1.25,\n                           1.9249999523162842,\n                           0,\n                           1.25,\n                           1.899999976158142,\n                           0,\n                           1,\n                           2,\n                           0,\n                           1,\n                           1.975000023841858,\n                           0,\n                           1,\n                           1.9500000476837158,\n                           0,\n                           1,\n                           1.9249999523162842,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           1,\n                           2,\n                           0,\n                           0.75,\n                           2,\n                           0,\n                           0.75,\n                           1.975000023841858,\n                           0,\n                           1,\n                           1.975000023841858,\n                           0,\n                           0.75,\n                           1.9500000476837158,\n                           0,\n                           1,\n                           1.9500000476837158,\n                           0,\n                           0.75,\n                           1.9249999523162842,\n                           0,\n                           1,\n                           1.9249999523162842,\n                           0,\n                           0.75,\n                           1.899999976158142,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           0.5,\n                           2,\n                           0,\n                           0.5,\n                           1.975000023841858,\n                           0,\n                           0.5,\n                           1.9500000476837158,\n                           0,\n                           0.5,\n                           1.9249999523162842,\n                           0,\n                           0.5,\n                           1.899999976158142,\n                           0,\n                           0.25,\n                           2,\n                           0,\n                           0.25,\n                           1.975000023841858,\n                           0,\n                           0.25,\n                           1.9500000476837158,\n                           0,\n                           0.25,\n                           1.9249999523162842,\n                           0,\n                           0.25,\n                           1.899999976158142,\n                           0,\n                           0,\n                           2,\n                           0,\n                           0,\n                           1.975000023841858,\n                           0,\n                           0,\n                           1.9500000476837158,\n                           0,\n                           0,\n                           1.9249999523162842,\n                           0,\n                           0,\n                           1.899999976158142,\n                           0,\n                           2,\n                           1.899999976158142,\n                           0,\n                           1.75,\n                           1.899999976158142,\n                           0,\n                           1.75,\n                           1.6749999523162842,\n                           0,\n                           2,\n                           1.6749999523162842,\n                           0,\n                           1.75,\n                           1.4500000476837158,\n                           0,\n                           2,\n                           1.4500000476837158,\n                           0,\n                           1.75,\n                           1.225000023841858,\n                           0,\n                           2,\n                           1.225000023841858,\n                           0,\n                           1.75,\n                           1,\n                           0,\n                           2,\n                           1,\n                           0,\n                           1.5,\n                           1.899999976158142,\n                           0,\n                           1.5,\n                           1.6749999523162842,\n                           0,\n                           1.5,\n                           1.4500000476837158,\n                           0,\n                           1.5,\n                           1.225000023841858,\n                           0,\n                           1.5,\n                           1,\n                           0,\n                           1.25,\n                           1.899999976158142,\n                           0,\n                           1.25,\n                           1.6749999523162842,\n                           0,\n                           1.25,\n                           1.4500000476837158,\n                           0,\n                           1.25,\n                           1.225000023841858,\n                           0,\n                           1.25,\n                           1,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           1,\n                           1.6749999523162842,\n                           0,\n                           1,\n                           1.4500000476837158,\n                           0,\n                           1,\n                           1.225000023841858,\n                           0,\n                           1,\n                           1,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           0.75,\n                           1.899999976158142,\n                           0,\n                           0.75,\n                           1.6749999523162842,\n                           0,\n                           1,\n                           1.6749999523162842,\n                           0,\n                           0.75,\n                           1.4500000476837158,\n                           0,\n                           1,\n                           1.4500000476837158,\n                           0,\n                           0.75,\n                           1.225000023841858,\n                           0,\n                           1,\n                           1.225000023841858,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.5,\n                           1.899999976158142,\n                           0,\n                           0.5,\n                           1.6749999523162842,\n                           0,\n                           0.5,\n                           1.4500000476837158,\n                           0,\n                           0.5,\n                           1.225000023841858,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.25,\n                           1.899999976158142,\n                           0,\n                           0.25,\n                           1.6749999523162842,\n                           0,\n                           0.25,\n                           1.4500000476837158,\n                           0,\n                           0.25,\n                           1.225000023841858,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0,\n                           1.899999976158142,\n                           0,\n                           0,\n                           1.6749999523162842,\n                           0,\n                           0,\n                           1.4500000476837158,\n                           0,\n                           0,\n                           1.225000023841858,\n                           0,\n                           0,\n                           1,\n                           0,\n                           2,\n                           1.899999976158142,\n                           0,\n                           1.75,\n                           1.899999976158142,\n                           0,\n                           1.75,\n                           1.6749999523162842,\n                           0,\n                           2,\n                           1.6749999523162842,\n                           0,\n                           1.75,\n                           1.4500000476837158,\n                           0,\n                           2,\n                           1.4500000476837158,\n                           0,\n                           1.75,\n                           1.225000023841858,\n                           0,\n                           2,\n                           1.225000023841858,\n                           0,\n                           1.75,\n                           1,\n                           0,\n                           2,\n                           1,\n                           0,\n                           1.5,\n                           1.899999976158142,\n                           0,\n                           1.5,\n                           1.6749999523162842,\n                           0,\n                           1.5,\n                           1.4500000476837158,\n                           0,\n                           1.5,\n                           1.225000023841858,\n                           0,\n                           1.5,\n                           1,\n                           0,\n                           1.25,\n                           1.899999976158142,\n                           0,\n                           1.25,\n                           1.6749999523162842,\n                           0,\n                           1.25,\n                           1.4500000476837158,\n                           0,\n                           1.25,\n                           1.225000023841858,\n                           0,\n                           1.25,\n                           1,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           1,\n                           1.6749999523162842,\n                           0,\n                           1,\n                           1.4500000476837158,\n                           0,\n                           1,\n                           1.225000023841858,\n                           0,\n                           1,\n                           1,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           0.75,\n                           1.899999976158142,\n                           0,\n                           0.75,\n                           1.6749999523162842,\n                           0,\n                           1,\n                           1.6749999523162842,\n                           0,\n                           0.75,\n                           1.4500000476837158,\n                           0,\n                           1,\n                           1.4500000476837158,\n                           0,\n                           0.75,\n                           1.225000023841858,\n                           0,\n                           1,\n                           1.225000023841858,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.5,\n                           1.899999976158142,\n                           0,\n                           0.5,\n                           1.6749999523162842,\n                           0,\n                           0.5,\n                           1.4500000476837158,\n                           0,\n                           0.5,\n                           1.225000023841858,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.25,\n                           1.899999976158142,\n                           0,\n                           0.25,\n                           1.6749999523162842,\n                           0,\n                           0.25,\n                           1.4500000476837158,\n                           0,\n                           0.25,\n                           1.225000023841858,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0,\n                           1.899999976158142,\n                           0,\n                           0,\n                           1.6749999523162842,\n                           0,\n                           0,\n                           1.4500000476837158,\n                           0,\n                           0,\n                           1.225000023841858,\n                           0,\n                           0,\n                           1,\n                           0,\n                           2,\n                           1,\n                           0,\n                           1.75,\n                           1,\n                           0,\n                           1.75,\n                           0.8500000238418579,\n                           0,\n                           2,\n                           0.8500000238418579,\n                           0,\n                           1.75,\n                           0.699999988079071,\n                           0,\n                           2,\n                           0.699999988079071,\n                           0,\n                           1.75,\n                           0.550000011920929,\n                           0,\n                           2,\n                           0.550000011920929,\n                           0,\n                           1.75,\n                           0.4000000059604645,\n                           0,\n                           2,\n                           0.4000000059604645,\n                           0,\n                           1.5,\n                           1,\n                           0,\n                           1.5,\n                           0.8500000238418579,\n                           0,\n                           1.5,\n                           0.699999988079071,\n                           0,\n                           1.5,\n                           0.550000011920929,\n                           0,\n                           1.5,\n                           0.4000000059604645,\n                           0,\n                           1.25,\n                           1,\n                           0,\n                           1.25,\n                           0.8500000238418579,\n                           0,\n                           1.25,\n                           0.699999988079071,\n                           0,\n                           1.25,\n                           0.550000011920929,\n                           0,\n                           1.25,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           1,\n                           0,\n                           1,\n                           0.8500000238418579,\n                           0,\n                           1,\n                           0.699999988079071,\n                           0,\n                           1,\n                           0.550000011920929,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.8500000238418579,\n                           0,\n                           1,\n                           0.8500000238418579,\n                           0,\n                           0.75,\n                           0.699999988079071,\n                           0,\n                           1,\n                           0.699999988079071,\n                           0,\n                           0.75,\n                           0.550000011920929,\n                           0,\n                           1,\n                           0.550000011920929,\n                           0,\n                           0.75,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.8500000238418579,\n                           0,\n                           0.5,\n                           0.699999988079071,\n                           0,\n                           0.5,\n                           0.550000011920929,\n                           0,\n                           0.5,\n                           0.4000000059604645,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.8500000238418579,\n                           0,\n                           0.25,\n                           0.699999988079071,\n                           0,\n                           0.25,\n                           0.550000011920929,\n                           0,\n                           0.25,\n                           0.4000000059604645,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.8500000238418579,\n                           0,\n                           0,\n                           0.699999988079071,\n                           0,\n                           0,\n                           0.550000011920929,\n                           0,\n                           0,\n                           0.4000000059604645,\n                           0,\n                           2,\n                           1,\n                           0,\n                           1.75,\n                           1,\n                           0,\n                           1.75,\n                           0.8500000238418579,\n                           0,\n                           2,\n                           0.8500000238418579,\n                           0,\n                           1.75,\n                           0.699999988079071,\n                           0,\n                           2,\n                           0.699999988079071,\n                           0,\n                           1.75,\n                           0.550000011920929,\n                           0,\n                           2,\n                           0.550000011920929,\n                           0,\n                           1.75,\n                           0.4000000059604645,\n                           0,\n                           2,\n                           0.4000000059604645,\n                           0,\n                           1.5,\n                           1,\n                           0,\n                           1.5,\n                           0.8500000238418579,\n                           0,\n                           1.5,\n                           0.699999988079071,\n                           0,\n                           1.5,\n                           0.550000011920929,\n                           0,\n                           1.5,\n                           0.4000000059604645,\n                           0,\n                           1.25,\n                           1,\n                           0,\n                           1.25,\n                           0.8500000238418579,\n                           0,\n                           1.25,\n                           0.699999988079071,\n                           0,\n                           1.25,\n                           0.550000011920929,\n                           0,\n                           1.25,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           1,\n                           0,\n                           1,\n                           0.8500000238418579,\n                           0,\n                           1,\n                           0.699999988079071,\n                           0,\n                           1,\n                           0.550000011920929,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.8500000238418579,\n                           0,\n                           1,\n                           0.8500000238418579,\n                           0,\n                           0.75,\n                           0.699999988079071,\n                           0,\n                           1,\n                           0.699999988079071,\n                           0,\n                           0.75,\n                           0.550000011920929,\n                           0,\n                           1,\n                           0.550000011920929,\n                           0,\n                           0.75,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.8500000238418579,\n                           0,\n                           0.5,\n                           0.699999988079071,\n                           0,\n                           0.5,\n                           0.550000011920929,\n                           0,\n                           0.5,\n                           0.4000000059604645,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.8500000238418579,\n                           0,\n                           0.25,\n                           0.699999988079071,\n                           0,\n                           0.25,\n                           0.550000011920929,\n                           0,\n                           0.25,\n                           0.4000000059604645,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.8500000238418579,\n                           0,\n                           0,\n                           0.699999988079071,\n                           0,\n                           0,\n                           0.550000011920929,\n                           0,\n                           0,\n                           0.4000000059604645,\n                           0,\n                           2,\n                           0.4000000059604645,\n                           0,\n                           1.75,\n                           0.4000000059604645,\n                           0,\n                           1.75,\n                           0.30000001192092896,\n                           0,\n                           2,\n                           0.30000001192092896,\n                           0,\n                           1.75,\n                           0.20000000298023224,\n                           0,\n                           2,\n                           0.20000000298023224,\n                           0,\n                           1.75,\n                           0.10000000149011612,\n                           0,\n                           2,\n                           0.10000000149011612,\n                           0,\n                           1.75,\n                           0,\n                           0,\n                           2,\n                           0,\n                           0,\n                           1.5,\n                           0.4000000059604645,\n                           0,\n                           1.5,\n                           0.30000001192092896,\n                           0,\n                           1.5,\n                           0.20000000298023224,\n                           0,\n                           1.5,\n                           0.10000000149011612,\n                           0,\n                           1.5,\n                           0,\n                           0,\n                           1.25,\n                           0.4000000059604645,\n                           0,\n                           1.25,\n                           0.30000001192092896,\n                           0,\n                           1.25,\n                           0.20000000298023224,\n                           0,\n                           1.25,\n                           0.10000000149011612,\n                           0,\n                           1.25,\n                           0,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           0.30000001192092896,\n                           0,\n                           1,\n                           0.20000000298023224,\n                           0,\n                           1,\n                           0.10000000149011612,\n                           0,\n                           1,\n                           0,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           0.75,\n                           0.4000000059604645,\n                           0,\n                           0.75,\n                           0.30000001192092896,\n                           0,\n                           1,\n                           0.30000001192092896,\n                           0,\n                           0.75,\n                           0.20000000298023224,\n                           0,\n                           1,\n                           0.20000000298023224,\n                           0,\n                           0.75,\n                           0.10000000149011612,\n                           0,\n                           1,\n                           0.10000000149011612,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.5,\n                           0.4000000059604645,\n                           0,\n                           0.5,\n                           0.30000001192092896,\n                           0,\n                           0.5,\n                           0.20000000298023224,\n                           0,\n                           0.5,\n                           0.10000000149011612,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0.4000000059604645,\n                           0,\n                           0.25,\n                           0.30000001192092896,\n                           0,\n                           0.25,\n                           0.20000000298023224,\n                           0,\n                           0.25,\n                           0.10000000149011612,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0,\n                           0.4000000059604645,\n                           0,\n                           0,\n                           0.30000001192092896,\n                           0,\n                           0,\n                           0.20000000298023224,\n                           0,\n                           0,\n                           0.10000000149011612,\n                           0,\n                           0,\n                           0,\n                           0,\n                           2,\n                           0.4000000059604645,\n                           0,\n                           1.75,\n                           0.4000000059604645,\n                           0,\n                           1.75,\n                           0.30000001192092896,\n                           0,\n                           2,\n                           0.30000001192092896,\n                           0,\n                           1.75,\n                           0.20000000298023224,\n                           0,\n                           2,\n                           0.20000000298023224,\n                           0,\n                           1.75,\n                           0.10000000149011612,\n                           0,\n                           2,\n                           0.10000000149011612,\n                           0,\n                           1.75,\n                           0,\n                           0,\n                           2,\n                           0,\n                           0,\n                           1.5,\n                           0.4000000059604645,\n                           0,\n                           1.5,\n                           0.30000001192092896,\n                           0,\n                           1.5,\n                           0.20000000298023224,\n                           0,\n                           1.5,\n                           0.10000000149011612,\n                           0,\n                           1.5,\n                           0,\n                           0,\n                           1.25,\n                           0.4000000059604645,\n                           0,\n                           1.25,\n                           0.30000001192092896,\n                           0,\n                           1.25,\n                           0.20000000298023224,\n                           0,\n                           1.25,\n                           0.10000000149011612,\n                           0,\n                           1.25,\n                           0,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           0.30000001192092896,\n                           0,\n                           1,\n                           0.20000000298023224,\n                           0,\n                           1,\n                           0.10000000149011612,\n                           0,\n                           1,\n                           0,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           0.75,\n                           0.4000000059604645,\n                           0,\n                           0.75,\n                           0.30000001192092896,\n                           0,\n                           1,\n                           0.30000001192092896,\n                           0,\n                           0.75,\n                           0.20000000298023224,\n                           0,\n                           1,\n                           0.20000000298023224,\n                           0,\n                           0.75,\n                           0.10000000149011612,\n                           0,\n                           1,\n                           0.10000000149011612,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.5,\n                           0.4000000059604645,\n                           0,\n                           0.5,\n                           0.30000001192092896,\n                           0,\n                           0.5,\n                           0.20000000298023224,\n                           0,\n                           0.5,\n                           0.10000000149011612,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0.4000000059604645,\n                           0,\n                           0.25,\n                           0.30000001192092896,\n                           0,\n                           0.25,\n                           0.20000000298023224,\n                           0,\n                           0.25,\n                           0.10000000149011612,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0,\n                           0.4000000059604645,\n                           0,\n                           0,\n                           0.30000001192092896,\n                           0,\n                           0,\n                           0.20000000298023224,\n                           0,\n                           0,\n                           0.10000000149011612,\n                           0,\n                           0,\n                           0,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.875,\n                           1,\n                           0,\n                           0.875,\n                           0.875,\n                           0,\n                           1,\n                           0.875,\n                           0,\n                           0.875,\n                           0.75,\n                           0,\n                           1,\n                           0.75,\n                           0,\n                           0.875,\n                           0.625,\n                           0,\n                           1,\n                           0.625,\n                           0,\n                           0.875,\n                           0.5,\n                           0,\n                           1,\n                           0.5,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.875,\n                           0,\n                           0.75,\n                           0.75,\n                           0,\n                           0.75,\n                           0.625,\n                           0,\n                           0.75,\n                           0.5,\n                           0,\n                           0.625,\n                           1,\n                           0,\n                           0.625,\n                           0.875,\n                           0,\n                           0.625,\n                           0.75,\n                           0,\n                           0.625,\n                           0.625,\n                           0,\n                           0.625,\n                           0.5,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.875,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.5,\n                           0.625,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.375,\n                           1,\n                           0,\n                           0.375,\n                           0.875,\n                           0,\n                           0.5,\n                           0.875,\n                           0,\n                           0.375,\n                           0.75,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.375,\n                           0.625,\n                           0,\n                           0.5,\n                           0.625,\n                           0,\n                           0.375,\n                           0.5,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.875,\n                           0,\n                           0.25,\n                           0.75,\n                           0,\n                           0.25,\n                           0.625,\n                           0,\n                           0.25,\n                           0.5,\n                           0,\n                           0.125,\n                           1,\n                           0,\n                           0.125,\n                           0.875,\n                           0,\n                           0.125,\n                           0.75,\n                           0,\n                           0.125,\n                           0.625,\n                           0,\n                           0.125,\n                           0.5,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           1,\n                           0.5,\n                           0,\n                           0.875,\n                           0.5,\n                           0,\n                           0.875,\n                           0.375,\n                           0,\n                           1,\n                           0.375,\n                           0,\n                           0.875,\n                           0.25,\n                           0,\n                           1,\n                           0.25,\n                           0,\n                           0.875,\n                           0.125,\n                           0,\n                           1,\n                           0.125,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           0.5,\n                           0,\n                           0.75,\n                           0.375,\n                           0,\n                           0.75,\n                           0.25,\n                           0,\n                           0.75,\n                           0.125,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.625,\n                           0.5,\n                           0,\n                           0.625,\n                           0.375,\n                           0,\n                           0.625,\n                           0.25,\n                           0,\n                           0.625,\n                           0.125,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.5,\n                           0.375,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.5,\n                           0.125,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.375,\n                           0.5,\n                           0,\n                           0.375,\n                           0.375,\n                           0,\n                           0.5,\n                           0.375,\n                           0,\n                           0.375,\n                           0.25,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.375,\n                           0.125,\n                           0,\n                           0.5,\n                           0.125,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0.5,\n                           0,\n                           0.25,\n                           0.375,\n                           0,\n                           0.25,\n                           0.25,\n                           0,\n                           0.25,\n                           0.125,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.125,\n                           0.5,\n                           0,\n                           0.125,\n                           0.375,\n                           0,\n                           0.125,\n                           0.25,\n                           0,\n                           0.125,\n                           0.125,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.625,\n                           0.22499999403953552,\n                           0,\n                           0.5,\n                           0.22499999403953552,\n                           0,\n                           0.625,\n                           0.44999998807907104,\n                           0,\n                           0.5,\n                           0.44999998807907104,\n                           0,\n                           0.625,\n                           0.675000011920929,\n                           0,\n                           0.5,\n                           0.675000011920929,\n                           0,\n                           0.625,\n                           0.8999999761581421,\n                           0,\n                           0.5,\n                           0.8999999761581421,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.75,\n                           0.22499999403953552,\n                           0,\n                           0.75,\n                           0.44999998807907104,\n                           0,\n                           0.75,\n                           0.675000011920929,\n                           0,\n                           0.75,\n                           0.8999999761581421,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           0.875,\n                           0.22499999403953552,\n                           0,\n                           0.875,\n                           0.44999998807907104,\n                           0,\n                           0.875,\n                           0.675000011920929,\n                           0,\n                           0.875,\n                           0.8999999761581421,\n                           0,\n                           1,\n                           0,\n                           0,\n                           1,\n                           0.22499999403953552,\n                           0,\n                           1,\n                           0.44999998807907104,\n                           0,\n                           1,\n                           0.675000011920929,\n                           0,\n                           1,\n                           0.8999999761581421,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0.125,\n                           0.22499999403953552,\n                           0,\n                           0,\n                           0.22499999403953552,\n                           0,\n                           0.125,\n                           0.44999998807907104,\n                           0,\n                           0,\n                           0.44999998807907104,\n                           0,\n                           0.125,\n                           0.675000011920929,\n                           0,\n                           0,\n                           0.675000011920929,\n                           0,\n                           0.125,\n                           0.8999999761581421,\n                           0,\n                           0,\n                           0.8999999761581421,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.25,\n                           0.22499999403953552,\n                           0,\n                           0.25,\n                           0.44999998807907104,\n                           0,\n                           0.25,\n                           0.675000011920929,\n                           0,\n                           0.25,\n                           0.8999999761581421,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.375,\n                           0.22499999403953552,\n                           0,\n                           0.375,\n                           0.44999998807907104,\n                           0,\n                           0.375,\n                           0.675000011920929,\n                           0,\n                           0.375,\n                           0.8999999761581421,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.5,\n                           0.22499999403953552,\n                           0,\n                           0.5,\n                           0.44999998807907104,\n                           0,\n                           0.5,\n                           0.675000011920929,\n                           0,\n                           0.5,\n                           0.8999999761581421,\n                           0,\n                           0.5,\n                           0.8999999761581421,\n                           0,\n                           0.625,\n                           0.8999999761581421,\n                           0,\n                           0.625,\n                           0.925000011920929,\n                           0,\n                           0.5,\n                           0.925000011920929,\n                           0,\n                           0.625,\n                           0.949999988079071,\n                           0,\n                           0.5,\n                           0.949999988079071,\n                           0,\n                           0.625,\n                           0.9750000238418579,\n                           0,\n                           0.5,\n                           0.9750000238418579,\n                           0,\n                           0.625,\n                           1,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.75,\n                           0.8999999761581421,\n                           0,\n                           0.75,\n                           0.925000011920929,\n                           0,\n                           0.75,\n                           0.949999988079071,\n                           0,\n                           0.75,\n                           0.9750000238418579,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.875,\n                           0.8999999761581421,\n                           0,\n                           0.875,\n                           0.925000011920929,\n                           0,\n                           0.875,\n                           0.949999988079071,\n                           0,\n                           0.875,\n                           0.9750000238418579,\n                           0,\n                           0.875,\n                           1,\n                           0,\n                           1,\n                           0.8999999761581421,\n                           0,\n                           1,\n                           0.925000011920929,\n                           0,\n                           1,\n                           0.949999988079071,\n                           0,\n                           1,\n                           0.9750000238418579,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0,\n                           0.8999999761581421,\n                           0,\n                           0.125,\n                           0.8999999761581421,\n                           0,\n                           0.125,\n                           0.925000011920929,\n                           0,\n                           0,\n                           0.925000011920929,\n                           0,\n                           0.125,\n                           0.949999988079071,\n                           0,\n                           0,\n                           0.949999988079071,\n                           0,\n                           0.125,\n                           0.9750000238418579,\n                           0,\n                           0,\n                           0.9750000238418579,\n                           0,\n                           0.125,\n                           1,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0.25,\n                           0.8999999761581421,\n                           0,\n                           0.25,\n                           0.925000011920929,\n                           0,\n                           0.25,\n                           0.949999988079071,\n                           0,\n                           0.25,\n                           0.9750000238418579,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.375,\n                           0.8999999761581421,\n                           0,\n                           0.375,\n                           0.925000011920929,\n                           0,\n                           0.375,\n                           0.949999988079071,\n                           0,\n                           0.375,\n                           0.9750000238418579,\n                           0,\n                           0.375,\n                           1,\n                           0,\n                           0.5,\n                           0.8999999761581421,\n                           0,\n                           0.5,\n                           0.925000011920929,\n                           0,\n                           0.5,\n                           0.949999988079071,\n                           0,\n                           0.5,\n                           0.9750000238418579,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.875,\n                           1,\n                           0,\n                           0.875,\n                           0.75,\n                           0,\n                           1,\n                           0.75,\n                           0,\n                           0.875,\n                           0.5,\n                           0,\n                           1,\n                           0.5,\n                           0,\n                           0.875,\n                           0.25,\n                           0,\n                           1,\n                           0.25,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.75,\n                           0,\n                           0.75,\n                           0.5,\n                           0,\n                           0.75,\n                           0.25,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.625,\n                           1,\n                           0,\n                           0.625,\n                           0.75,\n                           0,\n                           0.625,\n                           0.5,\n                           0,\n                           0.625,\n                           0.25,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.375,\n                           1,\n                           0,\n                           0.375,\n                           0.75,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.375,\n                           0.5,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.375,\n                           0.25,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.75,\n                           0,\n                           0.25,\n                           0.5,\n                           0,\n                           0.25,\n                           0.25,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.125,\n                           1,\n                           0,\n                           0.125,\n                           0.75,\n                           0,\n                           0.125,\n                           0.5,\n                           0,\n                           0.125,\n                           0.25,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.875,\n                           1,\n                           0,\n                           0.875,\n                           0.75,\n                           0,\n                           1,\n                           0.75,\n                           0,\n                           0.875,\n                           0.5,\n                           0,\n                           1,\n                           0.5,\n                           0,\n                           0.875,\n                           0.25,\n                           0,\n                           1,\n                           0.25,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.75,\n                           0,\n                           0.75,\n                           0.5,\n                           0,\n                           0.75,\n                           0.25,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.625,\n                           1,\n                           0,\n                           0.625,\n                           0.75,\n                           0,\n                           0.625,\n                           0.5,\n                           0,\n                           0.625,\n                           0.25,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.375,\n                           1,\n                           0,\n                           0.375,\n                           0.75,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.375,\n                           0.5,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.375,\n                           0.25,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.75,\n                           0,\n                           0.25,\n                           0.5,\n                           0,\n                           0.25,\n                           0.25,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.125,\n                           1,\n                           0,\n                           0.125,\n                           0.75,\n                           0,\n                           0.125,\n                           0.5,\n                           0,\n                           0.125,\n                           0.25,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.875,\n                           1,\n                           0,\n                           0.875,\n                           0.75,\n                           0,\n                           1,\n                           0.75,\n                           0,\n                           0.875,\n                           0.5,\n                           0,\n                           1,\n                           0.5,\n                           0,\n                           0.875,\n                           0.25,\n                           0,\n                           1,\n                           0.25,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.75,\n                           0,\n                           0.75,\n                           0.5,\n                           0,\n                           0.75,\n                           0.25,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.625,\n                           1,\n                           0,\n                           0.625,\n                           0.75,\n                           0,\n                           0.625,\n                           0.5,\n                           0,\n                           0.625,\n                           0.25,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.375,\n                           1,\n                           0,\n                           0.375,\n                           0.75,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.375,\n                           0.5,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.375,\n                           0.25,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.75,\n                           0,\n                           0.25,\n                           0.5,\n                           0,\n                           0.25,\n                           0.25,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.125,\n                           1,\n                           0,\n                           0.125,\n                           0.75,\n                           0,\n                           0.125,\n                           0.5,\n                           0,\n                           0.125,\n                           0.25,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.875,\n                           1,\n                           0,\n                           0.875,\n                           0.75,\n                           0,\n                           1,\n                           0.75,\n                           0,\n                           0.875,\n                           0.5,\n                           0,\n                           1,\n                           0.5,\n                           0,\n                           0.875,\n                           0.25,\n                           0,\n                           1,\n                           0.25,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.75,\n                           0,\n                           0.75,\n                           0.5,\n                           0,\n                           0.75,\n                           0.25,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.625,\n                           1,\n                           0,\n                           0.625,\n                           0.75,\n                           0,\n                           0.625,\n                           0.5,\n                           0,\n                           0.625,\n                           0.25,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.375,\n                           1,\n                           0,\n                           0.375,\n                           0.75,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.375,\n                           0.5,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.375,\n                           0.25,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.75,\n                           0,\n                           0.25,\n                           0.5,\n                           0,\n                           0.25,\n                           0.25,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.125,\n                           1,\n                           0,\n                           0.125,\n                           0.75,\n                           0,\n                           0.125,\n                           0.5,\n                           0,\n                           0.125,\n                           0.25,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0,\n                           0};\n\nuint16_t teapotIndices[] = {\n    0,   1,   2,   2,   3,   0,   3,   2,   4,   4,   5,   3,   5,   4,   6,\n    6,   7,   5,   7,   6,   8,   8,   9,   7,   1,   10,  11,  11,  2,   1,\n    2,   11,  12,  12,  4,   2,   4,   12,  13,  13,  6,   4,   6,   13,  14,\n    14,  8,   6,   10,  15,  16,  16,  11,  10,  11,  16,  17,  17,  12,  11,\n    12,  17,  18,  18,  13,  12,  13,  18,  19,  19,  14,  13,  15,  20,  21,\n    21,  16,  15,  16,  21,  22,  22,  17,  16,  17,  22,  23,  23,  18,  17,\n    18,  23,  24,  24,  19,  18,  25,  26,  27,  27,  28,  25,  28,  27,  29,\n    29,  30,  28,  30,  29,  31,  31,  32,  30,  32,  31,  33,  33,  34,  32,\n    26,  35,  36,  36,  27,  26,  27,  36,  37,  37,  29,  27,  29,  37,  38,\n    38,  31,  29,  31,  38,  39,  39,  33,  31,  35,  40,  41,  41,  36,  35,\n    36,  41,  42,  42,  37,  36,  37,  42,  43,  43,  38,  37,  38,  43,  44,\n    44,  39,  38,  40,  45,  46,  46,  41,  40,  41,  46,  47,  47,  42,  41,\n    42,  47,  48,  48,  43,  42,  43,  48,  49,  49,  44,  43,  50,  51,  52,\n    52,  53,  50,  53,  52,  54,  54,  55,  53,  55,  54,  56,  56,  57,  55,\n    57,  56,  58,  58,  59,  57,  51,  60,  61,  61,  52,  51,  52,  61,  62,\n    62,  54,  52,  54,  62,  63,  63,  56,  54,  56,  63,  64,  64,  58,  56,\n    60,  65,  66,  66,  61,  60,  61,  66,  67,  67,  62,  61,  62,  67,  68,\n    68,  63,  62,  63,  68,  69,  69,  64,  63,  65,  70,  71,  71,  66,  65,\n    66,  71,  72,  72,  67,  66,  67,  72,  73,  73,  68,  67,  68,  73,  74,\n    74,  69,  68,  75,  76,  77,  77,  78,  75,  78,  77,  79,  79,  80,  78,\n    80,  79,  81,  81,  82,  80,  82,  81,  83,  83,  84,  82,  76,  85,  86,\n    86,  77,  76,  77,  86,  87,  87,  79,  77,  79,  87,  88,  88,  81,  79,\n    81,  88,  89,  89,  83,  81,  85,  90,  91,  91,  86,  85,  86,  91,  92,\n    92,  87,  86,  87,  92,  93,  93,  88,  87,  88,  93,  94,  94,  89,  88,\n    90,  95,  96,  96,  91,  90,  91,  96,  97,  97,  92,  91,  92,  97,  98,\n    98,  93,  92,  93,  98,  99,  99,  94,  93,  100, 101, 102, 102, 103, 100,\n    103, 102, 104, 104, 105, 103, 105, 104, 106, 106, 107, 105, 107, 106, 108,\n    108, 109, 107, 101, 110, 111, 111, 102, 101, 102, 111, 112, 112, 104, 102,\n    104, 112, 113, 113, 106, 104, 106, 113, 114, 114, 108, 106, 110, 115, 116,\n    116, 111, 110, 111, 116, 117, 117, 112, 111, 112, 117, 118, 118, 113, 112,\n    113, 118, 119, 119, 114, 113, 115, 120, 121, 121, 116, 115, 116, 121, 122,\n    122, 117, 116, 117, 122, 123, 123, 118, 117, 118, 123, 124, 124, 119, 118,\n    125, 126, 127, 127, 128, 125, 128, 127, 129, 129, 130, 128, 130, 129, 131,\n    131, 132, 130, 132, 131, 133, 133, 134, 132, 126, 135, 136, 136, 127, 126,\n    127, 136, 137, 137, 129, 127, 129, 137, 138, 138, 131, 129, 131, 138, 139,\n    139, 133, 131, 135, 140, 141, 141, 136, 135, 136, 141, 142, 142, 137, 136,\n    137, 142, 143, 143, 138, 137, 138, 143, 144, 144, 139, 138, 140, 145, 146,\n    146, 141, 140, 141, 146, 147, 147, 142, 141, 142, 147, 148, 148, 143, 142,\n    143, 148, 149, 149, 144, 143, 150, 151, 152, 152, 153, 150, 153, 152, 154,\n    154, 155, 153, 155, 154, 156, 156, 157, 155, 157, 156, 158, 158, 159, 157,\n    151, 160, 161, 161, 152, 151, 152, 161, 162, 162, 154, 152, 154, 162, 163,\n    163, 156, 154, 156, 163, 164, 164, 158, 156, 160, 165, 166, 166, 161, 160,\n    161, 166, 167, 167, 162, 161, 162, 167, 168, 168, 163, 162, 163, 168, 169,\n    169, 164, 163, 165, 170, 171, 171, 166, 165, 166, 171, 172, 172, 167, 166,\n    167, 172, 173, 173, 168, 167, 168, 173, 174, 174, 169, 168, 175, 176, 177,\n    177, 178, 175, 178, 177, 179, 179, 180, 178, 180, 179, 181, 181, 182, 180,\n    182, 181, 183, 183, 184, 182, 176, 185, 186, 186, 177, 176, 177, 186, 187,\n    187, 179, 177, 179, 187, 188, 188, 181, 179, 181, 188, 189, 189, 183, 181,\n    185, 190, 191, 191, 186, 185, 186, 191, 192, 192, 187, 186, 187, 192, 193,\n    193, 188, 187, 188, 193, 194, 194, 189, 188, 190, 195, 196, 196, 191, 190,\n    191, 196, 197, 197, 192, 191, 192, 197, 198, 198, 193, 192, 193, 198, 199,\n    199, 194, 193, 200, 201, 202, 202, 203, 200, 203, 202, 204, 204, 205, 203,\n    205, 204, 206, 206, 207, 205, 207, 206, 208, 208, 209, 207, 201, 210, 211,\n    211, 202, 201, 202, 211, 212, 212, 204, 202, 204, 212, 213, 213, 206, 204,\n    206, 213, 214, 214, 208, 206, 210, 215, 216, 216, 211, 210, 211, 216, 217,\n    217, 212, 211, 212, 217, 218, 218, 213, 212, 213, 218, 219, 219, 214, 213,\n    215, 220, 221, 221, 216, 215, 216, 221, 222, 222, 217, 216, 217, 222, 223,\n    223, 218, 217, 218, 223, 224, 224, 219, 218, 225, 226, 227, 227, 228, 225,\n    228, 227, 229, 229, 230, 228, 230, 229, 231, 231, 232, 230, 232, 231, 233,\n    233, 234, 232, 226, 235, 236, 236, 227, 226, 227, 236, 237, 237, 229, 227,\n    229, 237, 238, 238, 231, 229, 231, 238, 239, 239, 233, 231, 235, 240, 241,\n    241, 236, 235, 236, 241, 242, 242, 237, 236, 237, 242, 243, 243, 238, 237,\n    238, 243, 244, 244, 239, 238, 240, 245, 246, 246, 241, 240, 241, 246, 247,\n    247, 242, 241, 242, 247, 248, 248, 243, 242, 243, 248, 249, 249, 244, 243,\n    250, 251, 252, 252, 253, 250, 253, 252, 254, 254, 255, 253, 255, 254, 256,\n    256, 257, 255, 257, 256, 258, 258, 259, 257, 251, 260, 261, 261, 252, 251,\n    252, 261, 262, 262, 254, 252, 254, 262, 263, 263, 256, 254, 256, 263, 264,\n    264, 258, 256, 260, 265, 266, 266, 261, 260, 261, 266, 267, 267, 262, 261,\n    262, 267, 268, 268, 263, 262, 263, 268, 269, 269, 264, 263, 265, 270, 271,\n    271, 266, 265, 266, 271, 272, 272, 267, 266, 267, 272, 273, 273, 268, 267,\n    268, 273, 274, 274, 269, 268, 275, 276, 277, 277, 278, 275, 278, 277, 279,\n    279, 280, 278, 280, 279, 281, 281, 282, 280, 282, 281, 283, 283, 284, 282,\n    276, 285, 286, 286, 277, 276, 277, 286, 287, 287, 279, 277, 279, 287, 288,\n    288, 281, 279, 281, 288, 289, 289, 283, 281, 285, 290, 291, 291, 286, 285,\n    286, 291, 292, 292, 287, 286, 287, 292, 293, 293, 288, 287, 288, 293, 294,\n    294, 289, 288, 290, 295, 296, 296, 291, 290, 291, 296, 297, 297, 292, 291,\n    292, 297, 298, 298, 293, 292, 293, 298, 299, 299, 294, 293, 300, 301, 302,\n    302, 303, 300, 303, 302, 304, 304, 305, 303, 305, 304, 306, 306, 307, 305,\n    307, 306, 308, 308, 309, 307, 301, 310, 311, 311, 302, 301, 302, 311, 312,\n    312, 304, 302, 304, 312, 313, 313, 306, 304, 306, 313, 314, 314, 308, 306,\n    310, 315, 316, 316, 311, 310, 311, 316, 317, 317, 312, 311, 312, 317, 318,\n    318, 313, 312, 313, 318, 319, 319, 314, 313, 315, 320, 321, 321, 316, 315,\n    316, 321, 322, 322, 317, 316, 317, 322, 323, 323, 318, 317, 318, 323, 324,\n    324, 319, 318, 325, 326, 327, 327, 328, 325, 328, 327, 329, 329, 330, 328,\n    330, 329, 331, 331, 332, 330, 332, 331, 333, 333, 334, 332, 326, 335, 336,\n    336, 327, 326, 327, 336, 337, 337, 329, 327, 329, 337, 338, 338, 331, 329,\n    331, 338, 339, 339, 333, 331, 335, 340, 341, 341, 336, 335, 336, 341, 342,\n    342, 337, 336, 337, 342, 343, 343, 338, 337, 338, 343, 344, 344, 339, 338,\n    340, 345, 346, 346, 341, 340, 341, 346, 347, 347, 342, 341, 342, 347, 348,\n    348, 343, 342, 343, 348, 349, 349, 344, 343, 350, 351, 352, 352, 353, 350,\n    353, 352, 354, 354, 355, 353, 355, 354, 356, 356, 357, 355, 357, 356, 358,\n    358, 359, 357, 351, 360, 361, 361, 352, 351, 352, 361, 362, 362, 354, 352,\n    354, 362, 363, 363, 356, 354, 356, 363, 364, 364, 358, 356, 360, 365, 366,\n    366, 361, 360, 361, 366, 367, 367, 362, 361, 362, 367, 368, 368, 363, 362,\n    363, 368, 369, 369, 364, 363, 365, 370, 371, 371, 366, 365, 366, 371, 372,\n    372, 367, 366, 367, 372, 373, 373, 368, 367, 368, 373, 374, 374, 369, 368,\n    375, 376, 377, 377, 378, 375, 378, 377, 379, 379, 380, 378, 380, 379, 381,\n    381, 382, 380, 382, 381, 383, 383, 384, 382, 376, 385, 386, 386, 377, 376,\n    377, 386, 387, 387, 379, 377, 379, 387, 388, 388, 381, 379, 381, 388, 389,\n    389, 383, 381, 385, 390, 391, 391, 386, 385, 386, 391, 392, 392, 387, 386,\n    387, 392, 393, 393, 388, 387, 388, 393, 394, 394, 389, 388, 390, 395, 396,\n    396, 391, 390, 391, 396, 397, 397, 392, 391, 392, 397, 398, 398, 393, 392,\n    393, 398, 399, 399, 394, 393, 400, 401, 402, 402, 403, 400, 403, 402, 404,\n    404, 405, 403, 405, 404, 406, 406, 407, 405, 407, 406, 408, 408, 409, 407,\n    401, 410, 411, 411, 402, 401, 402, 411, 412, 412, 404, 402, 404, 412, 413,\n    413, 406, 404, 406, 413, 414, 414, 408, 406, 410, 415, 416, 416, 411, 410,\n    411, 416, 417, 417, 412, 411, 412, 417, 418, 418, 413, 412, 413, 418, 419,\n    419, 414, 413, 415, 420, 421, 421, 416, 415, 416, 421, 422, 422, 417, 416,\n    417, 422, 423, 423, 418, 417, 418, 423, 424, 424, 419, 418, 425, 426, 427,\n    427, 428, 425, 428, 427, 429, 429, 430, 428, 430, 429, 431, 431, 432, 430,\n    432, 431, 433, 433, 434, 432, 426, 435, 436, 436, 427, 426, 427, 436, 437,\n    437, 429, 427, 429, 437, 438, 438, 431, 429, 431, 438, 439, 439, 433, 431,\n    435, 440, 441, 441, 436, 435, 436, 441, 442, 442, 437, 436, 437, 442, 443,\n    443, 438, 437, 438, 443, 444, 444, 439, 438, 440, 445, 446, 446, 441, 440,\n    441, 446, 447, 447, 442, 441, 442, 447, 448, 448, 443, 442, 443, 448, 449,\n    449, 444, 443, 450, 451, 452, 452, 453, 450, 453, 452, 454, 454, 455, 453,\n    455, 454, 456, 456, 457, 455, 457, 456, 458, 458, 459, 457, 451, 460, 461,\n    461, 452, 451, 452, 461, 462, 462, 454, 452, 454, 462, 463, 463, 456, 454,\n    456, 463, 464, 464, 458, 456, 460, 465, 466, 466, 461, 460, 461, 466, 467,\n    467, 462, 461, 462, 467, 468, 468, 463, 462, 463, 468, 469, 469, 464, 463,\n    465, 470, 471, 471, 466, 465, 466, 471, 472, 472, 467, 466, 467, 472, 473,\n    473, 468, 467, 468, 473, 474, 474, 469, 468, 475, 476, 477, 477, 478, 475,\n    478, 477, 479, 479, 480, 478, 480, 479, 481, 481, 482, 480, 482, 481, 483,\n    483, 484, 482, 476, 485, 486, 486, 477, 476, 477, 486, 487, 487, 479, 477,\n    479, 487, 488, 488, 481, 479, 481, 488, 489, 489, 483, 481, 485, 490, 491,\n    491, 486, 485, 486, 491, 492, 492, 487, 486, 487, 492, 493, 493, 488, 487,\n    488, 493, 494, 494, 489, 488, 490, 495, 496, 496, 491, 490, 491, 496, 497,\n    497, 492, 491, 492, 497, 498, 498, 493, 492, 493, 498, 499, 499, 494, 493,\n    500, 501, 502, 502, 503, 500, 503, 502, 504, 504, 505, 503, 505, 504, 506,\n    506, 507, 505, 507, 506, 508, 508, 509, 507, 501, 510, 511, 511, 502, 501,\n    502, 511, 512, 512, 504, 502, 504, 512, 513, 513, 506, 504, 506, 513, 514,\n    514, 508, 506, 510, 515, 516, 516, 511, 510, 511, 516, 517, 517, 512, 511,\n    512, 517, 518, 518, 513, 512, 513, 518, 519, 519, 514, 513, 515, 520, 521,\n    521, 516, 515, 516, 521, 522, 522, 517, 516, 517, 522, 523, 523, 518, 517,\n    518, 523, 524, 524, 519, 518, 525, 526, 527, 527, 528, 525, 528, 527, 529,\n    529, 530, 528, 530, 529, 531, 531, 532, 530, 532, 531, 533, 533, 534, 532,\n    526, 535, 536, 536, 527, 526, 527, 536, 537, 537, 529, 527, 529, 537, 538,\n    538, 531, 529, 531, 538, 539, 539, 533, 531, 535, 540, 541, 541, 536, 535,\n    536, 541, 542, 542, 537, 536, 537, 542, 543, 543, 538, 537, 538, 543, 544,\n    544, 539, 538, 540, 545, 546, 546, 541, 540, 541, 546, 547, 547, 542, 541,\n    542, 547, 548, 548, 543, 542, 543, 548, 549, 549, 544, 543, 550, 551, 552,\n    552, 553, 550, 553, 552, 554, 554, 555, 553, 555, 554, 556, 556, 557, 555,\n    557, 556, 558, 558, 559, 557, 551, 560, 561, 561, 552, 551, 552, 561, 562,\n    562, 554, 552, 554, 562, 563, 563, 556, 554, 556, 563, 564, 564, 558, 556,\n    560, 565, 566, 566, 561, 560, 561, 566, 567, 567, 562, 561, 562, 567, 568,\n    568, 563, 562, 563, 568, 569, 569, 564, 563, 565, 570, 571, 571, 566, 565,\n    566, 571, 572, 572, 567, 566, 567, 572, 573, 573, 568, 567, 568, 573, 574,\n    574, 569, 568, 575, 576, 577, 577, 578, 575, 578, 577, 579, 579, 580, 578,\n    580, 579, 581, 581, 582, 580, 582, 581, 583, 583, 584, 582, 576, 585, 586,\n    586, 577, 576, 577, 586, 587, 587, 579, 577, 579, 587, 588, 588, 581, 579,\n    581, 588, 589, 589, 583, 581, 585, 590, 591, 591, 586, 585, 586, 591, 592,\n    592, 587, 586, 587, 592, 593, 593, 588, 587, 588, 593, 594, 594, 589, 588,\n    590, 595, 596, 596, 591, 590, 591, 596, 597, 597, 592, 591, 592, 597, 598,\n    598, 593, 592, 593, 598, 599, 599, 594, 593, 600, 601, 602, 602, 603, 600,\n    603, 602, 604, 604, 605, 603, 605, 604, 606, 606, 607, 605, 607, 606, 608,\n    608, 609, 607, 601, 610, 611, 611, 602, 601, 602, 611, 612, 612, 604, 602,\n    604, 612, 613, 613, 606, 604, 606, 613, 614, 614, 608, 606, 610, 615, 616,\n    616, 611, 610, 611, 616, 617, 617, 612, 611, 612, 617, 618, 618, 613, 612,\n    613, 618, 619, 619, 614, 613, 615, 620, 621, 621, 616, 615, 616, 621, 622,\n    622, 617, 616, 617, 622, 623, 623, 618, 617, 618, 623, 624, 624, 619, 618,\n    625, 626, 627, 627, 628, 625, 628, 627, 629, 629, 630, 628, 630, 629, 631,\n    631, 632, 630, 632, 631, 633, 633, 634, 632, 626, 635, 636, 636, 627, 626,\n    627, 636, 637, 637, 629, 627, 629, 637, 638, 638, 631, 629, 631, 638, 639,\n    639, 633, 631, 635, 640, 641, 641, 636, 635, 636, 641, 642, 642, 637, 636,\n    637, 642, 643, 643, 638, 637, 638, 643, 644, 644, 639, 638, 640, 645, 646,\n    646, 641, 640, 641, 646, 647, 647, 642, 641, 642, 647, 648, 648, 643, 642,\n    643, 648, 649, 649, 644, 643, 650, 651, 652, 652, 653, 650, 653, 652, 654,\n    654, 655, 653, 655, 654, 656, 656, 657, 655, 657, 656, 658, 658, 659, 657,\n    651, 660, 661, 661, 652, 651, 652, 661, 662, 662, 654, 652, 654, 662, 663,\n    663, 656, 654, 656, 663, 664, 664, 658, 656, 660, 665, 666, 666, 661, 660,\n    661, 666, 667, 667, 662, 661, 662, 667, 668, 668, 663, 662, 663, 668, 669,\n    669, 664, 663, 665, 670, 671, 671, 666, 665, 666, 671, 672, 672, 667, 666,\n    667, 672, 673, 673, 668, 667, 668, 673, 674, 674, 669, 668, 675, 676, 677,\n    677, 678, 675, 678, 677, 679, 679, 680, 678, 680, 679, 681, 681, 682, 680,\n    682, 681, 683, 683, 684, 682, 676, 685, 686, 686, 677, 676, 677, 686, 687,\n    687, 679, 677, 679, 687, 688, 688, 681, 679, 681, 688, 689, 689, 683, 681,\n    685, 690, 691, 691, 686, 685, 686, 691, 692, 692, 687, 686, 687, 692, 693,\n    693, 688, 687, 688, 693, 694, 694, 689, 688, 690, 695, 696, 696, 691, 690,\n    691, 696, 697, 697, 692, 691, 692, 697, 698, 698, 693, 692, 693, 698, 699,\n    699, 694, 693, 700, 701, 702, 702, 703, 700, 703, 702, 704, 704, 705, 703,\n    705, 704, 706, 706, 707, 705, 707, 706, 708, 708, 709, 707, 701, 710, 711,\n    711, 702, 701, 702, 711, 712, 712, 704, 702, 704, 712, 713, 713, 706, 704,\n    706, 713, 714, 714, 708, 706, 710, 715, 716, 716, 711, 710, 711, 716, 717,\n    717, 712, 711, 712, 717, 718, 718, 713, 712, 713, 718, 719, 719, 714, 713,\n    715, 720, 721, 721, 716, 715, 716, 721, 722, 722, 717, 716, 717, 722, 723,\n    723, 718, 717, 718, 723, 724, 724, 719, 718, 725, 726, 727, 727, 728, 725,\n    728, 727, 729, 729, 730, 728, 730, 729, 731, 731, 732, 730, 732, 731, 733,\n    733, 734, 732, 726, 735, 736, 736, 727, 726, 727, 736, 737, 737, 729, 727,\n    729, 737, 738, 738, 731, 729, 731, 738, 739, 739, 733, 731, 735, 740, 741,\n    741, 736, 735, 736, 741, 742, 742, 737, 736, 737, 742, 743, 743, 738, 737,\n    738, 743, 744, 744, 739, 738, 740, 745, 746, 746, 741, 740, 741, 746, 747,\n    747, 742, 741, 742, 747, 748, 748, 743, 742, 743, 748, 749, 749, 744, 743,\n    750, 751, 752, 752, 753, 750, 753, 752, 754, 754, 755, 753, 755, 754, 756,\n    756, 757, 755, 757, 756, 758, 758, 759, 757, 751, 760, 761, 761, 752, 751,\n    752, 761, 762, 762, 754, 752, 754, 762, 763, 763, 756, 754, 756, 763, 764,\n    764, 758, 756, 760, 765, 766, 766, 761, 760, 761, 766, 767, 767, 762, 761,\n    762, 767, 768, 768, 763, 762, 763, 768, 769, 769, 764, 763, 765, 770, 771,\n    771, 766, 765, 766, 771, 772, 772, 767, 766, 767, 772, 773, 773, 768, 767,\n    768, 773, 774, 774, 769, 768, 775, 776, 777, 777, 778, 775, 778, 777, 779,\n    779, 780, 778, 780, 779, 781, 781, 782, 780, 782, 781, 783, 783, 784, 782,\n    776, 785, 786, 786, 777, 776, 777, 786, 787, 787, 779, 777, 779, 787, 788,\n    788, 781, 779, 781, 788, 789, 789, 783, 781, 785, 790, 791, 791, 786, 785,\n    786, 791, 792, 792, 787, 786, 787, 792, 793, 793, 788, 787, 788, 793, 794,\n    794, 789, 788, 790, 795, 796, 796, 791, 790, 791, 796, 797, 797, 792, 791,\n    792, 797, 798, 798, 793, 792, 793, 798, 799, 799, 794, 793};\n"
  },
  {
    "path": "teapots/classic-teapot/src/main/java/com/sample/helper/NDKHelper.java",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.sample.helper;\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.nio.ByteBuffer;\n\nimport javax.microedition.khronos.opengles.GL10;\n\nimport android.R.bool;\nimport android.opengl.GLES30;\n\nimport android.annotation.TargetApi;\nimport android.app.Activity;\nimport android.app.NativeActivity;\nimport android.content.Context;\nimport android.content.pm.ApplicationInfo;\nimport android.content.pm.PackageManager;\nimport android.content.pm.PackageManager.NameNotFoundException;\nimport android.graphics.Bitmap;\nimport android.graphics.Bitmap.CompressFormat;\nimport android.graphics.BitmapFactory;\nimport android.graphics.Matrix;\nimport android.media.AudioManager;\nimport android.media.AudioTrack;\nimport android.opengl.GLUtils;\nimport android.os.Build;\nimport android.util.Log;\nimport android.view.View;\nimport android.view.View.MeasureSpec;\n\n@TargetApi(Build.VERSION_CODES.GINGERBREAD)\npublic class NDKHelper {\n\n    public NDKHelper(NativeActivity act) {\n        activity = act;\n    }\n\n    public void loadLibrary(String soname) {\n        if (soname.isEmpty() == false) {\n            System.loadLibrary(soname);\n            loadedSO = true;\n        }\n    }\n\n    public static Boolean checkSOLoaded() {\n        if (loadedSO == false) {\n            Log.e(\"NDKHelper\",\n                    \"--------------------------------------------\\n\"\n                            + \".so has not been loaded. To use JUI helper, please initialize with \\n\"\n                            + \"NDKHelper::Init( ANativeActivity* activity, const char* helper_class_name, const char* native_soname);\\n\"\n                            + \"--------------------------------------------\\n\");\n            return false;\n        } else\n            return true;\n    }\n\n    private static boolean loadedSO = false;\n    NativeActivity activity;\n\n\n\n    //\n    // Load Bitmap\n    // Java helper is useful decoding PNG, TIFF etc rather than linking libPng\n    // etc separately\n    //\n    private int nextPOT(int i) {\n        int pot = 1;\n        while (pot < i)\n            pot <<= 1;\n        return pot;\n    }\n\n    private Bitmap scaleBitmap(Bitmap bitmapToScale, float newWidth,\n                               float newHeight) {\n        if (bitmapToScale == null)\n            return null;\n        // get the original width and height\n        int width = bitmapToScale.getWidth();\n        int height = bitmapToScale.getHeight();\n        // create a matrix for the manipulation\n        Matrix matrix = new Matrix();\n\n        // resize the bit map\n        matrix.postScale(newWidth / width, newHeight / height);\n\n        // recreate the new Bitmap and set it back\n        return Bitmap.createBitmap(bitmapToScale, 0, 0,\n                bitmapToScale.getWidth(), bitmapToScale.getHeight(), matrix,\n                true);\n    }\n\n    public class TextureInformation {\n        boolean ret;\n        boolean alphaChannel;\n        int originalWidth;\n        int originalHeight;\n        Object image;\n    }\n\n    public Object loadTexture(String path) {\n        Bitmap bitmap = null;\n        TextureInformation info = new TextureInformation();\n        try {\n            String str = path;\n            if (!path.startsWith(\"/\")) {\n                str = \"/\" + path;\n            }\n\n            File file = new File(activity.getExternalFilesDir(null), str);\n            if (file.canRead()) {\n                bitmap = BitmapFactory.decodeStream(new FileInputStream(file));\n            } else {\n                bitmap = BitmapFactory.decodeStream(activity.getResources()\n                        .getAssets().open(path));\n            }\n            // Matrix matrix = new Matrix();\n            // // resize the bit map\n            // matrix.postScale(-1F, 1F);\n            //\n            // // recreate the new Bitmap and set it back\n            // bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),\n            // bitmap.getHeight(), matrix, true);\n\n        } catch (Exception e) {\n            Log.w(\"NDKHelper\", \"Coundn't load a file:\" + path);\n            info.ret = false;\n            return info;\n        }\n\n        if (bitmap != null) {\n            GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);\n        }\n        info.ret = true;\n        info.alphaChannel = bitmap.hasAlpha();\n        info.originalWidth = getBitmapWidth(bitmap);\n        info.originalHeight = getBitmapHeight(bitmap);\n\n        return info;\n    }\n\n    public Object loadCubemapTexture(String path, int face, int miplevel, boolean sRGB) {\n        Bitmap bitmap = null;\n        TextureInformation info = new TextureInformation();\n        try {\n            String str = path;\n            if (!path.startsWith(\"/\")) {\n                str = \"/\" + path;\n            }\n\n            File file = new File(activity.getExternalFilesDir(null), str);\n            if (file.canRead()) {\n                bitmap = BitmapFactory.decodeStream(new FileInputStream(file));\n            } else {\n                bitmap = BitmapFactory.decodeStream(activity.getResources()\n                        .getAssets().open(path));\n            }\n        } catch (Exception e) {\n            Log.w(\"NDKHelper\", \"Coundn't load a file:\" + path);\n            info.ret = false;\n            return info;\n        }\n\n        if (bitmap != null) {\n            if (sRGB)\n            {\n//        \t\tGLUtils.texImage2D(face, miplevel, bitmap, 0);\n//        \t\tGLUtils.texImage2D(face, miplevel,\n//        \t\t\t\tGLUtils.getInternalFormat(bitmap), bitmap, 0);\n//        \t\tint i = GLUtils.getInternalFormat(bitmap);\n//        \t\tif( i == GL10.GL_RGBA)\n//        \t\t{\n//            \t\tGLUtils.texImage2D(face, miplevel,\n//            \t\t\t\tGLES30.GL_SRGB, bitmap, 0);\n//        \t\t}\n                //Leave them for now\n                GLUtils.texImage2D(face, miplevel, bitmap, 0);\n            }\n            else\n                GLUtils.texImage2D(face, miplevel, bitmap, 0);\n        }\n        info.ret = true;\n        info.alphaChannel = bitmap.hasAlpha();\n        info.originalWidth = getBitmapWidth(bitmap);\n        info.originalHeight = getBitmapHeight(bitmap);\n\n        return info;\n\n    }\n\n    public Object loadImage(String path) {\n        Bitmap bitmap = null;\n        TextureInformation info = new TextureInformation();\n        try {\n            String str = path;\n            if (!path.startsWith(\"/\")) {\n                str = \"/\" + path;\n            }\n\n            File file = new File(activity.getExternalFilesDir(null), str);\n            if (file.canRead()) {\n                bitmap = BitmapFactory.decodeStream(new FileInputStream(file));\n            } else {\n                bitmap = BitmapFactory.decodeStream(activity.getResources()\n                        .getAssets().open(path));\n            }\n        } catch (Exception e) {\n            Log.w(\"NDKHelper\", \"Coundn't load a file:\" + path);\n            info.ret = false;\n            return info;\n        }\n\n        if (bitmap != null) {\n            GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);\n        }\n        info.ret = true;\n        info.alphaChannel = bitmap.hasAlpha();\n        info.originalWidth = getBitmapWidth(bitmap);\n        info.originalHeight = getBitmapHeight(bitmap);\n\n        int iBytes = bitmap.getWidth() * bitmap.getHeight() * 4;\n        ByteBuffer buffer = ByteBuffer.allocateDirect(iBytes);\n\n        bitmap.copyPixelsToBuffer(buffer);\n        info.image = buffer;\n        return info;\n    }\n\n    public Bitmap openBitmap(String path, boolean iScalePOT) {\n        Bitmap bitmap = null;\n        try {\n            bitmap = BitmapFactory.decodeStream(activity.getResources()\n                    .getAssets().open(path));\n            if (iScalePOT) {\n                int originalWidth = getBitmapWidth(bitmap);\n                int originalHeight = getBitmapHeight(bitmap);\n                int width = nextPOT(originalWidth);\n                int height = nextPOT(originalHeight);\n                if (originalWidth != width || originalHeight != height) {\n                    // Scale it\n                    bitmap = scaleBitmap(bitmap, width, height);\n                }\n            }\n\n        } catch (Exception e) {\n            Log.w(\"NDKHelper\", \"Coundn't load a file:\" + path);\n        }\n\n        return bitmap;\n    }\n\n    public int getBitmapWidth(Bitmap bmp) {\n        return bmp.getWidth();\n    }\n\n    public int getBitmapHeight(Bitmap bmp) {\n        return bmp.getHeight();\n    }\n\n    public void getBitmapPixels(Bitmap bmp, int[] pixels) {\n        int w = bmp.getWidth();\n        int h = bmp.getHeight();\n        bmp.getPixels(pixels, 0, w, 0, 0, w, h);\n    }\n\n    public void closeBitmap(Bitmap bmp) {\n        bmp.recycle();\n    }\n\n    public String getNativeLibraryDirectory(Context appContext) {\n        ApplicationInfo ai = activity.getApplicationInfo();\n\n        Log.w(\"NDKHelper\", \"ai.nativeLibraryDir:\" + ai.nativeLibraryDir);\n\n        if ((ai.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0\n                || (ai.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {\n            return ai.nativeLibraryDir;\n        }\n        return \"/system/lib/\";\n    }\n\n    public String getApplicationName() {\n        final PackageManager pm = activity.getPackageManager();\n        ApplicationInfo ai;\n        try {\n            ai = pm.getApplicationInfo(activity.getPackageName(), 0);\n        } catch (final NameNotFoundException e) {\n            ai = null;\n        }\n        String applicationName = (String) (ai != null ? pm\n                .getApplicationLabel(ai) : \"(unknown)\");\n        return applicationName;\n    }\n\n    public String getStringResource(String resourceName)\n    {\n        int id = activity.getResources().getIdentifier(resourceName, \"string\", activity.getPackageName());\n        String value = id == 0 ? \"\" : (String)activity.getResources().getText(id);\n        return value;\n    }\n\n    //\n    // Audio related helpers\n    //\n    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)\n    public int getNativeAudioBufferSize() {\n        int SDK_INT = android.os.Build.VERSION.SDK_INT;\n        if (SDK_INT >= 17) {\n            AudioManager am = (AudioManager) activity\n                    .getSystemService(Context.AUDIO_SERVICE);\n            String framesPerBuffer = am\n                    .getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);\n            return Integer.parseInt(framesPerBuffer);\n        } else {\n            return 0;\n        }\n    }\n\n    public int getNativeAudioSampleRate() {\n        return AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_SYSTEM);\n    }\n\n    /*\n     * Helper to execute function in UIThread\n     */\n    public void runOnUIThread(final long p) {\n        if (checkSOLoaded()) {\n            activity.runOnUiThread(new Runnable() {\n                @Override\n                public void run() {\n                    RunOnUiThreadHandler(p);\n                }\n            });\n        }\n        return;\n    }\n\n    /*\n     * Native code helper for RunOnUiThread\n     */\n    native public void RunOnUiThreadHandler(long pointer);\n}\n"
  },
  {
    "path": "teapots/classic-teapot/src/main/java/com/sample/teapot/TeapotApplication.java",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.sample.teapot;\n\nimport javax.microedition.khronos.opengles.GL10;\n\nimport android.app.Application;\nimport android.content.Context;\nimport android.content.pm.ApplicationInfo;\nimport android.content.pm.PackageManager;\nimport android.content.pm.PackageManager.NameNotFoundException;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport android.graphics.Matrix;\nimport android.opengl.GLUtils;\nimport android.util.Log;\nimport android.widget.Toast;\n\npublic class TeapotApplication extends Application {\n    public void onCreate(){\n        super.onCreate();\t\n        Log.w(\"native-activity\", \"onCreate\");\n\n        final PackageManager pm = getApplicationContext().getPackageManager();\n        ApplicationInfo ai;\n        try {\n            ai = pm.getApplicationInfo( this.getPackageName(), 0);\n        } catch (final NameNotFoundException e) {\n            ai = null;\n        }\n        final String applicationName = (String) (ai != null ? pm.getApplicationLabel(ai) : \"(unknown)\");\n        Toast.makeText(this, applicationName, Toast.LENGTH_SHORT).show();\n    }\n}\n"
  },
  {
    "path": "teapots/classic-teapot/src/main/java/com/sample/teapot/TeapotNativeActivity.java",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.sample.teapot;\n\nimport android.annotation.SuppressLint;\nimport android.annotation.TargetApi;\nimport android.app.NativeActivity;\nimport android.os.Bundle;\nimport android.view.Gravity;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup.MarginLayoutParams;\nimport android.view.WindowManager.LayoutParams;\nimport android.widget.LinearLayout;\nimport android.widget.PopupWindow;\nimport android.widget.TextView;\n\npublic class TeapotNativeActivity extends NativeActivity {\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        //Hide toolbar\n        int SDK_INT = android.os.Build.VERSION.SDK_INT;\n        if(SDK_INT >= 19)\n        {\n            setImmersiveSticky();\n\n            View decorView = getWindow().getDecorView();\n            decorView.setOnSystemUiVisibilityChangeListener\n                    (new View.OnSystemUiVisibilityChangeListener() {\n                @Override\n                public void onSystemUiVisibilityChange(int visibility) {\n                    setImmersiveSticky();\n                }\n            });\n        }\n\n    }\n\n    @TargetApi(19)    \n    protected void onResume() {\n        super.onResume();\n\n        //Hide toolbar\n        int SDK_INT = android.os.Build.VERSION.SDK_INT;\n        if(SDK_INT >= 11 && SDK_INT < 14)\n        {\n            getWindow().getDecorView().setSystemUiVisibility(View.STATUS_BAR_HIDDEN);\n        }\n        else if(SDK_INT >= 14 && SDK_INT < 19)\n        {\n            getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LOW_PROFILE);\n        }\n        else if(SDK_INT >= 19)\n        {\n            setImmersiveSticky();\n        }\n\n    }\n    // Our popup window, you will call it from your C/C++ code later\n\n    @TargetApi(19)    \n    void setImmersiveSticky() {\n        View decorView = getWindow().getDecorView();\n        decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN\n                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION\n                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY\n                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN\n                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION\n                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);\n    }\n\n    TeapotNativeActivity _activity;\n    PopupWindow _popupWindow;\n    TextView _label;\n\n    @SuppressLint(\"InflateParams\")\n    public void showUI()\n    {\n        if( _popupWindow != null )\n            return;\n\n        _activity = this;\n\n        this.runOnUiThread(new Runnable()  {\n            @Override\n            public void run()  {\n                LayoutInflater layoutInflater\n                = (LayoutInflater)getBaseContext()\n                .getSystemService(LAYOUT_INFLATER_SERVICE);\n                View popupView = layoutInflater.inflate(R.layout.widgets, null);\n                _popupWindow = new PopupWindow(\n                        popupView,\n                        LayoutParams.WRAP_CONTENT,\n                        LayoutParams.WRAP_CONTENT);\n\n                LinearLayout mainLayout = new LinearLayout(_activity);\n                MarginLayoutParams params = new MarginLayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);\n                params.setMargins(0, 0, 0, 0);\n                _activity.setContentView(mainLayout, params);\n\n                // Show our UI over NativeActivity window\n                _popupWindow.showAtLocation(mainLayout, Gravity.TOP | Gravity.START, 10, 10);\n                _popupWindow.update();\n\n                _label = (TextView)popupView.findViewById(R.id.textViewFPS);\n\n            }});\n    }\n\n    protected void onPause()\n    {\n        super.onPause();\n    }\n\n    public void updateFPS(final float fFPS)\n    {\n        if( _label == null )\n            return;\n\n        _activity = this;\n        this.runOnUiThread(new Runnable()  {\n            @Override\n            public void run()  {\n                _label.setText(String.format(\"%2.2f FPS\", fFPS));\n\n            }});\n    }\n}\n\n\n"
  },
  {
    "path": "teapots/classic-teapot/src/main/res/layout/widgets.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:gravity=\"top\"\n    android:orientation=\"vertical\" >\n\n    <TextView\n        android:id=\"@+id/textViewFPS\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"end\"\n        android:text=\"@string/fps\"\n        android:textAppearance=\"?android:attr/textAppearanceMedium\"\n        android:textColor=\"@android:color/white\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "teapots/classic-teapot/src/main/res/values/strings.xml",
    "content": "<resources>\n\n    <string name=\"app_name\">Teapot</string>\n    <string name=\"fps\">0.0 FPS</string>\n\n</resources>\n"
  },
  {
    "path": "teapots/classic-teapot/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!--\n        Base application theme, dependent on API level. This theme is replaced\n        by AppBaseTheme from res/values-vXX/styles.xml on newer devices.\n    -->\n    <style name=\"AppBaseTheme\" parent=\"android:Theme.Light\">\n        <!--\n            Theme customizations available in newer API levels can go in\n            res/values-vXX/styles.xml, while customizations related to\n            backward-compatibility can go here.\n        -->\n    </style>\n\n    <!-- Application theme. -->\n    <style name=\"AppTheme\" parent=\"AppBaseTheme\">\n        <!-- All customizations that are NOT specific to a particular API-level can go here. -->\n    </style>\n\n</resources>"
  },
  {
    "path": "teapots/classic-teapot/src/main/res/values-v11/styles.xml",
    "content": "<resources>\n\n    <!--\n        Base application theme for API 11+. This theme completely replaces\n        AppBaseTheme from res/values/styles.xml on API 11+ devices.\n    -->\n    <style name=\"AppBaseTheme\" parent=\"android:Theme.Holo.Light\">\n        <!-- API 11 theme customizations can go here. -->\n    </style>\n\n</resources>"
  },
  {
    "path": "teapots/classic-teapot/src/main/res/values-v14/styles.xml",
    "content": "<resources>\n\n    <!--\n        Base application theme for API 14+. This theme completely replaces\n        AppBaseTheme from BOTH res/values/styles.xml and\n        res/values-v11/styles.xml on API 14+ devices.\n    -->\n    <style name=\"AppBaseTheme\" parent=\"android:Theme.Holo.Light.DarkActionBar\">\n        <!-- API 14 theme customizations can go here. -->\n    </style>\n\n</resources>"
  },
  {
    "path": "teapots/common/ndk_helper/CMakeLists.txt",
    "content": "# build native_app_glue as a static lib\ncmake_minimum_required(VERSION 3.22.1)\n\ninclude(AndroidNdkModules)\ninclude(AppLibrary)\nandroid_ndk_import_module_native_app_glue()\n\nadd_app_library(NdkHelper\n    STATIC\n    gestureDetector.cpp\n    gl3stub.cpp\n    GLContext.cpp\n    interpolator.cpp\n    JNIHelper.cpp\n    perfMonitor.cpp\n    sensorManager.cpp\n    shader.cpp\n    tapCamera.cpp\n    vecmath.cpp\n)\n# TODO: Remove this\n# This does not do what it looks like it does. It looks like it's redundant with\n# the target_include_directories(... PUBLIC ...) below. What it's actually doing\n# is re-exporting the headers for every library linked below. This is how all\n# the teapots samples are getting their native_app_glue. They should depend on\n# it explicitly.\nset_target_properties(NdkHelper\n    PROPERTIES\n    INTERFACE_INCLUDE_DIRECTORIES $<TARGET_PROPERTY:NdkHelper,INCLUDE_DIRECTORIES>\n)\ntarget_include_directories(NdkHelper\n    PUBLIC\n    ${CMAKE_CURRENT_SOURCE_DIR}\n)\n\n# TODO: Audit, make private.\n# Some of these are here because it was a common location to link the\n# dependenices of the various teapot samples. Those samples should link their\n# dependencies explicitly.\ntarget_link_libraries(NdkHelper\n    PUBLIC\n    native_app_glue\n    GLESv2\n    EGL\n    log\n    android\n    atomic\n)\n"
  },
  {
    "path": "teapots/common/ndk_helper/GLContext.cpp",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//--------------------------------------------------------------------------------\n// GLContext.cpp\n//--------------------------------------------------------------------------------\n//--------------------------------------------------------------------------------\n// includes\n//--------------------------------------------------------------------------------\n#include \"GLContext.h\"\n\n#include <string.h>\n#include <unistd.h>\n\n#include \"gl3stub.h\"\n\nnamespace ndk_helper {\n\n//--------------------------------------------------------------------------------\n// eGLContext\n//--------------------------------------------------------------------------------\n\n//--------------------------------------------------------------------------------\n// Ctor\n//--------------------------------------------------------------------------------\nGLContext::GLContext()\n    : window_(nullptr),\n      display_(EGL_NO_DISPLAY),\n      surface_(EGL_NO_SURFACE),\n      context_(EGL_NO_CONTEXT),\n      screen_width_(0),\n      screen_height_(0),\n      gles_initialized_(false),\n      egl_context_initialized_(false),\n      es3_supported_(false) {}\n\nvoid GLContext::InitGLES() {\n  if (gles_initialized_) return;\n  //\n  // Initialize OpenGL ES 3 if available\n  //\n  const char* versionStr = (const char*)glGetString(GL_VERSION);\n  if (strstr(versionStr, \"OpenGL ES 3.\") && gl3stubInit()) {\n    es3_supported_ = true;\n    gl_version_ = 3.0f;\n  } else {\n    gl_version_ = 2.0f;\n  }\n\n  gles_initialized_ = true;\n}\n\n//--------------------------------------------------------------------------------\n// Dtor\n//--------------------------------------------------------------------------------\nGLContext::~GLContext() { Terminate(); }\n\nbool GLContext::Init(ANativeWindow* window) {\n  if (egl_context_initialized_) return true;\n\n  //\n  // Initialize EGL\n  //\n  window_ = window;\n  InitEGLSurface();\n  InitEGLContext();\n  InitGLES();\n\n  egl_context_initialized_ = true;\n\n  return true;\n}\n\nbool GLContext::InitEGLSurface() {\n  display_ = eglGetDisplay(EGL_DEFAULT_DISPLAY);\n  eglInitialize(display_, 0, 0);\n\n  /*\n   * Here specify the attributes of the desired configuration.\n   * Below, we select an EGLConfig with at least 8 bits per color\n   * component compatible with on-screen windows\n   */\n  const EGLint attribs[] = {EGL_RENDERABLE_TYPE,\n                            EGL_OPENGL_ES2_BIT,  // Request opengl ES2.0\n                            EGL_SURFACE_TYPE,\n                            EGL_WINDOW_BIT,\n                            EGL_BLUE_SIZE,\n                            8,\n                            EGL_GREEN_SIZE,\n                            8,\n                            EGL_RED_SIZE,\n                            8,\n                            EGL_DEPTH_SIZE,\n                            24,\n                            EGL_NONE};\n  color_size_ = 8;\n  depth_size_ = 24;\n\n  EGLint num_configs;\n  eglChooseConfig(display_, attribs, &config_, 1, &num_configs);\n\n  if (!num_configs) {\n    // Fall back to 16bit depth buffer\n    const EGLint attribs[] = {EGL_RENDERABLE_TYPE,\n                              EGL_OPENGL_ES2_BIT,  // Request opengl ES2.0\n                              EGL_SURFACE_TYPE,\n                              EGL_WINDOW_BIT,\n                              EGL_BLUE_SIZE,\n                              8,\n                              EGL_GREEN_SIZE,\n                              8,\n                              EGL_RED_SIZE,\n                              8,\n                              EGL_DEPTH_SIZE,\n                              16,\n                              EGL_NONE};\n    eglChooseConfig(display_, attribs, &config_, 1, &num_configs);\n    depth_size_ = 16;\n  }\n\n  if (!num_configs) {\n    LOGW(\"Unable to retrieve EGL config\");\n    return false;\n  }\n\n  surface_ = eglCreateWindowSurface(display_, config_, window_, NULL);\n  eglQuerySurface(display_, surface_, EGL_WIDTH, &screen_width_);\n  eglQuerySurface(display_, surface_, EGL_HEIGHT, &screen_height_);\n\n  return true;\n}\n\nbool GLContext::InitEGLContext() {\n  const EGLint context_attribs[] = {EGL_CONTEXT_CLIENT_VERSION,\n                                    2,  // Request opengl ES2.0\n                                    EGL_NONE};\n  context_ = eglCreateContext(display_, config_, NULL, context_attribs);\n\n  if (eglMakeCurrent(display_, surface_, surface_, context_) == EGL_FALSE) {\n    LOGW(\"Unable to eglMakeCurrent\");\n    return false;\n  }\n\n  context_valid_ = true;\n  return true;\n}\n\nEGLint GLContext::Swap() {\n  bool b = eglSwapBuffers(display_, surface_);\n  if (!b) {\n    EGLint err = eglGetError();\n    if (err == EGL_BAD_SURFACE) {\n      // Recreate surface\n      InitEGLSurface();\n      return EGL_SUCCESS;  // Still consider glContext is valid\n    } else if (err == EGL_CONTEXT_LOST || err == EGL_BAD_CONTEXT) {\n      // Context has been lost!!\n      context_valid_ = false;\n      Terminate();\n      InitEGLContext();\n    }\n    return err;\n  }\n  return EGL_SUCCESS;\n}\n\nvoid GLContext::Terminate() {\n  if (display_ != EGL_NO_DISPLAY) {\n    eglMakeCurrent(display_, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);\n    if (context_ != EGL_NO_CONTEXT) {\n      eglDestroyContext(display_, context_);\n    }\n\n    if (surface_ != EGL_NO_SURFACE) {\n      eglDestroySurface(display_, surface_);\n    }\n    eglTerminate(display_);\n  }\n\n  display_ = EGL_NO_DISPLAY;\n  context_ = EGL_NO_CONTEXT;\n  surface_ = EGL_NO_SURFACE;\n  window_ = nullptr;\n  context_valid_ = false;\n}\n\nEGLint GLContext::Resume(ANativeWindow* window) {\n  if (egl_context_initialized_ == false) {\n    Init(window);\n    return EGL_SUCCESS;\n  }\n\n  int32_t original_widhth = screen_width_;\n  int32_t original_height = screen_height_;\n\n  // Create surface\n  window_ = window;\n  surface_ = eglCreateWindowSurface(display_, config_, window_, NULL);\n  eglQuerySurface(display_, surface_, EGL_WIDTH, &screen_width_);\n  eglQuerySurface(display_, surface_, EGL_HEIGHT, &screen_height_);\n\n  if (screen_width_ != original_widhth || screen_height_ != original_height) {\n    // Screen resized\n    LOGI(\"Screen resized\");\n  }\n\n  if (eglMakeCurrent(display_, surface_, surface_, context_) == EGL_TRUE)\n    return EGL_SUCCESS;\n\n  EGLint err = eglGetError();\n  LOGW(\"Unable to eglMakeCurrent %d\", err);\n\n  if (err == EGL_CONTEXT_LOST) {\n    // Recreate context\n    LOGI(\"Re-creating egl context\");\n    InitEGLContext();\n  } else {\n    // Recreate surface\n    Terminate();\n    InitEGLSurface();\n    InitEGLContext();\n  }\n\n  return err;\n}\n\nvoid GLContext::Suspend() {\n  if (surface_ != EGL_NO_SURFACE) {\n    eglDestroySurface(display_, surface_);\n    surface_ = EGL_NO_SURFACE;\n  }\n}\n\nbool GLContext::Invalidate() {\n  Terminate();\n\n  egl_context_initialized_ = false;\n  return true;\n}\n\nbool GLContext::CheckExtension(const char* extension) {\n  if (extension == NULL) return false;\n\n  std::string extensions = std::string((char*)glGetString(GL_EXTENSIONS));\n  std::string str = std::string(extension);\n  str.append(\" \");\n\n  size_t pos = 0;\n  if (extensions.find(extension, pos) != std::string::npos) {\n    return true;\n  }\n\n  return false;\n}\n\n}  // namespace ndk_helper\n"
  },
  {
    "path": "teapots/common/ndk_helper/GLContext.h",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//--------------------------------------------------------------------------------\n// GLContext.h\n//--------------------------------------------------------------------------------\n#ifndef GLCONTEXT_H_\n#define GLCONTEXT_H_\n\n#include <EGL/egl.h>\n#include <GLES2/gl2.h>\n#include <android/log.h>\n\n#include \"JNIHelper.h\"\n\nnamespace ndk_helper {\n\n//--------------------------------------------------------------------------------\n// Constants\n//--------------------------------------------------------------------------------\n\n//--------------------------------------------------------------------------------\n// Class\n//--------------------------------------------------------------------------------\n\n/******************************************************************\n * OpenGL context handler\n * The class handles OpenGL and EGL context based on Android activity life cycle\n * The caller needs to call corresponding methods for each activity life cycle\n *events as it's done in sample codes.\n *\n * Also the class initializes OpenGL ES3 when the compatible driver is installed\n *in the device.\n * getGLVersion() returns 3.0~ when the device supports OpenGLES3.0\n *\n * Thread safety: OpenGL context is expecting used within dedicated single\n *thread,\n * thus GLContext class is not designed as a thread-safe\n */\nclass GLContext {\n private:\n  // EGL configurations\n  ANativeWindow* window_;\n  EGLDisplay display_;\n  EGLSurface surface_;\n  EGLContext context_;\n  EGLConfig config_;\n\n  // Screen parameters\n  int32_t screen_width_;\n  int32_t screen_height_;\n  int32_t color_size_;\n  int32_t depth_size_;\n\n  // Flags\n  bool gles_initialized_;\n  bool egl_context_initialized_;\n  bool es3_supported_;\n  float gl_version_;\n  bool context_valid_;\n\n  void InitGLES();\n  void Terminate();\n  bool InitEGLSurface();\n  bool InitEGLContext();\n\n  GLContext(GLContext const&);\n  void operator=(GLContext const&);\n  GLContext();\n  virtual ~GLContext();\n\n public:\n  static GLContext* GetInstance() {\n    // Singleton\n    static GLContext instance;\n\n    return &instance;\n  }\n\n  bool Init(ANativeWindow* window);\n  EGLint Swap();\n  bool Invalidate();\n\n  void Suspend();\n  EGLint Resume(ANativeWindow* window);\n\n  ANativeWindow* GetANativeWindow(void) const { return window_; };\n  int32_t GetScreenWidth() const { return screen_width_; }\n  int32_t GetScreenHeight() const { return screen_height_; }\n\n  int32_t GetBufferColorSize() const { return color_size_; }\n  int32_t GetBufferDepthSize() const { return depth_size_; }\n  float GetGLVersion() const { return gl_version_; }\n  bool CheckExtension(const char* extension);\n\n  EGLDisplay GetDisplay() const { return display_; }\n  EGLSurface GetSurface() const { return surface_; }\n};\n\n}  // namespace ndk_helper\n\n#endif /* GLCONTEXT_H_ */\n"
  },
  {
    "path": "teapots/common/ndk_helper/JNIHelper.cpp",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"JNIHelper.h\"\n\n#include <EGL/egl.h>\n#include <GLES2/gl2.h>\n#include <string.h>\n\n#include <fstream>\n#include <iostream>\n\nnamespace ndk_helper {\n\n#define NATIVEACTIVITY_CLASS_NAME \"android/app/NativeActivity\"\n\n//---------------------------------------------------------------------------\n// JNI Helper functions\n//---------------------------------------------------------------------------\n\n//---------------------------------------------------------------------------\n// Singleton\n//---------------------------------------------------------------------------\nJNIHelper* JNIHelper::GetInstance() {\n  static JNIHelper helper;\n  return &helper;\n}\n\n//---------------------------------------------------------------------------\n// Ctor\n//---------------------------------------------------------------------------\nJNIHelper::JNIHelper() : activity_(NULL) {}\n\n//---------------------------------------------------------------------------\n// Dtor\n//---------------------------------------------------------------------------\nJNIHelper::~JNIHelper() {\n  // Lock mutex\n  std::lock_guard<std::mutex> lock(mutex_);\n\n  JNIEnv* env = AttachCurrentThread();\n  env->DeleteGlobalRef(jni_helper_java_ref_);\n  env->DeleteGlobalRef(jni_helper_java_class_);\n\n  DetachCurrentThread();\n}\n\n//---------------------------------------------------------------------------\n// Init\n//---------------------------------------------------------------------------\nvoid JNIHelper::Init(ANativeActivity* activity, const char* helper_class_name) {\n  JNIHelper& helper = *GetInstance();\n\n  helper.activity_ = activity;\n\n  // Lock mutex\n  std::lock_guard<std::mutex> lock(helper.mutex_);\n\n  JNIEnv* env = helper.AttachCurrentThread();\n\n  // Retrieve app bundle id\n  jclass android_content_Context = env->GetObjectClass(helper.activity_->clazz);\n  jmethodID midGetPackageName = env->GetMethodID(\n      android_content_Context, \"getPackageName\", \"()Ljava/lang/String;\");\n\n  jstring packageName = (jstring)env->CallObjectMethod(helper.activity_->clazz,\n                                                       midGetPackageName);\n  const char* appname = env->GetStringUTFChars(packageName, NULL);\n  helper.app_name_ = std::string(appname);\n\n  jclass cls = helper.RetrieveClass(env, helper_class_name);\n  helper.jni_helper_java_class_ = (jclass)env->NewGlobalRef(cls);\n\n  jmethodID constructor =\n      env->GetMethodID(helper.jni_helper_java_class_, \"<init>\",\n                       \"(Landroid/app/NativeActivity;)V\");\n\n  helper.jni_helper_java_ref_ = env->NewObject(helper.jni_helper_java_class_,\n                                               constructor, activity->clazz);\n  helper.jni_helper_java_ref_ = env->NewGlobalRef(helper.jni_helper_java_ref_);\n\n  // Get app label\n  jstring labelName = (jstring)helper.CallObjectMethod(\"getApplicationName\",\n                                                       \"()Ljava/lang/String;\");\n  const char* label = env->GetStringUTFChars(labelName, NULL);\n  helper.app_label_ = std::string(label);\n\n  env->ReleaseStringUTFChars(packageName, appname);\n  env->ReleaseStringUTFChars(labelName, label);\n  env->DeleteLocalRef(packageName);\n  env->DeleteLocalRef(labelName);\n  env->DeleteLocalRef(cls);\n}\n\nvoid JNIHelper::Init(ANativeActivity* activity, const char* helper_class_name,\n                     const char* native_soname) {\n  Init(activity, helper_class_name);\n  if (native_soname) {\n    JNIHelper& helper = *GetInstance();\n    // Lock mutex\n    std::lock_guard<std::mutex> lock(helper.mutex_);\n\n    JNIEnv* env = helper.AttachCurrentThread();\n\n    // Setup soname\n    jstring soname = env->NewStringUTF(native_soname);\n\n    jmethodID mid = env->GetMethodID(helper.jni_helper_java_class_,\n                                     \"loadLibrary\", \"(Ljava/lang/String;)V\");\n    env->CallVoidMethod(helper.jni_helper_java_ref_, mid, soname);\n\n    env->DeleteLocalRef(soname);\n  }\n}\n\n//---------------------------------------------------------------------------\n// readFile\n//---------------------------------------------------------------------------\nbool JNIHelper::ReadFile(const char* fileName,\n                         std::vector<uint8_t>* buffer_ref) {\n  if (activity_ == NULL) {\n    LOGI(\n        \"JNIHelper has not been initialized.Call init() to initialize the \"\n        \"helper\");\n    return false;\n  }\n\n  // Lock mutex\n  std::lock_guard<std::mutex> lock(mutex_);\n\n  // First, try reading from externalFileDir;\n  JNIEnv* env = AttachCurrentThread();\n  jstring str_path = GetExternalFilesDirJString(env);\n\n  std::string s;\n  if (str_path) {\n    const char* path = env->GetStringUTFChars(str_path, NULL);\n    s = std::string(path);\n    if (fileName[0] != '/') {\n      s.append(\"/\");\n    }\n    s.append(fileName);\n    env->ReleaseStringUTFChars(str_path, path);\n    env->DeleteLocalRef(str_path);\n  }\n  std::ifstream f(s.c_str(), std::ios::binary);\n  activity_->vm->DetachCurrentThread();\n  if (f) {\n    LOGI(\"reading:%s\", s.c_str());\n    f.seekg(0, std::ifstream::end);\n    int32_t fileSize = f.tellg();\n    f.seekg(0, std::ifstream::beg);\n    buffer_ref->reserve(fileSize);\n    buffer_ref->assign(std::istreambuf_iterator<char>(f),\n                       std::istreambuf_iterator<char>());\n    f.close();\n    return true;\n  } else {\n    // Fallback to assetManager\n    AAssetManager* assetManager = activity_->assetManager;\n    AAsset* assetFile =\n        AAssetManager_open(assetManager, fileName, AASSET_MODE_BUFFER);\n    if (!assetFile) {\n      return false;\n    }\n    uint8_t* data = (uint8_t*)AAsset_getBuffer(assetFile);\n    int32_t size = AAsset_getLength(assetFile);\n    if (data == NULL) {\n      AAsset_close(assetFile);\n\n      LOGI(\"Failed to load:%s\", fileName);\n      return false;\n    }\n\n    buffer_ref->reserve(size);\n    buffer_ref->assign(data, data + size);\n\n    AAsset_close(assetFile);\n    return true;\n  }\n}\n\nstd::string JNIHelper::GetExternalFilesDir() {\n  if (activity_ == NULL) {\n    LOGI(\n        \"JNIHelper has not been initialized. Call init() to initialize the \"\n        \"helper\");\n    return std::string(\"\");\n  }\n\n  // Lock mutex\n  std::lock_guard<std::mutex> lock(mutex_);\n\n  // First, try reading from externalFileDir;\n  JNIEnv* env = AttachCurrentThread();\n\n  jstring strPath = GetExternalFilesDirJString(env);\n  const char* path = env->GetStringUTFChars(strPath, NULL);\n  std::string s(path);\n\n  env->ReleaseStringUTFChars(strPath, path);\n  env->DeleteLocalRef(strPath);\n  return s;\n}\n\nuint32_t JNIHelper::LoadTexture(const char* file_name, int32_t* outWidth,\n                                int32_t* outHeight, bool* hasAlpha) {\n  if (activity_ == NULL) {\n    LOGI(\n        \"JNIHelper has not been initialized. Call init() to initialize the \"\n        \"helper\");\n    return 0;\n  }\n\n  // Lock mutex\n  std::lock_guard<std::mutex> lock(mutex_);\n\n  JNIEnv* env = AttachCurrentThread();\n  jstring name = env->NewStringUTF(file_name);\n\n  GLuint tex;\n  glGenTextures(1, &tex);\n  glBindTexture(GL_TEXTURE_2D, tex);\n\n  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,\n                  GL_LINEAR_MIPMAP_NEAREST);\n  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n  jmethodID mid = env->GetMethodID(jni_helper_java_class_, \"loadTexture\",\n                                   \"(Ljava/lang/String;)Ljava/lang/Object;\");\n\n  jobject out = env->CallObjectMethod(jni_helper_java_ref_, mid, name);\n\n  jclass javaCls =\n      RetrieveClass(env, \"com/sample/helper/NDKHelper$TextureInformation\");\n  jfieldID fidRet = env->GetFieldID(javaCls, \"ret\", \"Z\");\n  jfieldID fidHasAlpha = env->GetFieldID(javaCls, \"alphaChannel\", \"Z\");\n  jfieldID fidWidth = env->GetFieldID(javaCls, \"originalWidth\", \"I\");\n  jfieldID fidHeight = env->GetFieldID(javaCls, \"originalHeight\", \"I\");\n  bool ret = env->GetBooleanField(out, fidRet);\n  bool alpha = env->GetBooleanField(out, fidHasAlpha);\n  int32_t width = env->GetIntField(out, fidWidth);\n  int32_t height = env->GetIntField(out, fidHeight);\n  if (!ret) {\n    glDeleteTextures(1, &tex);\n    tex = -1;\n    LOGI(\"Texture load failed %s\", file_name);\n  }\n  LOGI(\"Loaded texture original size:%dx%d alpha:%d\", width, height,\n       (int32_t)alpha);\n  if (outWidth != NULL) {\n    *outWidth = width;\n  }\n  if (outHeight != NULL) {\n    *outHeight = height;\n  }\n  if (hasAlpha != NULL) {\n    *hasAlpha = alpha;\n  }\n\n  // Generate mipmap\n  glGenerateMipmap(GL_TEXTURE_2D);\n\n  env->DeleteLocalRef(name);\n  DetachCurrentThread();\n\n  return tex;\n}\n\nuint32_t JNIHelper::LoadCubemapTexture(const char* file_name,\n                                       const int32_t face,\n                                       const int32_t miplevel, const bool,\n                                       int32_t* outWidth, int32_t* outHeight,\n                                       bool* hasAlpha) {\n  if (activity_ == NULL) {\n    LOGI(\n        \"JNIHelper has not been initialized. Call init() to initialize the \"\n        \"helper\");\n    return 0;\n  }\n\n  // Lock mutex\n  std::lock_guard<std::mutex> lock(mutex_);\n\n  JNIEnv* env = AttachCurrentThread();\n  jstring name = env->NewStringUTF(file_name);\n\n  jmethodID mid = env->GetMethodID(jni_helper_java_class_, \"loadCubemapTexture\",\n                                   \"(Ljava/lang/String;IIZ)Ljava/lang/Object;\");\n\n  jobject out =\n      env->CallObjectMethod(jni_helper_java_ref_, mid, name, face, miplevel);\n\n  jclass javaCls =\n      RetrieveClass(env, \"com/sample/helper/NDKHelper$TextureInformation\");\n  jfieldID fidRet = env->GetFieldID(javaCls, \"ret\", \"Z\");\n  jfieldID fidHasAlpha = env->GetFieldID(javaCls, \"alphaChannel\", \"Z\");\n  jfieldID fidWidth = env->GetFieldID(javaCls, \"originalWidth\", \"I\");\n  jfieldID fidHeight = env->GetFieldID(javaCls, \"originalHeight\", \"I\");\n  bool ret = env->GetBooleanField(out, fidRet);\n  bool alpha = env->GetBooleanField(out, fidHasAlpha);\n  int32_t width = env->GetIntField(out, fidWidth);\n  int32_t height = env->GetIntField(out, fidHeight);\n  if (!ret) {\n    LOGI(\"Texture load failed %s\", file_name);\n  }\n  LOGI(\"Loaded texture original size:%dx%d alpha:%d\", width, height,\n       (int32_t)alpha);\n  if (outWidth != NULL) {\n    *outWidth = width;\n  }\n  if (outHeight != NULL) {\n    *outHeight = height;\n  }\n  if (hasAlpha != NULL) {\n    *hasAlpha = alpha;\n  }\n\n  env->DeleteLocalRef(name);\n  env->DeleteLocalRef(javaCls);\n\n  return 0;\n}\n\njobject JNIHelper::LoadImage(const char* file_name, int32_t* outWidth,\n                             int32_t* outHeight, bool* hasAlpha) {\n  if (activity_ == NULL) {\n    LOGI(\n        \"JNIHelper has not been initialized. Call init() to initialize the \"\n        \"helper\");\n    return 0;\n  }\n\n  // Lock mutex\n  std::lock_guard<std::mutex> lock(mutex_);\n\n  JNIEnv* env = AttachCurrentThread();\n  jstring name = env->NewStringUTF(file_name);\n\n  jmethodID mid = env->GetMethodID(jni_helper_java_class_, \"loadImage\",\n                                   \"(Ljava/lang/String;)Ljava/lang/Object;\");\n\n  jobject out = env->CallObjectMethod(jni_helper_java_ref_, mid, name);\n\n  jclass javaCls =\n      RetrieveClass(env, \"com/sample/helper/NDKHelper$TextureInformation\");\n  jfieldID fidRet = env->GetFieldID(javaCls, \"ret\", \"Z\");\n  jfieldID fidHasAlpha = env->GetFieldID(javaCls, \"alphaChannel\", \"Z\");\n  jfieldID fidWidth = env->GetFieldID(javaCls, \"originalWidth\", \"I\");\n  jfieldID fidHeight = env->GetFieldID(javaCls, \"originalHeight\", \"I\");\n  bool ret = env->GetBooleanField(out, fidRet);\n  bool alpha = env->GetBooleanField(out, fidHasAlpha);\n  int32_t width = env->GetIntField(out, fidWidth);\n  int32_t height = env->GetIntField(out, fidHeight);\n  if (!ret) {\n    LOGI(\"Texture load failed %s\", file_name);\n  }\n  LOGI(\"Loaded texture original size:%dx%d alpha:%d\", width, height,\n       (int32_t)alpha);\n  if (outWidth != NULL) {\n    *outWidth = width;\n  }\n  if (outHeight != NULL) {\n    *outHeight = height;\n  }\n  if (hasAlpha != NULL) {\n    *hasAlpha = alpha;\n  }\n\n  jfieldID fidImage = env->GetFieldID(javaCls, \"image\", \"Ljava/lang/Object;\");\n  jobject array = env->GetObjectField(out, fidImage);\n  jobject objGlobal = env->NewGlobalRef(array);\n\n  env->DeleteLocalRef(name);\n  env->DeleteLocalRef(javaCls);\n\n  return objGlobal;\n}\n\nstd::string JNIHelper::ConvertString(const char* str, const char* encode) {\n  if (activity_ == NULL) {\n    LOGI(\n        \"JNIHelper has not been initialized. Call init() to initialize the \"\n        \"helper\");\n    return std::string(\"\");\n  }\n\n  // Lock mutex\n  std::lock_guard<std::mutex> lock(mutex_);\n\n  JNIEnv* env = AttachCurrentThread();\n  env->PushLocalFrame(16);\n\n  int32_t iLength = strlen((const char*)str);\n\n  jbyteArray array = env->NewByteArray(iLength);\n  env->SetByteArrayRegion(array, 0, iLength, (const signed char*)str);\n\n  jstring strEncode = env->NewStringUTF(encode);\n\n  jclass cls = env->FindClass(\"java/lang/String\");\n  jmethodID ctor = env->GetMethodID(cls, \"<init>\", \"([BLjava/lang/String;)V\");\n  jstring object = (jstring)env->NewObject(cls, ctor, array, strEncode);\n\n  const char* cparam = env->GetStringUTFChars(object, NULL);\n\n  std::string s = std::string(cparam);\n\n  env->ReleaseStringUTFChars(object, cparam);\n  env->DeleteLocalRef(array);\n  env->DeleteLocalRef(strEncode);\n  env->DeleteLocalRef(object);\n  env->DeleteLocalRef(cls);\n\n  env->PopLocalFrame(NULL);\n\n  return s;\n}\n/*\n * Retrieve string resource with a given name\n * arguments:\n *  in: resourceName, name of string resource to retrieve\n * return: string resource value, returns \"\" when there is no string resource\n * with given name\n */\nstd::string JNIHelper::GetStringResource(const std::string& resourceName) {\n  if (activity_ == NULL) {\n    LOGI(\n        \"JNIHelper has not been initialized. Call init() to initialize the \"\n        \"helper\");\n    return std::string(\"\");\n  }\n\n  // Lock mutex\n  std::lock_guard<std::mutex> lock(mutex_);\n\n  JNIEnv* env = AttachCurrentThread();\n  jstring name = env->NewStringUTF(resourceName.c_str());\n\n  jstring ret = (jstring)CallObjectMethod(\n      \"getStringResource\", \"(Ljava/lang/String;)Ljava/lang/String;\", name);\n\n  const char* resource = env->GetStringUTFChars(ret, NULL);\n  std::string s = std::string(resource);\n\n  env->ReleaseStringUTFChars(ret, resource);\n  env->DeleteLocalRef(ret);\n  env->DeleteLocalRef(name);\n\n  return s;\n}\n/*\n * Audio helpers\n */\nint32_t JNIHelper::GetNativeAudioBufferSize() {\n  if (activity_ == NULL) {\n    LOGI(\n        \"JNIHelper has not been initialized. Call init() to initialize the \"\n        \"helper\");\n    return 0;\n  }\n\n  JNIEnv* env = AttachCurrentThread();\n  jmethodID mid = env->GetMethodID(jni_helper_java_class_,\n                                   \"getNativeAudioBufferSize\", \"()I\");\n  int32_t i = env->CallIntMethod(jni_helper_java_ref_, mid);\n  return i;\n}\n\nint32_t JNIHelper::GetNativeAudioSampleRate() {\n  if (activity_ == NULL) {\n    LOGI(\n        \"JNIHelper has not been initialized. Call init() to initialize the \"\n        \"helper\");\n    return 0;\n  }\n\n  JNIEnv* env = AttachCurrentThread();\n  jmethodID mid = env->GetMethodID(jni_helper_java_class_,\n                                   \"getNativeAudioSampleRate\", \"()I\");\n  int32_t i = env->CallIntMethod(jni_helper_java_ref_, mid);\n  return i;\n}\n\n//---------------------------------------------------------------------------\n// Misc implementations\n//---------------------------------------------------------------------------\njclass JNIHelper::RetrieveClass(JNIEnv* jni, const char* class_name) {\n  jclass activity_class = jni->FindClass(NATIVEACTIVITY_CLASS_NAME);\n  jmethodID get_class_loader = jni->GetMethodID(\n      activity_class, \"getClassLoader\", \"()Ljava/lang/ClassLoader;\");\n  jobject cls = jni->CallObjectMethod(activity_->clazz, get_class_loader);\n  jclass class_loader = jni->FindClass(\"java/lang/ClassLoader\");\n  jmethodID find_class = jni->GetMethodID(\n      class_loader, \"loadClass\", \"(Ljava/lang/String;)Ljava/lang/Class;\");\n\n  jstring str_class_name = jni->NewStringUTF(class_name);\n  jclass class_retrieved =\n      (jclass)jni->CallObjectMethod(cls, find_class, str_class_name);\n  jni->DeleteLocalRef(str_class_name);\n  jni->DeleteLocalRef(activity_class);\n  jni->DeleteLocalRef(class_loader);\n  return class_retrieved;\n}\n\njstring JNIHelper::GetExternalFilesDirJString(JNIEnv* env) {\n  if (activity_ == NULL) {\n    LOGI(\n        \"JNIHelper has not been initialized. Call init() to initialize the \"\n        \"helper\");\n    return NULL;\n  }\n\n  jstring obj_Path = nullptr;\n  // Invoking getExternalFilesDir() java API\n  jclass cls_Env = env->FindClass(NATIVEACTIVITY_CLASS_NAME);\n  jmethodID mid = env->GetMethodID(cls_Env, \"getExternalFilesDir\",\n                                   \"(Ljava/lang/String;)Ljava/io/File;\");\n  jobject obj_File = env->CallObjectMethod(activity_->clazz, mid, NULL);\n  if (obj_File) {\n    jclass cls_File = env->FindClass(\"java/io/File\");\n    jmethodID mid_getPath =\n        env->GetMethodID(cls_File, \"getPath\", \"()Ljava/lang/String;\");\n    obj_Path = (jstring)env->CallObjectMethod(obj_File, mid_getPath);\n  }\n  return obj_Path;\n}\n\nvoid JNIHelper::DeleteObject(jobject obj) {\n  if (obj == NULL) {\n    LOGI(\"obj can not be NULL\");\n    return;\n  }\n\n  JNIEnv* env = AttachCurrentThread();\n  env->DeleteGlobalRef(obj);\n}\n\njobject JNIHelper::CallObjectMethod(const char* strMethodName,\n                                    const char* strSignature, ...) {\n  if (activity_ == NULL) {\n    LOGI(\n        \"JNIHelper has not been initialized. Call init() to initialize the \"\n        \"helper\");\n    return NULL;\n  }\n\n  JNIEnv* env = AttachCurrentThread();\n  jmethodID mid =\n      env->GetMethodID(jni_helper_java_class_, strMethodName, strSignature);\n  if (mid == NULL) {\n    LOGI(\"method ID %s, '%s' not found\", strMethodName, strSignature);\n    return NULL;\n  }\n\n  va_list args;\n  va_start(args, strSignature);\n  jobject obj = env->CallObjectMethodV(jni_helper_java_ref_, mid, args);\n  va_end(args);\n\n  return obj;\n}\n\nvoid JNIHelper::CallVoidMethod(const char* strMethodName,\n                               const char* strSignature, ...) {\n  if (activity_ == NULL) {\n    LOGI(\n        \"JNIHelper has not been initialized. Call init() to initialize the \"\n        \"helper\");\n    return;\n  }\n\n  JNIEnv* env = AttachCurrentThread();\n  jmethodID mid =\n      env->GetMethodID(jni_helper_java_class_, strMethodName, strSignature);\n  if (mid == NULL) {\n    LOGI(\"method ID %s, '%s' not found\", strMethodName, strSignature);\n    return;\n  }\n  va_list args;\n  va_start(args, strSignature);\n  env->CallVoidMethodV(jni_helper_java_ref_, mid, args);\n  va_end(args);\n\n  return;\n}\n\njobject JNIHelper::CallObjectMethod(jobject object, const char* strMethodName,\n                                    const char* strSignature, ...) {\n  if (activity_ == NULL) {\n    LOGI(\n        \"JNIHelper has not been initialized. Call init() to initialize the \"\n        \"helper\");\n    return NULL;\n  }\n\n  JNIEnv* env = AttachCurrentThread();\n  jclass cls = env->GetObjectClass(object);\n  jmethodID mid = env->GetMethodID(cls, strMethodName, strSignature);\n  if (mid == NULL) {\n    LOGI(\"method ID %s, '%s' not found\", strMethodName, strSignature);\n    return NULL;\n  }\n\n  va_list args;\n  va_start(args, strSignature);\n  jobject obj = env->CallObjectMethodV(object, mid, args);\n  va_end(args);\n\n  env->DeleteLocalRef(cls);\n  return obj;\n}\n\nvoid JNIHelper::CallVoidMethod(jobject object, const char* strMethodName,\n                               const char* strSignature, ...) {\n  if (activity_ == NULL) {\n    LOGI(\n        \"JNIHelper has not been initialized. Call init() to initialize the \"\n        \"helper\");\n    return;\n  }\n\n  JNIEnv* env = AttachCurrentThread();\n  jclass cls = env->GetObjectClass(object);\n  jmethodID mid = env->GetMethodID(cls, strMethodName, strSignature);\n  if (mid == NULL) {\n    LOGI(\"method ID %s, '%s' not found\", strMethodName, strSignature);\n    return;\n  }\n\n  va_list args;\n  va_start(args, strSignature);\n  env->CallVoidMethodV(object, mid, args);\n  va_end(args);\n\n  env->DeleteLocalRef(cls);\n  return;\n}\n\nfloat JNIHelper::CallFloatMethod(jobject object, const char* strMethodName,\n                                 const char* strSignature, ...) {\n  float f = 0.f;\n  if (activity_ == NULL) {\n    LOGI(\n        \"JNIHelper has not been initialized. Call init() to initialize the \"\n        \"helper\");\n    return f;\n  }\n\n  JNIEnv* env = AttachCurrentThread();\n  jclass cls = env->GetObjectClass(object);\n  jmethodID mid = env->GetMethodID(cls, strMethodName, strSignature);\n  if (mid == NULL) {\n    LOGI(\"method ID %s, '%s' not found\", strMethodName, strSignature);\n    return f;\n  }\n  va_list args;\n  va_start(args, strSignature);\n  f = env->CallFloatMethodV(object, mid, args);\n  va_end(args);\n\n  env->DeleteLocalRef(cls);\n  return f;\n}\n\nint32_t JNIHelper::CallIntMethod(jobject object, const char* strMethodName,\n                                 const char* strSignature, ...) {\n  int32_t i = 0;\n  if (activity_ == NULL) {\n    LOGI(\n        \"JNIHelper has not been initialized. Call init() to initialize the \"\n        \"helper\");\n    return i;\n  }\n\n  JNIEnv* env = AttachCurrentThread();\n  jclass cls = env->GetObjectClass(object);\n  jmethodID mid = env->GetMethodID(cls, strMethodName, strSignature);\n  if (mid == NULL) {\n    LOGI(\"method ID %s, '%s' not found\", strMethodName, strSignature);\n    return i;\n  }\n  va_list args;\n  va_start(args, strSignature);\n  i = env->CallIntMethodV(object, mid, args);\n  va_end(args);\n\n  env->DeleteLocalRef(cls);\n  return i;\n}\n\nbool JNIHelper::CallBooleanMethod(jobject object, const char* strMethodName,\n                                  const char* strSignature, ...) {\n  bool b;\n  if (activity_ == NULL) {\n    LOGI(\n        \"JNIHelper has not been initialized. Call init() to initialize the \"\n        \"helper\");\n    return false;\n  }\n\n  JNIEnv* env = AttachCurrentThread();\n  jclass cls = env->GetObjectClass(object);\n  jmethodID mid = env->GetMethodID(cls, strMethodName, strSignature);\n  if (mid == NULL) {\n    LOGI(\"method ID %s, '%s' not found\", strMethodName, strSignature);\n    return false;\n  }\n  va_list args;\n  va_start(args, strSignature);\n  b = env->CallBooleanMethodV(object, mid, args);\n  va_end(args);\n\n  env->DeleteLocalRef(cls);\n  return b;\n}\n\njobject JNIHelper::CreateObject(const char* class_name) {\n  JNIEnv* env = AttachCurrentThread();\n\n  jclass cls = env->FindClass(class_name);\n  jmethodID constructor = env->GetMethodID(cls, \"<init>\", \"()V\");\n\n  jobject obj = env->NewObject(cls, constructor);\n  jobject objGlobal = env->NewGlobalRef(obj);\n  env->DeleteLocalRef(obj);\n  env->DeleteLocalRef(cls);\n  return objGlobal;\n}\n\nvoid JNIHelper::RunOnUiThread(std::function<void()> callback) {\n  // Lock mutex\n  std::lock_guard<std::mutex> lock(mutex_);\n\n  JNIEnv* env = AttachCurrentThread();\n  static jmethodID mid = NULL;\n  if (mid == NULL)\n    mid = env->GetMethodID(jni_helper_java_class_, \"runOnUIThread\", \"(J)V\");\n\n  // Allocate temporary function object to be passed around\n  std::function<void()>* pCallback = new std::function<void()>(callback);\n  env->CallVoidMethod(jni_helper_java_ref_, mid, (int64_t)pCallback);\n}\n\n// This JNI function is invoked from UIThread asynchronously\nextern \"C\" {\nJNIEXPORT void Java_com_sample_helper_NDKHelper_RunOnUiThreadHandler(\n    JNIEnv*, jobject, int64_t pointer) {\n  std::function<void()>* pCallback = (std::function<void()>*)pointer;\n  (*pCallback)();\n\n  // Deleting temporary object\n  delete pCallback;\n}\n}\n\n}  // namespace ndk_helper\n"
  },
  {
    "path": "teapots/common/ndk_helper/JNIHelper.h",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#pragma once\n\n#include <android/log.h>\n#include <android_native_app_glue.h>\n#include <assert.h>\n#include <jni.h>\n#include <pthread.h>\n\n#include <functional>\n#include <mutex>\n#include <string>\n#include <vector>\n\n#define LOGI(...)                                                           \\\n  ((void)__android_log_print(                                               \\\n      ANDROID_LOG_INFO, ndk_helper::JNIHelper::GetInstance()->GetAppName(), \\\n      __VA_ARGS__))\n#define LOGW(...)                                                           \\\n  ((void)__android_log_print(                                               \\\n      ANDROID_LOG_WARN, ndk_helper::JNIHelper::GetInstance()->GetAppName(), \\\n      __VA_ARGS__))\n#define LOGE(...)                                                            \\\n  ((void)__android_log_print(                                                \\\n      ANDROID_LOG_ERROR, ndk_helper::JNIHelper::GetInstance()->GetAppName(), \\\n      __VA_ARGS__))\n\nnamespace ndk_helper {\n\nclass JUIView;\n\n/******************************************************************\n * Helper functions for JNI calls\n * This class wraps JNI calls and provides handy interface calling commonly used\n *features\n * in Java SDK.\n * Such as\n * - loading graphics files (e.g. PNG, JPG)\n * - character code conversion\n * - retrieving system properties which only supported in Java SDK\n *\n * NOTE: To use this class, add NDKHelper.java as a corresponding helpers in\n *Java code\n */\nclass JNIHelper {\n private:\n  std::string app_name_;\n\n  ANativeActivity* activity_;\n  jobject jni_helper_java_ref_;\n  jclass jni_helper_java_class_;\n\n  jstring GetExternalFilesDirJString(JNIEnv* env);\n  jclass RetrieveClass(JNIEnv* jni, const char* class_name);\n\n  JNIHelper();\n  ~JNIHelper();\n  JNIHelper(const JNIHelper& rhs);\n  JNIHelper& operator=(const JNIHelper& rhs);\n\n  std::string app_label_;\n\n  // mutex for synchronization\n  // This class uses singleton pattern and can be invoked from multiple threads,\n  // each methods locks the mutex for a thread safety\n  mutable std::mutex mutex_;\n\n  /*\n   * Call method in JNIHelper class\n   */\n  jobject CallObjectMethod(const char* strMethodName, const char* strSignature,\n                           ...);\n  void CallVoidMethod(const char* strMethodName, const char* strSignature, ...);\n\n  /*\n   * Unregister this thread from the VM\n   */\n  static void DetachCurrentThreadDtor(void* p) {\n    LOGI(\"detached current thread\");\n    if (p != nullptr) {\n      ANativeActivity* activity = (ANativeActivity*)p;\n      activity->vm->DetachCurrentThread();\n    }\n  }\n\n public:\n  /*\n   * To load your own Java classes, JNIHelper requires to be initialized with a\n   *ANativeActivity handle.\n   * This methods need to be called before any call to the helper class.\n   * Static member of the class\n   *\n   * arguments:\n   * in: activity, pointer to ANativeActivity. Used internally to set up JNI\n   *environment\n   * in: helper_class_name, pointer to Java side helper class name. (e.g.\n   *\"com/sample/helper/NDKHelper\" in samples )\n   */\n  static void Init(ANativeActivity* activity, const char* helper_class_name);\n\n  /*\n   * Init() that accept so name.\n   * When using a JUI helper class, Java side requires SO name to initialize JNI\n   * calls to invoke native callbacks.\n   * Use this version when using JUI helper.\n   *\n   * arguments:\n   * in: activity, pointer to ANativeActivity. Used internally to set up JNI\n   * environment\n   * in: helper_class_name, pointer to Java side helper class name. (e.g.\n   * \"com/sample/helper/NDKHelper\" in samples )\n   * in: native_soname, pointer to soname of native library. (e.g.\n   * \"NativeActivity\" for \"libNativeActivity.so\" )\n   */\n  static void Init(ANativeActivity* activity, const char* helper_class_name,\n                   const char* native_soname);\n\n  /*\n   * Retrieve the singleton object of the helper.\n   * Static member of the class\n\n   * Methods in the class are designed as thread safe.\n   */\n  static JNIHelper* GetInstance();\n\n  /*\n   * Read a file from a strorage.\n   * First, the method tries to read the file from an external storage.\n   * If it fails to read, it falls back to use assset manager and try to read\n   * the file from APK asset.\n   *\n   * arguments:\n   * in: file_name, file name to read\n   * out: buffer_ref, pointer to a vector buffer to read a file.\n   *      when the call succeeded, the buffer includes contents of specified\n   *file\n   *      when the call failed, contents of the buffer remains same\n   * return:\n   * true when file read succeeded\n   * false when it failed to read the file\n   */\n  bool ReadFile(const char* file_name, std::vector<uint8_t>* buffer_ref);\n\n  /*\n   * Load and create OpenGL texture from given file name.\n   * The method invokes BitmapFactory in Java so it can read jpeg/png formatted\n   * files\n   *\n   * The methods creates mip-map and set texture parameters like this,\n   * glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,\n   * GL_LINEAR_MIPMAP_NEAREST );\n   * glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );\n   * glGenerateMipmap( GL_TEXTURE_2D );\n   *\n   * arguments:\n   * in: file_name, file name to read, PNG&JPG is supported\n   * outWidth(Optional) pointer to retrieve original bitmap width\n   * outHeight(Optional) pointer to retrieve original bitmap height\n   * return:\n   * OpenGL texture name when the call succeeded\n   * When it failed to load the texture, it returns -1\n   */\n  uint32_t LoadTexture(const char* file_name, int32_t* outWidth = nullptr,\n                       int32_t* outHeight = nullptr, bool* hasAlpha = nullptr);\n\n  /*\n   * Load and create OpenGL cubemap texture from given file name\n   * into specified cubemap face & miplevel\n   * The method invokes BitmapFactory in Java so it can read jpeg/png formatted\n   * files\n   *\n   * arguments:\n   * in: file_name, file name to read, PNG&JPG is supported\n   * outWidth(Optional) pointer to retrieve original bitmap width\n   * outHeight(Optional) pointer to retrieve original bitmap height\n   * return:\n   * OpenGL texture name when the call succeeded\n   * When it failed to load the texture, it returns -1\n   */\n  uint32_t LoadCubemapTexture(const char* file_name, const int32_t face,\n                              const int32_t miplevel, const bool sRGB,\n                              int32_t* outWidth = nullptr,\n                              int32_t* outHeight = nullptr,\n                              bool* hasAlpha = nullptr);\n\n  /*\n   * Load and create image and return it as a byte array.\n   * The method invokes BitmapFactory in Java so it can read jpeg/png formatted\n   * files\n   *\n   * arguments:\n   * in: file_name, file name to read, PNG&JPG is supported\n   * outWidth(Optional) pointer to retrieve original bitmap width\n   * outHeight(Optional) pointer to retrieve original bitmap height\n   * return:\n   * Java ByteBuffer object containing image data converted to RGBA values.\n   */\n  jobject LoadImage(const char* file_name, int32_t* outWidth = nullptr,\n                    int32_t* outHeight = nullptr, bool* hasAlpha = nullptr);\n\n  /*\n   * Convert string from character code other than UTF-8\n   *\n   * arguments:\n   *  in: str, pointer to a string which is encoded other than UTF-8\n   *  in: encoding, pointer to a character encoding string.\n   *  The encoding string can be any valid java.nio.charset.Charset name\n   *  e.g. \"UTF-16\", \"Shift_JIS\"\n   * return: converted input string as an UTF-8 std::string\n   */\n  std::string ConvertString(const char* str, const char* encode);\n  /*\n   * Retrieve external file directory through JNI call\n   *\n   * return: std::string containing external file diretory\n   */\n  std::string GetExternalFilesDir();\n\n  /*\n   * Retrieve string resource with a given name\n   * arguments:\n   *  in: resourceName, name of string resource to retrieve\n   * return: string resource value, returns \"\" when there is no string resource\n   * with given name\n   */\n  std::string GetStringResource(const std::string& resourceName);\n\n  /*\n   * Audio helper\n   * Retrieves native audio buffer size which is required to achieve low latency\n   * audio\n   *\n   * return: Native audio buffer size which is a hint to achieve low latency\n   * audio\n   * If the API is not supported (API level < 17), it returns 0\n   */\n  int32_t GetNativeAudioBufferSize();\n\n  /*\n   * Audio helper\n   * Retrieves native audio sample rate which is required to achieve low latency\n   * audio\n   *\n   * return: Native audio sample rate which is a hint to achieve low latency\n   * audio\n   */\n  int32_t GetNativeAudioSampleRate();\n\n  /*\n   * Retrieves application bundle name\n   *\n   * return: pointer to an app name string\n   *\n   */\n  const char* GetAppName() const { return app_name_.c_str(); }\n\n  /*\n   * Retrieves application label\n   *\n   * return: pointer to an app label string\n   *\n   */\n  const char* GetAppLabel() const { return app_label_.c_str(); }\n\n  /*\n   * Execute given function in Java UIThread.\n   *\n   * arguments:\n   *  in: pFunction, a pointer to a function to be executed in Java UI Thread.\n   *  Note that the helper function returns immediately without synchronizing a\n   *  function completion.\n   */\n  void RunOnUiThread(std::function<void()> callback);\n\n  /*\n   * Attach current thread\n   * In Android, the thread doesn't have to be 'Detach' current thread\n   * as application process is only killed and VM does not shut down\n   */\n  JNIEnv* AttachCurrentThread() {\n    JNIEnv* env;\n    if (activity_->vm->GetEnv((void**)&env, JNI_VERSION_1_4) == JNI_OK)\n      return env;\n    activity_->vm->AttachCurrentThread(&env, NULL);\n    pthread_key_t key;\n    if (pthread_key_create(&key, DetachCurrentThreadDtor) == 0) {\n      pthread_setspecific(key, (void*)activity_);\n    }\n    return env;\n  }\n\n  void DetachCurrentThread() {\n    activity_->vm->DetachCurrentThread();\n    return;\n  }\n\n  /*\n   * Decrement a global reference to the object\n   * arguments:\n   *  in: obj, obj to decrement a global reference\n   */\n  void DeleteObject(jobject obj);\n\n  /*\n   * Helper methods to call a method in given object\n   */\n  jobject CreateObject(const char* class_name);\n  jobject CallObjectMethod(jobject object, const char* strMethodName,\n                           const char* strSignature, ...);\n  void CallVoidMethod(jobject object, const char* strMethodName,\n                      const char* strSignature, ...);\n  float CallFloatMethod(jobject object, const char* strMethodName,\n                        const char* strSignature, ...);\n  int32_t CallIntMethod(jobject object, const char* strMethodName,\n                        const char* strSignature, ...);\n  bool CallBooleanMethod(jobject object, const char* strMethodName,\n                         const char* strSignature, ...);\n};\n\n}  // namespace ndk_helper\n"
  },
  {
    "path": "teapots/common/ndk_helper/NDKHelper.h",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef _NDKSUPPORT_H\n#define _NDKSUPPORT_H\n\n#define NDK_HELPER_VERSION \"0.90\"\n\n/******************************************************************\n * NDK support helpers\n * Utility module to provide misc functionalities that is used widely in native\n * applications,\n * such as gesture detection, jni bridge, openGL context etc.\n *\n * The purpose of this module is,\n * - Provide best practices using NDK\n * - Provide handy utility functions for NDK development\n * - Make NDK samples more simpler and readable\n */\n#include \"GLContext.h\"        // EGL & OpenGL manager\n#include \"JNIHelper.h\"        // JNI support\n#include \"gestureDetector.h\"  // Tap/Doubletap/Pinch detector\n#include \"gl3stub.h\"          // GLES3 stubs\n#include \"interpolator.h\"     // Interpolator\n#include \"perfMonitor.h\"      // FPS counter\n#include \"sensorManager.h\"    // SensorManager\n#include \"shader.h\"           // Shader compiler support\n#include \"tapCamera.h\"        // Tap/Pinch camera control\n#include \"vecmath.h\"  // Vector math support, C++ implementation n current version\n#endif\n"
  },
  {
    "path": "teapots/common/ndk_helper/gestureDetector.cpp",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"gestureDetector.h\"\n\n//--------------------------------------------------------------------------------\n// gestureDetector.cpp\n//--------------------------------------------------------------------------------\nnamespace ndk_helper {\n\n//--------------------------------------------------------------------------------\n// includes\n//--------------------------------------------------------------------------------\n\n//--------------------------------------------------------------------------------\n// GestureDetector\n//--------------------------------------------------------------------------------\nGestureDetector::GestureDetector() { dp_factor_ = 1.f; }\n\nvoid GestureDetector::SetConfiguration(AConfiguration* config) {\n  dp_factor_ = 160.f / AConfiguration_getDensity(config);\n}\n\n//--------------------------------------------------------------------------------\n// TapDetector\n//--------------------------------------------------------------------------------\nTapDetector::TapDetector() : down_x_(0), down_y_(0) {}\n\nGESTURE_STATE TapDetector::Detect(const AInputEvent* motion_event) {\n  if (AMotionEvent_getPointerCount(motion_event) > 1) {\n    // Only support single touch\n    return false;\n  }\n\n  int32_t action = AMotionEvent_getAction(motion_event);\n  unsigned int flags = action & AMOTION_EVENT_ACTION_MASK;\n  switch (flags) {\n    case AMOTION_EVENT_ACTION_DOWN:\n      down_pointer_id_ = AMotionEvent_getPointerId(motion_event, 0);\n      down_x_ = AMotionEvent_getX(motion_event, 0);\n      down_y_ = AMotionEvent_getY(motion_event, 0);\n      break;\n    case AMOTION_EVENT_ACTION_UP: {\n      int64_t eventTime = AMotionEvent_getEventTime(motion_event);\n      int64_t downTime = AMotionEvent_getDownTime(motion_event);\n      if (eventTime - downTime <= TAP_TIMEOUT) {\n        if (down_pointer_id_ == AMotionEvent_getPointerId(motion_event, 0)) {\n          float x = AMotionEvent_getX(motion_event, 0) - down_x_;\n          float y = AMotionEvent_getY(motion_event, 0) - down_y_;\n          if (x * x + y * y < TOUCH_SLOP * TOUCH_SLOP * dp_factor_) {\n            LOGI(\"TapDetector: Tap detected\");\n            return GESTURE_STATE_ACTION;\n          }\n        }\n      }\n      break;\n    }\n  }\n  return GESTURE_STATE_NONE;\n}\n\n//--------------------------------------------------------------------------------\n// DoubletapDetector\n//--------------------------------------------------------------------------------\nDoubletapDetector::DoubletapDetector()\n    : last_tap_time_(0), last_tap_x_(0), last_tap_y_(0) {}\n\nGESTURE_STATE DoubletapDetector::Detect(const AInputEvent* motion_event) {\n  if (AMotionEvent_getPointerCount(motion_event) > 1) {\n    // Only support single double tap\n    return false;\n  }\n\n  bool tap_detected = tap_detector_.Detect(motion_event);\n\n  int32_t action = AMotionEvent_getAction(motion_event);\n  unsigned int flags = action & AMOTION_EVENT_ACTION_MASK;\n  switch (flags) {\n    case AMOTION_EVENT_ACTION_DOWN: {\n      int64_t eventTime = AMotionEvent_getEventTime(motion_event);\n      if (eventTime - last_tap_time_ <= DOUBLE_TAP_TIMEOUT) {\n        float x = AMotionEvent_getX(motion_event, 0) - last_tap_x_;\n        float y = AMotionEvent_getY(motion_event, 0) - last_tap_y_;\n        if (x * x + y * y < DOUBLE_TAP_SLOP * DOUBLE_TAP_SLOP * dp_factor_) {\n          LOGI(\"DoubletapDetector: Doubletap detected\");\n          return GESTURE_STATE_ACTION;\n        }\n      }\n      break;\n    }\n    case AMOTION_EVENT_ACTION_UP:\n      if (tap_detected) {\n        last_tap_time_ = AMotionEvent_getEventTime(motion_event);\n        last_tap_x_ = AMotionEvent_getX(motion_event, 0);\n        last_tap_y_ = AMotionEvent_getY(motion_event, 0);\n      }\n      break;\n  }\n  return GESTURE_STATE_NONE;\n}\n\nvoid DoubletapDetector::SetConfiguration(AConfiguration* config) {\n  dp_factor_ = 160.f / AConfiguration_getDensity(config);\n  tap_detector_.SetConfiguration(config);\n}\n\n//--------------------------------------------------------------------------------\n// PinchDetector\n//--------------------------------------------------------------------------------\n\nint32_t PinchDetector::FindIndex(const AInputEvent* event, int32_t id) {\n  int32_t count = AMotionEvent_getPointerCount(event);\n  for (auto i = 0; i < count; ++i) {\n    if (id == AMotionEvent_getPointerId(event, i)) return i;\n  }\n  return -1;\n}\n\nGESTURE_STATE PinchDetector::Detect(const AInputEvent* event) {\n  GESTURE_STATE ret = GESTURE_STATE_NONE;\n  int32_t action = AMotionEvent_getAction(event);\n  uint32_t flags = action & AMOTION_EVENT_ACTION_MASK;\n  event_ = event;\n\n  int32_t count = AMotionEvent_getPointerCount(event);\n  switch (flags) {\n    case AMOTION_EVENT_ACTION_DOWN:\n      vec_pointers_.push_back(AMotionEvent_getPointerId(event, 0));\n      break;\n    case AMOTION_EVENT_ACTION_POINTER_DOWN: {\n      int32_t iIndex = (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >>\n                       AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;\n      vec_pointers_.push_back(AMotionEvent_getPointerId(event, iIndex));\n      if (count == 2) {\n        // Start new pinch\n        ret = GESTURE_STATE_START;\n      }\n    } break;\n    case AMOTION_EVENT_ACTION_UP:\n      vec_pointers_.pop_back();\n      break;\n    case AMOTION_EVENT_ACTION_POINTER_UP: {\n      int32_t index = (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >>\n                      AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;\n      int32_t released_pointer_id = AMotionEvent_getPointerId(event, index);\n\n      std::vector<int32_t>::iterator it = vec_pointers_.begin();\n      std::vector<int32_t>::iterator it_end = vec_pointers_.end();\n      int32_t i = 0;\n      for (; it != it_end; ++it, ++i) {\n        if (*it == released_pointer_id) {\n          vec_pointers_.erase(it);\n          break;\n        }\n      }\n\n      if (i <= 1) {\n        // Reset pinch or drag\n        if (count != 2) {\n          // Start new pinch\n          ret = GESTURE_STATE_START | GESTURE_STATE_END;\n        }\n      }\n    } break;\n    case AMOTION_EVENT_ACTION_MOVE:\n      switch (count) {\n        case 1:\n          break;\n        default:\n          // Multi touch\n          ret = GESTURE_STATE_MOVE;\n          break;\n      }\n      break;\n    case AMOTION_EVENT_ACTION_CANCEL:\n      break;\n  }\n\n  return ret;\n}\n\nbool PinchDetector::GetPointers(Vec2& v1, Vec2& v2) {\n  if (vec_pointers_.size() < 2) return false;\n\n  int32_t index = FindIndex(event_, vec_pointers_[0]);\n  if (index == -1) return false;\n\n  float x = AMotionEvent_getX(event_, index);\n  float y = AMotionEvent_getY(event_, index);\n\n  index = FindIndex(event_, vec_pointers_[1]);\n  if (index == -1) return false;\n\n  float x2 = AMotionEvent_getX(event_, index);\n  float y2 = AMotionEvent_getY(event_, index);\n\n  v1 = Vec2(x, y);\n  v2 = Vec2(x2, y2);\n\n  return true;\n}\n\n//--------------------------------------------------------------------------------\n// DragDetector\n//--------------------------------------------------------------------------------\n\nint32_t DragDetector::FindIndex(const AInputEvent* event, int32_t id) {\n  int32_t count = AMotionEvent_getPointerCount(event);\n  for (auto i = 0; i < count; ++i) {\n    if (id == AMotionEvent_getPointerId(event, i)) return i;\n  }\n  return -1;\n}\n\nGESTURE_STATE DragDetector::Detect(const AInputEvent* event) {\n  GESTURE_STATE ret = GESTURE_STATE_NONE;\n  int32_t action = AMotionEvent_getAction(event);\n  int32_t index = (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >>\n                  AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;\n  uint32_t flags = action & AMOTION_EVENT_ACTION_MASK;\n  event_ = event;\n\n  int32_t count = AMotionEvent_getPointerCount(event);\n  switch (flags) {\n    case AMOTION_EVENT_ACTION_DOWN:\n      vec_pointers_.push_back(AMotionEvent_getPointerId(event, 0));\n      ret = GESTURE_STATE_START;\n      break;\n    case AMOTION_EVENT_ACTION_POINTER_DOWN:\n      vec_pointers_.push_back(AMotionEvent_getPointerId(event, index));\n      break;\n    case AMOTION_EVENT_ACTION_UP:\n      vec_pointers_.pop_back();\n      ret = GESTURE_STATE_END;\n      break;\n    case AMOTION_EVENT_ACTION_POINTER_UP: {\n      int32_t released_pointer_id = AMotionEvent_getPointerId(event, index);\n\n      auto it = vec_pointers_.begin();\n      auto it_end = vec_pointers_.end();\n      int32_t i = 0;\n      for (; it != it_end; ++it, ++i) {\n        if (*it == released_pointer_id) {\n          vec_pointers_.erase(it);\n          break;\n        }\n      }\n\n      if (i <= 1) {\n        // Reset pinch or drag\n        if (count == 2) {\n          ret = GESTURE_STATE_START;\n        }\n      }\n      break;\n    }\n    case AMOTION_EVENT_ACTION_MOVE:\n      switch (count) {\n        case 1:\n          // Drag\n          ret = GESTURE_STATE_MOVE;\n          break;\n        default:\n          break;\n      }\n      break;\n    case AMOTION_EVENT_ACTION_CANCEL:\n      break;\n  }\n\n  return ret;\n}\n\nbool DragDetector::GetPointer(Vec2& v) {\n  if (vec_pointers_.size() < 1) return false;\n\n  int32_t iIndex = FindIndex(event_, vec_pointers_[0]);\n  if (iIndex == -1) return false;\n\n  float x = AMotionEvent_getX(event_, iIndex);\n  float y = AMotionEvent_getY(event_, iIndex);\n\n  v = Vec2(x, y);\n\n  return true;\n}\n\n}  // namespace ndk_helper\n"
  },
  {
    "path": "teapots/common/ndk_helper/gestureDetector.h",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//--------------------------------------------------------------------------------\n// gestureDetector.h\n//--------------------------------------------------------------------------------\n#ifndef GESTUREDETECTOR_H_\n#define GESTUREDETECTOR_H_\n\n#include <android/log.h>\n#include <android/native_window_jni.h>\n#include <android/sensor.h>\n#include <android_native_app_glue.h>\n\n#include <vector>\n\n#include \"JNIHelper.h\"\n#include \"vecmath.h\"\n\nnamespace ndk_helper {\n//--------------------------------------------------------------------------------\n// Constants\n//--------------------------------------------------------------------------------\nconst int32_t DOUBLE_TAP_TIMEOUT = 300 * 1000000;\nconst int32_t TAP_TIMEOUT = 180 * 1000000;\nconst int32_t DOUBLE_TAP_SLOP = 100;\nconst int32_t TOUCH_SLOP = 8;\n\nenum {\n  GESTURE_STATE_NONE = 0,\n  GESTURE_STATE_START = 1,\n  GESTURE_STATE_MOVE = 2,\n  GESTURE_STATE_END = 4,\n  GESTURE_STATE_ACTION = (GESTURE_STATE_START | GESTURE_STATE_END),\n};\ntypedef int32_t GESTURE_STATE;\n\n/******************************************************************\n * Base class of Gesture Detectors\n * GestureDetectors handles input events and detect gestures\n * Note that different detectors may detect gestures with an event at\n * same time. The caller needs to manage gesture priority accordingly\n *\n */\nclass GestureDetector {\n protected:\n  float dp_factor_;\n\n public:\n  GestureDetector();\n  virtual ~GestureDetector() {}\n  virtual void SetConfiguration(AConfiguration* config);\n\n  virtual GESTURE_STATE Detect(const AInputEvent* motion_event) = 0;\n};\n\n/******************************************************************\n * Tap gesture detector\n * Returns GESTURE_STATE_ACTION when a tap gesture is detected\n *\n */\nclass TapDetector : public GestureDetector {\n private:\n  int32_t down_pointer_id_;\n  float down_x_;\n  float down_y_;\n\n public:\n  TapDetector();\n  virtual ~TapDetector() {}\n  virtual GESTURE_STATE Detect(const AInputEvent* motion_event);\n};\n\n/******************************************************************\n * Pinch gesture detector\n * Returns GESTURE_STATE_ACTION when a double-tap gesture is detected\n *\n */\nclass DoubletapDetector : public GestureDetector {\n private:\n  TapDetector tap_detector_;\n  int64_t last_tap_time_;\n  float last_tap_x_;\n  float last_tap_y_;\n\n public:\n  DoubletapDetector();\n  virtual ~DoubletapDetector() {}\n  virtual GESTURE_STATE Detect(const AInputEvent* motion_event);\n  virtual void SetConfiguration(AConfiguration* config);\n};\n\n/******************************************************************\n * Double gesture detector\n * Returns pinch gesture state when a pinch gesture is detected\n * The class handles multiple touches more than 2\n * When the finger 1,2,3 are tapped and then finger 1 is released,\n * the detector start new pinch gesture with finger 2 & 3.\n */\nclass PinchDetector : public GestureDetector {\n private:\n  int32_t FindIndex(const AInputEvent* event, int32_t id);\n  const AInputEvent* event_;\n  std::vector<int32_t> vec_pointers_;\n\n public:\n  PinchDetector() {}\n  virtual ~PinchDetector() {}\n  virtual GESTURE_STATE Detect(const AInputEvent* event);\n  bool GetPointers(Vec2& v1, Vec2& v2);\n};\n\n/******************************************************************\n * Drag gesture detector\n * Returns drag gesture state when a drag-tap gesture is detected\n *\n */\nclass DragDetector : public GestureDetector {\n private:\n  int32_t FindIndex(const AInputEvent* event, int32_t id);\n  const AInputEvent* event_;\n  std::vector<int32_t> vec_pointers_;\n\n public:\n  DragDetector() : event_(nullptr) {}\n  virtual ~DragDetector() {}\n  virtual GESTURE_STATE Detect(const AInputEvent* event);\n  bool GetPointer(Vec2& v);\n};\n\n}  // namespace ndk_helper\n#endif /* GESTUREDETECTOR_H_ */\n"
  },
  {
    "path": "teapots/common/ndk_helper/gl3stub.c",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"gl3stub.h\"\n\n#include <EGL/egl.h>\n\nGLboolean gl3stubInit() {\n#define FIND_PROC(s) s = (void*)eglGetProcAddress(#s);\n  FIND_PROC(glReadBuffer);\n  FIND_PROC(glDrawRangeElements);\n  FIND_PROC(glTexImage3D);\n  FIND_PROC(glTexSubImage3D);\n  FIND_PROC(glCopyTexSubImage3D);\n  FIND_PROC(glCompressedTexImage3D);\n  FIND_PROC(glCompressedTexSubImage3D);\n  FIND_PROC(glGenQueries);\n  FIND_PROC(glDeleteQueries);\n  FIND_PROC(glIsQuery);\n  FIND_PROC(glBeginQuery);\n  FIND_PROC(glEndQuery);\n  FIND_PROC(glGetQueryiv);\n  FIND_PROC(glGetQueryObjectuiv);\n  FIND_PROC(glUnmapBuffer);\n  FIND_PROC(glGetBufferPointerv);\n  FIND_PROC(glDrawBuffers);\n  FIND_PROC(glUniformMatrix2x3fv);\n  FIND_PROC(glUniformMatrix3x2fv);\n  FIND_PROC(glUniformMatrix2x4fv);\n  FIND_PROC(glUniformMatrix4x2fv);\n  FIND_PROC(glUniformMatrix3x4fv);\n  FIND_PROC(glUniformMatrix4x3fv);\n  FIND_PROC(glBlitFramebuffer);\n  FIND_PROC(glRenderbufferStorageMultisample);\n  FIND_PROC(glFramebufferTextureLayer);\n  FIND_PROC(glMapBufferRange);\n  FIND_PROC(glFlushMappedBufferRange);\n  FIND_PROC(glBindVertexArray);\n  FIND_PROC(glDeleteVertexArrays);\n  FIND_PROC(glGenVertexArrays);\n  FIND_PROC(glIsVertexArray);\n  FIND_PROC(glGetIntegeri_v);\n  FIND_PROC(glBeginTransformFeedback);\n  FIND_PROC(glEndTransformFeedback);\n  FIND_PROC(glBindBufferRange);\n  FIND_PROC(glBindBufferBase);\n  FIND_PROC(glTransformFeedbackVaryings);\n  FIND_PROC(glGetTransformFeedbackVarying);\n  FIND_PROC(glVertexAttribIPointer);\n  FIND_PROC(glGetVertexAttribIiv);\n  FIND_PROC(glGetVertexAttribIuiv);\n  FIND_PROC(glVertexAttribI4i);\n  FIND_PROC(glVertexAttribI4ui);\n  FIND_PROC(glVertexAttribI4iv);\n  FIND_PROC(glVertexAttribI4uiv);\n  FIND_PROC(glGetUniformuiv);\n  FIND_PROC(glGetFragDataLocation);\n  FIND_PROC(glUniform1ui);\n  FIND_PROC(glUniform2ui);\n  FIND_PROC(glUniform3ui);\n  FIND_PROC(glUniform4ui);\n  FIND_PROC(glUniform1uiv);\n  FIND_PROC(glUniform2uiv);\n  FIND_PROC(glUniform3uiv);\n  FIND_PROC(glUniform4uiv);\n  FIND_PROC(glClearBufferiv);\n  FIND_PROC(glClearBufferuiv);\n  FIND_PROC(glClearBufferfv);\n  FIND_PROC(glClearBufferfi);\n  FIND_PROC(glGetStringi);\n  FIND_PROC(glCopyBufferSubData);\n  FIND_PROC(glGetUniformIndices);\n  FIND_PROC(glGetActiveUniformsiv);\n  FIND_PROC(glGetUniformBlockIndex);\n  FIND_PROC(glGetActiveUniformBlockiv);\n  FIND_PROC(glGetActiveUniformBlockName);\n  FIND_PROC(glUniformBlockBinding);\n  FIND_PROC(glDrawArraysInstanced);\n  FIND_PROC(glDrawElementsInstanced);\n  FIND_PROC(glFenceSync);\n  FIND_PROC(glIsSync);\n  FIND_PROC(glDeleteSync);\n  FIND_PROC(glClientWaitSync);\n  FIND_PROC(glWaitSync);\n  FIND_PROC(glGetInteger64v);\n  FIND_PROC(glGetSynciv);\n  FIND_PROC(glGetInteger64i_v);\n  FIND_PROC(glGetBufferParameteri64v);\n  FIND_PROC(glGenSamplers);\n  FIND_PROC(glDeleteSamplers);\n  FIND_PROC(glIsSampler);\n  FIND_PROC(glBindSampler);\n  FIND_PROC(glSamplerParameteri);\n  FIND_PROC(glSamplerParameteriv);\n  FIND_PROC(glSamplerParameterf);\n  FIND_PROC(glSamplerParameterfv);\n  FIND_PROC(glGetSamplerParameteriv);\n  FIND_PROC(glGetSamplerParameterfv);\n  FIND_PROC(glVertexAttribDivisor);\n  FIND_PROC(glBindTransformFeedback);\n  FIND_PROC(glDeleteTransformFeedbacks);\n  FIND_PROC(glGenTransformFeedbacks);\n  FIND_PROC(glIsTransformFeedback);\n  FIND_PROC(glPauseTransformFeedback);\n  FIND_PROC(glResumeTransformFeedback);\n  FIND_PROC(glGetProgramBinary);\n  FIND_PROC(glProgramBinary);\n  FIND_PROC(glProgramParameteri);\n  FIND_PROC(glInvalidateFramebuffer);\n  FIND_PROC(glInvalidateSubFramebuffer);\n  FIND_PROC(glTexStorage2D);\n  FIND_PROC(glTexStorage3D);\n  FIND_PROC(glGetInternalformativ);\n#undef FIND_PROC\n\n  if (!glReadBuffer || !glDrawRangeElements || !glTexImage3D ||\n      !glTexSubImage3D || !glCopyTexSubImage3D || !glCompressedTexImage3D ||\n      !glCompressedTexSubImage3D || !glGenQueries || !glDeleteQueries ||\n      !glIsQuery || !glBeginQuery || !glEndQuery || !glGetQueryiv ||\n      !glGetQueryObjectuiv || !glUnmapBuffer || !glGetBufferPointerv ||\n      !glDrawBuffers || !glUniformMatrix2x3fv || !glUniformMatrix3x2fv ||\n      !glUniformMatrix2x4fv || !glUniformMatrix4x2fv || !glUniformMatrix3x4fv ||\n      !glUniformMatrix4x3fv || !glBlitFramebuffer ||\n      !glRenderbufferStorageMultisample || !glFramebufferTextureLayer ||\n      !glMapBufferRange || !glFlushMappedBufferRange || !glBindVertexArray ||\n      !glDeleteVertexArrays || !glGenVertexArrays || !glIsVertexArray ||\n      !glGetIntegeri_v || !glBeginTransformFeedback ||\n      !glEndTransformFeedback || !glBindBufferRange || !glBindBufferBase ||\n      !glTransformFeedbackVaryings || !glGetTransformFeedbackVarying ||\n      !glVertexAttribIPointer || !glGetVertexAttribIiv ||\n      !glGetVertexAttribIuiv || !glVertexAttribI4i || !glVertexAttribI4ui ||\n      !glVertexAttribI4iv || !glVertexAttribI4uiv || !glGetUniformuiv ||\n      !glGetFragDataLocation || !glUniform1ui || !glUniform2ui ||\n      !glUniform3ui || !glUniform4ui || !glUniform1uiv || !glUniform2uiv ||\n      !glUniform3uiv || !glUniform4uiv || !glClearBufferiv ||\n      !glClearBufferuiv || !glClearBufferfv || !glClearBufferfi ||\n      !glGetStringi || !glCopyBufferSubData || !glGetUniformIndices ||\n      !glGetActiveUniformsiv || !glGetUniformBlockIndex ||\n      !glGetActiveUniformBlockiv || !glGetActiveUniformBlockName ||\n      !glUniformBlockBinding || !glDrawArraysInstanced ||\n      !glDrawElementsInstanced || !glFenceSync || !glIsSync || !glDeleteSync ||\n      !glClientWaitSync || !glWaitSync || !glGetInteger64v || !glGetSynciv ||\n      !glGetInteger64i_v || !glGetBufferParameteri64v || !glGenSamplers ||\n      !glDeleteSamplers || !glIsSampler || !glBindSampler ||\n      !glSamplerParameteri || !glSamplerParameteriv || !glSamplerParameterf ||\n      !glSamplerParameterfv || !glGetSamplerParameteriv ||\n      !glGetSamplerParameterfv || !glVertexAttribDivisor ||\n      !glBindTransformFeedback || !glDeleteTransformFeedbacks ||\n      !glGenTransformFeedbacks || !glIsTransformFeedback ||\n      !glPauseTransformFeedback || !glResumeTransformFeedback ||\n      !glGetProgramBinary || !glProgramBinary || !glProgramParameteri ||\n      !glInvalidateFramebuffer || !glInvalidateSubFramebuffer ||\n      !glTexStorage2D || !glTexStorage3D || !glGetInternalformativ) {\n    return GL_FALSE;\n  }\n\n  return GL_TRUE;\n}\n\n/* Function pointer definitions */ GL_APICALL void (*GL_APIENTRY glReadBuffer)(\n    GLenum mode);\nGL_APICALL void (*GL_APIENTRY glDrawRangeElements)(GLenum mode, GLuint start,\n                                                   GLuint end, GLsizei count,\n                                                   GLenum type,\n                                                   const GLvoid* indices);\nGL_APICALL void (*GL_APIENTRY glTexImage3D)(GLenum target, GLint level,\n                                            GLint internalformat, GLsizei width,\n                                            GLsizei height, GLsizei depth,\n                                            GLint border, GLenum format,\n                                            GLenum type, const GLvoid* pixels);\nGL_APICALL void (*GL_APIENTRY glTexSubImage3D)(GLenum target, GLint level,\n                                               GLint xoffset, GLint yoffset,\n                                               GLint zoffset, GLsizei width,\n                                               GLsizei height, GLsizei depth,\n                                               GLenum format, GLenum type,\n                                               const GLvoid* pixels);\nGL_APICALL void (*GL_APIENTRY glCopyTexSubImage3D)(GLenum target, GLint level,\n                                                   GLint xoffset, GLint yoffset,\n                                                   GLint zoffset, GLint x,\n                                                   GLint y, GLsizei width,\n                                                   GLsizei height);\nGL_APICALL void (*GL_APIENTRY glCompressedTexImage3D)(\n    GLenum target, GLint level, GLenum internalformat, GLsizei width,\n    GLsizei height, GLsizei depth, GLint border, GLsizei imageSize,\n    const GLvoid* data);\nGL_APICALL void (*GL_APIENTRY glCompressedTexSubImage3D)(\n    GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,\n    GLsizei width, GLsizei height, GLsizei depth, GLenum format,\n    GLsizei imageSize, const GLvoid* data);\nGL_APICALL void (*GL_APIENTRY glGenQueries)(GLsizei n, GLuint* ids);\nGL_APICALL void (*GL_APIENTRY glDeleteQueries)(GLsizei n, const GLuint* ids);\nGL_APICALL GLboolean (*GL_APIENTRY glIsQuery)(GLuint id);\nGL_APICALL void (*GL_APIENTRY glBeginQuery)(GLenum target, GLuint id);\nGL_APICALL void (*GL_APIENTRY glEndQuery)(GLenum target);\nGL_APICALL void (*GL_APIENTRY glGetQueryiv)(GLenum target, GLenum pname,\n                                            GLint* params);\nGL_APICALL void (*GL_APIENTRY glGetQueryObjectuiv)(GLuint id, GLenum pname,\n                                                   GLuint* params);\nGL_APICALL GLboolean (*GL_APIENTRY glUnmapBuffer)(GLenum target);\nGL_APICALL void (*GL_APIENTRY glGetBufferPointerv)(GLenum target, GLenum pname,\n                                                   GLvoid** params);\nGL_APICALL void (*GL_APIENTRY glDrawBuffers)(GLsizei n, const GLenum* bufs);\nGL_APICALL void (*GL_APIENTRY glUniformMatrix2x3fv)(GLint location,\n                                                    GLsizei count,\n                                                    GLboolean transpose,\n                                                    const GLfloat* value);\nGL_APICALL void (*GL_APIENTRY glUniformMatrix3x2fv)(GLint location,\n                                                    GLsizei count,\n                                                    GLboolean transpose,\n                                                    const GLfloat* value);\nGL_APICALL void (*GL_APIENTRY glUniformMatrix2x4fv)(GLint location,\n                                                    GLsizei count,\n                                                    GLboolean transpose,\n                                                    const GLfloat* value);\nGL_APICALL void (*GL_APIENTRY glUniformMatrix4x2fv)(GLint location,\n                                                    GLsizei count,\n                                                    GLboolean transpose,\n                                                    const GLfloat* value);\nGL_APICALL void (*GL_APIENTRY glUniformMatrix3x4fv)(GLint location,\n                                                    GLsizei count,\n                                                    GLboolean transpose,\n                                                    const GLfloat* value);\nGL_APICALL void (*GL_APIENTRY glUniformMatrix4x3fv)(GLint location,\n                                                    GLsizei count,\n                                                    GLboolean transpose,\n                                                    const GLfloat* value);\nGL_APICALL void (*GL_APIENTRY glBlitFramebuffer)(\n    GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0,\n    GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);\nGL_APICALL void (*GL_APIENTRY glRenderbufferStorageMultisample)(\n    GLenum target, GLsizei samples, GLenum internalformat, GLsizei width,\n    GLsizei height);\nGL_APICALL void (*GL_APIENTRY glFramebufferTextureLayer)(\n    GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);\nGL_APICALL GLvoid* (*GL_APIENTRY glMapBufferRange)(GLenum target,\n                                                   GLintptr offset,\n                                                   GLsizeiptr length,\n                                                   GLbitfield access);\nGL_APICALL void (*GL_APIENTRY glFlushMappedBufferRange)(GLenum target,\n                                                        GLintptr offset,\n                                                        GLsizeiptr length);\nGL_APICALL void (*GL_APIENTRY glBindVertexArray)(GLuint array);\nGL_APICALL void (*GL_APIENTRY glDeleteVertexArrays)(GLsizei n,\n                                                    const GLuint* arrays);\nGL_APICALL void (*GL_APIENTRY glGenVertexArrays)(GLsizei n, GLuint* arrays);\nGL_APICALL GLboolean (*GL_APIENTRY glIsVertexArray)(GLuint array);\nGL_APICALL void (*GL_APIENTRY glGetIntegeri_v)(GLenum target, GLuint index,\n                                               GLint* data);\nGL_APICALL void (*GL_APIENTRY glBeginTransformFeedback)(GLenum primitiveMode);\nGL_APICALL void (*GL_APIENTRY glEndTransformFeedback)(void);\nGL_APICALL void (*GL_APIENTRY glBindBufferRange)(GLenum target, GLuint index,\n                                                 GLuint buffer, GLintptr offset,\n                                                 GLsizeiptr size);\nGL_APICALL void (*GL_APIENTRY glBindBufferBase)(GLenum target, GLuint index,\n                                                GLuint buffer);\nGL_APICALL void (*GL_APIENTRY glTransformFeedbackVaryings)(\n    GLuint program, GLsizei count, const GLchar* const* varyings,\n    GLenum bufferMode);\nGL_APICALL void (*GL_APIENTRY glGetTransformFeedbackVarying)(\n    GLuint program, GLuint index, GLsizei bufSize, GLsizei* length,\n    GLsizei* size, GLenum* type, GLchar* name);\nGL_APICALL void (*GL_APIENTRY glVertexAttribIPointer)(GLuint index, GLint size,\n                                                      GLenum type,\n                                                      GLsizei stride,\n                                                      const GLvoid* pointer);\nGL_APICALL void (*GL_APIENTRY glGetVertexAttribIiv)(GLuint index, GLenum pname,\n                                                    GLint* params);\nGL_APICALL void (*GL_APIENTRY glGetVertexAttribIuiv)(GLuint index, GLenum pname,\n                                                     GLuint* params);\nGL_APICALL void (*GL_APIENTRY glVertexAttribI4i)(GLuint index, GLint x, GLint y,\n                                                 GLint z, GLint w);\nGL_APICALL void (*GL_APIENTRY glVertexAttribI4ui)(GLuint index, GLuint x,\n                                                  GLuint y, GLuint z, GLuint w);\nGL_APICALL void (*GL_APIENTRY glVertexAttribI4iv)(GLuint index, const GLint* v);\nGL_APICALL void (*GL_APIENTRY glVertexAttribI4uiv)(GLuint index,\n                                                   const GLuint* v);\nGL_APICALL void (*GL_APIENTRY glGetUniformuiv)(GLuint program, GLint location,\n                                               GLuint* params);\nGL_APICALL GLint (*GL_APIENTRY glGetFragDataLocation)(GLuint program,\n                                                      const GLchar* name);\nGL_APICALL void (*GL_APIENTRY glUniform1ui)(GLint location, GLuint v0);\nGL_APICALL void (*GL_APIENTRY glUniform2ui)(GLint location, GLuint v0,\n                                            GLuint v1);\nGL_APICALL void (*GL_APIENTRY glUniform3ui)(GLint location, GLuint v0,\n                                            GLuint v1, GLuint v2);\nGL_APICALL void (*GL_APIENTRY glUniform4ui)(GLint location, GLuint v0,\n                                            GLuint v1, GLuint v2, GLuint v3);\nGL_APICALL void (*GL_APIENTRY glUniform1uiv)(GLint location, GLsizei count,\n                                             const GLuint* value);\nGL_APICALL void (*GL_APIENTRY glUniform2uiv)(GLint location, GLsizei count,\n                                             const GLuint* value);\nGL_APICALL void (*GL_APIENTRY glUniform3uiv)(GLint location, GLsizei count,\n                                             const GLuint* value);\nGL_APICALL void (*GL_APIENTRY glUniform4uiv)(GLint location, GLsizei count,\n                                             const GLuint* value);\nGL_APICALL void (*GL_APIENTRY glClearBufferiv)(GLenum buffer, GLint drawbuffer,\n                                               const GLint* value);\nGL_APICALL void (*GL_APIENTRY glClearBufferuiv)(GLenum buffer, GLint drawbuffer,\n                                                const GLuint* value);\nGL_APICALL void (*GL_APIENTRY glClearBufferfv)(GLenum buffer, GLint drawbuffer,\n                                               const GLfloat* value);\nGL_APICALL void (*GL_APIENTRY glClearBufferfi)(GLenum buffer, GLint drawbuffer,\n                                               GLfloat depth, GLint stencil);\nGL_APICALL const GLubyte* (*GL_APIENTRY glGetStringi)(GLenum name,\n                                                      GLuint index);\nGL_APICALL void (*GL_APIENTRY glCopyBufferSubData)(GLenum readTarget,\n                                                   GLenum writeTarget,\n                                                   GLintptr readOffset,\n                                                   GLintptr writeOffset,\n                                                   GLsizeiptr size);\nGL_APICALL void (*GL_APIENTRY glGetUniformIndices)(\n    GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames,\n    GLuint* uniformIndices);\nGL_APICALL void (*GL_APIENTRY glGetActiveUniformsiv)(\n    GLuint program, GLsizei uniformCount, const GLuint* uniformIndices,\n    GLenum pname, GLint* params);\nGL_APICALL GLuint (*GL_APIENTRY glGetUniformBlockIndex)(\n    GLuint program, const GLchar* uniformBlockName);\nGL_APICALL void (*GL_APIENTRY glGetActiveUniformBlockiv)(\n    GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params);\nGL_APICALL void (*GL_APIENTRY glGetActiveUniformBlockName)(\n    GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length,\n    GLchar* uniformBlockName);\nGL_APICALL void (*GL_APIENTRY glUniformBlockBinding)(\n    GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);\nGL_APICALL void (*GL_APIENTRY glDrawArraysInstanced)(GLenum mode, GLint first,\n                                                     GLsizei count,\n                                                     GLsizei instanceCount);\nGL_APICALL void (*GL_APIENTRY glDrawElementsInstanced)(GLenum mode,\n                                                       GLsizei count,\n                                                       GLenum type,\n                                                       const GLvoid* indices,\n                                                       GLsizei instanceCount);\nGL_APICALL GLsync (*GL_APIENTRY glFenceSync)(GLenum condition,\n                                             GLbitfield flags);\nGL_APICALL GLboolean (*GL_APIENTRY glIsSync)(GLsync sync);\nGL_APICALL void (*GL_APIENTRY glDeleteSync)(GLsync sync);\nGL_APICALL GLenum (*GL_APIENTRY glClientWaitSync)(GLsync sync, GLbitfield flags,\n                                                  GLuint64 timeout);\nGL_APICALL void (*GL_APIENTRY glWaitSync)(GLsync sync, GLbitfield flags,\n                                          GLuint64 timeout);\nGL_APICALL void (*GL_APIENTRY glGetInteger64v)(GLenum pname, GLint64* params);\nGL_APICALL void (*GL_APIENTRY glGetSynciv)(GLsync sync, GLenum pname,\n                                           GLsizei bufSize, GLsizei* length,\n                                           GLint* values);\nGL_APICALL void (*GL_APIENTRY glGetInteger64i_v)(GLenum target, GLuint index,\n                                                 GLint64* data);\nGL_APICALL void (*GL_APIENTRY glGetBufferParameteri64v)(GLenum target,\n                                                        GLenum pname,\n                                                        GLint64* params);\nGL_APICALL void (*GL_APIENTRY glGenSamplers)(GLsizei count, GLuint* samplers);\nGL_APICALL void (*GL_APIENTRY glDeleteSamplers)(GLsizei count,\n                                                const GLuint* samplers);\nGL_APICALL GLboolean (*GL_APIENTRY glIsSampler)(GLuint sampler);\nGL_APICALL void (*GL_APIENTRY glBindSampler)(GLuint unit, GLuint sampler);\nGL_APICALL void (*GL_APIENTRY glSamplerParameteri)(GLuint sampler, GLenum pname,\n                                                   GLint param);\nGL_APICALL void (*GL_APIENTRY glSamplerParameteriv)(GLuint sampler,\n                                                    GLenum pname,\n                                                    const GLint* param);\nGL_APICALL void (*GL_APIENTRY glSamplerParameterf)(GLuint sampler, GLenum pname,\n                                                   GLfloat param);\nGL_APICALL void (*GL_APIENTRY glSamplerParameterfv)(GLuint sampler,\n                                                    GLenum pname,\n                                                    const GLfloat* param);\nGL_APICALL void (*GL_APIENTRY glGetSamplerParameteriv)(GLuint sampler,\n                                                       GLenum pname,\n                                                       GLint* params);\nGL_APICALL void (*GL_APIENTRY glGetSamplerParameterfv)(GLuint sampler,\n                                                       GLenum pname,\n                                                       GLfloat* params);\nGL_APICALL void (*GL_APIENTRY glVertexAttribDivisor)(GLuint index,\n                                                     GLuint divisor);\nGL_APICALL void (*GL_APIENTRY glBindTransformFeedback)(GLenum target,\n                                                       GLuint id);\nGL_APICALL void (*GL_APIENTRY glDeleteTransformFeedbacks)(GLsizei n,\n                                                          const GLuint* ids);\nGL_APICALL void (*GL_APIENTRY glGenTransformFeedbacks)(GLsizei n, GLuint* ids);\nGL_APICALL GLboolean (*GL_APIENTRY glIsTransformFeedback)(GLuint id);\nGL_APICALL void (*GL_APIENTRY glPauseTransformFeedback)(void);\nGL_APICALL void (*GL_APIENTRY glResumeTransformFeedback)(void);\nGL_APICALL void (*GL_APIENTRY glGetProgramBinary)(GLuint program,\n                                                  GLsizei bufSize,\n                                                  GLsizei* length,\n                                                  GLenum* binaryFormat,\n                                                  GLvoid* binary);\nGL_APICALL void (*GL_APIENTRY glProgramBinary)(GLuint program,\n                                               GLenum binaryFormat,\n                                               const GLvoid* binary,\n                                               GLsizei length);\nGL_APICALL void (*GL_APIENTRY glProgramParameteri)(GLuint program, GLenum pname,\n                                                   GLint value);\nGL_APICALL void (*GL_APIENTRY glInvalidateFramebuffer)(\n    GLenum target, GLsizei numAttachments, const GLenum* attachments);\nGL_APICALL void (*GL_APIENTRY glInvalidateSubFramebuffer)(\n    GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x,\n    GLint y, GLsizei width, GLsizei height);\nGL_APICALL void (*GL_APIENTRY glTexStorage2D)(GLenum target, GLsizei levels,\n                                              GLenum internalformat,\n                                              GLsizei width, GLsizei height);\nGL_APICALL void (*GL_APIENTRY glTexStorage3D)(GLenum target, GLsizei levels,\n                                              GLenum internalformat,\n                                              GLsizei width, GLsizei height,\n                                              GLsizei depth);\nGL_APICALL void (*GL_APIENTRY glGetInternalformativ)(GLenum target,\n                                                     GLenum internalformat,\n                                                     GLenum pname,\n                                                     GLsizei bufSize,\n                                                     GLint* params);\n"
  },
  {
    "path": "teapots/common/ndk_helper/gl3stub.cpp",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"gl3stub.h\"\n\n#include <EGL/egl.h>\n\nGLboolean gl3stubInit() {\n#define FIND_PROC(s) s = (decltype(s))eglGetProcAddress(#s);\n  FIND_PROC(glReadBuffer);\n  FIND_PROC(glDrawRangeElements);\n  FIND_PROC(glTexImage3D);\n  FIND_PROC(glTexSubImage3D);\n  FIND_PROC(glCopyTexSubImage3D);\n  FIND_PROC(glCompressedTexImage3D);\n  FIND_PROC(glCompressedTexSubImage3D);\n  FIND_PROC(glGenQueries);\n  FIND_PROC(glDeleteQueries);\n  FIND_PROC(glIsQuery);\n  FIND_PROC(glBeginQuery);\n  FIND_PROC(glEndQuery);\n  FIND_PROC(glGetQueryiv);\n  FIND_PROC(glGetQueryObjectuiv);\n  FIND_PROC(glUnmapBuffer);\n  FIND_PROC(glGetBufferPointerv);\n  FIND_PROC(glDrawBuffers);\n  FIND_PROC(glUniformMatrix2x3fv);\n  FIND_PROC(glUniformMatrix3x2fv);\n  FIND_PROC(glUniformMatrix2x4fv);\n  FIND_PROC(glUniformMatrix4x2fv);\n  FIND_PROC(glUniformMatrix3x4fv);\n  FIND_PROC(glUniformMatrix4x3fv);\n  FIND_PROC(glBlitFramebuffer);\n  FIND_PROC(glRenderbufferStorageMultisample);\n  FIND_PROC(glFramebufferTextureLayer);\n  FIND_PROC(glMapBufferRange);\n  FIND_PROC(glFlushMappedBufferRange);\n  FIND_PROC(glBindVertexArray);\n  FIND_PROC(glDeleteVertexArrays);\n  FIND_PROC(glGenVertexArrays);\n  FIND_PROC(glIsVertexArray);\n  FIND_PROC(glGetIntegeri_v);\n  FIND_PROC(glBeginTransformFeedback);\n  FIND_PROC(glEndTransformFeedback);\n  FIND_PROC(glBindBufferRange);\n  FIND_PROC(glBindBufferBase);\n  FIND_PROC(glTransformFeedbackVaryings);\n  FIND_PROC(glGetTransformFeedbackVarying);\n  FIND_PROC(glVertexAttribIPointer);\n  FIND_PROC(glGetVertexAttribIiv);\n  FIND_PROC(glGetVertexAttribIuiv);\n  FIND_PROC(glVertexAttribI4i);\n  FIND_PROC(glVertexAttribI4ui);\n  FIND_PROC(glVertexAttribI4iv);\n  FIND_PROC(glVertexAttribI4uiv);\n  FIND_PROC(glGetUniformuiv);\n  FIND_PROC(glGetFragDataLocation);\n  FIND_PROC(glUniform1ui);\n  FIND_PROC(glUniform2ui);\n  FIND_PROC(glUniform3ui);\n  FIND_PROC(glUniform4ui);\n  FIND_PROC(glUniform1uiv);\n  FIND_PROC(glUniform2uiv);\n  FIND_PROC(glUniform3uiv);\n  FIND_PROC(glUniform4uiv);\n  FIND_PROC(glClearBufferiv);\n  FIND_PROC(glClearBufferuiv);\n  FIND_PROC(glClearBufferfv);\n  FIND_PROC(glClearBufferfi);\n  FIND_PROC(glGetStringi);\n  FIND_PROC(glCopyBufferSubData);\n  FIND_PROC(glGetUniformIndices);\n  FIND_PROC(glGetActiveUniformsiv);\n  FIND_PROC(glGetUniformBlockIndex);\n  FIND_PROC(glGetActiveUniformBlockiv);\n  FIND_PROC(glGetActiveUniformBlockName);\n  FIND_PROC(glUniformBlockBinding);\n  FIND_PROC(glDrawArraysInstanced);\n  FIND_PROC(glDrawElementsInstanced);\n  FIND_PROC(glFenceSync);\n  FIND_PROC(glIsSync);\n  FIND_PROC(glDeleteSync);\n  FIND_PROC(glClientWaitSync);\n  FIND_PROC(glWaitSync);\n  FIND_PROC(glGetInteger64v);\n  FIND_PROC(glGetSynciv);\n  FIND_PROC(glGetInteger64i_v);\n  FIND_PROC(glGetBufferParameteri64v);\n  FIND_PROC(glGenSamplers);\n  FIND_PROC(glDeleteSamplers);\n  FIND_PROC(glIsSampler);\n  FIND_PROC(glBindSampler);\n  FIND_PROC(glSamplerParameteri);\n  FIND_PROC(glSamplerParameteriv);\n  FIND_PROC(glSamplerParameterf);\n  FIND_PROC(glSamplerParameterfv);\n  FIND_PROC(glGetSamplerParameteriv);\n  FIND_PROC(glGetSamplerParameterfv);\n  FIND_PROC(glVertexAttribDivisor);\n  FIND_PROC(glBindTransformFeedback);\n  FIND_PROC(glDeleteTransformFeedbacks);\n  FIND_PROC(glGenTransformFeedbacks);\n  FIND_PROC(glIsTransformFeedback);\n  FIND_PROC(glPauseTransformFeedback);\n  FIND_PROC(glResumeTransformFeedback);\n  FIND_PROC(glGetProgramBinary);\n  FIND_PROC(glProgramBinary);\n  FIND_PROC(glProgramParameteri);\n  FIND_PROC(glInvalidateFramebuffer);\n  FIND_PROC(glInvalidateSubFramebuffer);\n  FIND_PROC(glTexStorage2D);\n  FIND_PROC(glTexStorage3D);\n  FIND_PROC(glGetInternalformativ);\n#undef FIND_PROC\n\n  if (!glReadBuffer || !glDrawRangeElements || !glTexImage3D ||\n      !glTexSubImage3D || !glCopyTexSubImage3D || !glCompressedTexImage3D ||\n      !glCompressedTexSubImage3D || !glGenQueries || !glDeleteQueries ||\n      !glIsQuery || !glBeginQuery || !glEndQuery || !glGetQueryiv ||\n      !glGetQueryObjectuiv || !glUnmapBuffer || !glGetBufferPointerv ||\n      !glDrawBuffers || !glUniformMatrix2x3fv || !glUniformMatrix3x2fv ||\n      !glUniformMatrix2x4fv || !glUniformMatrix4x2fv || !glUniformMatrix3x4fv ||\n      !glUniformMatrix4x3fv || !glBlitFramebuffer ||\n      !glRenderbufferStorageMultisample || !glFramebufferTextureLayer ||\n      !glMapBufferRange || !glFlushMappedBufferRange || !glBindVertexArray ||\n      !glDeleteVertexArrays || !glGenVertexArrays || !glIsVertexArray ||\n      !glGetIntegeri_v || !glBeginTransformFeedback ||\n      !glEndTransformFeedback || !glBindBufferRange || !glBindBufferBase ||\n      !glTransformFeedbackVaryings || !glGetTransformFeedbackVarying ||\n      !glVertexAttribIPointer || !glGetVertexAttribIiv ||\n      !glGetVertexAttribIuiv || !glVertexAttribI4i || !glVertexAttribI4ui ||\n      !glVertexAttribI4iv || !glVertexAttribI4uiv || !glGetUniformuiv ||\n      !glGetFragDataLocation || !glUniform1ui || !glUniform2ui ||\n      !glUniform3ui || !glUniform4ui || !glUniform1uiv || !glUniform2uiv ||\n      !glUniform3uiv || !glUniform4uiv || !glClearBufferiv ||\n      !glClearBufferuiv || !glClearBufferfv || !glClearBufferfi ||\n      !glGetStringi || !glCopyBufferSubData || !glGetUniformIndices ||\n      !glGetActiveUniformsiv || !glGetUniformBlockIndex ||\n      !glGetActiveUniformBlockiv || !glGetActiveUniformBlockName ||\n      !glUniformBlockBinding || !glDrawArraysInstanced ||\n      !glDrawElementsInstanced || !glFenceSync || !glIsSync || !glDeleteSync ||\n      !glClientWaitSync || !glWaitSync || !glGetInteger64v || !glGetSynciv ||\n      !glGetInteger64i_v || !glGetBufferParameteri64v || !glGenSamplers ||\n      !glDeleteSamplers || !glIsSampler || !glBindSampler ||\n      !glSamplerParameteri || !glSamplerParameteriv || !glSamplerParameterf ||\n      !glSamplerParameterfv || !glGetSamplerParameteriv ||\n      !glGetSamplerParameterfv || !glVertexAttribDivisor ||\n      !glBindTransformFeedback || !glDeleteTransformFeedbacks ||\n      !glGenTransformFeedbacks || !glIsTransformFeedback ||\n      !glPauseTransformFeedback || !glResumeTransformFeedback ||\n      !glGetProgramBinary || !glProgramBinary || !glProgramParameteri ||\n      !glInvalidateFramebuffer || !glInvalidateSubFramebuffer ||\n      !glTexStorage2D || !glTexStorage3D || !glGetInternalformativ) {\n    return GL_FALSE;\n  }\n\n  return GL_TRUE;\n}\n\n/* Function pointer definitions */ GL_APICALL void (*GL_APIENTRY glReadBuffer)(\n    GLenum mode);\nGL_APICALL void (*GL_APIENTRY glDrawRangeElements)(GLenum mode, GLuint start,\n                                                   GLuint end, GLsizei count,\n                                                   GLenum type,\n                                                   const GLvoid* indices);\nGL_APICALL void (*GL_APIENTRY glTexImage3D)(GLenum target, GLint level,\n                                            GLint internalformat, GLsizei width,\n                                            GLsizei height, GLsizei depth,\n                                            GLint border, GLenum format,\n                                            GLenum type, const GLvoid* pixels);\nGL_APICALL void (*GL_APIENTRY glTexSubImage3D)(GLenum target, GLint level,\n                                               GLint xoffset, GLint yoffset,\n                                               GLint zoffset, GLsizei width,\n                                               GLsizei height, GLsizei depth,\n                                               GLenum format, GLenum type,\n                                               const GLvoid* pixels);\nGL_APICALL void (*GL_APIENTRY glCopyTexSubImage3D)(GLenum target, GLint level,\n                                                   GLint xoffset, GLint yoffset,\n                                                   GLint zoffset, GLint x,\n                                                   GLint y, GLsizei width,\n                                                   GLsizei height);\nGL_APICALL void (*GL_APIENTRY glCompressedTexImage3D)(\n    GLenum target, GLint level, GLenum internalformat, GLsizei width,\n    GLsizei height, GLsizei depth, GLint border, GLsizei imageSize,\n    const GLvoid* data);\nGL_APICALL void (*GL_APIENTRY glCompressedTexSubImage3D)(\n    GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,\n    GLsizei width, GLsizei height, GLsizei depth, GLenum format,\n    GLsizei imageSize, const GLvoid* data);\nGL_APICALL void (*GL_APIENTRY glGenQueries)(GLsizei n, GLuint* ids);\nGL_APICALL void (*GL_APIENTRY glDeleteQueries)(GLsizei n, const GLuint* ids);\nGL_APICALL GLboolean (*GL_APIENTRY glIsQuery)(GLuint id);\nGL_APICALL void (*GL_APIENTRY glBeginQuery)(GLenum target, GLuint id);\nGL_APICALL void (*GL_APIENTRY glEndQuery)(GLenum target);\nGL_APICALL void (*GL_APIENTRY glGetQueryiv)(GLenum target, GLenum pname,\n                                            GLint* params);\nGL_APICALL void (*GL_APIENTRY glGetQueryObjectuiv)(GLuint id, GLenum pname,\n                                                   GLuint* params);\nGL_APICALL GLboolean (*GL_APIENTRY glUnmapBuffer)(GLenum target);\nGL_APICALL void (*GL_APIENTRY glGetBufferPointerv)(GLenum target, GLenum pname,\n                                                   GLvoid** params);\nGL_APICALL void (*GL_APIENTRY glDrawBuffers)(GLsizei n, const GLenum* bufs);\nGL_APICALL void (*GL_APIENTRY glUniformMatrix2x3fv)(GLint location,\n                                                    GLsizei count,\n                                                    GLboolean transpose,\n                                                    const GLfloat* value);\nGL_APICALL void (*GL_APIENTRY glUniformMatrix3x2fv)(GLint location,\n                                                    GLsizei count,\n                                                    GLboolean transpose,\n                                                    const GLfloat* value);\nGL_APICALL void (*GL_APIENTRY glUniformMatrix2x4fv)(GLint location,\n                                                    GLsizei count,\n                                                    GLboolean transpose,\n                                                    const GLfloat* value);\nGL_APICALL void (*GL_APIENTRY glUniformMatrix4x2fv)(GLint location,\n                                                    GLsizei count,\n                                                    GLboolean transpose,\n                                                    const GLfloat* value);\nGL_APICALL void (*GL_APIENTRY glUniformMatrix3x4fv)(GLint location,\n                                                    GLsizei count,\n                                                    GLboolean transpose,\n                                                    const GLfloat* value);\nGL_APICALL void (*GL_APIENTRY glUniformMatrix4x3fv)(GLint location,\n                                                    GLsizei count,\n                                                    GLboolean transpose,\n                                                    const GLfloat* value);\nGL_APICALL void (*GL_APIENTRY glBlitFramebuffer)(\n    GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0,\n    GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);\nGL_APICALL void (*GL_APIENTRY glRenderbufferStorageMultisample)(\n    GLenum target, GLsizei samples, GLenum internalformat, GLsizei width,\n    GLsizei height);\nGL_APICALL void (*GL_APIENTRY glFramebufferTextureLayer)(\n    GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);\nGL_APICALL GLvoid* (*GL_APIENTRY glMapBufferRange)(GLenum target,\n                                                   GLintptr offset,\n                                                   GLsizeiptr length,\n                                                   GLbitfield access);\nGL_APICALL void (*GL_APIENTRY glFlushMappedBufferRange)(GLenum target,\n                                                        GLintptr offset,\n                                                        GLsizeiptr length);\nGL_APICALL void (*GL_APIENTRY glBindVertexArray)(GLuint array);\nGL_APICALL void (*GL_APIENTRY glDeleteVertexArrays)(GLsizei n,\n                                                    const GLuint* arrays);\nGL_APICALL void (*GL_APIENTRY glGenVertexArrays)(GLsizei n, GLuint* arrays);\nGL_APICALL GLboolean (*GL_APIENTRY glIsVertexArray)(GLuint array);\nGL_APICALL void (*GL_APIENTRY glGetIntegeri_v)(GLenum target, GLuint index,\n                                               GLint* data);\nGL_APICALL void (*GL_APIENTRY glBeginTransformFeedback)(GLenum primitiveMode);\nGL_APICALL void (*GL_APIENTRY glEndTransformFeedback)(void);\nGL_APICALL void (*GL_APIENTRY glBindBufferRange)(GLenum target, GLuint index,\n                                                 GLuint buffer, GLintptr offset,\n                                                 GLsizeiptr size);\nGL_APICALL void (*GL_APIENTRY glBindBufferBase)(GLenum target, GLuint index,\n                                                GLuint buffer);\nGL_APICALL void (*GL_APIENTRY glTransformFeedbackVaryings)(\n    GLuint program, GLsizei count, const GLchar* const* varyings,\n    GLenum bufferMode);\nGL_APICALL void (*GL_APIENTRY glGetTransformFeedbackVarying)(\n    GLuint program, GLuint index, GLsizei bufSize, GLsizei* length,\n    GLsizei* size, GLenum* type, GLchar* name);\nGL_APICALL void (*GL_APIENTRY glVertexAttribIPointer)(GLuint index, GLint size,\n                                                      GLenum type,\n                                                      GLsizei stride,\n                                                      const GLvoid* pointer);\nGL_APICALL void (*GL_APIENTRY glGetVertexAttribIiv)(GLuint index, GLenum pname,\n                                                    GLint* params);\nGL_APICALL void (*GL_APIENTRY glGetVertexAttribIuiv)(GLuint index, GLenum pname,\n                                                     GLuint* params);\nGL_APICALL void (*GL_APIENTRY glVertexAttribI4i)(GLuint index, GLint x, GLint y,\n                                                 GLint z, GLint w);\nGL_APICALL void (*GL_APIENTRY glVertexAttribI4ui)(GLuint index, GLuint x,\n                                                  GLuint y, GLuint z, GLuint w);\nGL_APICALL void (*GL_APIENTRY glVertexAttribI4iv)(GLuint index, const GLint* v);\nGL_APICALL void (*GL_APIENTRY glVertexAttribI4uiv)(GLuint index,\n                                                   const GLuint* v);\nGL_APICALL void (*GL_APIENTRY glGetUniformuiv)(GLuint program, GLint location,\n                                               GLuint* params);\nGL_APICALL GLint (*GL_APIENTRY glGetFragDataLocation)(GLuint program,\n                                                      const GLchar* name);\nGL_APICALL void (*GL_APIENTRY glUniform1ui)(GLint location, GLuint v0);\nGL_APICALL void (*GL_APIENTRY glUniform2ui)(GLint location, GLuint v0,\n                                            GLuint v1);\nGL_APICALL void (*GL_APIENTRY glUniform3ui)(GLint location, GLuint v0,\n                                            GLuint v1, GLuint v2);\nGL_APICALL void (*GL_APIENTRY glUniform4ui)(GLint location, GLuint v0,\n                                            GLuint v1, GLuint v2, GLuint v3);\nGL_APICALL void (*GL_APIENTRY glUniform1uiv)(GLint location, GLsizei count,\n                                             const GLuint* value);\nGL_APICALL void (*GL_APIENTRY glUniform2uiv)(GLint location, GLsizei count,\n                                             const GLuint* value);\nGL_APICALL void (*GL_APIENTRY glUniform3uiv)(GLint location, GLsizei count,\n                                             const GLuint* value);\nGL_APICALL void (*GL_APIENTRY glUniform4uiv)(GLint location, GLsizei count,\n                                             const GLuint* value);\nGL_APICALL void (*GL_APIENTRY glClearBufferiv)(GLenum buffer, GLint drawbuffer,\n                                               const GLint* value);\nGL_APICALL void (*GL_APIENTRY glClearBufferuiv)(GLenum buffer, GLint drawbuffer,\n                                                const GLuint* value);\nGL_APICALL void (*GL_APIENTRY glClearBufferfv)(GLenum buffer, GLint drawbuffer,\n                                               const GLfloat* value);\nGL_APICALL void (*GL_APIENTRY glClearBufferfi)(GLenum buffer, GLint drawbuffer,\n                                               GLfloat depth, GLint stencil);\nGL_APICALL const GLubyte* (*GL_APIENTRY glGetStringi)(GLenum name,\n                                                      GLuint index);\nGL_APICALL void (*GL_APIENTRY glCopyBufferSubData)(GLenum readTarget,\n                                                   GLenum writeTarget,\n                                                   GLintptr readOffset,\n                                                   GLintptr writeOffset,\n                                                   GLsizeiptr size);\nGL_APICALL void (*GL_APIENTRY glGetUniformIndices)(\n    GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames,\n    GLuint* uniformIndices);\nGL_APICALL void (*GL_APIENTRY glGetActiveUniformsiv)(\n    GLuint program, GLsizei uniformCount, const GLuint* uniformIndices,\n    GLenum pname, GLint* params);\nGL_APICALL GLuint (*GL_APIENTRY glGetUniformBlockIndex)(\n    GLuint program, const GLchar* uniformBlockName);\nGL_APICALL void (*GL_APIENTRY glGetActiveUniformBlockiv)(\n    GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params);\nGL_APICALL void (*GL_APIENTRY glGetActiveUniformBlockName)(\n    GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length,\n    GLchar* uniformBlockName);\nGL_APICALL void (*GL_APIENTRY glUniformBlockBinding)(\n    GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);\nGL_APICALL void (*GL_APIENTRY glDrawArraysInstanced)(GLenum mode, GLint first,\n                                                     GLsizei count,\n                                                     GLsizei instanceCount);\nGL_APICALL void (*GL_APIENTRY glDrawElementsInstanced)(GLenum mode,\n                                                       GLsizei count,\n                                                       GLenum type,\n                                                       const GLvoid* indices,\n                                                       GLsizei instanceCount);\nGL_APICALL GLsync (*GL_APIENTRY glFenceSync)(GLenum condition,\n                                             GLbitfield flags);\nGL_APICALL GLboolean (*GL_APIENTRY glIsSync)(GLsync sync);\nGL_APICALL void (*GL_APIENTRY glDeleteSync)(GLsync sync);\nGL_APICALL GLenum (*GL_APIENTRY glClientWaitSync)(GLsync sync, GLbitfield flags,\n                                                  GLuint64 timeout);\nGL_APICALL void (*GL_APIENTRY glWaitSync)(GLsync sync, GLbitfield flags,\n                                          GLuint64 timeout);\nGL_APICALL void (*GL_APIENTRY glGetInteger64v)(GLenum pname, GLint64* params);\nGL_APICALL void (*GL_APIENTRY glGetSynciv)(GLsync sync, GLenum pname,\n                                           GLsizei bufSize, GLsizei* length,\n                                           GLint* values);\nGL_APICALL void (*GL_APIENTRY glGetInteger64i_v)(GLenum target, GLuint index,\n                                                 GLint64* data);\nGL_APICALL void (*GL_APIENTRY glGetBufferParameteri64v)(GLenum target,\n                                                        GLenum pname,\n                                                        GLint64* params);\nGL_APICALL void (*GL_APIENTRY glGenSamplers)(GLsizei count, GLuint* samplers);\nGL_APICALL void (*GL_APIENTRY glDeleteSamplers)(GLsizei count,\n                                                const GLuint* samplers);\nGL_APICALL GLboolean (*GL_APIENTRY glIsSampler)(GLuint sampler);\nGL_APICALL void (*GL_APIENTRY glBindSampler)(GLuint unit, GLuint sampler);\nGL_APICALL void (*GL_APIENTRY glSamplerParameteri)(GLuint sampler, GLenum pname,\n                                                   GLint param);\nGL_APICALL void (*GL_APIENTRY glSamplerParameteriv)(GLuint sampler,\n                                                    GLenum pname,\n                                                    const GLint* param);\nGL_APICALL void (*GL_APIENTRY glSamplerParameterf)(GLuint sampler, GLenum pname,\n                                                   GLfloat param);\nGL_APICALL void (*GL_APIENTRY glSamplerParameterfv)(GLuint sampler,\n                                                    GLenum pname,\n                                                    const GLfloat* param);\nGL_APICALL void (*GL_APIENTRY glGetSamplerParameteriv)(GLuint sampler,\n                                                       GLenum pname,\n                                                       GLint* params);\nGL_APICALL void (*GL_APIENTRY glGetSamplerParameterfv)(GLuint sampler,\n                                                       GLenum pname,\n                                                       GLfloat* params);\nGL_APICALL void (*GL_APIENTRY glVertexAttribDivisor)(GLuint index,\n                                                     GLuint divisor);\nGL_APICALL void (*GL_APIENTRY glBindTransformFeedback)(GLenum target,\n                                                       GLuint id);\nGL_APICALL void (*GL_APIENTRY glDeleteTransformFeedbacks)(GLsizei n,\n                                                          const GLuint* ids);\nGL_APICALL void (*GL_APIENTRY glGenTransformFeedbacks)(GLsizei n, GLuint* ids);\nGL_APICALL GLboolean (*GL_APIENTRY glIsTransformFeedback)(GLuint id);\nGL_APICALL void (*GL_APIENTRY glPauseTransformFeedback)(void);\nGL_APICALL void (*GL_APIENTRY glResumeTransformFeedback)(void);\nGL_APICALL void (*GL_APIENTRY glGetProgramBinary)(GLuint program,\n                                                  GLsizei bufSize,\n                                                  GLsizei* length,\n                                                  GLenum* binaryFormat,\n                                                  GLvoid* binary);\nGL_APICALL void (*GL_APIENTRY glProgramBinary)(GLuint program,\n                                               GLenum binaryFormat,\n                                               const GLvoid* binary,\n                                               GLsizei length);\nGL_APICALL void (*GL_APIENTRY glProgramParameteri)(GLuint program, GLenum pname,\n                                                   GLint value);\nGL_APICALL void (*GL_APIENTRY glInvalidateFramebuffer)(\n    GLenum target, GLsizei numAttachments, const GLenum* attachments);\nGL_APICALL void (*GL_APIENTRY glInvalidateSubFramebuffer)(\n    GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x,\n    GLint y, GLsizei width, GLsizei height);\nGL_APICALL void (*GL_APIENTRY glTexStorage2D)(GLenum target, GLsizei levels,\n                                              GLenum internalformat,\n                                              GLsizei width, GLsizei height);\nGL_APICALL void (*GL_APIENTRY glTexStorage3D)(GLenum target, GLsizei levels,\n                                              GLenum internalformat,\n                                              GLsizei width, GLsizei height,\n                                              GLsizei depth);\nGL_APICALL void (*GL_APIENTRY glGetInternalformativ)(GLenum target,\n                                                     GLenum internalformat,\n                                                     GLenum pname,\n                                                     GLsizei bufSize,\n                                                     GLint* params);\n"
  },
  {
    "path": "teapots/common/ndk_helper/gl3stub.h",
    "content": "#ifndef __gl3_h_\n#define __gl3_h_\n\n/*\n * stub gl3.h for dynamic loading, based on:\n * gl3.h last updated on $Date: 2013-02-12 14:37:24 -0800 (Tue, 12 Feb 2013) $\n *\n * Changes:\n * - Added #include <GLES2/gl2.h>\n * - Removed duplicate OpenGL ES 2.0 declarations\n * - Converted OpenGL ES 3.0 function prototypes to function pointer\n *   declarations\n * - Added gl3stubInit() declaration\n */\n\n#include <GLES2/gl2.h>\n#include <android/api-level.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/*\n ** Copyright (c) 2007-2013 The Khronos Group Inc.\n **\n ** Permission is hereby granted, free of charge, to any person obtaining a\n ** copy of this software and/or associated documentation files (the\n ** \"Materials\"), to deal in the Materials without restriction, including\n ** without limitation the rights to use, copy, modify, merge, publish,\n ** distribute, sublicense, and/or sell copies of the Materials, and to\n ** permit persons to whom the Materials are furnished to do so, subject to\n ** the following conditions:\n **\n ** The above copyright notice and this permission notice shall be included\n ** in all copies or substantial portions of the Materials.\n **\n ** THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.\n */\n\n/*\n * This files is for apps that want to use ES3 if present,\n * but continue to work on pre-API-18 devices. They can't just link to -lGLESv3\n *since\n * that library doesn't exist on pre-API-18 devices.\n * The function dynamically check if OpenGLES3.0 APIs are present and fill in if\n *there are.\n * Also the header defines some extra variables for OpenGLES3.0.\n *\n */\n\n/* Call this function before calling any OpenGL ES 3.0 functions. It will\n * return GL_TRUE if the OpenGL ES 3.0 was successfully initialized, GL_FALSE\n * otherwise. */\nGLboolean gl3stubInit();\n\n/*-------------------------------------------------------------------------\n * Data type definitions\n *-----------------------------------------------------------------------*/\n\n/* OpenGL ES 3.0 */\n\ntypedef unsigned short GLhalf;\n#if __ANDROID_API__ <= 19\ntypedef khronos_int64_t GLint64;\ntypedef khronos_uint64_t GLuint64;\ntypedef struct __GLsync* GLsync;\n#endif\n\n/*-------------------------------------------------------------------------\n * Token definitions\n *-----------------------------------------------------------------------*/\n\n/* OpenGL ES core versions */\n#define GL_ES_VERSION_3_0 1\n\n/* OpenGL ES 3.0 */\n\n#define GL_READ_BUFFER 0x0C02\n#define GL_UNPACK_ROW_LENGTH 0x0CF2\n#define GL_UNPACK_SKIP_ROWS 0x0CF3\n#define GL_UNPACK_SKIP_PIXELS 0x0CF4\n#define GL_PACK_ROW_LENGTH 0x0D02\n#define GL_PACK_SKIP_ROWS 0x0D03\n#define GL_PACK_SKIP_PIXELS 0x0D04\n#define GL_COLOR 0x1800\n#define GL_DEPTH 0x1801\n#define GL_STENCIL 0x1802\n#define GL_RED 0x1903\n#define GL_RGB8 0x8051\n#define GL_RGBA8 0x8058\n#define GL_RGB10_A2 0x8059\n#define GL_TEXTURE_BINDING_3D 0x806A\n#define GL_UNPACK_SKIP_IMAGES 0x806D\n#define GL_UNPACK_IMAGE_HEIGHT 0x806E\n#define GL_TEXTURE_3D 0x806F\n#define GL_TEXTURE_WRAP_R 0x8072\n#define GL_MAX_3D_TEXTURE_SIZE 0x8073\n#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368\n#define GL_MAX_ELEMENTS_VERTICES 0x80E8\n#define GL_MAX_ELEMENTS_INDICES 0x80E9\n#define GL_TEXTURE_MIN_LOD 0x813A\n#define GL_TEXTURE_MAX_LOD 0x813B\n#define GL_TEXTURE_BASE_LEVEL 0x813C\n#define GL_TEXTURE_MAX_LEVEL 0x813D\n#define GL_MIN 0x8007\n#define GL_MAX 0x8008\n#define GL_DEPTH_COMPONENT24 0x81A6\n#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD\n#define GL_TEXTURE_COMPARE_MODE 0x884C\n#define GL_TEXTURE_COMPARE_FUNC 0x884D\n#define GL_CURRENT_QUERY 0x8865\n#define GL_QUERY_RESULT 0x8866\n#define GL_QUERY_RESULT_AVAILABLE 0x8867\n#define GL_BUFFER_MAPPED 0x88BC\n#define GL_BUFFER_MAP_POINTER 0x88BD\n#define GL_STREAM_READ 0x88E1\n#define GL_STREAM_COPY 0x88E2\n#define GL_STATIC_READ 0x88E5\n#define GL_STATIC_COPY 0x88E6\n#define GL_DYNAMIC_READ 0x88E9\n#define GL_DYNAMIC_COPY 0x88EA\n#define GL_MAX_DRAW_BUFFERS 0x8824\n#define GL_DRAW_BUFFER0 0x8825\n#define GL_DRAW_BUFFER1 0x8826\n#define GL_DRAW_BUFFER2 0x8827\n#define GL_DRAW_BUFFER3 0x8828\n#define GL_DRAW_BUFFER4 0x8829\n#define GL_DRAW_BUFFER5 0x882A\n#define GL_DRAW_BUFFER6 0x882B\n#define GL_DRAW_BUFFER7 0x882C\n#define GL_DRAW_BUFFER8 0x882D\n#define GL_DRAW_BUFFER9 0x882E\n#define GL_DRAW_BUFFER10 0x882F\n#define GL_DRAW_BUFFER11 0x8830\n#define GL_DRAW_BUFFER12 0x8831\n#define GL_DRAW_BUFFER13 0x8832\n#define GL_DRAW_BUFFER14 0x8833\n#define GL_DRAW_BUFFER15 0x8834\n#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49\n#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A\n#define GL_SAMPLER_3D 0x8B5F\n#define GL_SAMPLER_2D_SHADOW 0x8B62\n#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B\n#define GL_PIXEL_PACK_BUFFER 0x88EB\n#define GL_PIXEL_UNPACK_BUFFER 0x88EC\n#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED\n#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF\n#define GL_FLOAT_MAT2x3 0x8B65\n#define GL_FLOAT_MAT2x4 0x8B66\n#define GL_FLOAT_MAT3x2 0x8B67\n#define GL_FLOAT_MAT3x4 0x8B68\n#define GL_FLOAT_MAT4x2 0x8B69\n#define GL_FLOAT_MAT4x3 0x8B6A\n#define GL_SRGB 0x8C40\n#define GL_SRGB8 0x8C41\n#define GL_SRGB8_ALPHA8 0x8C43\n#define GL_COMPARE_REF_TO_TEXTURE 0x884E\n#define GL_MAJOR_VERSION 0x821B\n#define GL_MINOR_VERSION 0x821C\n#define GL_NUM_EXTENSIONS 0x821D\n#define GL_RGBA32F 0x8814\n#define GL_RGB32F 0x8815\n#define GL_RGBA16F 0x881A\n#define GL_RGB16F 0x881B\n#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD\n#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF\n#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904\n#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905\n#define GL_MAX_VARYING_COMPONENTS 0x8B4B\n#define GL_TEXTURE_2D_ARRAY 0x8C1A\n#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D\n#define GL_R11F_G11F_B10F 0x8C3A\n#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B\n#define GL_RGB9_E5 0x8C3D\n#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E\n#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76\n#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F\n#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80\n#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83\n#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84\n#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85\n#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88\n#define GL_RASTERIZER_DISCARD 0x8C89\n#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A\n#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B\n#define GL_INTERLEAVED_ATTRIBS 0x8C8C\n#define GL_SEPARATE_ATTRIBS 0x8C8D\n#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E\n#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F\n#define GL_RGBA32UI 0x8D70\n#define GL_RGB32UI 0x8D71\n#define GL_RGBA16UI 0x8D76\n#define GL_RGB16UI 0x8D77\n#define GL_RGBA8UI 0x8D7C\n#define GL_RGB8UI 0x8D7D\n#define GL_RGBA32I 0x8D82\n#define GL_RGB32I 0x8D83\n#define GL_RGBA16I 0x8D88\n#define GL_RGB16I 0x8D89\n#define GL_RGBA8I 0x8D8E\n#define GL_RGB8I 0x8D8F\n#define GL_RED_INTEGER 0x8D94\n#define GL_RGB_INTEGER 0x8D98\n#define GL_RGBA_INTEGER 0x8D99\n#define GL_SAMPLER_2D_ARRAY 0x8DC1\n#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4\n#define GL_SAMPLER_CUBE_SHADOW 0x8DC5\n#define GL_UNSIGNED_INT_VEC2 0x8DC6\n#define GL_UNSIGNED_INT_VEC3 0x8DC7\n#define GL_UNSIGNED_INT_VEC4 0x8DC8\n#define GL_INT_SAMPLER_2D 0x8DCA\n#define GL_INT_SAMPLER_3D 0x8DCB\n#define GL_INT_SAMPLER_CUBE 0x8DCC\n#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF\n#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2\n#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3\n#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4\n#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7\n#define GL_BUFFER_ACCESS_FLAGS 0x911F\n#define GL_BUFFER_MAP_LENGTH 0x9120\n#define GL_BUFFER_MAP_OFFSET 0x9121\n#define GL_DEPTH_COMPONENT32F 0x8CAC\n#define GL_DEPTH32F_STENCIL8 0x8CAD\n#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD\n#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210\n#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211\n#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212\n#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213\n#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214\n#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215\n#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216\n#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217\n#define GL_FRAMEBUFFER_DEFAULT 0x8218\n#define GL_FRAMEBUFFER_UNDEFINED 0x8219\n#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A\n#define GL_DEPTH_STENCIL 0x84F9\n#define GL_UNSIGNED_INT_24_8 0x84FA\n#define GL_DEPTH24_STENCIL8 0x88F0\n#define GL_UNSIGNED_NORMALIZED 0x8C17\n#define GL_DRAW_FRAMEBUFFER_BINDING GL_FRAMEBUFFER_BINDING\n#define GL_READ_FRAMEBUFFER 0x8CA8\n#define GL_DRAW_FRAMEBUFFER 0x8CA9\n#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA\n#define GL_RENDERBUFFER_SAMPLES 0x8CAB\n#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4\n#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF\n#define GL_COLOR_ATTACHMENT1 0x8CE1\n#define GL_COLOR_ATTACHMENT2 0x8CE2\n#define GL_COLOR_ATTACHMENT3 0x8CE3\n#define GL_COLOR_ATTACHMENT4 0x8CE4\n#define GL_COLOR_ATTACHMENT5 0x8CE5\n#define GL_COLOR_ATTACHMENT6 0x8CE6\n#define GL_COLOR_ATTACHMENT7 0x8CE7\n#define GL_COLOR_ATTACHMENT8 0x8CE8\n#define GL_COLOR_ATTACHMENT9 0x8CE9\n#define GL_COLOR_ATTACHMENT10 0x8CEA\n#define GL_COLOR_ATTACHMENT11 0x8CEB\n#define GL_COLOR_ATTACHMENT12 0x8CEC\n#define GL_COLOR_ATTACHMENT13 0x8CED\n#define GL_COLOR_ATTACHMENT14 0x8CEE\n#define GL_COLOR_ATTACHMENT15 0x8CEF\n#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56\n#define GL_MAX_SAMPLES 0x8D57\n#define GL_HALF_FLOAT 0x140B\n#define GL_MAP_READ_BIT 0x0001\n#define GL_MAP_WRITE_BIT 0x0002\n#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004\n#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008\n#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010\n#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020\n#define GL_RG 0x8227\n#define GL_RG_INTEGER 0x8228\n#define GL_R8 0x8229\n#define GL_RG8 0x822B\n#define GL_R16F 0x822D\n#define GL_R32F 0x822E\n#define GL_RG16F 0x822F\n#define GL_RG32F 0x8230\n#define GL_R8I 0x8231\n#define GL_R8UI 0x8232\n#define GL_R16I 0x8233\n#define GL_R16UI 0x8234\n#define GL_R32I 0x8235\n#define GL_R32UI 0x8236\n#define GL_RG8I 0x8237\n#define GL_RG8UI 0x8238\n#define GL_RG16I 0x8239\n#define GL_RG16UI 0x823A\n#define GL_RG32I 0x823B\n#define GL_RG32UI 0x823C\n#define GL_VERTEX_ARRAY_BINDING 0x85B5\n#define GL_R8_SNORM 0x8F94\n#define GL_RG8_SNORM 0x8F95\n#define GL_RGB8_SNORM 0x8F96\n#define GL_RGBA8_SNORM 0x8F97\n#define GL_SIGNED_NORMALIZED 0x8F9C\n#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69\n#define GL_COPY_READ_BUFFER 0x8F36\n#define GL_COPY_WRITE_BUFFER 0x8F37\n#define GL_COPY_READ_BUFFER_BINDING GL_COPY_READ_BUFFER\n#define GL_COPY_WRITE_BUFFER_BINDING GL_COPY_WRITE_BUFFER\n#define GL_UNIFORM_BUFFER 0x8A11\n#define GL_UNIFORM_BUFFER_BINDING 0x8A28\n#define GL_UNIFORM_BUFFER_START 0x8A29\n#define GL_UNIFORM_BUFFER_SIZE 0x8A2A\n#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B\n#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D\n#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E\n#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F\n#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30\n#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31\n#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33\n#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34\n#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35\n#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36\n#define GL_UNIFORM_TYPE 0x8A37\n#define GL_UNIFORM_SIZE 0x8A38\n#define GL_UNIFORM_NAME_LENGTH 0x8A39\n#define GL_UNIFORM_BLOCK_INDEX 0x8A3A\n#define GL_UNIFORM_OFFSET 0x8A3B\n#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C\n#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D\n#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E\n#define GL_UNIFORM_BLOCK_BINDING 0x8A3F\n#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40\n#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41\n#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42\n#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44\n#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46\n#define GL_INVALID_INDEX 0xFFFFFFFFu\n#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122\n#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125\n#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111\n#define GL_OBJECT_TYPE 0x9112\n#define GL_SYNC_CONDITION 0x9113\n#define GL_SYNC_STATUS 0x9114\n#define GL_SYNC_FLAGS 0x9115\n#define GL_SYNC_FENCE 0x9116\n#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117\n#define GL_UNSIGNALED 0x9118\n#define GL_SIGNALED 0x9119\n#define GL_ALREADY_SIGNALED 0x911A\n#define GL_TIMEOUT_EXPIRED 0x911B\n#define GL_CONDITION_SATISFIED 0x911C\n#define GL_WAIT_FAILED 0x911D\n#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001\n#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull\n#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE\n#define GL_ANY_SAMPLES_PASSED 0x8C2F\n#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A\n#define GL_SAMPLER_BINDING 0x8919\n#define GL_RGB10_A2UI 0x906F\n#define GL_TEXTURE_SWIZZLE_R 0x8E42\n#define GL_TEXTURE_SWIZZLE_G 0x8E43\n#define GL_TEXTURE_SWIZZLE_B 0x8E44\n#define GL_TEXTURE_SWIZZLE_A 0x8E45\n#define GL_GREEN 0x1904\n#define GL_BLUE 0x1905\n#define GL_INT_2_10_10_10_REV 0x8D9F\n#define GL_TRANSFORM_FEEDBACK 0x8E22\n#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23\n#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24\n#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25\n#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257\n#define GL_PROGRAM_BINARY_LENGTH 0x8741\n#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE\n#define GL_PROGRAM_BINARY_FORMATS 0x87FF\n#define GL_COMPRESSED_R11_EAC 0x9270\n#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271\n#define GL_COMPRESSED_RG11_EAC 0x9272\n#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273\n#define GL_COMPRESSED_RGB8_ETC2 0x9274\n#define GL_COMPRESSED_SRGB8_ETC2 0x9275\n#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276\n#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277\n#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278\n#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279\n#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F\n#define GL_MAX_ELEMENT_INDEX 0x8D6B\n#define GL_NUM_SAMPLE_COUNTS 0x9380\n#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF\n\n/*-------------------------------------------------------------------------\n * Entrypoint definitions\n *-----------------------------------------------------------------------*/\n\n/* OpenGL ES 3.0 */\n\nextern GL_APICALL void (*GL_APIENTRY glReadBuffer)(GLenum mode);\nextern GL_APICALL void (*GL_APIENTRY glDrawRangeElements)(\n    GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type,\n    const GLvoid* indices);\nextern GL_APICALL void (*GL_APIENTRY glTexImage3D)(\n    GLenum target, GLint level, GLint internalformat, GLsizei width,\n    GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type,\n    const GLvoid* pixels);\nextern GL_APICALL void (*GL_APIENTRY glTexSubImage3D)(\n    GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,\n    GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type,\n    const GLvoid* pixels);\nextern GL_APICALL void (*GL_APIENTRY glCopyTexSubImage3D)(\n    GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,\n    GLint x, GLint y, GLsizei width, GLsizei height);\nextern GL_APICALL void (*GL_APIENTRY glCompressedTexImage3D)(\n    GLenum target, GLint level, GLenum internalformat, GLsizei width,\n    GLsizei height, GLsizei depth, GLint border, GLsizei imageSize,\n    const GLvoid* data);\nextern GL_APICALL void (*GL_APIENTRY glCompressedTexSubImage3D)(\n    GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,\n    GLsizei width, GLsizei height, GLsizei depth, GLenum format,\n    GLsizei imageSize, const GLvoid* data);\nextern GL_APICALL void (*GL_APIENTRY glGenQueries)(GLsizei n, GLuint* ids);\nextern GL_APICALL void (*GL_APIENTRY glDeleteQueries)(GLsizei n,\n                                                      const GLuint* ids);\nextern GL_APICALL GLboolean (*GL_APIENTRY glIsQuery)(GLuint id);\nextern GL_APICALL void (*GL_APIENTRY glBeginQuery)(GLenum target, GLuint id);\nextern GL_APICALL void (*GL_APIENTRY glEndQuery)(GLenum target);\nextern GL_APICALL void (*GL_APIENTRY glGetQueryiv)(GLenum target, GLenum pname,\n                                                   GLint* params);\nextern GL_APICALL void (*GL_APIENTRY glGetQueryObjectuiv)(GLuint id,\n                                                          GLenum pname,\n                                                          GLuint* params);\nextern GL_APICALL GLboolean (*GL_APIENTRY glUnmapBuffer)(GLenum target);\nextern GL_APICALL void (*GL_APIENTRY glGetBufferPointerv)(GLenum target,\n                                                          GLenum pname,\n                                                          GLvoid** params);\nextern GL_APICALL void (*GL_APIENTRY glDrawBuffers)(GLsizei n,\n                                                    const GLenum* bufs);\nextern GL_APICALL void (*GL_APIENTRY glUniformMatrix2x3fv)(\n    GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nextern GL_APICALL void (*GL_APIENTRY glUniformMatrix3x2fv)(\n    GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nextern GL_APICALL void (*GL_APIENTRY glUniformMatrix2x4fv)(\n    GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nextern GL_APICALL void (*GL_APIENTRY glUniformMatrix4x2fv)(\n    GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nextern GL_APICALL void (*GL_APIENTRY glUniformMatrix3x4fv)(\n    GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nextern GL_APICALL void (*GL_APIENTRY glUniformMatrix4x3fv)(\n    GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\nextern GL_APICALL void (*GL_APIENTRY glBlitFramebuffer)(\n    GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0,\n    GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);\nextern GL_APICALL void (*GL_APIENTRY glRenderbufferStorageMultisample)(\n    GLenum target, GLsizei samples, GLenum internalformat, GLsizei width,\n    GLsizei height);\nextern GL_APICALL void (*GL_APIENTRY glFramebufferTextureLayer)(\n    GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);\nextern GL_APICALL GLvoid* (*GL_APIENTRY glMapBufferRange)(GLenum target,\n                                                          GLintptr offset,\n                                                          GLsizeiptr length,\n                                                          GLbitfield access);\nextern GL_APICALL void (*GL_APIENTRY glFlushMappedBufferRange)(\n    GLenum target, GLintptr offset, GLsizeiptr length);\nextern GL_APICALL void (*GL_APIENTRY glBindVertexArray)(GLuint array);\nextern GL_APICALL void (*GL_APIENTRY glDeleteVertexArrays)(\n    GLsizei n, const GLuint* arrays);\nextern GL_APICALL void (*GL_APIENTRY glGenVertexArrays)(GLsizei n,\n                                                        GLuint* arrays);\nextern GL_APICALL GLboolean (*GL_APIENTRY glIsVertexArray)(GLuint array);\nextern GL_APICALL void (*GL_APIENTRY glGetIntegeri_v)(GLenum target,\n                                                      GLuint index,\n                                                      GLint* data);\nextern GL_APICALL void (*GL_APIENTRY glBeginTransformFeedback)(\n    GLenum primitiveMode);\nextern GL_APICALL void (*GL_APIENTRY glEndTransformFeedback)(void);\nextern GL_APICALL void (*GL_APIENTRY glBindBufferRange)(GLenum target,\n                                                        GLuint index,\n                                                        GLuint buffer,\n                                                        GLintptr offset,\n                                                        GLsizeiptr size);\nextern GL_APICALL void (*GL_APIENTRY glBindBufferBase)(GLenum target,\n                                                       GLuint index,\n                                                       GLuint buffer);\nextern GL_APICALL void (*GL_APIENTRY glTransformFeedbackVaryings)(\n    GLuint program, GLsizei count, const GLchar* const* varyings,\n    GLenum bufferMode);\nextern GL_APICALL void (*GL_APIENTRY glGetTransformFeedbackVarying)(\n    GLuint program, GLuint index, GLsizei bufSize, GLsizei* length,\n    GLsizei* size, GLenum* type, GLchar* name);\nextern GL_APICALL void (*GL_APIENTRY glVertexAttribIPointer)(\n    GLuint index, GLint size, GLenum type, GLsizei stride,\n    const GLvoid* pointer);\nextern GL_APICALL void (*GL_APIENTRY glGetVertexAttribIiv)(GLuint index,\n                                                           GLenum pname,\n                                                           GLint* params);\nextern GL_APICALL void (*GL_APIENTRY glGetVertexAttribIuiv)(GLuint index,\n                                                            GLenum pname,\n                                                            GLuint* params);\nextern GL_APICALL void (*GL_APIENTRY glVertexAttribI4i)(GLuint index, GLint x,\n                                                        GLint y, GLint z,\n                                                        GLint w);\nextern GL_APICALL void (*GL_APIENTRY glVertexAttribI4ui)(GLuint index, GLuint x,\n                                                         GLuint y, GLuint z,\n                                                         GLuint w);\nextern GL_APICALL void (*GL_APIENTRY glVertexAttribI4iv)(GLuint index,\n                                                         const GLint* v);\nextern GL_APICALL void (*GL_APIENTRY glVertexAttribI4uiv)(GLuint index,\n                                                          const GLuint* v);\nextern GL_APICALL void (*GL_APIENTRY glGetUniformuiv)(GLuint program,\n                                                      GLint location,\n                                                      GLuint* params);\nextern GL_APICALL GLint (*GL_APIENTRY glGetFragDataLocation)(\n    GLuint program, const GLchar* name);\nextern GL_APICALL void (*GL_APIENTRY glUniform1ui)(GLint location, GLuint v0);\nextern GL_APICALL void (*GL_APIENTRY glUniform2ui)(GLint location, GLuint v0,\n                                                   GLuint v1);\nextern GL_APICALL void (*GL_APIENTRY glUniform3ui)(GLint location, GLuint v0,\n                                                   GLuint v1, GLuint v2);\nextern GL_APICALL void (*GL_APIENTRY glUniform4ui)(GLint location, GLuint v0,\n                                                   GLuint v1, GLuint v2,\n                                                   GLuint v3);\nextern GL_APICALL void (*GL_APIENTRY glUniform1uiv)(GLint location,\n                                                    GLsizei count,\n                                                    const GLuint* value);\nextern GL_APICALL void (*GL_APIENTRY glUniform2uiv)(GLint location,\n                                                    GLsizei count,\n                                                    const GLuint* value);\nextern GL_APICALL void (*GL_APIENTRY glUniform3uiv)(GLint location,\n                                                    GLsizei count,\n                                                    const GLuint* value);\nextern GL_APICALL void (*GL_APIENTRY glUniform4uiv)(GLint location,\n                                                    GLsizei count,\n                                                    const GLuint* value);\nextern GL_APICALL void (*GL_APIENTRY glClearBufferiv)(GLenum buffer,\n                                                      GLint drawbuffer,\n                                                      const GLint* value);\nextern GL_APICALL void (*GL_APIENTRY glClearBufferuiv)(GLenum buffer,\n                                                       GLint drawbuffer,\n                                                       const GLuint* value);\nextern GL_APICALL void (*GL_APIENTRY glClearBufferfv)(GLenum buffer,\n                                                      GLint drawbuffer,\n                                                      const GLfloat* value);\nextern GL_APICALL void (*GL_APIENTRY glClearBufferfi)(GLenum buffer,\n                                                      GLint drawbuffer,\n                                                      GLfloat depth,\n                                                      GLint stencil);\nextern GL_APICALL const GLubyte* (*GL_APIENTRY glGetStringi)(GLenum name,\n                                                             GLuint index);\nextern GL_APICALL void (*GL_APIENTRY glCopyBufferSubData)(GLenum readTarget,\n                                                          GLenum writeTarget,\n                                                          GLintptr readOffset,\n                                                          GLintptr writeOffset,\n                                                          GLsizeiptr size);\nextern GL_APICALL void (*GL_APIENTRY glGetUniformIndices)(\n    GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames,\n    GLuint* uniformIndices);\nextern GL_APICALL void (*GL_APIENTRY glGetActiveUniformsiv)(\n    GLuint program, GLsizei uniformCount, const GLuint* uniformIndices,\n    GLenum pname, GLint* params);\nextern GL_APICALL GLuint (*GL_APIENTRY glGetUniformBlockIndex)(\n    GLuint program, const GLchar* uniformBlockName);\nextern GL_APICALL void (*GL_APIENTRY glGetActiveUniformBlockiv)(\n    GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params);\nextern GL_APICALL void (*GL_APIENTRY glGetActiveUniformBlockName)(\n    GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length,\n    GLchar* uniformBlockName);\nextern GL_APICALL void (*GL_APIENTRY glUniformBlockBinding)(\n    GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);\nextern GL_APICALL void (*GL_APIENTRY glDrawArraysInstanced)(\n    GLenum mode, GLint first, GLsizei count, GLsizei instanceCount);\nextern GL_APICALL void (*GL_APIENTRY glDrawElementsInstanced)(\n    GLenum mode, GLsizei count, GLenum type, const GLvoid* indices,\n    GLsizei instanceCount);\nextern GL_APICALL GLsync (*GL_APIENTRY glFenceSync)(GLenum condition,\n                                                    GLbitfield flags);\nextern GL_APICALL GLboolean (*GL_APIENTRY glIsSync)(GLsync sync);\nextern GL_APICALL void (*GL_APIENTRY glDeleteSync)(GLsync sync);\nextern GL_APICALL GLenum (*GL_APIENTRY glClientWaitSync)(GLsync sync,\n                                                         GLbitfield flags,\n                                                         GLuint64 timeout);\nextern GL_APICALL void (*GL_APIENTRY glWaitSync)(GLsync sync, GLbitfield flags,\n                                                 GLuint64 timeout);\nextern GL_APICALL void (*GL_APIENTRY glGetInteger64v)(GLenum pname,\n                                                      GLint64* params);\nextern GL_APICALL void (*GL_APIENTRY glGetSynciv)(GLsync sync, GLenum pname,\n                                                  GLsizei bufSize,\n                                                  GLsizei* length,\n                                                  GLint* values);\nextern GL_APICALL void (*GL_APIENTRY glGetInteger64i_v)(GLenum target,\n                                                        GLuint index,\n                                                        GLint64* data);\nextern GL_APICALL void (*GL_APIENTRY glGetBufferParameteri64v)(GLenum target,\n                                                               GLenum pname,\n                                                               GLint64* params);\nextern GL_APICALL void (*GL_APIENTRY glGenSamplers)(GLsizei count,\n                                                    GLuint* samplers);\nextern GL_APICALL void (*GL_APIENTRY glDeleteSamplers)(GLsizei count,\n                                                       const GLuint* samplers);\nextern GL_APICALL GLboolean (*GL_APIENTRY glIsSampler)(GLuint sampler);\nextern GL_APICALL void (*GL_APIENTRY glBindSampler)(GLuint unit,\n                                                    GLuint sampler);\nextern GL_APICALL void (*GL_APIENTRY glSamplerParameteri)(GLuint sampler,\n                                                          GLenum pname,\n                                                          GLint param);\nextern GL_APICALL void (*GL_APIENTRY glSamplerParameteriv)(GLuint sampler,\n                                                           GLenum pname,\n                                                           const GLint* param);\nextern GL_APICALL void (*GL_APIENTRY glSamplerParameterf)(GLuint sampler,\n                                                          GLenum pname,\n                                                          GLfloat param);\nextern GL_APICALL void (*GL_APIENTRY glSamplerParameterfv)(\n    GLuint sampler, GLenum pname, const GLfloat* param);\nextern GL_APICALL void (*GL_APIENTRY glGetSamplerParameteriv)(GLuint sampler,\n                                                              GLenum pname,\n                                                              GLint* params);\nextern GL_APICALL void (*GL_APIENTRY glGetSamplerParameterfv)(GLuint sampler,\n                                                              GLenum pname,\n                                                              GLfloat* params);\nextern GL_APICALL void (*GL_APIENTRY glVertexAttribDivisor)(GLuint index,\n                                                            GLuint divisor);\nextern GL_APICALL void (*GL_APIENTRY glBindTransformFeedback)(GLenum target,\n                                                              GLuint id);\nextern GL_APICALL void (*GL_APIENTRY glDeleteTransformFeedbacks)(\n    GLsizei n, const GLuint* ids);\nextern GL_APICALL void (*GL_APIENTRY glGenTransformFeedbacks)(GLsizei n,\n                                                              GLuint* ids);\nextern GL_APICALL GLboolean (*GL_APIENTRY glIsTransformFeedback)(GLuint id);\nextern GL_APICALL void (*GL_APIENTRY glPauseTransformFeedback)(void);\nextern GL_APICALL void (*GL_APIENTRY glResumeTransformFeedback)(void);\nextern GL_APICALL void (*GL_APIENTRY glGetProgramBinary)(GLuint program,\n                                                         GLsizei bufSize,\n                                                         GLsizei* length,\n                                                         GLenum* binaryFormat,\n                                                         GLvoid* binary);\nextern GL_APICALL void (*GL_APIENTRY glProgramBinary)(GLuint program,\n                                                      GLenum binaryFormat,\n                                                      const GLvoid* binary,\n                                                      GLsizei length);\nextern GL_APICALL void (*GL_APIENTRY glProgramParameteri)(GLuint program,\n                                                          GLenum pname,\n                                                          GLint value);\nextern GL_APICALL void (*GL_APIENTRY glInvalidateFramebuffer)(\n    GLenum target, GLsizei numAttachments, const GLenum* attachments);\nextern GL_APICALL void (*GL_APIENTRY glInvalidateSubFramebuffer)(\n    GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x,\n    GLint y, GLsizei width, GLsizei height);\nextern GL_APICALL void (*GL_APIENTRY glTexStorage2D)(GLenum target,\n                                                     GLsizei levels,\n                                                     GLenum internalformat,\n                                                     GLsizei width,\n                                                     GLsizei height);\nextern GL_APICALL void (*GL_APIENTRY glTexStorage3D)(\n    GLenum target, GLsizei levels, GLenum internalformat, GLsizei width,\n    GLsizei height, GLsizei depth);\nextern GL_APICALL void (*GL_APIENTRY glGetInternalformativ)(\n    GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize,\n    GLint* params);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "teapots/common/ndk_helper/interpolator.cpp",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"interpolator.h\"\n\n#include <math.h>\n\n#include \"interpolator.h\"\n\nnamespace ndk_helper {\n\n//-------------------------------------------------\n// Ctor\n//-------------------------------------------------\nInterpolator::Interpolator() { list_params_.clear(); }\n\n//-------------------------------------------------\n// Dtor\n//-------------------------------------------------\nInterpolator::~Interpolator() { list_params_.clear(); }\n\nvoid Interpolator::Clear() { list_params_.clear(); }\n\nInterpolator& Interpolator::Set(const float start, const float dest,\n                                const INTERPOLATOR_TYPE type,\n                                const double duration) {\n  // init the parameters for the interpolation process\n  start_time_ = PerfMonitor::GetCurrentTime();\n  dest_time_ = start_time_ + duration;\n  type_ = type;\n\n  start_value_ = start;\n  dest_value_ = dest;\n  return *this;\n}\n\nInterpolator& Interpolator::Add(const float dest, const INTERPOLATOR_TYPE type,\n                                const double duration) {\n  InterpolatorParams param;\n  param.dest_value_ = dest;\n  param.type_ = type;\n  param.duration_ = duration;\n  list_params_.push_back(param);\n  return *this;\n}\n\nbool Interpolator::Update(const double current_time, float& p) {\n  bool bContinue;\n  if (current_time >= dest_time_) {\n    p = dest_value_;\n    if (list_params_.size()) {\n      InterpolatorParams& item = list_params_.front();\n      Set(dest_value_, item.dest_value_, item.type_, item.duration_);\n      list_params_.pop_front();\n\n      bContinue = true;\n    } else {\n      bContinue = false;\n    }\n  } else {\n    float t = (float)(current_time - start_time_);\n    float d = (float)(dest_time_ - start_time_);\n    float b = start_value_;\n    float c = dest_value_ - start_value_;\n    p = GetFormula(type_, t, b, d, c);\n\n    bContinue = true;\n  }\n  return bContinue;\n}\n\nfloat Interpolator::GetFormula(const INTERPOLATOR_TYPE type, const float t,\n                               const float b, const float d, const float c) {\n  float t1;\n  switch (type) {\n    case INTERPOLATOR_TYPE_LINEAR:\n      // simple linear interpolation - no easing\n      return (c * t / d + b);\n\n    case INTERPOLATOR_TYPE_EASEINQUAD:\n      // quadratic (t^2) easing in - accelerating from zero velocity\n      t1 = t / d;\n      return (c * t1 * t1 + b);\n\n    case INTERPOLATOR_TYPE_EASEOUTQUAD:\n      // quadratic (t^2) easing out - decelerating to zero velocity\n      t1 = t / d;\n      return (-c * t1 * (t1 - 2) + b);\n\n    case INTERPOLATOR_TYPE_EASEINOUTQUAD:\n      // quadratic easing in/out - acceleration until halfway, then deceleration\n      t1 = t / d / 2;\n      if (t1 < 1)\n        return (c / 2 * t1 * t1 + b);\n      else {\n        t1 = t1 - 1;\n        return (-c / 2 * (t1 * (t1 - 2) - 1) + b);\n      }\n    case INTERPOLATOR_TYPE_EASEINCUBIC:\n      // cubic easing in - accelerating from zero velocity\n      t1 = t / d;\n      return (c * t1 * t1 * t1 + b);\n\n    case INTERPOLATOR_TYPE_EASEOUTCUBIC:\n      // cubic easing in - accelerating from zero velocity\n      t1 = t / d - 1;\n      return (c * (t1 * t1 * t1 + 1) + b);\n\n    case INTERPOLATOR_TYPE_EASEINOUTCUBIC:\n      // cubic easing in - accelerating from zero velocity\n      t1 = t / d / 2;\n\n      if (t1 < 1)\n        return (c / 2 * t1 * t1 * t1 + b);\n      else {\n        t1 -= 2;\n        return (c / 2 * (t1 * t1 * t1 + 2) + b);\n      }\n    case INTERPOLATOR_TYPE_EASEINQUART:\n      // quartic easing in - accelerating from zero velocity\n      t1 = t / d;\n      return (c * t1 * t1 * t1 * t1 + b);\n\n    case INTERPOLATOR_TYPE_EASEINEXPO:\n      // exponential (2^t) easing in - accelerating from zero velocity\n      if (t == 0)\n        return b;\n      else\n        return (c * powf(2, (10 * (t / d - 1))) + b);\n\n    case INTERPOLATOR_TYPE_EASEOUTEXPO:\n      // exponential (2^t) easing out - decelerating to zero velocity\n      if (t == d)\n        return (b + c);\n      else\n        return (c * (-powf(2, -10 * t / d) + 1) + b);\n    default:\n      return 0;\n  }\n}\n\n}  // namespace ndk_helper\n"
  },
  {
    "path": "teapots/common/ndk_helper/interpolator.h",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef INTERPOLATOR_H_\n#define INTERPOLATOR_H_\n\n#include <errno.h>\n#include <jni.h>\n#include <time.h>\n\n#include <list>\n\n#include \"JNIHelper.h\"\n#include \"perfMonitor.h\"\n\nnamespace ndk_helper {\n\nenum INTERPOLATOR_TYPE {\n  INTERPOLATOR_TYPE_LINEAR,\n  INTERPOLATOR_TYPE_EASEINQUAD,\n  INTERPOLATOR_TYPE_EASEOUTQUAD,\n  INTERPOLATOR_TYPE_EASEINOUTQUAD,\n  INTERPOLATOR_TYPE_EASEINCUBIC,\n  INTERPOLATOR_TYPE_EASEOUTCUBIC,\n  INTERPOLATOR_TYPE_EASEINOUTCUBIC,\n  INTERPOLATOR_TYPE_EASEINQUART,\n  INTERPOLATOR_TYPE_EASEINEXPO,\n  INTERPOLATOR_TYPE_EASEOUTEXPO,\n};\n\nstruct InterpolatorParams {\n  float dest_value_;\n  INTERPOLATOR_TYPE type_;\n  double duration_;\n};\n\n/******************************************************************\n * Interpolates values with several interpolation methods\n */\nclass Interpolator {\n private:\n  double start_time_;\n  double dest_time_;\n  INTERPOLATOR_TYPE type_;\n\n  float start_value_;\n  float dest_value_;\n  std::list<InterpolatorParams> list_params_;\n\n  float GetFormula(const INTERPOLATOR_TYPE type, const float t, const float b,\n                   const float d, const float c);\n\n public:\n  Interpolator();\n  ~Interpolator();\n\n  Interpolator& Set(const float start, const float dest,\n                    const INTERPOLATOR_TYPE type, double duration);\n\n  Interpolator& Add(const float dest, const INTERPOLATOR_TYPE type,\n                    const double duration);\n\n  bool Update(const double currentTime, float& p);\n\n  void Clear();\n};\n\n}  // namespace ndk_helper\n#endif /* INTERPOLATOR_H_ */\n"
  },
  {
    "path": "teapots/common/ndk_helper/perfMonitor.cpp",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"perfMonitor.h\"\n\nnamespace ndk_helper {\n\nPerfMonitor::PerfMonitor()\n    : current_FPS_(0),\n      tv_last_sec_(0),\n      last_tick_(0.f),\n      tickindex_(0),\n      ticksum_(0) {\n  for (int32_t i = 0; i < kNumSamples; ++i) ticklist_[i] = 0;\n}\n\nPerfMonitor::~PerfMonitor() {}\n\ndouble PerfMonitor::UpdateTick(double currentTick) {\n  ticksum_ -= ticklist_[tickindex_];\n  ticksum_ += currentTick;\n  ticklist_[tickindex_] = currentTick;\n  tickindex_ = (tickindex_ + 1) % kNumSamples;\n\n  return ((double)ticksum_ / kNumSamples);\n}\n\nbool PerfMonitor::Update(float& fFPS) {\n  struct timeval Time;\n  gettimeofday(&Time, NULL);\n\n  double time = Time.tv_sec + Time.tv_usec * 1.0 / 1000000.0;\n  double tick = time - last_tick_;\n  double d = UpdateTick(tick);\n  last_tick_ = time;\n\n  if (Time.tv_sec - tv_last_sec_ >= 1) {\n    current_FPS_ = 1.f / d;\n    tv_last_sec_ = Time.tv_sec;\n    fFPS = current_FPS_;\n    return true;\n  } else {\n    fFPS = current_FPS_;\n    return false;\n  }\n}\n\n}  // namespace ndk_helper\n"
  },
  {
    "path": "teapots/common/ndk_helper/perfMonitor.h",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef PERFMONITOR_H_\n#define PERFMONITOR_H_\n\n#include <errno.h>\n#include <jni.h>\n#include <time.h>\n\n#include \"JNIHelper.h\"\n\nnamespace ndk_helper {\n\nconst int32_t kNumSamples = 100;\n\n/******************************************************************\n * Helper class for a performance monitoring and get current tick time\n */\nclass PerfMonitor {\n private:\n  float current_FPS_;\n  time_t tv_last_sec_;\n\n  double last_tick_;\n  int32_t tickindex_;\n  double ticksum_;\n  double ticklist_[kNumSamples];\n\n  double UpdateTick(double current_tick);\n\n public:\n  PerfMonitor();\n  virtual ~PerfMonitor();\n\n  bool Update(float& fFPS);\n\n  static double GetCurrentTime() {\n    struct timeval time;\n    gettimeofday(&time, NULL);\n    double ret = time.tv_sec + time.tv_usec * 1.0 / 1000000.0;\n    return ret;\n  }\n};\n\n}  // namespace ndk_helper\n#endif /* PERFMONITOR_H_ */\n"
  },
  {
    "path": "teapots/common/ndk_helper/sensorManager.cpp",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"sensorManager.h\"\n\n#include <math.h>\n\n//--------------------------------------------------------------------------------\n// sensorManager.cpp\n//--------------------------------------------------------------------------------\nnamespace ndk_helper {\n\n//--------------------------------------------------------------------------------\n// includes\n//--------------------------------------------------------------------------------\n\n//-------------------------------------------------------------------------\n// Sensor handlers\n//-------------------------------------------------------------------------\nSensorManager::SensorManager()\n    : sensorManager_(nullptr),\n      accelerometerSensor_(nullptr),\n      sensorEventQueue_(nullptr) {}\n\nSensorManager::~SensorManager() {}\n\nvoid SensorManager::Init(android_app* app) {\n  sensorManager_ = AcquireASensorManagerInstance(app);\n  accelerometerSensor_ = ASensorManager_getDefaultSensor(\n      sensorManager_, ASENSOR_TYPE_ACCELEROMETER);\n  sensorEventQueue_ = ASensorManager_createEventQueue(\n      sensorManager_, app->looper, LOOPER_ID_USER, NULL, NULL);\n}\n\nvoid SensorManager::Resume() {\n  // When the app gains focus, start monitoring the accelerometer.\n  if (accelerometerSensor_ != NULL) {\n    ASensorEventQueue_enableSensor(sensorEventQueue_, accelerometerSensor_);\n    // We'd like to get 60 events per second (in us).\n    ASensorEventQueue_setEventRate(sensorEventQueue_, accelerometerSensor_,\n                                   (1000L / 60) * 1000);\n  }\n}\n\nvoid SensorManager::Suspend() {\n  // When the app loses focus, stop monitoring the accelerometer.\n  // This is to avoid consuming battery while not being used.\n  if (accelerometerSensor_ != NULL) {\n    ASensorEventQueue_disableSensor(sensorEventQueue_, accelerometerSensor_);\n  }\n}\n\n#include <dlfcn.h>\nASensorManager* AcquireASensorManagerInstance(android_app* app) {\n  if (!app) return nullptr;\n\n  typedef ASensorManager* (*PF_GETINSTANCEFORPACKAGE)(const char* name);\n  void* androidHandle = dlopen(\"libandroid.so\", RTLD_NOW);\n  PF_GETINSTANCEFORPACKAGE getInstanceForPackageFunc =\n      (PF_GETINSTANCEFORPACKAGE)dlsym(androidHandle,\n                                      \"ASensorManager_getInstanceForPackage\");\n  if (getInstanceForPackageFunc) {\n    JNIEnv* env = nullptr;\n    app->activity->vm->AttachCurrentThread(&env, NULL);\n\n    jclass android_content_Context = env->GetObjectClass(app->activity->clazz);\n    jmethodID midGetPackageName = env->GetMethodID(\n        android_content_Context, \"getPackageName\", \"()Ljava/lang/String;\");\n    jstring packageName =\n        (jstring)env->CallObjectMethod(app->activity->clazz, midGetPackageName);\n\n    const char* nativePackageName = env->GetStringUTFChars(packageName, 0);\n    ASensorManager* mgr = getInstanceForPackageFunc(nativePackageName);\n    env->ReleaseStringUTFChars(packageName, nativePackageName);\n    app->activity->vm->DetachCurrentThread();\n    if (mgr) {\n      dlclose(androidHandle);\n      return mgr;\n    }\n  }\n\n  typedef ASensorManager* (*PF_GETINSTANCE)();\n  PF_GETINSTANCE getInstanceFunc =\n      (PF_GETINSTANCE)dlsym(androidHandle, \"ASensorManager_getInstance\");\n  // by all means at this point, ASensorManager_getInstance should be available\n  assert(getInstanceFunc);\n  dlclose(androidHandle);\n\n  return getInstanceFunc();\n}\n\n}  // namespace ndk_helper\n"
  },
  {
    "path": "teapots/common/ndk_helper/sensorManager.h",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//--------------------------------------------------------------------------------\n// sensorManager.h\n//--------------------------------------------------------------------------------\n#ifndef SENSORMANAGER_H_\n#define SENSORMANAGER_H_\n\n#include <android/sensor.h>\n\n#include \"JNIHelper.h\"\n\nnamespace ndk_helper {\n//--------------------------------------------------------------------------------\n// Constants\n//--------------------------------------------------------------------------------\nenum ORIENTATION {\n  ORIENTATION_UNKNOWN = -1,\n  ORIENTATION_PORTRAIT = 0,\n  ORIENTATION_LANDSCAPE = 1,\n  ORIENTATION_REVERSE_PORTRAIT = 2,\n  ORIENTATION_REVERSE_LANDSCAPE = 3,\n};\n\n/*\n * Helper to handle sensor inputs such as accelerometer.\n * The helper also check for screen rotation\n *\n */\nclass SensorManager {\n  ASensorManager* sensorManager_;\n  const ASensor* accelerometerSensor_;\n  ASensorEventQueue* sensorEventQueue_;\n\n protected:\n public:\n  SensorManager();\n  ~SensorManager();\n  void Init(android_app* state);\n  void Suspend();\n  void Resume();\n};\n\n/*\n * AcquireASensorManagerInstance(android_app* app)\n *    Workaround ASensorManager_getInstance() deprecation false alarm\n *    for Android-N and before, when compiling with NDK-r15\n */\nASensorManager* AcquireASensorManagerInstance(android_app* app);\n}  // namespace ndk_helper\n#endif /* SENSORMANAGER_H_ */\n"
  },
  {
    "path": "teapots/common/ndk_helper/shader.cpp",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#include \"shader.h\"\n\n#include <EGL/egl.h>\n#include <GLES2/gl2.h>\n\n#include <cstdlib>\n\n#include \"JNIHelper.h\"\n\nnamespace ndk_helper {\n\n#define DEBUG (1)\n\nbool shader::CompileShader(\n    GLuint* shader, const GLenum type, const char* str_file_name,\n    const std::map<std::string, std::string>& map_parameters) {\n  std::vector<uint8_t> data;\n  if (!JNIHelper::GetInstance()->ReadFile(str_file_name, &data)) {\n    LOGI(\"Can not open a file:%s\", str_file_name);\n    return false;\n  }\n\n  const char REPLACEMENT_TAG = '*';\n  // Fill-in parameters\n  std::string str(data.begin(), data.end());\n  std::string str_replacement_map(data.size(), ' ');\n\n  std::map<std::string, std::string>::const_iterator it =\n      map_parameters.begin();\n  std::map<std::string, std::string>::const_iterator itEnd =\n      map_parameters.end();\n  while (it != itEnd) {\n    size_t pos = 0;\n    while ((pos = str.find(it->first, pos)) != std::string::npos) {\n      // Check if the sub string is already touched\n\n      size_t replaced_pos = str_replacement_map.find(REPLACEMENT_TAG, pos);\n      if (replaced_pos == std::string::npos || replaced_pos > pos) {\n        str.replace(pos, it->first.length(), it->second);\n        str_replacement_map.replace(pos, it->first.length(), it->first.length(),\n                                    REPLACEMENT_TAG);\n        pos += it->second.length();\n      } else {\n        // The replacement target has been touched by other tag, skipping them\n        pos += it->second.length();\n      }\n    }\n    it++;\n  }\n\n  LOGI(\"Patched Shdader:\\n%s\", str.c_str());\n\n  std::vector<uint8_t> v(str.begin(), str.end());\n  str.clear();\n  return shader::CompileShader(shader, type, v);\n}\n\nbool shader::CompileShader(GLuint* shader, const GLenum type,\n                           const GLchar* source, const int32_t iSize) {\n  if (source == NULL || iSize <= 0) return false;\n\n  *shader = glCreateShader(type);\n  glShaderSource(*shader, 1, &source, &iSize);  // Not specifying 3rd parameter\n                                                // (size) could be troublesome..\n\n  glCompileShader(*shader);\n\n#if defined(DEBUG)\n  GLint logLength;\n  glGetShaderiv(*shader, GL_INFO_LOG_LENGTH, &logLength);\n  if (logLength > 0) {\n    GLchar* log = (GLchar*)malloc(logLength);\n    glGetShaderInfoLog(*shader, logLength, &logLength, log);\n    LOGI(\"Shader compile log:\\n%s\", log);\n    free(log);\n  }\n#endif\n\n  GLint status;\n  glGetShaderiv(*shader, GL_COMPILE_STATUS, &status);\n  if (status == 0) {\n    glDeleteShader(*shader);\n    return false;\n  }\n\n  return true;\n}\n\nbool shader::CompileShader(GLuint* shader, const GLenum type,\n                           std::vector<uint8_t>& data) {\n  if (!data.size()) return false;\n\n  const GLchar* source = (GLchar*)&data[0];\n  int32_t iSize = data.size();\n  return shader::CompileShader(shader, type, source, iSize);\n}\n\nbool shader::CompileShader(GLuint* shader, const GLenum type,\n                           const char* strFileName) {\n  std::vector<uint8_t> data;\n  bool b = JNIHelper::GetInstance()->ReadFile(strFileName, &data);\n  if (!b) {\n    LOGI(\"Can not open a file:%s\", strFileName);\n    return false;\n  }\n\n  return shader::CompileShader(shader, type, data);\n}\n\nbool shader::LinkProgram(const GLuint prog) {\n  GLint status;\n\n  glLinkProgram(prog);\n\n#if defined(DEBUG)\n  GLint logLength;\n  glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &logLength);\n  if (logLength > 0) {\n    GLchar* log = (GLchar*)malloc(logLength);\n    glGetProgramInfoLog(prog, logLength, &logLength, log);\n    LOGI(\"Program link log:\\n%s\", log);\n    free(log);\n  }\n#endif\n\n  glGetProgramiv(prog, GL_LINK_STATUS, &status);\n  if (status == 0) {\n    LOGI(\"Program link failed\\n\");\n    return false;\n  }\n\n  return true;\n}\n\nbool shader::ValidateProgram(const GLuint prog) {\n  GLint logLength, status;\n\n  glValidateProgram(prog);\n  glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &logLength);\n  if (logLength > 0) {\n    GLchar* log = (GLchar*)malloc(logLength);\n    glGetProgramInfoLog(prog, logLength, &logLength, log);\n    LOGI(\"Program validate log:\\n%s\", log);\n    free(log);\n  }\n\n  glGetProgramiv(prog, GL_VALIDATE_STATUS, &status);\n  if (status == 0) return false;\n\n  return true;\n}\n\n}  // namespace ndk_helper\n"
  },
  {
    "path": "teapots/common/ndk_helper/shader.h",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef SHADER_H_\n#define SHADER_H_\n\n#include <EGL/egl.h>\n#include <GLES/gl.h>\n#include <android/log.h>\n#include <jni.h>\n\n#include <map>\n#include <string>\n#include <vector>\n\n#include \"JNIHelper.h\"\n\nnamespace ndk_helper {\n\nnamespace shader {\n\n/******************************************************************\n * Shader compiler helper\n * namespace: ndkHelper::shader\n *\n */\n\n/******************************************************************\n * CompileShader() with vector\n *\n * arguments:\n *  out: shader, shader variable\n *  in: type, shader type (i.e. GL_VERTEX_SHADER/GL_FRAGMENT_SHADER)\n *  in: data, source vector\n * return: true if a shader compilation succeeded, false if it failed\n *\n */\nbool CompileShader(GLuint* shader, const GLenum type,\n                   std::vector<uint8_t>& data);\n\n/******************************************************************\n * CompileShader() with buffer\n *\n * arguments:\n *  out: shader, shader variable\n *  in: type, shader type (i.e. GL_VERTEX_SHADER/GL_FRAGMENT_SHADER)\n *  in: source, source buffer\n *  in: iSize, buffer size\n * return: true if a shader compilation succeeded, false if it failed\n *\n */\nbool CompileShader(GLuint* shader, const GLenum type, const GLchar* source,\n                   const int32_t iSize);\n\n/******************************************************************\n * CompileShader() with filename\n *\n * arguments:\n *  out: shader, shader variable\n *  in: type, shader type (i.e. GL_VERTEX_SHADER/GL_FRAGMENT_SHADER)\n *  in: strFilename, filename\n * return: true if a shader compilation succeeded, false if it failed\n *\n */\nbool CompileShader(GLuint* shader, const GLenum type, const char* strFileName);\n\n/******************************************************************\n * CompileShader() with std::map helps patching on a shader on the fly.\n *\n * arguments:\n *  out: shader, shader variable\n *  in: type, shader type (i.e. GL_VERTEX_SHADER/GL_FRAGMENT_SHADER)\n *  in: mapParameters\n *      For a example,\n *      map : %KEY% -> %VALUE% replaces all %KEY% entries in the given shader\n *code to %VALUE\"\n * return: true if a shader compilation succeeded, false if it failed\n *\n */\nbool CompileShader(GLuint* shader, const GLenum type, const char* str_file_name,\n                   const std::map<std::string, std::string>& map_parameters);\n\n/******************************************************************\n * LinkProgram()\n *\n * arguments:\n *  in: program, program\n * return: true if a shader linkage succeeded, false if it failed\n *\n */\nbool LinkProgram(const GLuint prog);\n\n/******************************************************************\n * validateProgram()\n *\n * arguments:\n *  in: program, program\n * return: true if a shader validation succeeded, false if it failed\n *\n */\nbool ValidateProgram(const GLuint prog);\n}  // namespace shader\n\n}  // namespace ndk_helper\n#endif /* SHADER_H_ */\n"
  },
  {
    "path": "teapots/common/ndk_helper/tapCamera.cpp",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//----------------------------------------------------------\n//  tapCamera.cpp\n//  Camera control with tap\n//\n//----------------------------------------------------------\n#include \"tapCamera.h\"\n\n#include <fstream>\n\nnamespace ndk_helper {\n\nconst float TRANSFORM_FACTOR = 15.f;\nconst float TRANSFORM_FACTORZ = 10.f;\n\nconst float MOMENTUM_FACTOR_DECREASE = 0.85f;\nconst float MOMENTUM_FACTOR_DECREASE_SHIFT = 0.9f;\nconst float MOMENTUM_FACTOR = 0.8f;\nconst float MOMENTUM_FACTOR_THRESHOLD = 0.001f;\n\n//----------------------------------------------------------\n//  Ctor\n//----------------------------------------------------------\nTapCamera::TapCamera()\n    : ball_radius_(0.75f),\n      dragging_(false),\n      pinching_(false),\n      pinch_start_distance_SQ_(0.f),\n      camera_rotation_(0.f),\n      camera_rotation_start_(0.f),\n      camera_rotation_now_(0.f),\n      momentum_(false),\n      momemtum_steps_(0.f),\n      flip_z_(0.f) {\n  // Init offset\n  InitParameters();\n\n  vec_flip_ = Vec2(1.f, -1.f);\n  flip_z_ = -1.f;\n  vec_pinch_transform_factor_ = Vec3(1.f, 1.f, 1.f);\n\n  vec_ball_center_ = Vec2(0, 0);\n  vec_ball_now_ = Vec2(0, 0);\n  vec_ball_down_ = Vec2(0, 0);\n\n  vec_pinch_start_ = Vec2(0, 0);\n  vec_pinch_start_center_ = Vec2(0, 0);\n\n  vec_flip_ = Vec2(0, 0);\n}\n\nvoid TapCamera::InitParameters() {\n  // Init parameters\n  vec_offset_ = Vec3();\n  vec_offset_now_ = Vec3();\n\n  quat_ball_rot_ = Quaternion();\n  quat_ball_now_ = Quaternion();\n  quat_ball_now_.ToMatrix(mat_rotation_);\n  camera_rotation_ = 0.f;\n\n  vec_drag_delta_ = Vec2();\n  vec_offset_delta_ = Vec3();\n\n  momentum_ = false;\n}\n\n//----------------------------------------------------------\n//  Dtor\n//----------------------------------------------------------\nTapCamera::~TapCamera() {}\n\nvoid TapCamera::Update() {\n  if (momentum_) {\n    float momenttum_steps = momemtum_steps_;\n\n    // Momentum rotation\n    Vec2 v = vec_drag_delta_;\n    BeginDrag(Vec2());  // NOTE:This call reset _VDragDelta\n    Drag(v * vec_flip_);\n\n    // Momentum shift\n    vec_offset_ += vec_offset_delta_;\n\n    BallUpdate();\n    EndDrag();\n\n    // Decrease deltas\n    vec_drag_delta_ = v * MOMENTUM_FACTOR_DECREASE;\n    vec_offset_delta_ = vec_offset_delta_ * MOMENTUM_FACTOR_DECREASE_SHIFT;\n\n    // Count steps\n    momemtum_steps_ = momenttum_steps * MOMENTUM_FACTOR_DECREASE;\n    if (momemtum_steps_ < MOMENTUM_FACTOR_THRESHOLD) {\n      momentum_ = false;\n    }\n  } else {\n    vec_drag_delta_ *= MOMENTUM_FACTOR;\n    vec_offset_delta_ = vec_offset_delta_ * MOMENTUM_FACTOR;\n    BallUpdate();\n  }\n\n  Vec3 vec = vec_offset_ + vec_offset_now_;\n  Vec3 vec_tmp(TRANSFORM_FACTOR, -TRANSFORM_FACTOR, TRANSFORM_FACTORZ);\n\n  vec *= vec_tmp * vec_pinch_transform_factor_;\n\n  mat_transform_ = Mat4::Translation(vec);\n}\n\nvoid TapCamera::Update(const double time) {\n  if (momentum_) {\n    const float MOMENTAM_UNIT = 0.0166f;\n    // Activate every 16.6msec\n    if (time - time_stamp_ >= MOMENTAM_UNIT) {\n      float momenttum_steps = momemtum_steps_;\n\n      // Momentum rotation\n      Vec2 v = vec_drag_delta_;\n      BeginDrag(Vec2());  // NOTE:This call reset _VDragDelta\n      Drag(v * vec_flip_);\n\n      // Momentum shift\n      vec_offset_ += vec_offset_delta_;\n\n      BallUpdate();\n      EndDrag();\n\n      // Decrease deltas\n      vec_drag_delta_ = v * MOMENTUM_FACTOR_DECREASE;\n      vec_offset_delta_ = vec_offset_delta_ * MOMENTUM_FACTOR_DECREASE_SHIFT;\n\n      // Count steps\n      momemtum_steps_ = momenttum_steps * MOMENTUM_FACTOR_DECREASE;\n      if (momemtum_steps_ < MOMENTUM_FACTOR_THRESHOLD) {\n        momentum_ = false;\n      }\n      time_stamp_ = time;\n    }\n  } else {\n    vec_drag_delta_ *= MOMENTUM_FACTOR;\n    vec_offset_delta_ = vec_offset_delta_ * MOMENTUM_FACTOR;\n    BallUpdate();\n    time_stamp_ = time;\n  }\n\n  Vec3 vec = vec_offset_ + vec_offset_now_;\n  Vec3 vec_tmp(TRANSFORM_FACTOR, -TRANSFORM_FACTOR, TRANSFORM_FACTORZ);\n\n  vec *= vec_tmp * vec_pinch_transform_factor_;\n\n  mat_transform_ = Mat4::Translation(vec);\n}\nMat4& TapCamera::GetRotationMatrix() { return mat_rotation_; }\n\nMat4& TapCamera::GetTransformMatrix() { return mat_transform_; }\n\nvoid TapCamera::Reset(const bool) {\n  InitParameters();\n  Update();\n}\n\n//----------------------------------------------------------\n// Drag control\n//----------------------------------------------------------\nvoid TapCamera::BeginDrag(const Vec2& v) {\n  if (dragging_) EndDrag();\n\n  if (pinching_) EndPinch();\n\n  Vec2 vec = v * vec_flip_;\n  vec_ball_now_ = vec;\n  vec_ball_down_ = vec_ball_now_;\n\n  dragging_ = true;\n  momentum_ = false;\n  vec_last_input_ = vec;\n  vec_drag_delta_ = Vec2();\n}\n\nvoid TapCamera::EndDrag() {\n  quat_ball_down_ = quat_ball_now_;\n  quat_ball_rot_ = Quaternion();\n\n  dragging_ = false;\n  momentum_ = true;\n  momemtum_steps_ = 1.0f;\n}\n\nvoid TapCamera::Drag(const Vec2& v) {\n  if (!dragging_) return;\n\n  Vec2 vec = v * vec_flip_;\n  vec_ball_now_ = vec;\n\n  vec_drag_delta_ = vec_drag_delta_ * MOMENTUM_FACTOR + (vec - vec_last_input_);\n  vec_last_input_ = vec;\n}\n\n//----------------------------------------------------------\n// Pinch controll\n//----------------------------------------------------------\nvoid TapCamera::BeginPinch(const Vec2& v1, const Vec2& v2) {\n  if (dragging_) EndDrag();\n\n  if (pinching_) EndPinch();\n\n  BeginDrag(Vec2());\n\n  vec_pinch_start_center_ = (v1 + v2) / 2.f;\n\n  Vec2 vec = v1 - v2;\n  float x_diff;\n  float y_diff;\n  vec.Value(x_diff, y_diff);\n\n  pinch_start_distance_SQ_ = x_diff * x_diff + y_diff * y_diff;\n  camera_rotation_start_ = atan2f(y_diff, x_diff);\n  camera_rotation_now_ = 0;\n\n  pinching_ = true;\n  momentum_ = false;\n\n  // Init momentum factors\n  vec_offset_delta_ = Vec3();\n}\n\nvoid TapCamera::EndPinch() {\n  pinching_ = false;\n  momentum_ = true;\n  momemtum_steps_ = 1.f;\n  vec_offset_ += vec_offset_now_;\n  camera_rotation_ += camera_rotation_now_;\n  vec_offset_now_ = Vec3();\n\n  camera_rotation_now_ = 0;\n\n  EndDrag();\n}\n\nvoid TapCamera::Pinch(const Vec2& v1, const Vec2& v2) {\n  if (!pinching_) return;\n\n  // Update momentum factor\n  vec_offset_last_ = vec_offset_now_;\n\n  float x_diff, y_diff;\n  Vec2 vec = v1 - v2;\n  vec.Value(x_diff, y_diff);\n\n  float fDistanceSQ = x_diff * x_diff + y_diff * y_diff;\n\n  float f = pinch_start_distance_SQ_ / fDistanceSQ;\n  if (f < 1.f)\n    f = -1.f / f + 1.0f;\n  else\n    f = f - 1.f;\n  if (std::isnan(f)) f = 0.f;\n\n  vec = (v1 + v2) / 2.f - vec_pinch_start_center_;\n  vec_offset_now_ = Vec3(vec, flip_z_ * f);\n\n  // Update momentum factor\n  vec_offset_delta_ = vec_offset_delta_ * MOMENTUM_FACTOR +\n                      (vec_offset_now_ - vec_offset_last_);\n\n  //\n  // Update ration quaternion\n  float fRotation = atan2f(y_diff, x_diff);\n  camera_rotation_now_ = fRotation - camera_rotation_start_;\n\n  // Trackball rotation\n  quat_ball_rot_ = Quaternion(0.f, 0.f, sinf(-camera_rotation_now_ * 0.5f),\n                              cosf(-camera_rotation_now_ * 0.5f));\n}\n\n//----------------------------------------------------------\n// Trackball controll\n//----------------------------------------------------------\nvoid TapCamera::BallUpdate() {\n  if (dragging_) {\n    Vec3 vec_from = PointOnSphere(vec_ball_down_);\n    Vec3 vec_to = PointOnSphere(vec_ball_now_);\n\n    Vec3 vec = vec_from.Cross(vec_to);\n    float w = vec_from.Dot(vec_to);\n\n    Quaternion qDrag = Quaternion(vec, w);\n    qDrag = qDrag * quat_ball_down_;\n    quat_ball_now_ = quat_ball_rot_ * qDrag;\n  }\n  quat_ball_now_.ToMatrix(mat_rotation_);\n}\n\nVec3 TapCamera::PointOnSphere(Vec2& point) {\n  Vec3 ball_mouse;\n  float mag;\n  Vec2 vec = (point - vec_ball_center_) / ball_radius_;\n  mag = vec.Dot(vec);\n  if (mag > 1.f) {\n    float scale = 1.f / sqrtf(mag);\n    vec *= scale;\n    ball_mouse = Vec3(vec, 0.f);\n  } else {\n    ball_mouse = Vec3(vec, sqrtf(1.f - mag));\n  }\n  return ball_mouse;\n}\n\n}  // namespace ndk_helper\n"
  },
  {
    "path": "teapots/common/ndk_helper/tapCamera.h",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#pragma once\n#include <GLES2/gl2.h>\n\n#include <string>\n#include <vector>\n\n#include \"JNIHelper.h\"\n#include \"interpolator.h\"\n#include \"vecmath.h\"\n\nnamespace ndk_helper {\n\n/******************************************************************\n * Camera control helper class with a tap gesture\n * This class is mainly used for 3D space camera control in samples.\n *\n */\nclass TapCamera {\n private:\n  // Trackball\n  Vec2 vec_ball_center_;\n  float ball_radius_;\n  Quaternion quat_ball_now_;\n  Quaternion quat_ball_down_;\n  Vec2 vec_ball_now_;\n  Vec2 vec_ball_down_;\n  Quaternion quat_ball_rot_;\n\n  bool dragging_;\n  bool pinching_;\n\n  // Pinch related info\n  Vec2 vec_pinch_start_;\n  Vec2 vec_pinch_start_center_;\n  float pinch_start_distance_SQ_;\n\n  // Camera shift\n  Vec3 vec_offset_;\n  Vec3 vec_offset_now_;\n\n  // Camera Rotation\n  float camera_rotation_;\n  float camera_rotation_start_;\n  float camera_rotation_now_;\n\n  // Momentum support\n  bool momentum_;\n  double time_stamp_;\n  Vec2 vec_drag_delta_;\n  Vec2 vec_last_input_;\n  Vec3 vec_offset_last_;\n  Vec3 vec_offset_delta_;\n  float momemtum_steps_;\n\n  Vec2 vec_flip_;\n  float flip_z_;\n\n  Mat4 mat_rotation_;\n  Mat4 mat_transform_;\n\n  Vec3 vec_pinch_transform_factor_;\n\n  Vec3 PointOnSphere(Vec2& point);\n  void BallUpdate();\n  void InitParameters();\n\n public:\n  TapCamera();\n  virtual ~TapCamera();\n  void BeginDrag(const Vec2& vec);\n  void EndDrag();\n  void Drag(const Vec2& vec);\n  void Update();\n  void Update(const double time);\n\n  Mat4& GetRotationMatrix();\n  Mat4& GetTransformMatrix();\n\n  void BeginPinch(const Vec2& v1, const Vec2& v2);\n  void EndPinch();\n  void Pinch(const Vec2& v1, const Vec2& v2);\n\n  void SetFlip(const float x, const float y, const float z) {\n    vec_flip_ = Vec2(x, y);\n    flip_z_ = z;\n  }\n\n  void SetPinchTransformFactor(const float x, const float y, const float z) {\n    vec_pinch_transform_factor_ = Vec3(x, y, z);\n  }\n\n  void Reset(const bool bAnimate);\n};\n\n}  // namespace ndk_helper\n"
  },
  {
    "path": "teapots/common/ndk_helper/vecmath.cpp",
    "content": "/*\n * Copy_right 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y_ou may_ not use this file ex_cept in compliance with the License.\n * You may_ obtain a copy_ of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by_ applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either ex_press or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//--------------------------------------------------------------------------------\n// vecmath.cpp\n//--------------------------------------------------------------------------------\n#include \"vecmath.h\"\n\nnamespace ndk_helper {\n\n//--------------------------------------------------------------------------------\n// vec3\n//--------------------------------------------------------------------------------\nVec3::Vec3(const Vec4& vec) {\n  x_ = vec.x_;\n  y_ = vec.y_;\n  z_ = vec.z_;\n}\n\n//--------------------------------------------------------------------------------\n// vec4\n//--------------------------------------------------------------------------------\nVec4 Vec4::operator*(const Mat4& rhs) const {\n  Vec4 out;\n  out.x_ = x_ * rhs.f_[0] + y_ * rhs.f_[1] + z_ * rhs.f_[2] + w_ * rhs.f_[3];\n  out.y_ = x_ * rhs.f_[4] + y_ * rhs.f_[5] + z_ * rhs.f_[6] + w_ * rhs.f_[7];\n  out.z_ = x_ * rhs.f_[8] + y_ * rhs.f_[9] + z_ * rhs.f_[10] + w_ * rhs.f_[11];\n  out.w_ =\n      x_ * rhs.f_[12] + y_ * rhs.f_[13] + z_ * rhs.f_[14] + w_ * rhs.f_[15];\n  return out;\n}\n\n//--------------------------------------------------------------------------------\n// mat4\n//--------------------------------------------------------------------------------\nMat4::Mat4() {\n  for (int32_t i = 0; i < 16; ++i) f_[i] = 0.f;\n  // column major identity matrix\n  f_[0] = f_[5] = f_[10] = f_[15] = 1.0f;\n}\n\nMat4::Mat4(const Mat4& other) { *this = other; }\n\nMat4::Mat4(const float* mIn) {\n  for (int32_t i = 0; i < 16; ++i) f_[i] = mIn[i];\n}\n\nMat4 Mat4::operator*(const Mat4& rhs) const {\n  Mat4 ret;\n  ret.f_[0] = f_[0] * rhs.f_[0] + f_[4] * rhs.f_[1] + f_[8] * rhs.f_[2] +\n              f_[12] * rhs.f_[3];\n  ret.f_[1] = f_[1] * rhs.f_[0] + f_[5] * rhs.f_[1] + f_[9] * rhs.f_[2] +\n              f_[13] * rhs.f_[3];\n  ret.f_[2] = f_[2] * rhs.f_[0] + f_[6] * rhs.f_[1] + f_[10] * rhs.f_[2] +\n              f_[14] * rhs.f_[3];\n  ret.f_[3] = f_[3] * rhs.f_[0] + f_[7] * rhs.f_[1] + f_[11] * rhs.f_[2] +\n              f_[15] * rhs.f_[3];\n\n  ret.f_[4] = f_[0] * rhs.f_[4] + f_[4] * rhs.f_[5] + f_[8] * rhs.f_[6] +\n              f_[12] * rhs.f_[7];\n  ret.f_[5] = f_[1] * rhs.f_[4] + f_[5] * rhs.f_[5] + f_[9] * rhs.f_[6] +\n              f_[13] * rhs.f_[7];\n  ret.f_[6] = f_[2] * rhs.f_[4] + f_[6] * rhs.f_[5] + f_[10] * rhs.f_[6] +\n              f_[14] * rhs.f_[7];\n  ret.f_[7] = f_[3] * rhs.f_[4] + f_[7] * rhs.f_[5] + f_[11] * rhs.f_[6] +\n              f_[15] * rhs.f_[7];\n\n  ret.f_[8] = f_[0] * rhs.f_[8] + f_[4] * rhs.f_[9] + f_[8] * rhs.f_[10] +\n              f_[12] * rhs.f_[11];\n  ret.f_[9] = f_[1] * rhs.f_[8] + f_[5] * rhs.f_[9] + f_[9] * rhs.f_[10] +\n              f_[13] * rhs.f_[11];\n  ret.f_[10] = f_[2] * rhs.f_[8] + f_[6] * rhs.f_[9] + f_[10] * rhs.f_[10] +\n               f_[14] * rhs.f_[11];\n  ret.f_[11] = f_[3] * rhs.f_[8] + f_[7] * rhs.f_[9] + f_[11] * rhs.f_[10] +\n               f_[15] * rhs.f_[11];\n\n  ret.f_[12] = f_[0] * rhs.f_[12] + f_[4] * rhs.f_[13] + f_[8] * rhs.f_[14] +\n               f_[12] * rhs.f_[15];\n  ret.f_[13] = f_[1] * rhs.f_[12] + f_[5] * rhs.f_[13] + f_[9] * rhs.f_[14] +\n               f_[13] * rhs.f_[15];\n  ret.f_[14] = f_[2] * rhs.f_[12] + f_[6] * rhs.f_[13] + f_[10] * rhs.f_[14] +\n               f_[14] * rhs.f_[15];\n  ret.f_[15] = f_[3] * rhs.f_[12] + f_[7] * rhs.f_[13] + f_[11] * rhs.f_[14] +\n               f_[15] * rhs.f_[15];\n\n  return ret;\n}\n\nVec4 Mat4::operator*(const Vec4& rhs) const {\n  Vec4 ret;\n  ret.x_ = rhs.x_ * f_[0] + rhs.y_ * f_[4] + rhs.z_ * f_[8] + rhs.w_ * f_[12];\n  ret.y_ = rhs.x_ * f_[1] + rhs.y_ * f_[5] + rhs.z_ * f_[9] + rhs.w_ * f_[13];\n  ret.z_ = rhs.x_ * f_[2] + rhs.y_ * f_[6] + rhs.z_ * f_[10] + rhs.w_ * f_[14];\n  ret.w_ = rhs.x_ * f_[3] + rhs.y_ * f_[7] + rhs.z_ * f_[11] + rhs.w_ * f_[15];\n  return ret;\n}\n\nMat4 Mat4::Inverse() {\n  Mat4 ret;\n  float det_1;\n  float pos = 0;\n  float neg = 0;\n  float temp;\n\n  temp = f_[0] * f_[5] * f_[10];\n  if (temp >= 0)\n    pos += temp;\n  else\n    neg += temp;\n  temp = f_[4] * f_[9] * f_[2];\n  if (temp >= 0)\n    pos += temp;\n  else\n    neg += temp;\n  temp = f_[8] * f_[1] * f_[6];\n  if (temp >= 0)\n    pos += temp;\n  else\n    neg += temp;\n  temp = -f_[8] * f_[5] * f_[2];\n  if (temp >= 0)\n    pos += temp;\n  else\n    neg += temp;\n  temp = -f_[4] * f_[1] * f_[10];\n  if (temp >= 0)\n    pos += temp;\n  else\n    neg += temp;\n  temp = -f_[0] * f_[9] * f_[6];\n  if (temp >= 0)\n    pos += temp;\n  else\n    neg += temp;\n  det_1 = pos + neg;\n\n  if (det_1 == 0.0) {\n    // Error\n  } else {\n    det_1 = 1.0f / det_1;\n    ret.f_[0] = (f_[5] * f_[10] - f_[9] * f_[6]) * det_1;\n    ret.f_[1] = -(f_[1] * f_[10] - f_[9] * f_[2]) * det_1;\n    ret.f_[2] = (f_[1] * f_[6] - f_[5] * f_[2]) * det_1;\n    ret.f_[4] = -(f_[4] * f_[10] - f_[8] * f_[6]) * det_1;\n    ret.f_[5] = (f_[0] * f_[10] - f_[8] * f_[2]) * det_1;\n    ret.f_[6] = -(f_[0] * f_[6] - f_[4] * f_[2]) * det_1;\n    ret.f_[8] = (f_[4] * f_[9] - f_[8] * f_[5]) * det_1;\n    ret.f_[9] = -(f_[0] * f_[9] - f_[8] * f_[1]) * det_1;\n    ret.f_[10] = (f_[0] * f_[5] - f_[4] * f_[1]) * det_1;\n\n    /* Calculate -C * inverse(A) */\n    ret.f_[12] =\n        -(f_[12] * ret.f_[0] + f_[13] * ret.f_[4] + f_[14] * ret.f_[8]);\n    ret.f_[13] =\n        -(f_[12] * ret.f_[1] + f_[13] * ret.f_[5] + f_[14] * ret.f_[9]);\n    ret.f_[14] =\n        -(f_[12] * ret.f_[2] + f_[13] * ret.f_[6] + f_[14] * ret.f_[10]);\n\n    ret.f_[3] = 0.0f;\n    ret.f_[7] = 0.0f;\n    ret.f_[11] = 0.0f;\n    ret.f_[15] = 1.0f;\n  }\n\n  *this = ret;\n  return *this;\n}\n\n//--------------------------------------------------------------------------------\n// Misc\n//--------------------------------------------------------------------------------\nMat4 Mat4::RotationX(const float fAngle) {\n  Mat4 ret;\n  float fCosine, fSine;\n\n  fCosine = cosf(fAngle);\n  fSine = sinf(fAngle);\n\n  ret.f_[0] = 1.0f;\n  ret.f_[4] = 0.0f;\n  ret.f_[8] = 0.0f;\n  ret.f_[12] = 0.0f;\n  ret.f_[1] = 0.0f;\n  ret.f_[5] = fCosine;\n  ret.f_[9] = fSine;\n  ret.f_[13] = 0.0f;\n  ret.f_[2] = 0.0f;\n  ret.f_[6] = -fSine;\n  ret.f_[10] = fCosine;\n  ret.f_[14] = 0.0f;\n  ret.f_[3] = 0.0f;\n  ret.f_[7] = 0.0f;\n  ret.f_[11] = 0.0f;\n  ret.f_[15] = 1.0f;\n  return ret;\n}\n\nMat4 Mat4::RotationY(const float fAngle) {\n  Mat4 ret;\n  float fCosine, fSine;\n\n  fCosine = cosf(fAngle);\n  fSine = sinf(fAngle);\n\n  ret.f_[0] = fCosine;\n  ret.f_[4] = 0.0f;\n  ret.f_[8] = -fSine;\n  ret.f_[12] = 0.0f;\n  ret.f_[1] = 0.0f;\n  ret.f_[5] = 1.0f;\n  ret.f_[9] = 0.0f;\n  ret.f_[13] = 0.0f;\n  ret.f_[2] = fSine;\n  ret.f_[6] = 0.0f;\n  ret.f_[10] = fCosine;\n  ret.f_[14] = 0.0f;\n  ret.f_[3] = 0.0f;\n  ret.f_[7] = 0.0f;\n  ret.f_[11] = 0.0f;\n  ret.f_[15] = 1.0f;\n  return ret;\n}\n\nMat4 Mat4::RotationZ(const float fAngle) {\n  Mat4 ret;\n  float fCosine, fSine;\n\n  fCosine = cosf(fAngle);\n  fSine = sinf(fAngle);\n\n  ret.f_[0] = fCosine;\n  ret.f_[4] = fSine;\n  ret.f_[8] = 0.0f;\n  ret.f_[12] = 0.0f;\n  ret.f_[1] = -fSine;\n  ret.f_[5] = fCosine;\n  ret.f_[9] = 0.0f;\n  ret.f_[13] = 0.0f;\n  ret.f_[2] = 0.0f;\n  ret.f_[6] = 0.0f;\n  ret.f_[10] = 1.0f;\n  ret.f_[14] = 0.0f;\n  ret.f_[3] = 0.0f;\n  ret.f_[7] = 0.0f;\n  ret.f_[11] = 0.0f;\n  ret.f_[15] = 1.0f;\n  return ret;\n}\n\nMat4 Mat4::Scale(const float scaleX, const float scaleY, const float scaleZ) {\n  Mat4 ret;\n  ret.f_[0] = scaleX;\n  ret.f_[5] = scaleY;\n  ret.f_[10] = scaleZ;\n  ret.f_[1] = ret.f_[2] = ret.f_[3] = ret.f_[4] = ret.f_[6] = ret.f_[7] =\n      ret.f_[8] = ret.f_[9] = ret.f_[11] = ret.f_[12] = ret.f_[13] =\n          ret.f_[14] = 0.f;\n  ret.f_[15] = 1.0f;\n  return ret;\n}\n\nMat4 Mat4::Translation(const float fX, const float fY, const float fZ) {\n  Mat4 ret;\n  ret.f_[0] = 1.0f;\n  ret.f_[4] = 0.0f;\n  ret.f_[8] = 0.0f;\n  ret.f_[12] = fX;\n  ret.f_[1] = 0.0f;\n  ret.f_[5] = 1.0f;\n  ret.f_[9] = 0.0f;\n  ret.f_[13] = fY;\n  ret.f_[2] = 0.0f;\n  ret.f_[6] = 0.0f;\n  ret.f_[10] = 1.0f;\n  ret.f_[14] = fZ;\n  ret.f_[3] = 0.0f;\n  ret.f_[7] = 0.0f;\n  ret.f_[11] = 0.0f;\n  ret.f_[15] = 1.0f;\n  return ret;\n}\n\nMat4 Mat4::Translation(const Vec3 vec) {\n  Mat4 ret;\n  ret.f_[0] = 1.0f;\n  ret.f_[4] = 0.0f;\n  ret.f_[8] = 0.0f;\n  ret.f_[12] = vec.x_;\n  ret.f_[1] = 0.0f;\n  ret.f_[5] = 1.0f;\n  ret.f_[9] = 0.0f;\n  ret.f_[13] = vec.y_;\n  ret.f_[2] = 0.0f;\n  ret.f_[6] = 0.0f;\n  ret.f_[10] = 1.0f;\n  ret.f_[14] = vec.z_;\n  ret.f_[3] = 0.0f;\n  ret.f_[7] = 0.0f;\n  ret.f_[11] = 0.0f;\n  ret.f_[15] = 1.0f;\n  return ret;\n}\n\nMat4 Mat4::Perspective(float width, float height, float nearPlane,\n                       float farPlane) {\n  float n2 = 2.0f * nearPlane;\n  float rcpnmf = 1.f / (nearPlane - farPlane);\n\n  Mat4 result;\n  result.f_[0] = n2 / width;\n  result.f_[4] = 0;\n  result.f_[8] = 0;\n  result.f_[12] = 0;\n  result.f_[1] = 0;\n  result.f_[5] = n2 / height;\n  result.f_[9] = 0;\n  result.f_[13] = 0;\n  result.f_[2] = 0;\n  result.f_[6] = 0;\n  result.f_[10] = (farPlane + nearPlane) * rcpnmf;\n  result.f_[14] = farPlane * rcpnmf * n2;\n  result.f_[3] = 0;\n  result.f_[7] = 0;\n  result.f_[11] = -1.0;\n  result.f_[15] = 0;\n\n  return result;\n}\n\nMat4 Mat4::Ortho2D(float left, float top, float right, float bottom) {\n  const float zNear = -1.0f;\n  const float zFar = 1.0f;\n  const float inv_z = 1.0f / (zFar - zNear);\n  const float inv_y = 1.0f / (-top + bottom);\n  const float inv_x = 1.0f / (right - left);\n\n  Mat4 result;\n  result.f_[0] = 2.0f * inv_x;\n  result.f_[1] = 0.0f;\n  result.f_[2] = 0.0f;\n  result.f_[3] = 0.0f;\n\n  result.f_[4] = 0.0f;\n  result.f_[5] = 2.0 * inv_y;\n  result.f_[6] = 0.0f;\n  result.f_[7] = 0.0f;\n\n  result.f_[8] = 0.0f;\n  result.f_[9] = 0.0f;\n  result.f_[10] = -2.0f * inv_z;\n  result.f_[11] = 0.0f;\n\n  result.f_[12] = -(right + left) * inv_x;\n  result.f_[13] = (top + bottom) * inv_y;\n  result.f_[14] = -(zFar + zNear) * inv_z;\n  result.f_[15] = 1.0f;\n  return result;\n}\n\nMat4 Mat4::LookAt(const Vec3& vec_eye, const Vec3& vec_at, const Vec3& vec_up) {\n  Vec3 vec_forward, vec_up_norm, vec_side;\n  Mat4 result;\n\n  vec_forward.x_ = vec_eye.x_ - vec_at.x_;\n  vec_forward.y_ = vec_eye.y_ - vec_at.y_;\n  vec_forward.z_ = vec_eye.z_ - vec_at.z_;\n\n  vec_forward.Normalize();\n  vec_up_norm = vec_up;\n  vec_up_norm.Normalize();\n  vec_side = vec_up_norm.Cross(vec_forward);\n  vec_up_norm = vec_forward.Cross(vec_side);\n\n  result.f_[0] = vec_side.x_;\n  result.f_[4] = vec_side.y_;\n  result.f_[8] = vec_side.z_;\n  result.f_[12] = 0;\n  result.f_[1] = vec_up_norm.x_;\n  result.f_[5] = vec_up_norm.y_;\n  result.f_[9] = vec_up_norm.z_;\n  result.f_[13] = 0;\n  result.f_[2] = vec_forward.x_;\n  result.f_[6] = vec_forward.y_;\n  result.f_[10] = vec_forward.z_;\n  result.f_[14] = 0;\n  result.f_[3] = 0;\n  result.f_[7] = 0;\n  result.f_[11] = 0;\n  result.f_[15] = 1.0;\n\n  result.PostTranslate(-vec_eye.x_, -vec_eye.y_, -vec_eye.z_);\n  return result;\n}\n\n}  // namespace ndk_helper\n"
  },
  {
    "path": "teapots/common/ndk_helper/vecmath.h",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef VECMATH_H_\n#define VECMATH_H_\n\n#include <cmath>\n\n#include \"JNIHelper.h\"\n\nnamespace ndk_helper {\n\n/******************************************************************\n * Helper class for vector math operations\n * Currently all implementations are in pure C++.\n * Each class is an opaque class so caller does not have a direct access\n * to each element. This is for an ease of future optimization to use vector\n *operations.\n *\n */\n\nclass Vec2;\nclass Vec3;\nclass Vec4;\nclass Mat4;\n\n/******************************************************************\n * 2 elements vector class\n *\n */\nclass Vec2 {\n private:\n  float x_;\n  float y_;\n\n public:\n  friend class Vec3;\n  friend class Vec4;\n  friend class Mat4;\n  friend class Quaternion;\n\n  Vec2() { x_ = y_ = 0.f; }\n\n  Vec2(const float fX, const float fY) {\n    x_ = fX;\n    y_ = fY;\n  }\n\n  Vec2(const float* pVec) {\n    x_ = (*pVec++);\n    y_ = (*pVec++);\n  }\n\n  // Operators\n  Vec2 operator*(const Vec2& rhs) const {\n    Vec2 ret;\n    ret.x_ = x_ * rhs.x_;\n    ret.y_ = y_ * rhs.y_;\n    return ret;\n  }\n\n  Vec2 operator/(const Vec2& rhs) const {\n    Vec2 ret;\n    ret.x_ = x_ / rhs.x_;\n    ret.y_ = y_ / rhs.y_;\n    return ret;\n  }\n\n  Vec2 operator+(const Vec2& rhs) const {\n    Vec2 ret;\n    ret.x_ = x_ + rhs.x_;\n    ret.y_ = y_ + rhs.y_;\n    return ret;\n  }\n\n  Vec2 operator-(const Vec2& rhs) const {\n    Vec2 ret;\n    ret.x_ = x_ - rhs.x_;\n    ret.y_ = y_ - rhs.y_;\n    return ret;\n  }\n\n  Vec2& operator+=(const Vec2& rhs) {\n    x_ += rhs.x_;\n    y_ += rhs.y_;\n    return *this;\n  }\n\n  Vec2& operator-=(const Vec2& rhs) {\n    x_ -= rhs.x_;\n    y_ -= rhs.y_;\n    return *this;\n  }\n\n  Vec2& operator*=(const Vec2& rhs) {\n    x_ *= rhs.x_;\n    y_ *= rhs.y_;\n    return *this;\n  }\n\n  Vec2& operator/=(const Vec2& rhs) {\n    x_ /= rhs.x_;\n    y_ /= rhs.y_;\n    return *this;\n  }\n\n  // External operators\n  friend Vec2 operator-(const Vec2& rhs) { return Vec2(rhs) *= -1; }\n\n  friend Vec2 operator*(const float lhs, const Vec2& rhs) {\n    Vec2 ret;\n    ret.x_ = lhs * rhs.x_;\n    ret.y_ = lhs * rhs.y_;\n    return ret;\n  }\n\n  friend Vec2 operator/(const float lhs, const Vec2& rhs) {\n    Vec2 ret;\n    ret.x_ = lhs / rhs.x_;\n    ret.y_ = lhs / rhs.y_;\n    return ret;\n  }\n\n  // Operators with float\n  Vec2 operator*(const float& rhs) const {\n    Vec2 ret;\n    ret.x_ = x_ * rhs;\n    ret.y_ = y_ * rhs;\n    return ret;\n  }\n\n  Vec2& operator*=(const float& rhs) {\n    x_ = x_ * rhs;\n    y_ = y_ * rhs;\n    return *this;\n  }\n\n  Vec2 operator/(const float& rhs) const {\n    Vec2 ret;\n    ret.x_ = x_ / rhs;\n    ret.y_ = y_ / rhs;\n    return ret;\n  }\n\n  Vec2& operator/=(const float& rhs) {\n    x_ = x_ / rhs;\n    y_ = y_ / rhs;\n    return *this;\n  }\n\n  // Compare\n  bool operator==(const Vec2& rhs) const {\n    if (x_ != rhs.x_ || y_ != rhs.y_) return false;\n    return true;\n  }\n\n  bool operator!=(const Vec2& rhs) const {\n    if (x_ == rhs.x_) return false;\n\n    return true;\n  }\n\n  float Length() const { return sqrtf(x_ * x_ + y_ * y_); }\n\n  Vec2 Normalize() {\n    float len = Length();\n    x_ = x_ / len;\n    y_ = y_ / len;\n    return *this;\n  }\n\n  float Dot(const Vec2& rhs) { return x_ * rhs.x_ + y_ * rhs.y_; }\n\n  bool Validate() {\n    if (std::isnan(x_) || std::isnan(y_)) return false;\n    return true;\n  }\n\n  void Value(float& fX, float& fY) {\n    fX = x_;\n    fY = y_;\n  }\n\n  void Dump() { LOGI(\"Vec2 %f %f\", x_, y_); }\n};\n\n/******************************************************************\n * 3 elements vector class\n *\n */\nclass Vec3 {\n private:\n  float x_, y_, z_;\n\n public:\n  friend class Vec4;\n  friend class Mat4;\n  friend class Quaternion;\n\n  Vec3() { x_ = y_ = z_ = 0.f; }\n\n  Vec3(const float fX, const float fY, const float fZ) {\n    x_ = fX;\n    y_ = fY;\n    z_ = fZ;\n  }\n\n  Vec3(const float* pVec) {\n    x_ = (*pVec++);\n    y_ = (*pVec++);\n    z_ = *pVec;\n  }\n\n  Vec3(const Vec2& vec, float f) {\n    x_ = vec.x_;\n    y_ = vec.y_;\n    z_ = f;\n  }\n\n  Vec3(const Vec4& vec);\n\n  // Operators\n  Vec3 operator*(const Vec3& rhs) const {\n    Vec3 ret;\n    ret.x_ = x_ * rhs.x_;\n    ret.y_ = y_ * rhs.y_;\n    ret.z_ = z_ * rhs.z_;\n    return ret;\n  }\n\n  Vec3 operator/(const Vec3& rhs) const {\n    Vec3 ret;\n    ret.x_ = x_ / rhs.x_;\n    ret.y_ = y_ / rhs.y_;\n    ret.z_ = z_ / rhs.z_;\n    return ret;\n  }\n\n  Vec3 operator+(const Vec3& rhs) const {\n    Vec3 ret;\n    ret.x_ = x_ + rhs.x_;\n    ret.y_ = y_ + rhs.y_;\n    ret.z_ = z_ + rhs.z_;\n    return ret;\n  }\n\n  Vec3 operator-(const Vec3& rhs) const {\n    Vec3 ret;\n    ret.x_ = x_ - rhs.x_;\n    ret.y_ = y_ - rhs.y_;\n    ret.z_ = z_ - rhs.z_;\n    return ret;\n  }\n\n  Vec3& operator+=(const Vec3& rhs) {\n    x_ += rhs.x_;\n    y_ += rhs.y_;\n    z_ += rhs.z_;\n    return *this;\n  }\n\n  Vec3& operator-=(const Vec3& rhs) {\n    x_ -= rhs.x_;\n    y_ -= rhs.y_;\n    z_ -= rhs.z_;\n    return *this;\n  }\n\n  Vec3& operator*=(const Vec3& rhs) {\n    x_ *= rhs.x_;\n    y_ *= rhs.y_;\n    z_ *= rhs.z_;\n    return *this;\n  }\n\n  Vec3& operator/=(const Vec3& rhs) {\n    x_ /= rhs.x_;\n    y_ /= rhs.y_;\n    z_ /= rhs.z_;\n    return *this;\n  }\n\n  // External operators\n  friend Vec3 operator-(const Vec3& rhs) { return Vec3(rhs) *= -1; }\n\n  friend Vec3 operator*(const float lhs, const Vec3& rhs) {\n    Vec3 ret;\n    ret.x_ = lhs * rhs.x_;\n    ret.y_ = lhs * rhs.y_;\n    ret.z_ = lhs * rhs.z_;\n    return ret;\n  }\n\n  friend Vec3 operator/(const float lhs, const Vec3& rhs) {\n    Vec3 ret;\n    ret.x_ = lhs / rhs.x_;\n    ret.y_ = lhs / rhs.y_;\n    ret.z_ = lhs / rhs.z_;\n    return ret;\n  }\n\n  // Operators with float\n  Vec3 operator*(const float& rhs) const {\n    Vec3 ret;\n    ret.x_ = x_ * rhs;\n    ret.y_ = y_ * rhs;\n    ret.z_ = z_ * rhs;\n    return ret;\n  }\n\n  Vec3& operator*=(const float& rhs) {\n    x_ = x_ * rhs;\n    y_ = y_ * rhs;\n    z_ = z_ * rhs;\n    return *this;\n  }\n\n  Vec3 operator/(const float& rhs) const {\n    Vec3 ret;\n    ret.x_ = x_ / rhs;\n    ret.y_ = y_ / rhs;\n    ret.z_ = z_ / rhs;\n    return ret;\n  }\n\n  Vec3& operator/=(const float& rhs) {\n    x_ = x_ / rhs;\n    y_ = y_ / rhs;\n    z_ = z_ / rhs;\n    return *this;\n  }\n\n  // Compare\n  bool operator==(const Vec3& rhs) const {\n    if (x_ != rhs.x_ || y_ != rhs.y_ || z_ != rhs.z_) return false;\n    return true;\n  }\n\n  bool operator!=(const Vec3& rhs) const {\n    if (x_ == rhs.x_) return false;\n\n    return true;\n  }\n\n  float Length() const { return sqrtf(x_ * x_ + y_ * y_ + z_ * z_); }\n\n  Vec3 Normalize() {\n    float len = Length();\n    x_ = x_ / len;\n    y_ = y_ / len;\n    z_ = z_ / len;\n    return *this;\n  }\n\n  float Dot(const Vec3& rhs) { return x_ * rhs.x_ + y_ * rhs.y_ + z_ * rhs.z_; }\n\n  Vec3 Cross(const Vec3& rhs) {\n    Vec3 ret;\n    ret.x_ = y_ * rhs.z_ - z_ * rhs.y_;\n    ret.y_ = z_ * rhs.x_ - x_ * rhs.z_;\n    ret.z_ = x_ * rhs.y_ - y_ * rhs.x_;\n    return ret;\n  }\n\n  bool Validate() {\n    if (std::isnan(x_) || std::isnan(y_) || std::isnan(z_)) return false;\n    return true;\n  }\n\n  void Value(float& fX, float& fY, float& fZ) {\n    fX = x_;\n    fY = y_;\n    fZ = z_;\n  }\n\n  void Dump() { LOGI(\"Vec3 %f %f %f\", x_, y_, z_); }\n};\n\n/******************************************************************\n * 4 elements vector class\n *\n */\nclass Vec4 {\n private:\n  float x_, y_, z_, w_;\n\n public:\n  friend class Vec3;\n  friend class Mat4;\n  friend class Quaternion;\n\n  Vec4() { x_ = y_ = z_ = w_ = 0.f; }\n\n  Vec4(const float fX, const float fY, const float fZ, const float fW) {\n    x_ = fX;\n    y_ = fY;\n    z_ = fZ;\n    w_ = fW;\n  }\n\n  Vec4(const Vec4& vec) {\n    x_ = vec.x_;\n    y_ = vec.y_;\n    z_ = vec.z_;\n    w_ = vec.w_;\n  }\n\n  Vec4(const Vec3& vec, const float fW) {\n    x_ = vec.x_;\n    y_ = vec.y_;\n    z_ = vec.z_;\n    w_ = fW;\n  }\n\n  Vec4(const float* pVec) {\n    x_ = (*pVec++);\n    y_ = (*pVec++);\n    z_ = *pVec;\n    w_ = *pVec;\n  }\n\n  // Operators\n  Vec4 operator*(const Vec4& rhs) const {\n    Vec4 ret;\n    ret.x_ = x_ * rhs.x_;\n    ret.y_ = y_ * rhs.y_;\n    ret.z_ = z_ * rhs.z_;\n    ret.w_ = z_ * rhs.w_;\n    return ret;\n  }\n\n  Vec4 operator/(const Vec4& rhs) const {\n    Vec4 ret;\n    ret.x_ = x_ / rhs.x_;\n    ret.y_ = y_ / rhs.y_;\n    ret.z_ = z_ / rhs.z_;\n    ret.w_ = z_ / rhs.w_;\n    return ret;\n  }\n\n  Vec4 operator+(const Vec4& rhs) const {\n    Vec4 ret;\n    ret.x_ = x_ + rhs.x_;\n    ret.y_ = y_ + rhs.y_;\n    ret.z_ = z_ + rhs.z_;\n    ret.w_ = z_ + rhs.w_;\n    return ret;\n  }\n\n  Vec4 operator-(const Vec4& rhs) const {\n    Vec4 ret;\n    ret.x_ = x_ - rhs.x_;\n    ret.y_ = y_ - rhs.y_;\n    ret.z_ = z_ - rhs.z_;\n    ret.w_ = z_ - rhs.w_;\n    return ret;\n  }\n\n  Vec4& operator+=(const Vec4& rhs) {\n    x_ += rhs.x_;\n    y_ += rhs.y_;\n    z_ += rhs.z_;\n    w_ += rhs.w_;\n    return *this;\n  }\n\n  Vec4& operator-=(const Vec4& rhs) {\n    x_ -= rhs.x_;\n    y_ -= rhs.y_;\n    z_ -= rhs.z_;\n    w_ -= rhs.w_;\n    return *this;\n  }\n\n  Vec4& operator*=(const Vec4& rhs) {\n    x_ *= rhs.x_;\n    y_ *= rhs.y_;\n    z_ *= rhs.z_;\n    w_ *= rhs.w_;\n    return *this;\n  }\n\n  Vec4& operator/=(const Vec4& rhs) {\n    x_ /= rhs.x_;\n    y_ /= rhs.y_;\n    z_ /= rhs.z_;\n    w_ /= rhs.w_;\n    return *this;\n  }\n\n  // External operators\n  friend Vec4 operator-(const Vec4& rhs) { return Vec4(rhs) *= -1; }\n\n  friend Vec4 operator*(const float lhs, const Vec4& rhs) {\n    Vec4 ret;\n    ret.x_ = lhs * rhs.x_;\n    ret.y_ = lhs * rhs.y_;\n    ret.z_ = lhs * rhs.z_;\n    ret.w_ = lhs * rhs.w_;\n    return ret;\n  }\n\n  friend Vec4 operator/(const float lhs, const Vec4& rhs) {\n    Vec4 ret;\n    ret.x_ = lhs / rhs.x_;\n    ret.y_ = lhs / rhs.y_;\n    ret.z_ = lhs / rhs.z_;\n    ret.w_ = lhs / rhs.w_;\n    return ret;\n  }\n\n  // Operators with float\n  Vec4 operator*(const float& rhs) const {\n    Vec4 ret;\n    ret.x_ = x_ * rhs;\n    ret.y_ = y_ * rhs;\n    ret.z_ = z_ * rhs;\n    ret.w_ = w_ * rhs;\n    return ret;\n  }\n\n  Vec4& operator*=(const float& rhs) {\n    x_ = x_ * rhs;\n    y_ = y_ * rhs;\n    z_ = z_ * rhs;\n    w_ = w_ * rhs;\n    return *this;\n  }\n\n  Vec4 operator/(const float& rhs) const {\n    Vec4 ret;\n    ret.x_ = x_ / rhs;\n    ret.y_ = y_ / rhs;\n    ret.z_ = z_ / rhs;\n    ret.w_ = w_ / rhs;\n    return ret;\n  }\n\n  Vec4& operator/=(const float& rhs) {\n    x_ = x_ / rhs;\n    y_ = y_ / rhs;\n    z_ = z_ / rhs;\n    w_ = w_ / rhs;\n    return *this;\n  }\n\n  // Compare\n  bool operator==(const Vec4& rhs) const {\n    if (x_ != rhs.x_ || y_ != rhs.y_ || z_ != rhs.z_ || w_ != rhs.w_)\n      return false;\n    return true;\n  }\n\n  bool operator!=(const Vec4& rhs) const {\n    if (x_ == rhs.x_) return false;\n\n    return true;\n  }\n\n  Vec4 operator*(const Mat4& rhs) const;\n\n  float Length() const { return sqrtf(x_ * x_ + y_ * y_ + z_ * z_ + w_ * w_); }\n\n  Vec4 Normalize() {\n    float len = Length();\n    x_ = x_ / len;\n    y_ = y_ / len;\n    z_ = z_ / len;\n    w_ = w_ / len;\n    return *this;\n  }\n\n  float Dot(const Vec3& rhs) { return x_ * rhs.x_ + y_ * rhs.y_ + z_ * rhs.z_; }\n\n  Vec3 Cross(const Vec3& rhs) {\n    Vec3 ret;\n    ret.x_ = y_ * rhs.z_ - z_ * rhs.y_;\n    ret.y_ = z_ * rhs.x_ - x_ * rhs.z_;\n    ret.z_ = x_ * rhs.y_ - y_ * rhs.x_;\n    return ret;\n  }\n\n  bool Validate() {\n    if (std::isnan(x_) || std::isnan(y_) || std::isnan(z_) || std::isnan(w_))\n      return false;\n\n    return true;\n  }\n\n  void Value(float& fX, float& fY, float& fZ, float& fW) {\n    fX = x_;\n    fY = y_;\n    fZ = z_;\n    fW = w_;\n  }\n};\n\n/******************************************************************\n * 4x4 matrix\n *\n */\nclass Mat4 {\n private:\n  float f_[16];\n\n public:\n  friend class Vec3;\n  friend class Vec4;\n  friend class Quaternion;\n\n  Mat4();\n  Mat4(const Mat4&);\n  Mat4(const float*);\n\n  Mat4 operator*(const Mat4& rhs) const;\n  Vec4 operator*(const Vec4& rhs) const;\n\n  Mat4 operator+(const Mat4& rhs) const {\n    Mat4 ret;\n    for (int32_t i = 0; i < 16; ++i) {\n      ret.f_[i] = f_[i] + rhs.f_[i];\n    }\n    return ret;\n  }\n\n  Mat4 operator-(const Mat4& rhs) const {\n    Mat4 ret;\n    for (int32_t i = 0; i < 16; ++i) {\n      ret.f_[i] = f_[i] - rhs.f_[i];\n    }\n    return ret;\n  }\n\n  Mat4& operator+=(const Mat4& rhs) {\n    for (int32_t i = 0; i < 16; ++i) {\n      f_[i] += rhs.f_[i];\n    }\n    return *this;\n  }\n\n  Mat4& operator-=(const Mat4& rhs) {\n    for (int32_t i = 0; i < 16; ++i) {\n      f_[i] -= rhs.f_[i];\n    }\n    return *this;\n  }\n\n  Mat4& operator*=(const Mat4& rhs) {\n    Mat4 ret;\n    ret.f_[0] = f_[0] * rhs.f_[0] + f_[4] * rhs.f_[1] + f_[8] * rhs.f_[2] +\n                f_[12] * rhs.f_[3];\n    ret.f_[1] = f_[1] * rhs.f_[0] + f_[5] * rhs.f_[1] + f_[9] * rhs.f_[2] +\n                f_[13] * rhs.f_[3];\n    ret.f_[2] = f_[2] * rhs.f_[0] + f_[6] * rhs.f_[1] + f_[10] * rhs.f_[2] +\n                f_[14] * rhs.f_[3];\n    ret.f_[3] = f_[3] * rhs.f_[0] + f_[7] * rhs.f_[1] + f_[11] * rhs.f_[2] +\n                f_[15] * rhs.f_[3];\n\n    ret.f_[4] = f_[0] * rhs.f_[4] + f_[4] * rhs.f_[5] + f_[8] * rhs.f_[6] +\n                f_[12] * rhs.f_[7];\n    ret.f_[5] = f_[1] * rhs.f_[4] + f_[5] * rhs.f_[5] + f_[9] * rhs.f_[6] +\n                f_[13] * rhs.f_[7];\n    ret.f_[6] = f_[2] * rhs.f_[4] + f_[6] * rhs.f_[5] + f_[10] * rhs.f_[6] +\n                f_[14] * rhs.f_[7];\n    ret.f_[7] = f_[3] * rhs.f_[4] + f_[7] * rhs.f_[5] + f_[11] * rhs.f_[6] +\n                f_[15] * rhs.f_[7];\n\n    ret.f_[8] = f_[0] * rhs.f_[8] + f_[4] * rhs.f_[9] + f_[8] * rhs.f_[10] +\n                f_[12] * rhs.f_[11];\n    ret.f_[9] = f_[1] * rhs.f_[8] + f_[5] * rhs.f_[9] + f_[9] * rhs.f_[10] +\n                f_[13] * rhs.f_[11];\n    ret.f_[10] = f_[2] * rhs.f_[8] + f_[6] * rhs.f_[9] + f_[10] * rhs.f_[10] +\n                 f_[14] * rhs.f_[11];\n    ret.f_[11] = f_[3] * rhs.f_[8] + f_[7] * rhs.f_[9] + f_[11] * rhs.f_[10] +\n                 f_[15] * rhs.f_[11];\n\n    ret.f_[12] = f_[0] * rhs.f_[12] + f_[4] * rhs.f_[13] + f_[8] * rhs.f_[14] +\n                 f_[12] * rhs.f_[15];\n    ret.f_[13] = f_[1] * rhs.f_[12] + f_[5] * rhs.f_[13] + f_[9] * rhs.f_[14] +\n                 f_[13] * rhs.f_[15];\n    ret.f_[14] = f_[2] * rhs.f_[12] + f_[6] * rhs.f_[13] + f_[10] * rhs.f_[14] +\n                 f_[14] * rhs.f_[15];\n    ret.f_[15] = f_[3] * rhs.f_[12] + f_[7] * rhs.f_[13] + f_[11] * rhs.f_[14] +\n                 f_[15] * rhs.f_[15];\n\n    *this = ret;\n    return *this;\n  }\n\n  Mat4 operator*(const float rhs) {\n    Mat4 ret;\n    for (int32_t i = 0; i < 16; ++i) {\n      ret.f_[i] = f_[i] * rhs;\n    }\n    return ret;\n  }\n\n  Mat4& operator*=(const float rhs) {\n    for (int32_t i = 0; i < 16; ++i) {\n      f_[i] *= rhs;\n    }\n    return *this;\n  }\n\n  Mat4& operator=(const Mat4& rhs) {\n    for (int32_t i = 0; i < 16; ++i) {\n      f_[i] = rhs.f_[i];\n    }\n    return *this;\n  }\n\n  Mat4 Inverse();\n\n  Mat4 Transpose() {\n    Mat4 ret;\n    ret.f_[0] = f_[0];\n    ret.f_[1] = f_[4];\n    ret.f_[2] = f_[8];\n    ret.f_[3] = f_[12];\n    ret.f_[4] = f_[1];\n    ret.f_[5] = f_[5];\n    ret.f_[6] = f_[9];\n    ret.f_[7] = f_[13];\n    ret.f_[8] = f_[2];\n    ret.f_[9] = f_[6];\n    ret.f_[10] = f_[10];\n    ret.f_[11] = f_[14];\n    ret.f_[12] = f_[3];\n    ret.f_[13] = f_[7];\n    ret.f_[14] = f_[11];\n    ret.f_[15] = f_[15];\n    *this = ret;\n    return *this;\n  }\n\n  Mat4& PostTranslate(float tx, float ty, float tz) {\n    f_[12] += (tx * f_[0]) + (ty * f_[4]) + (tz * f_[8]);\n    f_[13] += (tx * f_[1]) + (ty * f_[5]) + (tz * f_[9]);\n    f_[14] += (tx * f_[2]) + (ty * f_[6]) + (tz * f_[10]);\n    f_[15] += (tx * f_[3]) + (ty * f_[7]) + (tz * f_[11]);\n    return *this;\n  }\n\n  float* Ptr() { return f_; }\n\n  //--------------------------------------------------------------------------------\n  // Misc\n  //--------------------------------------------------------------------------------\n  static Mat4 Perspective(float width, float height, float nearPlane,\n                          float farPlane);\n  static Mat4 Ortho2D(float left, float top, float right, float bottom);\n\n  static Mat4 LookAt(const Vec3& vEye, const Vec3& vAt, const Vec3& vUp);\n\n  static Mat4 Translation(const float fX, const float fY, const float fZ);\n  static Mat4 Translation(const Vec3 vec);\n\n  static Mat4 RotationX(const float angle);\n\n  static Mat4 RotationY(const float angle);\n\n  static Mat4 RotationZ(const float angle);\n\n  static Mat4 Scale(const float scaleX, const float scaleY, const float scaleZ);\n\n  static Mat4 Identity() {\n    Mat4 ret;\n    ret.f_[0] = 1.f;\n    ret.f_[1] = 0;\n    ret.f_[2] = 0;\n    ret.f_[3] = 0;\n    ret.f_[4] = 0;\n    ret.f_[5] = 1.f;\n    ret.f_[6] = 0;\n    ret.f_[7] = 0;\n    ret.f_[8] = 0;\n    ret.f_[9] = 0;\n    ret.f_[10] = 1.f;\n    ret.f_[11] = 0;\n    ret.f_[12] = 0;\n    ret.f_[13] = 0;\n    ret.f_[14] = 0;\n    ret.f_[15] = 1.f;\n    return ret;\n  }\n\n  void Dump() {\n    LOGI(\"%f %f %f %f\", f_[0], f_[1], f_[2], f_[3]);\n    LOGI(\"%f %f %f %f\", f_[4], f_[5], f_[6], f_[7]);\n    LOGI(\"%f %f %f %f\", f_[8], f_[9], f_[10], f_[11]);\n    LOGI(\"%f %f %f %f\", f_[12], f_[13], f_[14], f_[15]);\n  }\n};\n\n/******************************************************************\n * Quaternion class\n *\n */\nclass Quaternion {\n private:\n  float x_, y_, z_, w_;\n\n public:\n  friend class Vec3;\n  friend class Vec4;\n  friend class Mat4;\n\n  Quaternion() {\n    x_ = 0.f;\n    y_ = 0.f;\n    z_ = 0.f;\n    w_ = 1.f;\n  }\n\n  Quaternion(const float fX, const float fY, const float fZ, const float fW) {\n    x_ = fX;\n    y_ = fY;\n    z_ = fZ;\n    w_ = fW;\n  }\n\n  Quaternion(const Vec3 vec, const float fW) {\n    x_ = vec.x_;\n    y_ = vec.y_;\n    z_ = vec.z_;\n    w_ = fW;\n  }\n\n  Quaternion(const float* p) {\n    x_ = *p++;\n    y_ = *p++;\n    z_ = *p++;\n    w_ = *p++;\n  }\n\n  Quaternion operator*(const Quaternion rhs) {\n    Quaternion ret;\n    ret.x_ = x_ * rhs.w_ + y_ * rhs.z_ - z_ * rhs.y_ + w_ * rhs.x_;\n    ret.y_ = -x_ * rhs.z_ + y_ * rhs.w_ + z_ * rhs.x_ + w_ * rhs.y_;\n    ret.z_ = x_ * rhs.y_ - y_ * rhs.x_ + z_ * rhs.w_ + w_ * rhs.z_;\n    ret.w_ = -x_ * rhs.x_ - y_ * rhs.y_ - z_ * rhs.z_ + w_ * rhs.w_;\n    return ret;\n  }\n\n  Quaternion& operator*=(const Quaternion rhs) {\n    Quaternion ret;\n    ret.x_ = x_ * rhs.w_ + y_ * rhs.z_ - z_ * rhs.y_ + w_ * rhs.x_;\n    ret.y_ = -x_ * rhs.z_ + y_ * rhs.w_ + z_ * rhs.x_ + w_ * rhs.y_;\n    ret.z_ = x_ * rhs.y_ - y_ * rhs.x_ + z_ * rhs.w_ + w_ * rhs.z_;\n    ret.w_ = -x_ * rhs.x_ - y_ * rhs.y_ - z_ * rhs.z_ + w_ * rhs.w_;\n    *this = ret;\n    return *this;\n  }\n\n  Quaternion Conjugate() {\n    x_ = -x_;\n    y_ = -y_;\n    z_ = -z_;\n    return *this;\n  }\n\n  // Non destuctive version\n  Quaternion Conjugated() {\n    Quaternion ret;\n    ret.x_ = -x_;\n    ret.y_ = -y_;\n    ret.z_ = -z_;\n    ret.w_ = w_;\n    return ret;\n  }\n\n  void ToMatrix(Mat4& mat) {\n    float x2 = x_ * x_ * 2.0f;\n    float y2 = y_ * y_ * 2.0f;\n    float z2 = z_ * z_ * 2.0f;\n    float xy = x_ * y_ * 2.0f;\n    float yz = y_ * z_ * 2.0f;\n    float zx = z_ * x_ * 2.0f;\n    float xw = x_ * w_ * 2.0f;\n    float yw = y_ * w_ * 2.0f;\n    float zw = z_ * w_ * 2.0f;\n\n    mat.f_[0] = 1.0f - y2 - z2;\n    mat.f_[1] = xy + zw;\n    mat.f_[2] = zx - yw;\n    mat.f_[4] = xy - zw;\n    mat.f_[5] = 1.0f - z2 - x2;\n    mat.f_[6] = yz + xw;\n    mat.f_[8] = zx + yw;\n    mat.f_[9] = yz - xw;\n    mat.f_[10] = 1.0f - x2 - y2;\n\n    mat.f_[3] = mat.f_[7] = mat.f_[11] = mat.f_[12] = mat.f_[13] = mat.f_[14] =\n        0.0f;\n    mat.f_[15] = 1.0f;\n  }\n\n  void ToMatrixPreserveTranslate(Mat4& mat) {\n    float x2 = x_ * x_ * 2.0f;\n    float y2 = y_ * y_ * 2.0f;\n    float z2 = z_ * z_ * 2.0f;\n    float xy = x_ * y_ * 2.0f;\n    float yz = y_ * z_ * 2.0f;\n    float zx = z_ * x_ * 2.0f;\n    float xw = x_ * w_ * 2.0f;\n    float yw = y_ * w_ * 2.0f;\n    float zw = z_ * w_ * 2.0f;\n\n    mat.f_[0] = 1.0f - y2 - z2;\n    mat.f_[1] = xy + zw;\n    mat.f_[2] = zx - yw;\n    mat.f_[4] = xy - zw;\n    mat.f_[5] = 1.0f - z2 - x2;\n    mat.f_[6] = yz + xw;\n    mat.f_[8] = zx + yw;\n    mat.f_[9] = yz - xw;\n    mat.f_[10] = 1.0f - x2 - y2;\n\n    mat.f_[3] = mat.f_[7] = mat.f_[11] = 0.0f;\n    mat.f_[15] = 1.0f;\n  }\n\n  static Quaternion RotationAxis(const Vec3 axis, const float angle) {\n    Quaternion ret;\n    float s = sinf(angle / 2);\n    ret.x_ = s * axis.x_;\n    ret.y_ = s * axis.y_;\n    ret.z_ = s * axis.z_;\n    ret.w_ = cosf(angle / 2);\n    return ret;\n  }\n\n  void Value(float& fX, float& fY, float& fZ, float& fW) {\n    fX = x_;\n    fY = y_;\n    fZ = z_;\n    fW = w_;\n  }\n};\n\n}  // namespace ndk_helper\n#endif /* VECMATH_H_ */\n"
  },
  {
    "path": "teapots/image-decoder/README.md",
    "content": "# image-decoder\n\nThis sample demonstrates the\n[ImageDecoder](https://developer.android.com/ndk/guides/image-decoder)\nfunctionality added to Android 11:\n\n- Texture files are decoded with AImageDecoder\n- The rest of the code is the same as that of TexturedTeapot This sample needs\n  to be build with NDK 21.1 available from the canary channel, Android Studio\n  4.0+ would prompt you to install the needed NDK; in case you meet\n  difficulties, check out\n  [NDK configuration documentation](https://github.com/android/ndk-samples/wiki/Configure-NDK-Path)\n  to fix local issues.\n\n## Screenshots\n\n![screenshot](screenshot.png)\n"
  },
  {
    "path": "teapots/image-decoder/build.gradle",
    "content": "plugins {\n    id \"ndksamples.android.application\"\n}\n\nandroid {\n    namespace 'com.sample.imagedecoder'\n\n    defaultConfig {\n        applicationId = 'com.sample.imagedecoder'\n        minSdkVersion 30\n        externalNativeBuild {\n            cmake {\n                arguments '-DANDROID_STL=c++_static'\n            }\n        }\n    }\n\n    externalNativeBuild {\n        cmake {\n            path 'src/main/cpp/CMakeLists.txt'\n        }\n    }\n}\n\ndependencies {\n    implementation libs.appcompat\n    implementation libs.androidx.constraintlayout\n}\n"
  },
  {
    "path": "teapots/image-decoder/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:versionCode=\"1\"\n          android:versionName=\"1.0\" >\n\n  <uses-feature android:glEsVersion=\"0x00020000\"></uses-feature>\n\n  <application\n      android:allowBackup=\"false\"\n      android:fullBackupContent=\"false\"\n      android:supportsRtl=\"true\"\n      android:icon=\"@mipmap/ic_launcher\"\n      android:label=\"@string/app_name\"\n      android:theme=\"@style/AppTheme\"\n      android:name=\"com.sample.imagedecoder.TeapotApplication\"\n      >\n\n    <!-- Our activity is the built-in NativeActivity framework class.\n         This will take care of integrating with our NDK code. -->\n    <activity android:name=\"com.sample.imagedecoder.TeapotNativeActivity\"\n              android:label=\"@string/app_name\"\n              android:configChanges=\"orientation|keyboardHidden\"\n        android:exported=\"true\">\n      <!-- Tell NativeActivity the name of our .so -->\n      <meta-data android:name=\"android.app.lib_name\"\n                 android:value=\"ImageDecoderNativeActivity\" />\n      <intent-filter>\n        <action android:name=\"android.intent.action.MAIN\" />\n        <category android:name=\"android.intent.category.LAUNCHER\" />\n      </intent-filter>\n    </activity>\n  </application>\n</manifest>\n"
  },
  {
    "path": "teapots/image-decoder/src/main/assets/Shaders/2DTexture.fsh",
    "content": "//\n// Copyright (C) 2018 The Android Open Source Project\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n//  ShaderPlain.fsh\n//\n\n#define USE_PHONG (1)\n\nuniform lowp vec3       vMaterialAmbient;\nuniform lowp vec4       vMaterialSpecular;\n\nuniform sampler2D samplerObj;\n\nvarying mediump vec2    texCoord;\nvarying lowp vec4 diffuseLight;\n\n#if USE_PHONG\nuniform highp vec3   vLight0;\nvarying mediump vec3 position;\nvarying mediump vec3 normal;\n#else\nvarying lowp vec4 colorSpecular;\n#endif\n\nvoid main()\n{\n    mediump vec2 flippedTexCoord = vec2(texCoord.x, -texCoord.y);\n#if USE_PHONG\n    mediump vec3 halfVector = normalize(-vLight0 + position);\n    mediump float NdotH = max(dot(normalize(normal), halfVector), 0.0);\n    mediump float fPower = vMaterialSpecular.w;\n    mediump float specular = pow(NdotH, fPower);\n\n    lowp vec4 colorSpecular = vec4( vMaterialSpecular.xyz * specular, 1 );\n\n    // increase ambient light to brighten the teapot :-)\n    gl_FragColor = diffuseLight * texture2D(samplerObj, flippedTexCoord) +\n            2.0f * vec4(vMaterialAmbient.xyz, 1.0f) + colorSpecular;\n#else\n    gl_FragColor = mix(colorDiffuse, texture2D(samplerObj, flippedTexCoord), 0.5) + colorSpecular;\n#endif\n}\n"
  },
  {
    "path": "teapots/image-decoder/src/main/assets/Shaders/2DTexture.vsh",
    "content": "//\n// Copyright (C) 2018 The Android Open Source Project\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n//  ShaderPlain.vsh\n//\n\n#define USE_PHONG (1)\n\nattribute highp vec3    myVertex;\nattribute highp vec3    myNormal;\nattribute mediump vec2  myUV;\nattribute mediump vec4  myBone;\n\nvarying mediump vec2    texCoord;\nvarying lowp    vec4    diffuseLight;\n\n#if USE_PHONG\nvarying mediump vec3 position;\nvarying mediump vec3 normal;\n#else\nvarying lowp    vec4    colorSpecular;\n#endif\n\nuniform highp mat4      uMVMatrix;\nuniform highp mat4      uPMatrix;\n\nuniform highp vec3      vLight0;\n\nuniform lowp vec4       vMaterialDiffuse;\nuniform lowp vec3       vMaterialAmbient;\nuniform lowp vec4       vMaterialSpecular;\n\nvoid main(void)\n{\n    highp vec4 p = vec4(myVertex,1);\n    gl_Position = uPMatrix * p;\n\n    texCoord = myUV;\n\n    highp vec3 worldNormal = vec3(mat3(uMVMatrix[0].xyz, uMVMatrix[1].xyz, uMVMatrix[2].xyz) * myNormal);\n    highp vec3 ecPosition = p.xyz;\n\n    diffuseLight = dot( worldNormal, normalize(-vLight0+ecPosition)) * vec4(1.0, 1.0, 1.0, 1.0);\n\n#if USE_PHONG\n    normal = worldNormal;\n    position = ecPosition;\n#else\n    highp vec3 halfVector = normalize(ecPosition - vLight0);\n\n    highp float NdotH = max(-dot(worldNormal, halfVector), 0.0);\n    float fPower = vMaterialSpecular.w;\n    highp float specular = min( pow(NdotH, fPower), 1.0);\n    colorSpecular = vec4( vMaterialSpecular.xyz * specular, 1 );\n#endif\n}\n"
  },
  {
    "path": "teapots/image-decoder/src/main/assets/Shaders/Cubemap.fsh",
    "content": "//\n// Copyright (C) 2020 The Android Open Source Project\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n//  ShaderPlain.fsh\n//\n\nuniform lowp vec3       vMaterialAmbient;\nuniform lowp vec4       vMaterialSpecular;\n\nuniform samplerCube samplerObj;\n\nvarying lowp vec4 colorDiffuse;\n\nuniform highp vec3   vLight0;\nvarying mediump vec3 position;\nvarying mediump vec3 normal;\n\nvoid main()\n{\n    mediump vec3 halfVector = normalize(-vLight0 + position);\n    mediump float NdotH = max(dot(normalize(normal), halfVector), 0.0);\n    mediump float fPower = vMaterialSpecular.w;\n    mediump float specular = pow(NdotH, fPower);\n\n    lowp vec4 colorSpecular = vec4( vMaterialSpecular.xyz * specular, 1 );\n    mediump vec3 texCoord = normal;\n    gl_FragColor = colorDiffuse * textureCube(samplerObj, normalize(texCoord)) +\n                      vec4(vMaterialAmbient.xyz, 1.0);\n}\n"
  },
  {
    "path": "teapots/image-decoder/src/main/assets/Shaders/Cubemap.vsh",
    "content": "//\n// Copyright (C) 2020 The Android Open Source Project\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n//  ShaderPlain.vsh\n//\n\nattribute highp vec3    myVertex;\nattribute highp vec3    myNormal;\nattribute mediump vec2  myUV;\nattribute mediump vec4  myBone;\n\nvarying lowp    vec4    colorDiffuse;\n\nvarying mediump vec3 position;\nvarying mediump vec3 normal;\n\nuniform highp mat4      uMVMatrix;\nuniform highp mat4      uPMatrix;\n\nuniform highp vec3      vLight0;\n\nuniform lowp vec4       vMaterialDiffuse;\nuniform lowp vec3       vMaterialAmbient;\nuniform lowp vec4       vMaterialSpecular;\n\nvoid main(void)\n{\n    highp vec4 p = vec4(myVertex,1);\n    gl_Position = uPMatrix * p;\n\n    highp vec3 worldNormal = vec3(mat3(uMVMatrix[0].xyz, uMVMatrix[1].xyz, uMVMatrix[2].xyz) * myNormal);\n    highp vec3 ecPosition = p.xyz;\n\n    // brighten the teapot color by 50%\n    colorDiffuse = clamp(vMaterialDiffuse * 1.5,\n                         vec4(0.0, 0.0, 0.0, 0.0),\n                         vec4(1.0, 1.0, 1.0, 1.0));\n\n    normal = worldNormal;\n    position = ecPosition;\n}\n"
  },
  {
    "path": "teapots/image-decoder/src/main/assets/Shaders/ShaderPlain.fsh",
    "content": "//\n// Copyright (C) 2020 The Android Open Source Project\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n//  ShaderPlain.fsh\n//\n\n#define USE_PHONG (1)\n\nuniform lowp vec3       vMaterialAmbient;\nuniform lowp vec4       vMaterialSpecular;\n\nvarying lowp vec4 colorDiffuse;\n\n#if USE_PHONG\nuniform highp vec3      vLight0;\nvarying mediump vec3 position;\nvarying mediump vec3 normal;\n#else\nvarying lowp vec4 colorSpecular;\n#endif\n\nvoid main()\n{\n#if USE_PHONG\n    mediump vec3 halfVector = normalize(-vLight0 + position);\n    mediump float NdotH = max(dot(normalize(normal), halfVector), 0.0);\n    mediump float fPower = vMaterialSpecular.w;\n    mediump float specular = pow(NdotH, fPower);\n\n    lowp vec4 colorSpecular = vec4( vMaterialSpecular.xyz * specular, 1 );\n    gl_FragColor = colorDiffuse + colorSpecular;\n#else\n    gl_FragColor = colorDiffuse + colorSpecular;\n#endif\n}\n"
  },
  {
    "path": "teapots/image-decoder/src/main/assets/Shaders/VS_ShaderPlain.vsh",
    "content": "//\n// Copyright (C) 2020 The Android Open Source Project\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n//  ShaderPlain.vsh\n//\n\n#define USE_PHONG (1)\n\nattribute highp vec3    myVertex;\nattribute highp vec3    myNormal;\nattribute mediump vec2  myUV;\nattribute mediump vec4  myBone;\n\nvarying mediump vec2    texCoord;\nvarying lowp    vec4    colorDiffuse;\n\n#if USE_PHONG\nvarying mediump vec3 position;\nvarying mediump vec3 normal;\n#else\nvarying lowp    vec4    colorSpecular;\n#endif\n\nuniform highp mat4      uMVMatrix;\nuniform highp mat4      uPMatrix;\n\nuniform highp vec3      vLight0;\n\nuniform lowp vec4       vMaterialDiffuse;\nuniform lowp vec3       vMaterialAmbient;\nuniform lowp vec4       vMaterialSpecular;\n\nvoid main(void)\n{\n    highp vec4 p = vec4(myVertex,1);\n    gl_Position = uPMatrix * p;\n\n    texCoord = myUV;\n\n    highp vec3 worldNormal = vec3(mat3(uMVMatrix[0].xyz, uMVMatrix[1].xyz, uMVMatrix[2].xyz) * myNormal);\n    highp vec3 ecPosition = p.xyz;\n\n    colorDiffuse = dot( worldNormal, normalize(-vLight0+ecPosition) ) * vMaterialDiffuse  + vec4( vMaterialAmbient, 1 );\n\n#if USE_PHONG\n    normal = worldNormal;\n    position = ecPosition;\n#else\n    highp vec3 halfVector = normalize(ecPosition - vLight0);\n\n    highp float NdotH = max(-dot(worldNormal, halfVector), 0.0);\n    float fPower = vMaterialSpecular.w;\n    highp float specular = min( pow(NdotH, fPower), 1.0);\n    colorSpecular = vec4( vMaterialSpecular.xyz * specular, 1 );\n#endif\n}\n"
  },
  {
    "path": "teapots/image-decoder/src/main/cpp/CMakeLists.txt",
    "content": "#\n# Copyright(C) 2020 The Android Open Source Project\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\ncmake_minimum_required(VERSION 3.22.1)\nproject(ImageDecoderNativeActivity LANGUAGES C CXX)\n\ninclude(AppLibrary)\n\nget_filename_component(commonDir ${CMAKE_CURRENT_SOURCE_DIR}/../../../../common ABSOLUTE)\n\n# build the ndk-helper library\nget_filename_component(ndkHelperSrc ${commonDir}/ndk_helper ABSOLUTE)\nadd_subdirectory(${ndkHelperSrc}\n    ndkHelperBin/${CMAKE_BUILD_TYPE}/${ANDROID_ABI})\n\n# now build app's shared lib\nadd_app_library(${PROJECT_NAME}\n    SHARED\n    TeapotNativeActivity.cpp\n    TeapotRenderer.cpp\n    ImageDecoderRender.cpp\n    Texture.cpp\n)\nset_target_properties(${PROJECT_NAME}\n    PROPERTIES\n    CXX_STANDARD 11\n    CXX_STANDARD_REQUIRED YES\n    CXX_EXTENSIONS NO\n)\ntarget_include_directories(${PROJECT_NAME} PRIVATE\n    ${commonDir}\n    ${CMAKE_CURRENT_SOURCE_DIR}/image_wrapper)\n\ntarget_compile_options(${PROJECT_NAME} PRIVATE -Wno-unused-function)\n\n# Export ANativeActivity_onCreate(),\n# Refer to: https://github.com/android-ndk/ndk/issues/381.\nset_target_properties(${PROJECT_NAME}\n    PROPERTIES LINK_FLAGS \"-u ANativeActivity_onCreate\")\n\n# add lib dependencies\ntarget_link_libraries(${PROJECT_NAME} PRIVATE NdkHelper jnigraphics)\n"
  },
  {
    "path": "teapots/image-decoder/src/main/cpp/ImageDecoderRender.cpp",
    "content": "/*\n * Copyright 2020 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"ImageDecoderRender.h\"\n\n/**\n * Texture Coordinators for 2D texture:\n *    they are declared in file model file teapot.inl with tiles\n *    for front and back teapot faces. If you do not want see\n *    the tiles but would like to see the stretched version, simply\n *    divide the texCoord by 2. Macro TILED_TEXTURE is for this purpose.\n *\n * teapot.inl file already included in TeapotRenderer.cpp, we directly\n * use! -- nice\n */\n#define TILED_TEXTURE 0\n\nextern float teapotTexCoords[];\nconstexpr int32_t kCoordElementCount = (TILED_TEXTURE ? 3 : 2);\n\n/**\n * Constructor: all work is done inside Init() function.\n *              nothing to do here\n */\nImageDecoderRender::ImageDecoderRender() {}\n\n/**\n * Destructor:\n *     let Unload() do the work, which should also trigger\n *     TeapotRenderer's Unload() function\n */\nImageDecoderRender::~ImageDecoderRender() { Unload(); };\n\n/**\n * Report type of teapot we are rendering. This is the only place\n * to decide what kind of teapot to render.\n *\n * @return\n *   GL_TEXTURE_CUBE_MAP if you want to render cubemaped teapot\n *   GL_TEXTURE_2D if just to render a 2D textured teapot\n *   GL_INVALID_VALUE no texture for teapot\n */\nGLint ImageDecoderRender::GetTextureType(void) { return GL_TEXTURE_CUBE_MAP; }\n\n/**\n * Init: Initialize the GL with needed data. We add on the things\n * needed for textures\n *  - load image data into generated glBuffers\n *  - configure samplerObj in fragment shader\n * @param assetMgr android assetManager from java side\n */\nvoid ImageDecoderRender::Init(AAssetManager* assetMgr) {\n  // initialize the basic things from TeapotRenderer, no change\n  TeapotRenderer::Init();\n\n  GLint type = GetTextureType();\n  if (type == GL_INVALID_VALUE) {\n    // Plain teapot no texture\n    return;\n  }\n\n  // load texture coordinator for 2D texture. Cubemap texture uses world space\n  // normal to sample cubemap.\n  if (type == GL_TEXTURE_2D) {\n    // do Texture related initializations...\n    glGenBuffers(1, &texVbo_);\n    assert(texVbo_ != GL_INVALID_VALUE);\n\n    /*\n     * Loading Texture coord directly from data declared in model file\n     *   teapot.inl\n     * which is 3 floats/vertex.\n     */\n    glBindBuffer(GL_ARRAY_BUFFER, texVbo_);\n\n#if (TILED_TEXTURE)\n    glBufferData(GL_ARRAY_BUFFER,\n                 kCoordElementCount * sizeof(float) * num_vertices_,\n                 teapotTexCoords, GL_STATIC_DRAW);\n#else\n    std::vector<float> coords;\n    for (int32_t idx = 0; idx < num_vertices_; idx++) {\n      coords.push_back(teapotTexCoords[3 * idx] / 2);\n      coords.push_back(teapotTexCoords[3 * idx + 1] / 2);\n    }\n    glBufferData(GL_ARRAY_BUFFER,\n                 kCoordElementCount * sizeof(float) * num_vertices_,\n                 coords.data(), GL_STATIC_DRAW);\n#endif\n    glVertexAttribPointer(ATTRIB_UV, 2, GL_FLOAT, GL_FALSE,\n                          kCoordElementCount * sizeof(float), nullptr);\n    glEnableVertexAttribArray(ATTRIB_UV);\n\n    glBindBuffer(GL_ARRAY_BUFFER, 0);\n  }\n\n  // Need flip Y, so as top/bottom image\n  std::vector<std::string> textures{\n      std::string(\"Textures/right.png\"),   // GL_TEXTURE_CUBE_MAP_POSITIVE_X\n      std::string(\"Textures/left.png\"),    // GL_TEXTURE_CUBE_MAP_NEGATIVE_X\n      std::string(\"Textures/top.png\"),     // GL_TEXTURE_CUBE_MAP_POSITIVE_Y\n      std::string(\"Textures/bottom.png\"),  // GL_TEXTURE_CUBE_MAP_NEGATIVE_Y\n      std::string(\"Textures/front.png\"),   // GL_TEXTURE_CUBE_MAP_POSITIVE_Z\n      std::string(\"Textures/back.png\")     // GL_TEXTURE_CUBE_MAP_NEGATIVE_Z\n  };\n\n  if (type == GL_TEXTURE_2D) {\n    textures[0] = std::string(\"Textures/front.png\");\n  }\n\n  texObj_ = Texture::Create(type, textures, assetMgr);\n  assert(texObj_);\n\n  std::vector<std::string> samplers;\n  std::vector<GLint> units;\n  texObj_->GetActiveSamplerInfo(samplers, units);\n  for (size_t idx = 0; idx < samplers.size(); idx++) {\n    GLint sampler =\n        glGetUniformLocation(shader_param_.program_, samplers[idx].c_str());\n    glUniform1i(sampler, units[idx]);\n  }\n\n  texObj_->Activate();\n}\n\n/**\n * Render() function:\n *   enable states for rendering and reader a frame.\n *   For Texture, simply inform GL to stream texture coord from _texVbo\n */\nvoid ImageDecoderRender::Render() { TeapotRenderer::Render(); }\n\n/**\n * Unload()\n *    clean-up function. May get called from destructor too\n */\nvoid ImageDecoderRender::Unload() {\n  TeapotRenderer::Unload();\n  if (texVbo_ != GL_INVALID_VALUE) {\n    glDeleteBuffers(1, &texVbo_);\n    texVbo_ = GL_INVALID_VALUE;\n  }\n  if (texObj_) {\n    Texture::Delete(texObj_);\n    texObj_ = nullptr;\n  }\n}\n"
  },
  {
    "path": "teapots/image-decoder/src/main/cpp/ImageDecoderRender.h",
    "content": "/*\n * Copyright 2020 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef TEAPOTS_IMAGEDECODERRENDER_H\n#define TEAPOTS_IMAGEDECODERRENDER_H\n#include \"TeapotRenderer.h\"\n#include \"Texture.h\"\n/**\n *  class TextureTeapotRender\n *    adding texture into teapot\n *     - create texture buffer and load image in assets/Textures\n *     - enable texture units\n *     - enable texturing inside shaders\n */\nclass ImageDecoderRender : public TeapotRenderer {\n  GLuint texVbo_ = GL_INVALID_VALUE;\n  Texture* texObj_ = nullptr;\n\n public:\n  ImageDecoderRender();\n  virtual ~ImageDecoderRender();\n  // This is to decide which teapot type to render:\n  //   plain teapot\n  //   2D textured teapot\n  //   Cubemap textured teapot\n  // the rest of the code looks this function to decide\n  // what to render.\n  virtual GLint GetTextureType(void);\n  virtual void Init(AAssetManager* amgr);\n  virtual void Render();\n  virtual void Unload();\n};\n\n#endif  // TEAPOTS_IMAGEDECODERRENDER_H\n"
  },
  {
    "path": "teapots/image-decoder/src/main/cpp/TeapotNativeActivity.cpp",
    "content": "/*\n * Copyright 2020 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//--------------------------------------------------------------------------------\n// Include files\n//--------------------------------------------------------------------------------\n#include <android/log.h>\n#include <android/native_window_jni.h>\n#include <android/sensor.h>\n#include <android_native_app_glue.h>\n#include <errno.h>\n#include <jni.h>\n\n#include \"ImageDecoderRender.h\"\n#include \"NDKHelper.h\"\n\n//-------------------------------------------------------------------------\n// Preprocessor\n//-------------------------------------------------------------------------\n#define HELPER_CLASS_NAME \\\n  \"com/sample/helper/NDKHelper\"  // Class name of helper function\n//-------------------------------------------------------------------------\n// Shared state for our app.\n//-------------------------------------------------------------------------\nstruct android_app;\nclass Engine {\n  ImageDecoderRender renderer_;\n\n  ndk_helper::GLContext* gl_context_;\n\n  bool initialized_resources_;\n  bool has_focus_;\n\n  ndk_helper::DoubletapDetector doubletap_detector_;\n  ndk_helper::PinchDetector pinch_detector_;\n  ndk_helper::DragDetector drag_detector_;\n  ndk_helper::PerfMonitor monitor_;\n\n  ndk_helper::TapCamera tap_camera_;\n\n  android_app* app_;\n\n  ASensorManager* sensor_manager_;\n  const ASensor* accelerometer_sensor_;\n  ASensorEventQueue* sensor_event_queue_;\n\n  void UpdateFPS(float fFPS);\n  void ShowUI();\n  void TransformPosition(ndk_helper::Vec2& vec);\n\n public:\n  static void HandleCmd(struct android_app* app, int32_t cmd);\n  static int32_t HandleInput(android_app* app, AInputEvent* event);\n\n  Engine();\n  ~Engine();\n  void SetState(android_app* app);\n  int InitDisplay(android_app* app);\n  void LoadResources();\n  void UnloadResources();\n  void DrawFrame();\n  void TermDisplay();\n  void TrimMemory();\n  bool IsReady();\n\n  void UpdatePosition(AInputEvent* event, int32_t iIndex, float& fX, float& fY);\n\n  void InitSensors();\n  void ProcessSensors(int32_t id);\n  void SuspendSensors();\n  void ResumeSensors();\n};\n\n//-------------------------------------------------------------------------\n// Ctor\n//-------------------------------------------------------------------------\nEngine::Engine()\n    : initialized_resources_(false),\n      has_focus_(false),\n      app_(NULL),\n      sensor_manager_(NULL),\n      accelerometer_sensor_(NULL),\n      sensor_event_queue_(NULL) {\n  gl_context_ = ndk_helper::GLContext::GetInstance();\n}\n\n//-------------------------------------------------------------------------\n// Dtor\n//-------------------------------------------------------------------------\nEngine::~Engine() {}\n\n/**\n * Load resources\n */\nvoid Engine::LoadResources() {\n  renderer_.Init(app_->activity->assetManager);\n  renderer_.Bind(&tap_camera_);\n}\n\n/**\n * Unload resources\n */\nvoid Engine::UnloadResources() { renderer_.Unload(); }\n\n/**\n * Initialize an EGL context for the current display.\n */\nint Engine::InitDisplay(android_app* app) {\n  if (!initialized_resources_) {\n    gl_context_->Init(app_->window);\n    LoadResources();\n    initialized_resources_ = true;\n  } else if (app->window != gl_context_->GetANativeWindow()) {\n    // Re-initialize ANativeWindow.\n    // On some devices, ANativeWindow is re-created when the app is resumed\n    assert(gl_context_->GetANativeWindow());\n    UnloadResources();\n    gl_context_->Invalidate();\n    app_ = app;\n    gl_context_->Init(app->window);\n    LoadResources();\n    initialized_resources_ = true;\n  } else {\n    // initialize OpenGL ES and EGL\n    if (EGL_SUCCESS == gl_context_->Resume(app_->window)) {\n      UnloadResources();\n      LoadResources();\n    } else {\n      assert(0);\n    }\n  }\n\n  ShowUI();\n\n  // Initialize GL state.\n  glEnable(GL_CULL_FACE);\n  glEnable(GL_DEPTH_TEST);\n  glDepthFunc(GL_LEQUAL);\n\n  // Note that screen size might have been changed\n  glViewport(0, 0, gl_context_->GetScreenWidth(),\n             gl_context_->GetScreenHeight());\n  renderer_.UpdateViewport();\n\n  tap_camera_.SetFlip(1.f, -1.f, -1.f);\n  tap_camera_.SetPinchTransformFactor(2.f, 2.f, 8.f);\n\n  return 0;\n}\n\n/**\n * Just the current frame in the display.\n */\nvoid Engine::DrawFrame() {\n  float fps;\n  if (monitor_.Update(fps)) {\n    UpdateFPS(fps);\n  }\n  renderer_.Update(monitor_.GetCurrentTime());\n\n  // Just fill the screen with a color.\n  glClearColor(0.5f, 0.5f, 0.5f, 1.f);\n  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n  renderer_.Render();\n\n  // Swap\n  if (EGL_SUCCESS != gl_context_->Swap()) {\n    UnloadResources();\n    LoadResources();\n  }\n}\n\n/**\n * Tear down the EGL context currently associated with the display.\n */\nvoid Engine::TermDisplay() { gl_context_->Suspend(); }\n\nvoid Engine::TrimMemory() {\n  LOGI(\"Trimming memory\");\n  gl_context_->Invalidate();\n}\n/**\n * Process the next input event.\n */\nint32_t Engine::HandleInput(android_app* app, AInputEvent* event) {\n  Engine* eng = (Engine*)app->userData;\n  if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION) {\n    ndk_helper::GESTURE_STATE doubleTapState =\n        eng->doubletap_detector_.Detect(event);\n    ndk_helper::GESTURE_STATE dragState = eng->drag_detector_.Detect(event);\n    ndk_helper::GESTURE_STATE pinchState = eng->pinch_detector_.Detect(event);\n\n    // Double tap detector has a priority over other detectors\n    if (doubleTapState == ndk_helper::GESTURE_STATE_ACTION) {\n      // Detect double tap\n      eng->tap_camera_.Reset(true);\n    } else {\n      // Handle drag state\n      if (dragState & ndk_helper::GESTURE_STATE_START) {\n        // Otherwise, start dragging\n        ndk_helper::Vec2 v;\n        eng->drag_detector_.GetPointer(v);\n        eng->TransformPosition(v);\n        eng->tap_camera_.BeginDrag(v);\n      } else if (dragState & ndk_helper::GESTURE_STATE_MOVE) {\n        ndk_helper::Vec2 v;\n        eng->drag_detector_.GetPointer(v);\n        eng->TransformPosition(v);\n        eng->tap_camera_.Drag(v);\n      } else if (dragState & ndk_helper::GESTURE_STATE_END) {\n        eng->tap_camera_.EndDrag();\n      }\n\n      // Handle pinch state\n      if (pinchState & ndk_helper::GESTURE_STATE_START) {\n        // Start new pinch\n        ndk_helper::Vec2 v1;\n        ndk_helper::Vec2 v2;\n        eng->pinch_detector_.GetPointers(v1, v2);\n        eng->TransformPosition(v1);\n        eng->TransformPosition(v2);\n        eng->tap_camera_.BeginPinch(v1, v2);\n      } else if (pinchState & ndk_helper::GESTURE_STATE_MOVE) {\n        // Multi touch\n        // Start new pinch\n        ndk_helper::Vec2 v1;\n        ndk_helper::Vec2 v2;\n        eng->pinch_detector_.GetPointers(v1, v2);\n        eng->TransformPosition(v1);\n        eng->TransformPosition(v2);\n        eng->tap_camera_.Pinch(v1, v2);\n      }\n    }\n    return 1;\n  }\n  return 0;\n}\n\n/**\n * Process the next main command.\n */\nvoid Engine::HandleCmd(struct android_app* app, int32_t cmd) {\n  Engine* eng = (Engine*)app->userData;\n  switch (cmd) {\n    case APP_CMD_SAVE_STATE:\n      break;\n    case APP_CMD_INIT_WINDOW:\n      // The window is being shown, get it ready.\n      if (app->window != NULL) {\n        eng->InitDisplay(app);\n        eng->has_focus_ = true;\n        eng->DrawFrame();\n      }\n      break;\n    case APP_CMD_TERM_WINDOW:\n      // The window is being hidden or closed, clean it up.\n      eng->TermDisplay();\n      eng->has_focus_ = false;\n      break;\n    case APP_CMD_STOP:\n      break;\n    case APP_CMD_GAINED_FOCUS:\n      eng->ResumeSensors();\n      // Start animation\n      eng->has_focus_ = true;\n      break;\n    case APP_CMD_LOST_FOCUS:\n      eng->SuspendSensors();\n      // Also stop animating.\n      eng->has_focus_ = false;\n      eng->DrawFrame();\n      break;\n    case APP_CMD_LOW_MEMORY:\n      // Free up GL resources\n      eng->TrimMemory();\n      break;\n  }\n}\n\n//-------------------------------------------------------------------------\n// Sensor handlers\n//-------------------------------------------------------------------------\nvoid Engine::InitSensors() {\n  sensor_manager_ = ndk_helper::AcquireASensorManagerInstance(app_);\n  accelerometer_sensor_ = ASensorManager_getDefaultSensor(\n      sensor_manager_, ASENSOR_TYPE_ACCELEROMETER);\n  sensor_event_queue_ = ASensorManager_createEventQueue(\n      sensor_manager_, app_->looper, LOOPER_ID_USER, NULL, NULL);\n}\n\nvoid Engine::ProcessSensors(int32_t id) {\n  // If a sensor has data, process it now.\n  if (id == LOOPER_ID_USER) {\n    if (accelerometer_sensor_ != NULL) {\n      ASensorEvent event;\n      while (ASensorEventQueue_getEvents(sensor_event_queue_, &event, 1) > 0) {\n      }\n    }\n  }\n}\n\nvoid Engine::ResumeSensors() {\n  // When our app gains focus, we start monitoring the accelerometer.\n  if (accelerometer_sensor_ != NULL) {\n    ASensorEventQueue_enableSensor(sensor_event_queue_, accelerometer_sensor_);\n    // We'd like to get 60 events per second (in us).\n    ASensorEventQueue_setEventRate(sensor_event_queue_, accelerometer_sensor_,\n                                   (1000L / 60) * 1000);\n  }\n}\n\nvoid Engine::SuspendSensors() {\n  // When our app loses focus, we stop monitoring the accelerometer.\n  // This is to avoid consuming battery while not being used.\n  if (accelerometer_sensor_ != NULL) {\n    ASensorEventQueue_disableSensor(sensor_event_queue_, accelerometer_sensor_);\n  }\n}\n\n//-------------------------------------------------------------------------\n// Misc\n//-------------------------------------------------------------------------\nvoid Engine::SetState(android_app* state) {\n  app_ = state;\n  doubletap_detector_.SetConfiguration(app_->config);\n  drag_detector_.SetConfiguration(app_->config);\n  pinch_detector_.SetConfiguration(app_->config);\n}\n\nbool Engine::IsReady() {\n  if (has_focus_) return true;\n\n  return false;\n}\n\nvoid Engine::TransformPosition(ndk_helper::Vec2& vec) {\n  vec = ndk_helper::Vec2(2.0f, 2.0f) * vec /\n            ndk_helper::Vec2(gl_context_->GetScreenWidth(),\n                             gl_context_->GetScreenHeight()) -\n        ndk_helper::Vec2(1.f, 1.f);\n}\n\nvoid Engine::ShowUI() {\n  JNIEnv* jni;\n  app_->activity->vm->AttachCurrentThread(&jni, NULL);\n\n  // Default class retrieval\n  jclass clazz = jni->GetObjectClass(app_->activity->clazz);\n  jmethodID methodID = jni->GetMethodID(clazz, \"showUI\", \"()V\");\n  jni->CallVoidMethod(app_->activity->clazz, methodID);\n\n  app_->activity->vm->DetachCurrentThread();\n  return;\n}\n\nvoid Engine::UpdateFPS(float fFPS) {\n  JNIEnv* jni;\n  app_->activity->vm->AttachCurrentThread(&jni, NULL);\n\n  // Default class retrieval\n  jclass clazz = jni->GetObjectClass(app_->activity->clazz);\n  jmethodID methodID = jni->GetMethodID(clazz, \"updateFPS\", \"(F)V\");\n  jni->CallVoidMethod(app_->activity->clazz, methodID, fFPS);\n\n  app_->activity->vm->DetachCurrentThread();\n  return;\n}\n\nEngine g_engine;\n\n/**\n * This is the main entry point of a native application that is using\n * android_native_app_glue.  It runs in its own thread, with its own\n * event loop for receiving input events and doing other things.\n */\nvoid android_main(android_app* state) {\n  g_engine.SetState(state);\n\n  // Init helper functions\n  ndk_helper::JNIHelper::Init(state->activity, HELPER_CLASS_NAME);\n\n  state->userData = &g_engine;\n  state->onAppCmd = Engine::HandleCmd;\n  state->onInputEvent = Engine::HandleInput;\n\n#ifdef USE_NDK_PROFILER\n  monstartup(\"libTeapotNativeActivity.so\");\n#endif\n\n  // Prepare to monitor accelerometer\n  g_engine.InitSensors();\n\n  // loop waiting for stuff to do.\n  while (!state->destroyRequested) {\n    // If not animating, we will block forever waiting for events.\n    // If animating, we loop until all events are read, then continue\n    // to draw the next frame of animation.\n    android_poll_source* source = nullptr;\n    auto result = ALooper_pollOnce(g_engine.IsReady() ? 0 : -1, nullptr,\n                                   nullptr, (void**)&source);\n\n    if (result == ALOOPER_POLL_ERROR) {\n      LOGE(\"ALooper_pollOnce returned an error\");\n      std::abort();\n    }\n\n    // Process this event.\n    if (source != NULL) source->process(state, source);\n\n    g_engine.ProcessSensors(result);\n\n    if (g_engine.IsReady()) {\n      // Drawing is throttled to the screen update rate, so there\n      // is no need to do timing here.\n      g_engine.DrawFrame();\n    }\n  }\n\n  g_engine.TermDisplay();\n}\n"
  },
  {
    "path": "teapots/image-decoder/src/main/cpp/TeapotRenderer.cpp",
    "content": "/*\n * Copyright 2020 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//--------------------------------------------------------------------------------\n// TeapotRenderer.cpp\n// Render a teapot\n//--------------------------------------------------------------------------------\n//--------------------------------------------------------------------------------\n// Include files\n//--------------------------------------------------------------------------------\n#include \"TeapotRenderer.h\"\n\n//--------------------------------------------------------------------------------\n// Teapot model data\n//--------------------------------------------------------------------------------\n#include \"teapot.inl\"\n\n//--------------------------------------------------------------------------------\n// Ctor\n//--------------------------------------------------------------------------------\nTeapotRenderer::TeapotRenderer() {}\n\n//--------------------------------------------------------------------------------\n// Dtor\n//--------------------------------------------------------------------------------\nTeapotRenderer::~TeapotRenderer() { Unload(); }\n\nvoid TeapotRenderer::Init() {\n  // Settings\n  glFrontFace(GL_CCW);\n\n  // Load shader\n  GLint type = GetTextureType();\n  if (type == GL_TEXTURE_CUBE_MAP) {\n    LoadShaders(&shader_param_, \"Shaders/Cubemap.vsh\", \"Shaders/Cubemap.fsh\");\n  } else if (type == GL_TEXTURE_2D) {\n    LoadShaders(&shader_param_, \"Shaders/2DTexture.vsh\",\n                \"Shaders/2DTexture.fsh\");\n  } else {\n    LoadShaders(&shader_param_, \"Shaders/VS_ShaderPlain.vsh\",\n                \"Shaders/ShaderPlain.fsh\");\n  }\n  // Create Index buffer\n  num_indices_ = sizeof(teapotIndices) / sizeof(teapotIndices[0]);\n  glGenBuffers(1, &ibo_);\n  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo_);\n  glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(teapotIndices), teapotIndices,\n               GL_STATIC_DRAW);\n  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);\n\n  // Create VBO\n  num_vertices_ = sizeof(teapotPositions) / sizeof(teapotPositions[0]) / 3;\n  int32_t stride = sizeof(TEAPOT_VERTEX);\n  int32_t index = 0;\n  TEAPOT_VERTEX* p = new TEAPOT_VERTEX[num_vertices_];\n  for (int32_t i = 0; i < num_vertices_; ++i) {\n    p[i].pos[0] = teapotPositions[index];\n    p[i].pos[1] = teapotPositions[index + 1];\n    p[i].pos[2] = teapotPositions[index + 2];\n\n    p[i].normal[0] = teapotNormals[index];\n    p[i].normal[1] = teapotNormals[index + 1];\n    p[i].normal[2] = teapotNormals[index + 2];\n    index += 3;\n  }\n  glGenBuffers(1, &vbo_);\n  glBindBuffer(GL_ARRAY_BUFFER, vbo_);\n  glBufferData(GL_ARRAY_BUFFER, stride * num_vertices_, p, GL_STATIC_DRAW);\n  glBindBuffer(GL_ARRAY_BUFFER, 0);\n\n  delete[] p;\n\n  UpdateViewport();\n  mat_model_ = ndk_helper::Mat4::Translation(0, 0, -15.f);\n\n  ndk_helper::Mat4 mat = ndk_helper::Mat4::RotationX(M_PI / 3);\n  mat_model_ = mat * mat_model_;\n}\n\nvoid TeapotRenderer::UpdateViewport() {\n  // Init Projection matrices\n  int32_t viewport[4];\n  glGetIntegerv(GL_VIEWPORT, viewport);\n\n  const float CAM_NEAR = 5.f;\n  const float CAM_FAR = 10000.f;\n  if (viewport[2] < viewport[3]) {\n    float aspect =\n        static_cast<float>(viewport[2]) / static_cast<float>(viewport[3]);\n    mat_projection_ =\n        ndk_helper::Mat4::Perspective(aspect, 1.0f, CAM_NEAR, CAM_FAR);\n  } else {\n    float aspect =\n        static_cast<float>(viewport[3]) / static_cast<float>(viewport[2]);\n    mat_projection_ =\n        ndk_helper::Mat4::Perspective(1.0f, aspect, CAM_NEAR, CAM_FAR);\n  }\n}\n\nvoid TeapotRenderer::Unload() {\n  if (vbo_) {\n    glDeleteBuffers(1, &vbo_);\n    vbo_ = 0;\n  }\n\n  if (ibo_) {\n    glDeleteBuffers(1, &ibo_);\n    ibo_ = 0;\n  }\n\n  if (shader_param_.program_) {\n    glDeleteProgram(shader_param_.program_);\n    shader_param_.program_ = 0;\n  }\n}\n\nvoid TeapotRenderer::Update(float) {\n  const float CAM_X = 0.f;\n  const float CAM_Y = 0.f;\n  const float CAM_Z = 700.f;\n\n  mat_view_ = ndk_helper::Mat4::LookAt(ndk_helper::Vec3(CAM_X, CAM_Y, CAM_Z),\n                                       ndk_helper::Vec3(0.f, 0.f, 0.f),\n                                       ndk_helper::Vec3(0.f, 1.f, 0.f));\n\n  if (camera_) {\n    camera_->Update();\n    mat_view_ = camera_->GetTransformMatrix() * mat_view_ *\n                camera_->GetRotationMatrix() * mat_model_;\n  } else {\n    mat_view_ = mat_view_ * mat_model_;\n  }\n}\n\nvoid TeapotRenderer::Render() {\n  //\n  // Feed Projection and Model View matrices to the shaders\n  ndk_helper::Mat4 mat_vp = mat_projection_ * mat_view_;\n\n  // Bind the VBO\n  glBindBuffer(GL_ARRAY_BUFFER, vbo_);\n\n  int32_t iStride = sizeof(TEAPOT_VERTEX);\n  // Pass the vertex data\n  glVertexAttribPointer(ATTRIB_VERTEX, 3, GL_FLOAT, GL_FALSE, iStride, nullptr);\n  glEnableVertexAttribArray(ATTRIB_VERTEX);\n\n  glVertexAttribPointer(ATTRIB_NORMAL, 3, GL_FLOAT, GL_FALSE, iStride,\n                        reinterpret_cast<void*>(3 * sizeof(GLfloat)));\n  glEnableVertexAttribArray(ATTRIB_NORMAL);\n\n  // Bind the IB\n  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo_);\n\n  glUseProgram(shader_param_.program_);\n\n  TEAPOT_MATERIALS material = {\n      {1.0f, 0.5f, 0.5f},\n      {1.0f, 1.0f, 1.0f, 10.f},\n      {0.1f, 0.1f, 0.1f},\n  };\n\n  // Update uniforms\n  glUniform4f(shader_param_.material_diffuse_, material.diffuse_color[0],\n              material.diffuse_color[1], material.diffuse_color[2], 1.f);\n\n  glUniform4f(shader_param_.material_specular_, material.specular_color[0],\n              material.specular_color[1], material.specular_color[2],\n              material.specular_color[3]);\n  //\n  // using glUniform3fv here was troublesome\n  //\n  glUniform3f(shader_param_.material_ambient_, material.ambient_color[0],\n              material.ambient_color[1], material.ambient_color[2]);\n\n  glUniformMatrix4fv(shader_param_.matrix_projection_, 1, GL_FALSE,\n                     mat_vp.Ptr());\n  glUniformMatrix4fv(shader_param_.matrix_view_, 1, GL_FALSE, mat_view_.Ptr());\n  glUniform3f(shader_param_.light0_, 100.f, -200.f, -600.f);\n\n  glDrawElements(GL_TRIANGLES, num_indices_, GL_UNSIGNED_SHORT, nullptr);\n\n  glBindBuffer(GL_ARRAY_BUFFER, 0);\n  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);\n}\n\nbool TeapotRenderer::LoadShaders(SHADER_PARAMS* params, const char* strVsh,\n                                 const char* strFsh) {\n  GLuint program;\n  GLuint vert_shader, frag_shader;\n\n  // Create shader program\n  program = glCreateProgram();\n  LOGI(\"Created Shader %d\", program);\n\n  // Create and compile vertex shader\n  if (!ndk_helper::shader::CompileShader(&vert_shader, GL_VERTEX_SHADER,\n                                         strVsh)) {\n    LOGI(\"Failed to compile vertex shader\");\n    glDeleteProgram(program);\n    assert(false);\n    return false;\n  }\n\n  // Create and compile fragment shader\n  if (!ndk_helper::shader::CompileShader(&frag_shader, GL_FRAGMENT_SHADER,\n                                         strFsh)) {\n    LOGI(\"Failed to compile fragment shader\");\n    glDeleteProgram(program);\n    assert(false);\n    return false;\n  }\n\n  // Attach vertex shader to program\n  glAttachShader(program, vert_shader);\n\n  // Attach fragment shader to program\n  glAttachShader(program, frag_shader);\n\n  // Bind attribute locations\n  // this needs to be done prior to linking\n  glBindAttribLocation(program, ATTRIB_VERTEX, \"myVertex\");\n  glBindAttribLocation(program, ATTRIB_NORMAL, \"myNormal\");\n  glBindAttribLocation(program, ATTRIB_UV, \"myUV\");\n\n  // Link program\n  if (!ndk_helper::shader::LinkProgram(program)) {\n    LOGI(\"Failed to link program: %d\", program);\n\n    if (vert_shader) {\n      glDeleteShader(vert_shader);\n      vert_shader = 0;\n    }\n    if (frag_shader) {\n      glDeleteShader(frag_shader);\n      frag_shader = 0;\n    }\n    if (program) {\n      glDeleteProgram(program);\n    }\n\n    return false;\n  }\n\n  // Get uniform locations\n  params->matrix_projection_ = glGetUniformLocation(program, \"uPMatrix\");\n  params->matrix_view_ = glGetUniformLocation(program, \"uMVMatrix\");\n\n  params->light0_ = glGetUniformLocation(program, \"vLight0\");\n  params->material_diffuse_ = glGetUniformLocation(program, \"vMaterialDiffuse\");\n  params->material_ambient_ = glGetUniformLocation(program, \"vMaterialAmbient\");\n  params->material_specular_ =\n      glGetUniformLocation(program, \"vMaterialSpecular\");\n\n  // Release vertex and fragment shaders\n  if (vert_shader) glDeleteShader(vert_shader);\n  if (frag_shader) glDeleteShader(frag_shader);\n\n  params->program_ = program;\n  return true;\n}\n\nbool TeapotRenderer::Bind(ndk_helper::TapCamera* camera) {\n  camera_ = camera;\n  return true;\n}\n"
  },
  {
    "path": "teapots/image-decoder/src/main/cpp/TeapotRenderer.h",
    "content": "/*\n * Copyright 2020 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//--------------------------------------------------------------------------------\n// Teapot Renderer.h\n// Renderer for teapots\n//--------------------------------------------------------------------------------\n#ifndef _TEAPOTRENDERER_H\n#define _TEAPOTRENDERER_H\n\n//--------------------------------------------------------------------------------\n// Include files\n//--------------------------------------------------------------------------------\n#include <EGL/egl.h>\n#include <GLES/gl.h>\n#include <android/log.h>\n#include <android/native_window_jni.h>\n#include <android/sensor.h>\n#include <android_native_app_glue.h>\n#include <errno.h>\n#include <jni.h>\n\n#include <vector>\n\n#define CLASS_NAME \"android/app/NativeActivity\"\n#define APPLICATION_CLASS_NAME \"com/sample/teapot/TeapotApplication\"\n\n#include \"NDKHelper.h\"\n\nstruct TEAPOT_VERTEX {\n  float pos[3];\n  float normal[3];\n};\n\nenum SHADER_ATTRIBUTES {\n  ATTRIB_VERTEX,\n  ATTRIB_NORMAL,\n  ATTRIB_UV,\n};\n\nstruct SHADER_PARAMS {\n  GLuint program_;\n  GLuint light0_;\n  GLuint material_diffuse_;\n  GLuint material_ambient_;\n  GLuint material_specular_;\n\n  GLuint matrix_projection_;\n  GLuint matrix_view_;\n};\n\nstruct TEAPOT_MATERIALS {\n  float diffuse_color[3];\n  float specular_color[4];\n  float ambient_color[3];\n};\n\nclass TeapotRenderer {\n protected:\n  int32_t num_indices_;\n  int32_t num_vertices_;\n  GLuint ibo_;\n  GLuint vbo_;\n\n  SHADER_PARAMS shader_param_;\n  bool LoadShaders(SHADER_PARAMS* params, const char* strVsh,\n                   const char* strFsh);\n\n  ndk_helper::Mat4 mat_projection_;\n  ndk_helper::Mat4 mat_view_;\n  ndk_helper::Mat4 mat_model_;\n\n  ndk_helper::TapCamera* camera_;\n  void Init();\n\n public:\n  TeapotRenderer();\n  virtual ~TeapotRenderer();\n  virtual void Init(AAssetManager* amgr) = 0;\n  virtual GLint GetTextureType(void) = 0;\n  virtual void Render();\n  void Update(float dTime);\n  bool Bind(ndk_helper::TapCamera* camera);\n  virtual void Unload();\n  void UpdateViewport();\n};\n\n#endif\n"
  },
  {
    "path": "teapots/image-decoder/src/main/cpp/Texture.cpp",
    "content": "/*\n * Copyright 2020 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"Texture.h\"\n\n#include <GLES3/gl32.h>\n#include <android/data_space.h>\n#include <android/imagedecoder.h>\n#include <assert.h>\n\n#define MODULE_NAME \"Teapot::Texture\"\n#include \"android_debug.h\"\n\n/**\n * Load2DTextureFromAsset(): Load one RGBA 2d texture from asset into\n * the given GL texture with NDK's ImageDecoder interface.\n */\nstatic bool Load2DTextureFromAsset(std::string& assetFile, AAssetManager* mgr,\n                                   GLenum target) {\n  int32_t imgWidth, imgHeight;\n  std::vector<uint8_t> imgBits;\n\n  // Open the asset with the give name from the APK's assets folder.\n  AAsset* assetDescriptor =\n      AAssetManager_open(mgr, assetFile.c_str(), AASSET_MODE_BUFFER);\n  ASSERT(assetDescriptor, \"%s does not exist in %s\", assetFile.c_str(),\n         __FUNCTION__);\n\n  // Create an AImageDecoder from the given AAsset\n  AImageDecoder* decoder = nullptr;\n  int status = AImageDecoder_createFromAAsset(assetDescriptor, &decoder);\n  ASSERT(ANDROID_IMAGE_DECODER_SUCCESS == status,\n         \"Failed to create ImageDecoder for %s\", assetFile.c_str());\n\n  status = AImageDecoder_setAndroidBitmapFormat(\n      decoder, ANDROID_BITMAP_FORMAT_RGBA_8888);\n  ASSERT(ANDROID_IMAGE_DECODER_SUCCESS == status,\n         \"Failed to request 8888 output format for %s\", assetFile.c_str());\n\n  status = AImageDecoder_setUnpremultipliedRequired(decoder, true);\n  ASSERT(ANDROID_IMAGE_DECODER_SUCCESS == status,\n         \"Failed to bypass pre-multiply alpha for %s\", assetFile.c_str());\n\n  const AImageDecoderHeaderInfo* headerInfo =\n      AImageDecoder_getHeaderInfo(decoder);\n  ASSERT(headerInfo != nullptr, \"Failed to get ImageHeaderInfo for %s\",\n         assetFile.c_str());\n\n  // scRGB/sRGB/SCRGB_LINEAR are okay for this sample\n  ADataSpace dataSpace =\n      static_cast<ADataSpace>(AImageDecoderHeaderInfo_getDataSpace(headerInfo));\n  if (dataSpace != ADATASPACE_SCRGB && dataSpace != ADATASPACE_SRGB &&\n      dataSpace != ADATASPACE_SCRGB_LINEAR) {\n    status = AImageDecoder_setDataSpace(decoder, ADATASPACE_SRGB);\n    ASSERT(ANDROID_IMAGE_DECODER_SUCCESS == status,\n           \"Failed to set SRGB color space %s\", assetFile.c_str());\n  }\n\n  imgWidth = AImageDecoderHeaderInfo_getWidth(headerInfo);\n  imgHeight = AImageDecoderHeaderInfo_getHeight(headerInfo);\n  size_t stride = AImageDecoder_getMinimumStride(decoder);\n\n  // by design, ImageDecoder decode the image into packed format, no padding.\n  // Let's make sure there is no padding; otherwise it would be bug, and app\n  // need to pack.\n  ASSERT(stride == static_cast<uint32_t>(imgWidth) * 4,\n         \"ImageDecoder padded  decoded image\");\n\n  imgBits.clear();\n  imgBits.resize(imgHeight * stride);\n\n  status = AImageDecoder_decodeImage(decoder, imgBits.data(), stride,\n                                     imgBits.size());\n  ASSERT(status == ANDROID_IMAGE_DECODER_SUCCESS, \"Failed to decode image %s\",\n         assetFile.c_str());\n\n  glTexImage2D(target, 0, GL_RGBA, imgWidth, imgHeight, 0, GL_RGBA,\n               GL_UNSIGNED_BYTE, imgBits.data());\n\n  // release decoder and asset\n  AImageDecoder_delete(decoder);\n  AAsset_close(assetDescriptor);\n  return true;\n}\n\n/**\n * Cubemap and Texture2d implementations for Class Texture.\n */\nclass TextureCubemap : public Texture {\n protected:\n  GLuint texId_ = GL_INVALID_VALUE;\n  bool activated_ = false;\n\n public:\n  virtual ~TextureCubemap();\n  TextureCubemap(std::vector<std::string>& texFiles,\n                 AAssetManager* assetManager);\n  virtual bool GetActiveSamplerInfo(std::vector<std::string>& names,\n                                    std::vector<GLint>& units);\n  virtual bool Activate(void);\n  virtual GLuint GetTexType();\n  virtual GLuint GetTexId();\n};\n\nclass Texture2d : public Texture {\n protected:\n  GLuint texId_ = GL_INVALID_VALUE;\n  bool activated_ = false;\n\n public:\n  virtual ~Texture2d();\n  // Implement just one texture\n  Texture2d(std::string& texFiles, AAssetManager* assetManager);\n  virtual bool GetActiveSamplerInfo(std::vector<std::string>& names,\n                                    std::vector<GLint>& units);\n  virtual bool Activate(void);\n  virtual GLuint GetTexType();\n  virtual GLuint GetTexId();\n};\n\n/**\n * Capability debug string\n */\nstatic const std::string supportedTextureTypes =\n    \"GL_TEXTURE_2D(0x0DE1) GL_TEXTURE_CUBE_MAP(0x8513)\";\n\n/**\n * Interface implementations\n */\nTexture::Texture() {}\nTexture::~Texture() {}\n/**\n * Create Texture Object\n * @param texFiles holds the texture file name(s) under APK's assets\n * @param type should be one (GL_TEXTURE_2D / GL_TEXTURE_CUBE_MAP)\n * @param assetManager is used to open texture files inside assets\n * @return is the newly created Texture Object\n */\nTexture* Texture::Create(GLuint type, std::vector<std::string>& texFiles,\n                         AAssetManager* assetManager) {\n  if (type == GL_TEXTURE_2D) {\n    return dynamic_cast<Texture*>(new Texture2d(texFiles[0], assetManager));\n  } else if (type == GL_TEXTURE_CUBE_MAP) {\n    return dynamic_cast<Texture*>(new TextureCubemap(texFiles, assetManager));\n  }\n\n  LOGE(\"Unknown texture type %x to created\", type);\n  LOGE(\"Supported Texture Types: %s\", supportedTextureTypes.c_str());\n  assert(false);\n  return nullptr;\n}\n\nvoid Texture::Delete(Texture* obj) {\n  if (obj == nullptr) {\n    ASSERT(false, \"NULL pointer to Texture::Delete() function\");\n    return;\n  }\n\n  GLuint type = obj->GetTexType();\n  if (type == GL_TEXTURE_2D) {\n    Texture2d* d2Instance = dynamic_cast<Texture2d*>(obj);\n    if (d2Instance) {\n      delete d2Instance;\n    } else {\n      ASSERT(false, \"Unknown obj type to %s\", __FUNCTION__);\n    }\n  } else if (type == GL_TEXTURE_CUBE_MAP) {\n    TextureCubemap* cubemapInstance = dynamic_cast<TextureCubemap*>(obj);\n    if (cubemapInstance) {\n      delete cubemapInstance;\n    } else {\n      ASSERT(false, \"Unknown obj type to %s\", __FUNCTION__);\n    }\n  } else {\n    LOGE(\"Supported Texture Types: %s\", supportedTextureTypes.c_str());\n    ASSERT(false, \"Unknow texture type %x to delete\", type);\n  }\n}\n\n/**\n * TextureCubemap implementations\n */\nbool TextureCubemap::Activate(void) {\n  assert(texId_ != GL_INVALID_VALUE);\n\n  glBindTexture(texId_, GL_TEXTURE0);\n  glActiveTexture(GL_TEXTURE0 + 0);\n  activated_ = true;\n  return true;\n}\n\nGLuint TextureCubemap::GetTexType() { return GL_TEXTURE_CUBE_MAP; }\n\nGLuint TextureCubemap::GetTexId() {\n  assert(texId_ != GL_INVALID_VALUE);\n  return texId_;\n}\n\nTextureCubemap::TextureCubemap(std::vector<std::string>& files,\n                               AAssetManager* mgr) {\n  // For Cubemap, we use world normal to sample the textures\n  // so no texture vbo necessary\n\n  if (!mgr || files.size() != 6) {\n    assert(false);\n    return;\n  }\n\n  glGenTextures(1, &texId_);\n  glBindTexture(GL_TEXTURE_CUBE_MAP, texId_);\n\n  if (texId_ == GL_INVALID_VALUE) {\n    assert(false);\n    return;\n  }\n\n  for (GLuint i = 0; i < 6; i++) {\n    Load2DTextureFromAsset(files[i], mgr, GL_TEXTURE_CUBE_MAP_POSITIVE_X + i);\n  }\n\n  glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n  glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\n  glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_REPEAT);\n  glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_REPEAT);\n  glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_REPEAT);\n\n  glActiveTexture(GL_TEXTURE0);\n  activated_ = true;\n}\n\n/**\n * Dtor\n *    clean-up function\n */\nTextureCubemap::~TextureCubemap() {\n  if (texId_ != GL_INVALID_VALUE) {\n    glDeleteTextures(1, &texId_);\n    texId_ = GL_INVALID_VALUE;\n    activated_ = false;\n  }\n}\n\n/**\n  Return used sampler names and units\n      so application could configure shader's sampler uniform(s).\n  Cubemap just used one sampler at unit 0 with \"samplerObj\" as its name.\n */\nbool TextureCubemap::GetActiveSamplerInfo(std::vector<std::string>& names,\n                                          std::vector<GLint>& units) {\n  names.clear();\n  names.push_back(std::string(\"samplerObj\"));\n  units.clear();\n  units.push_back(0);\n\n  return true;\n}\n\n/**\n * Texture2D implementation\n */\nTexture2d::Texture2d(std::string& fileName, AAssetManager* assetManager) {\n  if (!assetManager) {\n    LOGE(\"AssetManager to Texture2D() could not be null!!!\");\n    assert(false);\n    return;\n  }\n\n  glGenTextures(1, &texId_);\n  glBindTexture(GL_TEXTURE_2D, texId_);\n\n  if (texId_ == GL_INVALID_VALUE) {\n    assert(false);\n    return;\n  }\n\n  Load2DTextureFromAsset(fileName, assetManager, GL_TEXTURE_2D);\n\n  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\n  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);\n  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);\n\n  glActiveTexture(GL_TEXTURE0);\n}\n\nTexture2d::~Texture2d() {\n  if (texId_ != GL_INVALID_VALUE) {\n    glDeleteTextures(1, &texId_);\n    texId_ = GL_INVALID_VALUE;\n  }\n  activated_ = false;\n}\n\n/**\n * Same as the Cubemap::GetActiveSamplerInfo()\n */\nbool Texture2d::GetActiveSamplerInfo(std::vector<std::string>& names,\n                                     std::vector<GLint>& units) {\n  names.clear();\n  names.push_back(std::string(\"samplerObj\"));\n  units.clear();\n  units.push_back(0);\n\n  return true;\n}\n\nbool Texture2d::Activate(void) {\n  glBindTexture(texId_, GL_TEXTURE0);\n  glActiveTexture(GL_TEXTURE0 + 0);\n  activated_ = true;\n  return true;\n}\n\nGLuint Texture2d::GetTexType() { return GL_TEXTURE_2D; }\n\nGLuint Texture2d::GetTexId() { return texId_; }\n"
  },
  {
    "path": "teapots/image-decoder/src/main/cpp/Texture.h",
    "content": "/*\n * Copyright 2020 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef TEAPOTS_TEXTURE_H\n#define TEAPOTS_TEXTURE_H\n\n#include <EGL/egl.h>\n#include <GLES/gl.h>\n#include <android/asset_manager.h>\n\n#include <string>\n#include <vector>\n\n/**\n *  class Texture\n *    adding texture into teapot\n *     - oad image in assets/Textures\n *     - enable texture units\n *     - report samplers needed inside shader\n *  Functionality wise:\n *     - one texture\n *     - one sampler\n *     - texture unit 0, sampler unit 0\n */\nclass Texture {\n public:\n  /**\n   *   Create a texture object\n   * @param type  should be GL_TEXTURE_2D / GL_TEXTURE_CUBE_MAP\n   * @param texFiles holds image file names under APK/assets.\n   *     2d texture uses the very first image texFiles[0]\n   *     cube map needs 6 (direction of +x, -x, +y, -y, +z, -z)\n   * @param assetManager Java side assetManager object\n   * @return newly created texture object, or nullptr in case of errors\n   */\n  static Texture* Create(GLuint type, std::vector<std::string>& texFiles,\n                         AAssetManager* assetManager);\n  static void Delete(Texture* obj);\n\n  virtual bool GetActiveSamplerInfo(std::vector<std::string>& names,\n                                    std::vector<GLint>& units) = 0;\n  virtual bool Activate(void) = 0;\n  virtual GLuint GetTexType() = 0;\n  virtual GLuint GetTexId() = 0;\n\n protected:\n  Texture();\n  virtual ~Texture();\n};\n#endif  // TEAPOTS_TEXTURE_H\n"
  },
  {
    "path": "teapots/image-decoder/src/main/cpp/android_debug.h",
    "content": "/*\n * Copyright (C) 2020 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n#ifndef __SAMPLE_ANDROID_DEBUG_H__\n#define __SAMPLE_ANDROID_DEBUG_H__\n#include <android/log.h>\n\n#if 1\n#ifndef MODULE_NAME\n#define MODULE_NAME \"NDK_Sample\"\n#endif\n\n#define LOGV(...) \\\n  __android_log_print(ANDROID_LOG_VERBOSE, MODULE_NAME, __VA_ARGS__)\n#define LOGD(...) \\\n  __android_log_print(ANDROID_LOG_DEBUG, MODULE_NAME, __VA_ARGS__)\n#define LOGI(...) \\\n  __android_log_print(ANDROID_LOG_INFO, MODULE_NAME, __VA_ARGS__)\n#define LOGW(...) \\\n  __android_log_print(ANDROID_LOG_WARN, MODULE_NAME, __VA_ARGS__)\n#define LOGE(...) \\\n  __android_log_print(ANDROID_LOG_ERROR, MODULE_NAME, __VA_ARGS__)\n#define LOGF(...) \\\n  __android_log_print(ANDROID_LOG_FATAL, MODULE_NAME, __VA_ARGS__)\n\n#define ASSERT(cond, ...)                                  \\\n  if (!(cond)) {                                           \\\n    __android_log_assert(#cond, MODULE_NAME, __VA_ARGS__); \\\n  }\n#else\n\n#define LOGV(...)\n#define LOGD(...)\n#define LOGI(...)\n#define LOGW(...)\n#define LOGE(...)\n#define LOGF(...)\n#define ASSERT(cond, ...)\n\n#endif\n\n#endif  // __SAMPLE_ANDROID_DEBUG_H__\n"
  },
  {
    "path": "teapots/image-decoder/src/main/cpp/libImageDecoderNativeActivity.map.txt",
    "content": "LIBNDK_CAMERA {\n  global:\n    ANativeActivity_onCreate;\n  local:\n    *;\n};\n"
  },
  {
    "path": "teapots/image-decoder/src/main/cpp/teapot.inl",
    "content": "/*\n * Copyright 2020 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//\n// Teapot.inl\n// Derived from WebGL sample\n// https://github.com/KhronosGroup/WebGL/blob/master/sdk/demos/google/shiny-teapot/teapot-streams.js\n//\n\nfloat teapotPositions[] = {17.83489990234375,\n                           0,\n                           30.573999404907227,\n                           16.452699661254883,\n                           -7.000179767608643,\n                           30.573999404907227,\n                           16.223100662231445,\n                           -6.902520179748535,\n                           31.51460075378418,\n                           17.586000442504883,\n                           0,\n                           31.51460075378418,\n                           16.48940086364746,\n                           -7.015810012817383,\n                           31.828100204467773,\n                           17.87470054626465,\n                           0,\n                           31.828100204467773,\n                           17.031099319458008,\n                           -7.246280193328857,\n                           31.51460075378418,\n                           18.46190071105957,\n                           0,\n                           31.51460075378418,\n                           17.62779998779297,\n                           -7.500199794769287,\n                           30.573999404907227,\n                           19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           12.662699699401855,\n                           -12.662699699401855,\n                           30.573999404907227,\n                           12.486100196838379,\n                           -12.486100196838379,\n                           31.51460075378418,\n                           12.690999984741211,\n                           -12.690999984741211,\n                           31.828100204467773,\n                           13.10789966583252,\n                           -13.10789966583252,\n                           31.51460075378418,\n                           13.56719970703125,\n                           -13.56719970703125,\n                           30.573999404907227,\n                           7.000179767608643,\n                           -16.452699661254883,\n                           30.573999404907227,\n                           6.902520179748535,\n                           -16.223100662231445,\n                           31.51460075378418,\n                           7.015810012817383,\n                           -16.48940086364746,\n                           31.828100204467773,\n                           7.246280193328857,\n                           -17.031099319458008,\n                           31.51460075378418,\n                           7.500199794769287,\n                           -17.62779998779297,\n                           30.573999404907227,\n                           0,\n                           -17.83489990234375,\n                           30.573999404907227,\n                           0,\n                           -17.586000442504883,\n                           31.51460075378418,\n                           0,\n                           -17.87470054626465,\n                           31.828100204467773,\n                           0,\n                           -18.46190071105957,\n                           31.51460075378418,\n                           0,\n                           -19.108800888061523,\n                           30.573999404907227,\n                           0,\n                           -17.83489990234375,\n                           30.573999404907227,\n                           -7.483870029449463,\n                           -16.452699661254883,\n                           30.573999404907227,\n                           -7.106579780578613,\n                           -16.223100662231445,\n                           31.51460075378418,\n                           0,\n                           -17.586000442504883,\n                           31.51460075378418,\n                           -7.07627010345459,\n                           -16.48940086364746,\n                           31.828100204467773,\n                           0,\n                           -17.87470054626465,\n                           31.828100204467773,\n                           -7.25383996963501,\n                           -17.031099319458008,\n                           31.51460075378418,\n                           0,\n                           -18.46190071105957,\n                           31.51460075378418,\n                           -7.500199794769287,\n                           -17.62779998779297,\n                           30.573999404907227,\n                           0,\n                           -19.108800888061523,\n                           30.573999404907227,\n                           -13.092700004577637,\n                           -12.662699699401855,\n                           30.573999404907227,\n                           -12.667499542236328,\n                           -12.486100196838379,\n                           31.51460075378418,\n                           -12.744799613952637,\n                           -12.690999984741211,\n                           31.828100204467773,\n                           -13.11460018157959,\n                           -13.10789966583252,\n                           31.51460075378418,\n                           -13.56719970703125,\n                           -13.56719970703125,\n                           30.573999404907227,\n                           -16.61389923095703,\n                           -7.000179767608643,\n                           30.573999404907227,\n                           -16.291099548339844,\n                           -6.902520179748535,\n                           31.51460075378418,\n                           -16.50950050354004,\n                           -7.015810012817383,\n                           31.828100204467773,\n                           -17.033599853515625,\n                           -7.246280193328857,\n                           31.51460075378418,\n                           -17.62779998779297,\n                           -7.500199794769287,\n                           30.573999404907227,\n                           -17.83489990234375,\n                           0,\n                           30.573999404907227,\n                           -17.586000442504883,\n                           0,\n                           31.51460075378418,\n                           -17.87470054626465,\n                           0,\n                           31.828100204467773,\n                           -18.46190071105957,\n                           0,\n                           31.51460075378418,\n                           -19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           -17.83489990234375,\n                           0,\n                           30.573999404907227,\n                           -16.452699661254883,\n                           7.000179767608643,\n                           30.573999404907227,\n                           -16.223100662231445,\n                           6.902520179748535,\n                           31.51460075378418,\n                           -17.586000442504883,\n                           0,\n                           31.51460075378418,\n                           -16.48940086364746,\n                           7.015810012817383,\n                           31.828100204467773,\n                           -17.87470054626465,\n                           0,\n                           31.828100204467773,\n                           -17.031099319458008,\n                           7.246280193328857,\n                           31.51460075378418,\n                           -18.46190071105957,\n                           0,\n                           31.51460075378418,\n                           -17.62779998779297,\n                           7.500199794769287,\n                           30.573999404907227,\n                           -19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           -12.662699699401855,\n                           12.662699699401855,\n                           30.573999404907227,\n                           -12.486100196838379,\n                           12.486100196838379,\n                           31.51460075378418,\n                           -12.690999984741211,\n                           12.690999984741211,\n                           31.828100204467773,\n                           -13.10789966583252,\n                           13.10789966583252,\n                           31.51460075378418,\n                           -13.56719970703125,\n                           13.56719970703125,\n                           30.573999404907227,\n                           -7.000179767608643,\n                           16.452699661254883,\n                           30.573999404907227,\n                           -6.902520179748535,\n                           16.223100662231445,\n                           31.51460075378418,\n                           -7.015810012817383,\n                           16.48940086364746,\n                           31.828100204467773,\n                           -7.246280193328857,\n                           17.031099319458008,\n                           31.51460075378418,\n                           -7.500199794769287,\n                           17.62779998779297,\n                           30.573999404907227,\n                           0,\n                           17.83489990234375,\n                           30.573999404907227,\n                           0,\n                           17.586000442504883,\n                           31.51460075378418,\n                           0,\n                           17.87470054626465,\n                           31.828100204467773,\n                           0,\n                           18.46190071105957,\n                           31.51460075378418,\n                           0,\n                           19.108800888061523,\n                           30.573999404907227,\n                           0,\n                           17.83489990234375,\n                           30.573999404907227,\n                           7.000179767608643,\n                           16.452699661254883,\n                           30.573999404907227,\n                           6.902520179748535,\n                           16.223100662231445,\n                           31.51460075378418,\n                           0,\n                           17.586000442504883,\n                           31.51460075378418,\n                           7.015810012817383,\n                           16.48940086364746,\n                           31.828100204467773,\n                           0,\n                           17.87470054626465,\n                           31.828100204467773,\n                           7.246280193328857,\n                           17.031099319458008,\n                           31.51460075378418,\n                           0,\n                           18.46190071105957,\n                           31.51460075378418,\n                           7.500199794769287,\n                           17.62779998779297,\n                           30.573999404907227,\n                           0,\n                           19.108800888061523,\n                           30.573999404907227,\n                           12.662699699401855,\n                           12.662699699401855,\n                           30.573999404907227,\n                           12.486100196838379,\n                           12.486100196838379,\n                           31.51460075378418,\n                           12.690999984741211,\n                           12.690999984741211,\n                           31.828100204467773,\n                           13.10789966583252,\n                           13.10789966583252,\n                           31.51460075378418,\n                           13.56719970703125,\n                           13.56719970703125,\n                           30.573999404907227,\n                           16.452699661254883,\n                           7.000179767608643,\n                           30.573999404907227,\n                           16.223100662231445,\n                           6.902520179748535,\n                           31.51460075378418,\n                           16.48940086364746,\n                           7.015810012817383,\n                           31.828100204467773,\n                           17.031099319458008,\n                           7.246280193328857,\n                           31.51460075378418,\n                           17.62779998779297,\n                           7.500199794769287,\n                           30.573999404907227,\n                           17.83489990234375,\n                           0,\n                           30.573999404907227,\n                           17.586000442504883,\n                           0,\n                           31.51460075378418,\n                           17.87470054626465,\n                           0,\n                           31.828100204467773,\n                           18.46190071105957,\n                           0,\n                           31.51460075378418,\n                           19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           17.62779998779297,\n                           -7.500199794769287,\n                           30.573999404907227,\n                           19.785400390625,\n                           -8.418190002441406,\n                           25.572900772094727,\n                           21.447599411010742,\n                           0,\n                           25.572900772094727,\n                           21.667600631713867,\n                           -9.218990325927734,\n                           20.661399841308594,\n                           23.487899780273438,\n                           0,\n                           20.661399841308594,\n                           22.99880027770996,\n                           -9.785409927368164,\n                           15.928999900817871,\n                           24.930999755859375,\n                           0,\n                           15.928999900817871,\n                           23.503799438476562,\n                           -10.000300407409668,\n                           11.465299606323242,\n                           25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           13.56719970703125,\n                           -13.56719970703125,\n                           30.573999404907227,\n                           15.227800369262695,\n                           -15.227800369262695,\n                           25.572900772094727,\n                           16.67639923095703,\n                           -16.67639923095703,\n                           20.661399841308594,\n                           17.701000213623047,\n                           -17.701000213623047,\n                           15.928999900817871,\n                           18.089599609375,\n                           -18.089599609375,\n                           11.465299606323242,\n                           7.500199794769287,\n                           -17.62779998779297,\n                           30.573999404907227,\n                           8.418190002441406,\n                           -19.785400390625,\n                           25.572900772094727,\n                           9.218990325927734,\n                           -21.667600631713867,\n                           20.661399841308594,\n                           9.785409927368164,\n                           -22.99880027770996,\n                           15.928999900817871,\n                           10.000300407409668,\n                           -23.503799438476562,\n                           11.465299606323242,\n                           0,\n                           -19.108800888061523,\n                           30.573999404907227,\n                           0,\n                           -21.447599411010742,\n                           25.572900772094727,\n                           0,\n                           -23.487899780273438,\n                           20.661399841308594,\n                           0,\n                           -24.930999755859375,\n                           15.928999900817871,\n                           0,\n                           -25.4783992767334,\n                           11.465299606323242,\n                           0,\n                           -19.108800888061523,\n                           30.573999404907227,\n                           -7.500199794769287,\n                           -17.62779998779297,\n                           30.573999404907227,\n                           -8.418190002441406,\n                           -19.785400390625,\n                           25.572900772094727,\n                           0,\n                           -21.447599411010742,\n                           25.572900772094727,\n                           -9.218990325927734,\n                           -21.667600631713867,\n                           20.661399841308594,\n                           0,\n                           -23.487899780273438,\n                           20.661399841308594,\n                           -9.785409927368164,\n                           -22.99880027770996,\n                           15.928999900817871,\n                           0,\n                           -24.930999755859375,\n                           15.928999900817871,\n                           -10.000300407409668,\n                           -23.503799438476562,\n                           11.465299606323242,\n                           0,\n                           -25.4783992767334,\n                           11.465299606323242,\n                           -13.56719970703125,\n                           -13.56719970703125,\n                           30.573999404907227,\n                           -15.227800369262695,\n                           -15.227800369262695,\n                           25.572900772094727,\n                           -16.67639923095703,\n                           -16.67639923095703,\n                           20.661399841308594,\n                           -17.701000213623047,\n                           -17.701000213623047,\n                           15.928999900817871,\n                           -18.089599609375,\n                           -18.089599609375,\n                           11.465299606323242,\n                           -17.62779998779297,\n                           -7.500199794769287,\n                           30.573999404907227,\n                           -19.785400390625,\n                           -8.418190002441406,\n                           25.572900772094727,\n                           -21.667600631713867,\n                           -9.218990325927734,\n                           20.661399841308594,\n                           -22.99880027770996,\n                           -9.785409927368164,\n                           15.928999900817871,\n                           -23.503799438476562,\n                           -10.000300407409668,\n                           11.465299606323242,\n                           -19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           -21.447599411010742,\n                           0,\n                           25.572900772094727,\n                           -23.487899780273438,\n                           0,\n                           20.661399841308594,\n                           -24.930999755859375,\n                           0,\n                           15.928999900817871,\n                           -25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           -19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           -17.62779998779297,\n                           7.500199794769287,\n                           30.573999404907227,\n                           -19.785400390625,\n                           8.418190002441406,\n                           25.572900772094727,\n                           -21.447599411010742,\n                           0,\n                           25.572900772094727,\n                           -21.667600631713867,\n                           9.218990325927734,\n                           20.661399841308594,\n                           -23.487899780273438,\n                           0,\n                           20.661399841308594,\n                           -22.99880027770996,\n                           9.785409927368164,\n                           15.928999900817871,\n                           -24.930999755859375,\n                           0,\n                           15.928999900817871,\n                           -23.503799438476562,\n                           10.000300407409668,\n                           11.465299606323242,\n                           -25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           -13.56719970703125,\n                           13.56719970703125,\n                           30.573999404907227,\n                           -15.227800369262695,\n                           15.227800369262695,\n                           25.572900772094727,\n                           -16.67639923095703,\n                           16.67639923095703,\n                           20.661399841308594,\n                           -17.701000213623047,\n                           17.701000213623047,\n                           15.928999900817871,\n                           -18.089599609375,\n                           18.089599609375,\n                           11.465299606323242,\n                           -7.500199794769287,\n                           17.62779998779297,\n                           30.573999404907227,\n                           -8.418190002441406,\n                           19.785400390625,\n                           25.572900772094727,\n                           -9.218990325927734,\n                           21.667600631713867,\n                           20.661399841308594,\n                           -9.785409927368164,\n                           22.99880027770996,\n                           15.928999900817871,\n                           -10.000300407409668,\n                           23.503799438476562,\n                           11.465299606323242,\n                           0,\n                           19.108800888061523,\n                           30.573999404907227,\n                           0,\n                           21.447599411010742,\n                           25.572900772094727,\n                           0,\n                           23.487899780273438,\n                           20.661399841308594,\n                           0,\n                           24.930999755859375,\n                           15.928999900817871,\n                           0,\n                           25.4783992767334,\n                           11.465299606323242,\n                           0,\n                           19.108800888061523,\n                           30.573999404907227,\n                           7.500199794769287,\n                           17.62779998779297,\n                           30.573999404907227,\n                           8.418190002441406,\n                           19.785400390625,\n                           25.572900772094727,\n                           0,\n                           21.447599411010742,\n                           25.572900772094727,\n                           9.218990325927734,\n                           21.667600631713867,\n                           20.661399841308594,\n                           0,\n                           23.487899780273438,\n                           20.661399841308594,\n                           9.785409927368164,\n                           22.99880027770996,\n                           15.928999900817871,\n                           0,\n                           24.930999755859375,\n                           15.928999900817871,\n                           10.000300407409668,\n                           23.503799438476562,\n                           11.465299606323242,\n                           0,\n                           25.4783992767334,\n                           11.465299606323242,\n                           13.56719970703125,\n                           13.56719970703125,\n                           30.573999404907227,\n                           15.227800369262695,\n                           15.227800369262695,\n                           25.572900772094727,\n                           16.67639923095703,\n                           16.67639923095703,\n                           20.661399841308594,\n                           17.701000213623047,\n                           17.701000213623047,\n                           15.928999900817871,\n                           18.089599609375,\n                           18.089599609375,\n                           11.465299606323242,\n                           17.62779998779297,\n                           7.500199794769287,\n                           30.573999404907227,\n                           19.785400390625,\n                           8.418190002441406,\n                           25.572900772094727,\n                           21.667600631713867,\n                           9.218990325927734,\n                           20.661399841308594,\n                           22.99880027770996,\n                           9.785409927368164,\n                           15.928999900817871,\n                           23.503799438476562,\n                           10.000300407409668,\n                           11.465299606323242,\n                           19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           21.447599411010742,\n                           0,\n                           25.572900772094727,\n                           23.487899780273438,\n                           0,\n                           20.661399841308594,\n                           24.930999755859375,\n                           0,\n                           15.928999900817871,\n                           25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           23.503799438476562,\n                           -10.000300407409668,\n                           11.465299606323242,\n                           22.5856990814209,\n                           -9.609620094299316,\n                           7.688300132751465,\n                           24.48310089111328,\n                           0,\n                           7.688300132751465,\n                           20.565799713134766,\n                           -8.750229835510254,\n                           4.89661979675293,\n                           22.29360008239746,\n                           0,\n                           4.89661979675293,\n                           18.54599952697754,\n                           -7.890830039978027,\n                           3.0006699562072754,\n                           20.104000091552734,\n                           0,\n                           3.0006699562072754,\n                           17.62779998779297,\n                           -7.500199794769287,\n                           1.9108799695968628,\n                           19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           18.089599609375,\n                           -18.089599609375,\n                           11.465299606323242,\n                           17.382999420166016,\n                           -17.382999420166016,\n                           7.688300132751465,\n                           15.828399658203125,\n                           -15.828399658203125,\n                           4.89661979675293,\n                           14.273900032043457,\n                           -14.273900032043457,\n                           3.0006699562072754,\n                           13.56719970703125,\n                           -13.56719970703125,\n                           1.9108799695968628,\n                           10.000300407409668,\n                           -23.503799438476562,\n                           11.465299606323242,\n                           9.609620094299316,\n                           -22.5856990814209,\n                           7.688300132751465,\n                           8.750229835510254,\n                           -20.565799713134766,\n                           4.89661979675293,\n                           7.890830039978027,\n                           -18.54599952697754,\n                           3.0006699562072754,\n                           7.500199794769287,\n                           -17.62779998779297,\n                           1.9108799695968628,\n                           0,\n                           -25.4783992767334,\n                           11.465299606323242,\n                           0,\n                           -24.48310089111328,\n                           7.688300132751465,\n                           0,\n                           -22.29360008239746,\n                           4.89661979675293,\n                           0,\n                           -20.104000091552734,\n                           3.0006699562072754,\n                           0,\n                           -19.108800888061523,\n                           1.9108799695968628,\n                           0,\n                           -25.4783992767334,\n                           11.465299606323242,\n                           -10.000300407409668,\n                           -23.503799438476562,\n                           11.465299606323242,\n                           -9.609620094299316,\n                           -22.5856990814209,\n                           7.688300132751465,\n                           0,\n                           -24.48310089111328,\n                           7.688300132751465,\n                           -8.750229835510254,\n                           -20.565799713134766,\n                           4.89661979675293,\n                           0,\n                           -22.29360008239746,\n                           4.89661979675293,\n                           -7.890830039978027,\n                           -18.54599952697754,\n                           3.0006699562072754,\n                           0,\n                           -20.104000091552734,\n                           3.0006699562072754,\n                           -7.500199794769287,\n                           -17.62779998779297,\n                           1.9108799695968628,\n                           0,\n                           -19.108800888061523,\n                           1.9108799695968628,\n                           -18.089599609375,\n                           -18.089599609375,\n                           11.465299606323242,\n                           -17.382999420166016,\n                           -17.382999420166016,\n                           7.688300132751465,\n                           -15.828399658203125,\n                           -15.828399658203125,\n                           4.89661979675293,\n                           -14.273900032043457,\n                           -14.273900032043457,\n                           3.0006699562072754,\n                           -13.56719970703125,\n                           -13.56719970703125,\n                           1.9108799695968628,\n                           -23.503799438476562,\n                           -10.000300407409668,\n                           11.465299606323242,\n                           -22.5856990814209,\n                           -9.609620094299316,\n                           7.688300132751465,\n                           -20.565799713134766,\n                           -8.750229835510254,\n                           4.89661979675293,\n                           -18.54599952697754,\n                           -7.890830039978027,\n                           3.0006699562072754,\n                           -17.62779998779297,\n                           -7.500199794769287,\n                           1.9108799695968628,\n                           -25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           -24.48310089111328,\n                           0,\n                           7.688300132751465,\n                           -22.29360008239746,\n                           0,\n                           4.89661979675293,\n                           -20.104000091552734,\n                           0,\n                           3.0006699562072754,\n                           -19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           -25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           -23.503799438476562,\n                           10.000300407409668,\n                           11.465299606323242,\n                           -22.5856990814209,\n                           9.609620094299316,\n                           7.688300132751465,\n                           -24.48310089111328,\n                           0,\n                           7.688300132751465,\n                           -20.565799713134766,\n                           8.750229835510254,\n                           4.89661979675293,\n                           -22.29360008239746,\n                           0,\n                           4.89661979675293,\n                           -18.54599952697754,\n                           7.890830039978027,\n                           3.0006699562072754,\n                           -20.104000091552734,\n                           0,\n                           3.0006699562072754,\n                           -17.62779998779297,\n                           7.500199794769287,\n                           1.9108799695968628,\n                           -19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           -18.089599609375,\n                           18.089599609375,\n                           11.465299606323242,\n                           -17.382999420166016,\n                           17.382999420166016,\n                           7.688300132751465,\n                           -15.828399658203125,\n                           15.828399658203125,\n                           4.89661979675293,\n                           -14.273900032043457,\n                           14.273900032043457,\n                           3.0006699562072754,\n                           -13.56719970703125,\n                           13.56719970703125,\n                           1.9108799695968628,\n                           -10.000300407409668,\n                           23.503799438476562,\n                           11.465299606323242,\n                           -9.609620094299316,\n                           22.5856990814209,\n                           7.688300132751465,\n                           -8.750229835510254,\n                           20.565799713134766,\n                           4.89661979675293,\n                           -7.890830039978027,\n                           18.54599952697754,\n                           3.0006699562072754,\n                           -7.500199794769287,\n                           17.62779998779297,\n                           1.9108799695968628,\n                           0,\n                           25.4783992767334,\n                           11.465299606323242,\n                           0,\n                           24.48310089111328,\n                           7.688300132751465,\n                           0,\n                           22.29360008239746,\n                           4.89661979675293,\n                           0,\n                           20.104000091552734,\n                           3.0006699562072754,\n                           0,\n                           19.108800888061523,\n                           1.9108799695968628,\n                           0,\n                           25.4783992767334,\n                           11.465299606323242,\n                           10.000300407409668,\n                           23.503799438476562,\n                           11.465299606323242,\n                           9.609620094299316,\n                           22.5856990814209,\n                           7.688300132751465,\n                           0,\n                           24.48310089111328,\n                           7.688300132751465,\n                           8.750229835510254,\n                           20.565799713134766,\n                           4.89661979675293,\n                           0,\n                           22.29360008239746,\n                           4.89661979675293,\n                           7.890830039978027,\n                           18.54599952697754,\n                           3.0006699562072754,\n                           0,\n                           20.104000091552734,\n                           3.0006699562072754,\n                           7.500199794769287,\n                           17.62779998779297,\n                           1.9108799695968628,\n                           0,\n                           19.108800888061523,\n                           1.9108799695968628,\n                           18.089599609375,\n                           18.089599609375,\n                           11.465299606323242,\n                           17.382999420166016,\n                           17.382999420166016,\n                           7.688300132751465,\n                           15.828399658203125,\n                           15.828399658203125,\n                           4.89661979675293,\n                           14.273900032043457,\n                           14.273900032043457,\n                           3.0006699562072754,\n                           13.56719970703125,\n                           13.56719970703125,\n                           1.9108799695968628,\n                           23.503799438476562,\n                           10.000300407409668,\n                           11.465299606323242,\n                           22.5856990814209,\n                           9.609620094299316,\n                           7.688300132751465,\n                           20.565799713134766,\n                           8.750229835510254,\n                           4.89661979675293,\n                           18.54599952697754,\n                           7.890830039978027,\n                           3.0006699562072754,\n                           17.62779998779297,\n                           7.500199794769287,\n                           1.9108799695968628,\n                           25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           24.48310089111328,\n                           0,\n                           7.688300132751465,\n                           22.29360008239746,\n                           0,\n                           4.89661979675293,\n                           20.104000091552734,\n                           0,\n                           3.0006699562072754,\n                           19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           17.62779998779297,\n                           -7.500199794769287,\n                           1.9108799695968628,\n                           17.228500366210938,\n                           -7.330269813537598,\n                           1.2092299461364746,\n                           18.675800323486328,\n                           0,\n                           1.2092299461364746,\n                           15.093799591064453,\n                           -6.422039985656738,\n                           0.5971490144729614,\n                           16.361900329589844,\n                           0,\n                           0.5971490144729614,\n                           9.819259643554688,\n                           -4.177840232849121,\n                           0.16421599686145782,\n                           10.644200325012207,\n                           0,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           13.56719970703125,\n                           -13.56719970703125,\n                           1.9108799695968628,\n                           13.25979995727539,\n                           -13.25979995727539,\n                           1.2092299461364746,\n                           11.616900444030762,\n                           -11.616900444030762,\n                           0.5971490144729614,\n                           7.557370185852051,\n                           -7.557370185852051,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           7.500199794769287,\n                           -17.62779998779297,\n                           1.9108799695968628,\n                           7.330269813537598,\n                           -17.228500366210938,\n                           1.2092299461364746,\n                           6.422039985656738,\n                           -15.093799591064453,\n                           0.5971490144729614,\n                           4.177840232849121,\n                           -9.819259643554688,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           -19.108800888061523,\n                           1.9108799695968628,\n                           0,\n                           -18.675800323486328,\n                           1.2092299461364746,\n                           0,\n                           -16.361900329589844,\n                           0.5971490144729614,\n                           0,\n                           -10.644200325012207,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           -19.108800888061523,\n                           1.9108799695968628,\n                           -7.500199794769287,\n                           -17.62779998779297,\n                           1.9108799695968628,\n                           -7.330269813537598,\n                           -17.228500366210938,\n                           1.2092299461364746,\n                           0,\n                           -18.675800323486328,\n                           1.2092299461364746,\n                           -6.422039985656738,\n                           -15.093799591064453,\n                           0.5971490144729614,\n                           0,\n                           -16.361900329589844,\n                           0.5971490144729614,\n                           -4.177840232849121,\n                           -9.819259643554688,\n                           0.16421599686145782,\n                           0,\n                           -10.644200325012207,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           -13.56719970703125,\n                           -13.56719970703125,\n                           1.9108799695968628,\n                           -13.25979995727539,\n                           -13.25979995727539,\n                           1.2092299461364746,\n                           -11.616900444030762,\n                           -11.616900444030762,\n                           0.5971490144729614,\n                           -7.557370185852051,\n                           -7.557370185852051,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           -17.62779998779297,\n                           -7.500199794769287,\n                           1.9108799695968628,\n                           -17.228500366210938,\n                           -7.330269813537598,\n                           1.2092299461364746,\n                           -15.093799591064453,\n                           -6.422039985656738,\n                           0.5971490144729614,\n                           -9.819259643554688,\n                           -4.177840232849121,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           -19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           -18.675800323486328,\n                           0,\n                           1.2092299461364746,\n                           -16.361900329589844,\n                           0,\n                           0.5971490144729614,\n                           -10.644200325012207,\n                           0,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           -19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           -17.62779998779297,\n                           7.500199794769287,\n                           1.9108799695968628,\n                           -17.228500366210938,\n                           7.330269813537598,\n                           1.2092299461364746,\n                           -18.675800323486328,\n                           0,\n                           1.2092299461364746,\n                           -15.093799591064453,\n                           6.422039985656738,\n                           0.5971490144729614,\n                           -16.361900329589844,\n                           0,\n                           0.5971490144729614,\n                           -9.819259643554688,\n                           4.177840232849121,\n                           0.16421599686145782,\n                           -10.644200325012207,\n                           0,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           -13.56719970703125,\n                           13.56719970703125,\n                           1.9108799695968628,\n                           -13.25979995727539,\n                           13.25979995727539,\n                           1.2092299461364746,\n                           -11.616900444030762,\n                           11.616900444030762,\n                           0.5971490144729614,\n                           -7.557370185852051,\n                           7.557370185852051,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           -7.500199794769287,\n                           17.62779998779297,\n                           1.9108799695968628,\n                           -7.330269813537598,\n                           17.228500366210938,\n                           1.2092299461364746,\n                           -6.422039985656738,\n                           15.093799591064453,\n                           0.5971490144729614,\n                           -4.177840232849121,\n                           9.819259643554688,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           19.108800888061523,\n                           1.9108799695968628,\n                           0,\n                           18.675800323486328,\n                           1.2092299461364746,\n                           0,\n                           16.361900329589844,\n                           0.5971490144729614,\n                           0,\n                           10.644200325012207,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           19.108800888061523,\n                           1.9108799695968628,\n                           7.500199794769287,\n                           17.62779998779297,\n                           1.9108799695968628,\n                           7.330269813537598,\n                           17.228500366210938,\n                           1.2092299461364746,\n                           0,\n                           18.675800323486328,\n                           1.2092299461364746,\n                           6.422039985656738,\n                           15.093799591064453,\n                           0.5971490144729614,\n                           0,\n                           16.361900329589844,\n                           0.5971490144729614,\n                           4.177840232849121,\n                           9.819259643554688,\n                           0.16421599686145782,\n                           0,\n                           10.644200325012207,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           13.56719970703125,\n                           13.56719970703125,\n                           1.9108799695968628,\n                           13.25979995727539,\n                           13.25979995727539,\n                           1.2092299461364746,\n                           11.616900444030762,\n                           11.616900444030762,\n                           0.5971490144729614,\n                           7.557370185852051,\n                           7.557370185852051,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           17.62779998779297,\n                           7.500199794769287,\n                           1.9108799695968628,\n                           17.228500366210938,\n                           7.330269813537598,\n                           1.2092299461364746,\n                           15.093799591064453,\n                           6.422039985656738,\n                           0.5971490144729614,\n                           9.819259643554688,\n                           4.177840232849121,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           18.675800323486328,\n                           0,\n                           1.2092299461364746,\n                           16.361900329589844,\n                           0,\n                           0.5971490144729614,\n                           10.644200325012207,\n                           0,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           -20.382699966430664,\n                           0,\n                           25.796899795532227,\n                           -20.1835994720459,\n                           -2.149739980697632,\n                           26.244699478149414,\n                           -26.511600494384766,\n                           -2.149739980697632,\n                           26.192899703979492,\n                           -26.334299087524414,\n                           0,\n                           25.752099990844727,\n                           -31.156299591064453,\n                           -2.149739980697632,\n                           25.830400466918945,\n                           -30.733299255371094,\n                           0,\n                           25.438600540161133,\n                           -34.016998291015625,\n                           -2.149739980697632,\n                           24.846500396728516,\n                           -33.46030044555664,\n                           0,\n                           24.587600708007812,\n                           -34.99290084838867,\n                           -2.149739980697632,\n                           22.930500030517578,\n                           -34.39580154418945,\n                           0,\n                           22.930500030517578,\n                           -19.74570083618164,\n                           -2.8663198947906494,\n                           27.229999542236328,\n                           -26.901599884033203,\n                           -2.8663198947906494,\n                           27.162799835205078,\n                           -32.08679962158203,\n                           -2.8663198947906494,\n                           26.69260025024414,\n                           -35.241798400878906,\n                           -2.8663198947906494,\n                           25.416200637817383,\n                           -36.30670166015625,\n                           -2.8663198947906494,\n                           22.930500030517578,\n                           -19.30780029296875,\n                           -2.149739980697632,\n                           28.215299606323242,\n                           -27.29159927368164,\n                           -2.149739980697632,\n                           28.132699966430664,\n                           -33.017398834228516,\n                           -2.149739980697632,\n                           27.55470085144043,\n                           -36.46649932861328,\n                           -2.149739980697632,\n                           25.98579978942871,\n                           -37.620399475097656,\n                           -2.149739980697632,\n                           22.930500030517578,\n                           -19.108800888061523,\n                           0,\n                           28.66320037841797,\n                           -27.468900680541992,\n                           0,\n                           28.57360076904297,\n                           -33.440399169921875,\n                           0,\n                           27.94659996032715,\n                           -37.02330017089844,\n                           0,\n                           26.244699478149414,\n                           -38.21760177612305,\n                           0,\n                           22.930500030517578,\n                           -19.108800888061523,\n                           0,\n                           28.66320037841797,\n                           -19.30780029296875,\n                           2.149739980697632,\n                           28.215299606323242,\n                           -27.29159927368164,\n                           2.149739980697632,\n                           28.132699966430664,\n                           -27.468900680541992,\n                           0,\n                           28.57360076904297,\n                           -33.017398834228516,\n                           2.149739980697632,\n                           27.55470085144043,\n                           -33.440399169921875,\n                           0,\n                           27.94659996032715,\n                           -36.46649932861328,\n                           2.149739980697632,\n                           25.98579978942871,\n                           -37.02330017089844,\n                           0,\n                           26.244699478149414,\n                           -37.620399475097656,\n                           2.149739980697632,\n                           22.930500030517578,\n                           -38.21760177612305,\n                           0,\n                           22.930500030517578,\n                           -19.74570083618164,\n                           2.8663198947906494,\n                           27.229999542236328,\n                           -26.901599884033203,\n                           2.8663198947906494,\n                           27.162799835205078,\n                           -32.08679962158203,\n                           2.8663198947906494,\n                           26.69260025024414,\n                           -35.241798400878906,\n                           2.8663198947906494,\n                           25.416200637817383,\n                           -36.30670166015625,\n                           2.8663198947906494,\n                           22.930500030517578,\n                           -20.1835994720459,\n                           2.149739980697632,\n                           26.244699478149414,\n                           -26.511600494384766,\n                           2.149739980697632,\n                           26.192899703979492,\n                           -31.156299591064453,\n                           2.149739980697632,\n                           25.830400466918945,\n                           -34.016998291015625,\n                           2.149739980697632,\n                           24.846500396728516,\n                           -34.99290084838867,\n                           2.149739980697632,\n                           22.930500030517578,\n                           -20.382699966430664,\n                           0,\n                           25.796899795532227,\n                           -26.334299087524414,\n                           0,\n                           25.752099990844727,\n                           -30.733299255371094,\n                           0,\n                           25.438600540161133,\n                           -33.46030044555664,\n                           0,\n                           24.587600708007812,\n                           -34.39580154418945,\n                           0,\n                           22.930500030517578,\n                           -34.39580154418945,\n                           0,\n                           22.930500030517578,\n                           -34.99290084838867,\n                           -2.149739980697632,\n                           22.930500030517578,\n                           -34.44089889526367,\n                           -2.149739980697632,\n                           20.082199096679688,\n                           -33.89820098876953,\n                           0,\n                           20.33289909362793,\n                           -32.711299896240234,\n                           -2.149739980697632,\n                           16.81529998779297,\n                           -32.32569885253906,\n                           0,\n                           17.197900772094727,\n                           -29.69420051574707,\n                           -2.149739980697632,\n                           13.590499877929688,\n                           -29.558900833129883,\n                           0,\n                           14.062899589538574,\n                           -25.279300689697266,\n                           -2.149739980697632,\n                           10.8681001663208,\n                           -25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           -36.30670166015625,\n                           -2.8663198947906494,\n                           22.930500030517578,\n                           -35.6348991394043,\n                           -2.8663198947906494,\n                           19.530500411987305,\n                           -33.55979919433594,\n                           -2.8663198947906494,\n                           15.973699569702148,\n                           -29.99180030822754,\n                           -2.8663198947906494,\n                           12.551300048828125,\n                           -24.841400146484375,\n                           -2.8663198947906494,\n                           9.554389953613281,\n                           -37.620399475097656,\n                           -2.149739980697632,\n                           22.930500030517578,\n                           -36.82889938354492,\n                           -2.149739980697632,\n                           18.97879981994629,\n                           -34.408199310302734,\n                           -2.149739980697632,\n                           15.132100105285645,\n                           -30.289499282836914,\n                           -2.149739980697632,\n                           11.512200355529785,\n                           -24.403499603271484,\n                           -2.149739980697632,\n                           8.240659713745117,\n                           -38.21760177612305,\n                           0,\n                           22.930500030517578,\n                           -37.37160110473633,\n                           0,\n                           18.728099822998047,\n                           -34.79389953613281,\n                           0,\n                           14.749600410461426,\n                           -30.424800872802734,\n                           0,\n                           11.039799690246582,\n                           -24.204500198364258,\n                           0,\n                           7.643509864807129,\n                           -38.21760177612305,\n                           0,\n                           22.930500030517578,\n                           -37.620399475097656,\n                           2.149739980697632,\n                           22.930500030517578,\n                           -36.82889938354492,\n                           2.149739980697632,\n                           18.97879981994629,\n                           -37.37160110473633,\n                           0,\n                           18.728099822998047,\n                           -34.408199310302734,\n                           2.149739980697632,\n                           15.132100105285645,\n                           -34.79389953613281,\n                           0,\n                           14.749600410461426,\n                           -30.289499282836914,\n                           2.149739980697632,\n                           11.512200355529785,\n                           -30.424800872802734,\n                           0,\n                           11.039799690246582,\n                           -24.403499603271484,\n                           2.149739980697632,\n                           8.240659713745117,\n                           -24.204500198364258,\n                           0,\n                           7.643509864807129,\n                           -36.30670166015625,\n                           2.8663198947906494,\n                           22.930500030517578,\n                           -35.6348991394043,\n                           2.8663198947906494,\n                           19.530500411987305,\n                           -33.55979919433594,\n                           2.8663198947906494,\n                           15.973699569702148,\n                           -29.99180030822754,\n                           2.8663198947906494,\n                           12.551300048828125,\n                           -24.841400146484375,\n                           2.8663198947906494,\n                           9.554389953613281,\n                           -34.99290084838867,\n                           2.149739980697632,\n                           22.930500030517578,\n                           -34.44089889526367,\n                           2.149739980697632,\n                           20.082199096679688,\n                           -32.711299896240234,\n                           2.149739980697632,\n                           16.81529998779297,\n                           -29.69420051574707,\n                           2.149739980697632,\n                           13.590499877929688,\n                           -25.279300689697266,\n                           2.149739980697632,\n                           10.8681001663208,\n                           -34.39580154418945,\n                           0,\n                           22.930500030517578,\n                           -33.89820098876953,\n                           0,\n                           20.33289909362793,\n                           -32.32569885253906,\n                           0,\n                           17.197900772094727,\n                           -29.558900833129883,\n                           0,\n                           14.062899589538574,\n                           -25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           21.656600952148438,\n                           0,\n                           18.15329933166504,\n                           21.656600952148438,\n                           -4.729420185089111,\n                           16.511199951171875,\n                           28.233999252319336,\n                           -4.270359992980957,\n                           18.339000701904297,\n                           27.76740074157715,\n                           0,\n                           19.55660057067871,\n                           31.011899948120117,\n                           -3.2604401111602783,\n                           22.221399307250977,\n                           30.4148006439209,\n                           0,\n                           22.930500030517578,\n                           32.59560012817383,\n                           -2.2505099773406982,\n                           26.764400482177734,\n                           31.867900848388672,\n                           0,\n                           27.020999908447266,\n                           35.5900993347168,\n                           -1.791450023651123,\n                           30.573999404907227,\n                           34.39580154418945,\n                           0,\n                           30.573999404907227,\n                           21.656600952148438,\n                           -6.3059000968933105,\n                           12.89840030670166,\n                           29.260299682617188,\n                           -5.693819999694824,\n                           15.660200119018555,\n                           32.32569885253906,\n                           -4.347249984741211,\n                           20.661399841308594,\n                           34.19670104980469,\n                           -3.0006699562072754,\n                           26.199899673461914,\n                           38.21760177612305,\n                           -2.3886001110076904,\n                           30.573999404907227,\n                           21.656600952148438,\n                           -4.729420185089111,\n                           9.285670280456543,\n                           30.286699295043945,\n                           -4.270359992980957,\n                           12.981499671936035,\n                           33.639400482177734,\n                           -3.2604401111602783,\n                           19.101299285888672,\n                           35.79790115356445,\n                           -2.2505099773406982,\n                           25.635400772094727,\n                           40.845001220703125,\n                           -1.791450023651123,\n                           30.573999404907227,\n                           21.656600952148438,\n                           0,\n                           7.643509864807129,\n                           30.75320053100586,\n                           0,\n                           11.763799667358398,\n                           34.23659896850586,\n                           0,\n                           18.392200469970703,\n                           36.52560043334961,\n                           0,\n                           25.378799438476562,\n                           42.03929901123047,\n                           0,\n                           30.573999404907227,\n                           21.656600952148438,\n                           0,\n                           7.643509864807129,\n                           21.656600952148438,\n                           4.729420185089111,\n                           9.285670280456543,\n                           30.286699295043945,\n                           4.270359992980957,\n                           12.981499671936035,\n                           30.75320053100586,\n                           0,\n                           11.763799667358398,\n                           33.639400482177734,\n                           3.2604401111602783,\n                           19.101299285888672,\n                           34.23659896850586,\n                           0,\n                           18.392200469970703,\n                           35.79790115356445,\n                           2.2505099773406982,\n                           25.635400772094727,\n                           36.52560043334961,\n                           0,\n                           25.378799438476562,\n                           40.845001220703125,\n                           1.791450023651123,\n                           30.573999404907227,\n                           42.03929901123047,\n                           0,\n                           30.573999404907227,\n                           21.656600952148438,\n                           6.3059000968933105,\n                           12.89840030670166,\n                           29.260299682617188,\n                           5.693819999694824,\n                           15.660200119018555,\n                           32.32569885253906,\n                           4.347249984741211,\n                           20.661399841308594,\n                           34.19670104980469,\n                           3.0006699562072754,\n                           26.199899673461914,\n                           38.21760177612305,\n                           2.3886001110076904,\n                           30.573999404907227,\n                           21.656600952148438,\n                           4.729420185089111,\n                           16.511199951171875,\n                           28.233999252319336,\n                           4.270359992980957,\n                           18.339000701904297,\n                           31.011899948120117,\n                           3.2604401111602783,\n                           22.221399307250977,\n                           32.59560012817383,\n                           2.2505099773406982,\n                           26.764400482177734,\n                           35.5900993347168,\n                           1.791450023651123,\n                           30.573999404907227,\n                           21.656600952148438,\n                           0,\n                           18.15329933166504,\n                           27.76740074157715,\n                           0,\n                           19.55660057067871,\n                           30.4148006439209,\n                           0,\n                           22.930500030517578,\n                           31.867900848388672,\n                           0,\n                           27.020999908447266,\n                           34.39580154418945,\n                           0,\n                           30.573999404907227,\n                           34.39580154418945,\n                           0,\n                           30.573999404907227,\n                           35.5900993347168,\n                           -1.791450023651123,\n                           30.573999404907227,\n                           36.59049987792969,\n                           -1.679479956626892,\n                           31.137699127197266,\n                           35.3114013671875,\n                           0,\n                           31.111499786376953,\n                           37.18870162963867,\n                           -1.4331599473953247,\n                           31.332599639892578,\n                           35.98820114135742,\n                           0,\n                           31.290599822998047,\n                           37.206600189208984,\n                           -1.1868300437927246,\n                           31.1481990814209,\n                           36.187198638916016,\n                           0,\n                           31.111499786376953,\n                           36.46590042114258,\n                           -1.074869990348816,\n                           30.573999404907227,\n                           35.669700622558594,\n                           0,\n                           30.573999404907227,\n                           38.21760177612305,\n                           -2.3886001110076904,\n                           30.573999404907227,\n                           39.40439987182617,\n                           -2.2393100261688232,\n                           31.195499420166016,\n                           39.829898834228516,\n                           -1.9108799695968628,\n                           31.424999237060547,\n                           39.44919967651367,\n                           -1.582450032234192,\n                           31.229000091552734,\n                           38.21760177612305,\n                           -1.4331599473953247,\n                           30.573999404907227,\n                           40.845001220703125,\n                           -1.791450023651123,\n                           30.573999404907227,\n                           42.218299865722656,\n                           -1.679479956626892,\n                           31.25320053100586,\n                           42.47100067138672,\n                           -1.4331599473953247,\n                           31.51740074157715,\n                           41.69169998168945,\n                           -1.1868300437927246,\n                           31.309900283813477,\n                           39.969200134277344,\n                           -1.074869990348816,\n                           30.573999404907227,\n                           42.03929901123047,\n                           0,\n                           30.573999404907227,\n                           43.49729919433594,\n                           0,\n                           31.279399871826172,\n                           43.67150115966797,\n                           0,\n                           31.55929946899414,\n                           42.71110153198242,\n                           0,\n                           31.346599578857422,\n                           40.76539993286133,\n                           0,\n                           30.573999404907227,\n                           42.03929901123047,\n                           0,\n                           30.573999404907227,\n                           40.845001220703125,\n                           1.791450023651123,\n                           30.573999404907227,\n                           42.218299865722656,\n                           1.679479956626892,\n                           31.25320053100586,\n                           43.49729919433594,\n                           0,\n                           31.279399871826172,\n                           42.47100067138672,\n                           1.4331599473953247,\n                           31.51740074157715,\n                           43.67150115966797,\n                           0,\n                           31.55929946899414,\n                           41.69169998168945,\n                           1.1868300437927246,\n                           31.309900283813477,\n                           42.71110153198242,\n                           0,\n                           31.346599578857422,\n                           39.969200134277344,\n                           1.074869990348816,\n                           30.573999404907227,\n                           40.76539993286133,\n                           0,\n                           30.573999404907227,\n                           38.21760177612305,\n                           2.3886001110076904,\n                           30.573999404907227,\n                           39.40439987182617,\n                           2.2393100261688232,\n                           31.195499420166016,\n                           39.829898834228516,\n                           1.9108799695968628,\n                           31.424999237060547,\n                           39.44919967651367,\n                           1.582450032234192,\n                           31.229000091552734,\n                           38.21760177612305,\n                           1.4331599473953247,\n                           30.573999404907227,\n                           35.5900993347168,\n                           1.791450023651123,\n                           30.573999404907227,\n                           36.59049987792969,\n                           1.679479956626892,\n                           31.137699127197266,\n                           37.18870162963867,\n                           1.4331599473953247,\n                           31.332599639892578,\n                           37.206600189208984,\n                           1.1868300437927246,\n                           31.1481990814209,\n                           36.46590042114258,\n                           1.074869990348816,\n                           30.573999404907227,\n                           34.39580154418945,\n                           0,\n                           30.573999404907227,\n                           35.3114013671875,\n                           0,\n                           31.111499786376953,\n                           35.98820114135742,\n                           0,\n                           31.290599822998047,\n                           36.187198638916016,\n                           0,\n                           31.111499786376953,\n                           35.669700622558594,\n                           0,\n                           30.573999404907227,\n                           0,\n                           0,\n                           40.12839889526367,\n                           0,\n                           0,\n                           40.12839889526367,\n                           4.004499912261963,\n                           -1.7077000141143799,\n                           39.501399993896484,\n                           4.339280128479004,\n                           0,\n                           39.501399993896484,\n                           3.8207099437713623,\n                           -1.6290700435638428,\n                           37.97869873046875,\n                           4.140230178833008,\n                           0,\n                           37.97869873046875,\n                           2.314160108566284,\n                           -0.985912024974823,\n                           36.09769821166992,\n                           2.5080299377441406,\n                           0,\n                           36.09769821166992,\n                           2.3503799438476562,\n                           -1.0000300407409668,\n                           34.39580154418945,\n                           2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           3.0849199295043945,\n                           -3.0849199295043945,\n                           39.501399993896484,\n                           2.943150043487549,\n                           -2.943150043487549,\n                           37.97869873046875,\n                           1.782039999961853,\n                           -1.782039999961853,\n                           36.09769821166992,\n                           1.8089599609375,\n                           -1.8089599609375,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           1.7077000141143799,\n                           -4.004499912261963,\n                           39.501399993896484,\n                           1.6290700435638428,\n                           -3.8207099437713623,\n                           37.97869873046875,\n                           0.985912024974823,\n                           -2.314160108566284,\n                           36.09769821166992,\n                           1.0000300407409668,\n                           -2.3503799438476562,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           0,\n                           -4.339280128479004,\n                           39.501399993896484,\n                           0,\n                           -4.140230178833008,\n                           37.97869873046875,\n                           0,\n                           -2.5080299377441406,\n                           36.09769821166992,\n                           0,\n                           -2.547840118408203,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -1.7077000141143799,\n                           -4.004499912261963,\n                           39.501399993896484,\n                           0,\n                           -4.339280128479004,\n                           39.501399993896484,\n                           -1.6290700435638428,\n                           -3.8207099437713623,\n                           37.97869873046875,\n                           0,\n                           -4.140230178833008,\n                           37.97869873046875,\n                           -0.985912024974823,\n                           -2.314160108566284,\n                           36.09769821166992,\n                           0,\n                           -2.5080299377441406,\n                           36.09769821166992,\n                           -1.0000300407409668,\n                           -2.3503799438476562,\n                           34.39580154418945,\n                           0,\n                           -2.547840118408203,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -3.0849199295043945,\n                           -3.0849199295043945,\n                           39.501399993896484,\n                           -2.943150043487549,\n                           -2.943150043487549,\n                           37.97869873046875,\n                           -1.782039999961853,\n                           -1.782039999961853,\n                           36.09769821166992,\n                           -1.8089599609375,\n                           -1.8089599609375,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -4.004499912261963,\n                           -1.7077000141143799,\n                           39.501399993896484,\n                           -3.8207099437713623,\n                           -1.6290700435638428,\n                           37.97869873046875,\n                           -2.314160108566284,\n                           -0.985912024974823,\n                           36.09769821166992,\n                           -2.3503799438476562,\n                           -1.0000300407409668,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -4.339280128479004,\n                           0,\n                           39.501399993896484,\n                           -4.140230178833008,\n                           0,\n                           37.97869873046875,\n                           -2.5080299377441406,\n                           0,\n                           36.09769821166992,\n                           -2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -4.004499912261963,\n                           1.7077000141143799,\n                           39.501399993896484,\n                           -4.339280128479004,\n                           0,\n                           39.501399993896484,\n                           -3.8207099437713623,\n                           1.6290700435638428,\n                           37.97869873046875,\n                           -4.140230178833008,\n                           0,\n                           37.97869873046875,\n                           -2.314160108566284,\n                           0.985912024974823,\n                           36.09769821166992,\n                           -2.5080299377441406,\n                           0,\n                           36.09769821166992,\n                           -2.3503799438476562,\n                           1.0000300407409668,\n                           34.39580154418945,\n                           -2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -3.0849199295043945,\n                           3.0849199295043945,\n                           39.501399993896484,\n                           -2.943150043487549,\n                           2.943150043487549,\n                           37.97869873046875,\n                           -1.782039999961853,\n                           1.782039999961853,\n                           36.09769821166992,\n                           -1.8089599609375,\n                           1.8089599609375,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -1.7077000141143799,\n                           4.004499912261963,\n                           39.501399993896484,\n                           -1.6290700435638428,\n                           3.8207099437713623,\n                           37.97869873046875,\n                           -0.985912024974823,\n                           2.314160108566284,\n                           36.09769821166992,\n                           -1.0000300407409668,\n                           2.3503799438476562,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           0,\n                           4.339280128479004,\n                           39.501399993896484,\n                           0,\n                           4.140230178833008,\n                           37.97869873046875,\n                           0,\n                           2.5080299377441406,\n                           36.09769821166992,\n                           0,\n                           2.547840118408203,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           0,\n                           0,\n                           40.12839889526367,\n                           1.7077000141143799,\n                           4.004499912261963,\n                           39.501399993896484,\n                           0,\n                           4.339280128479004,\n                           39.501399993896484,\n                           1.6290700435638428,\n                           3.8207099437713623,\n                           37.97869873046875,\n                           0,\n                           4.140230178833008,\n                           37.97869873046875,\n                           0.985912024974823,\n                           2.314160108566284,\n                           36.09769821166992,\n                           0,\n                           2.5080299377441406,\n                           36.09769821166992,\n                           1.0000300407409668,\n                           2.3503799438476562,\n                           34.39580154418945,\n                           0,\n                           2.547840118408203,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           3.0849199295043945,\n                           3.0849199295043945,\n                           39.501399993896484,\n                           2.943150043487549,\n                           2.943150043487549,\n                           37.97869873046875,\n                           1.782039999961853,\n                           1.782039999961853,\n                           36.09769821166992,\n                           1.8089599609375,\n                           1.8089599609375,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           4.004499912261963,\n                           1.7077000141143799,\n                           39.501399993896484,\n                           3.8207099437713623,\n                           1.6290700435638428,\n                           37.97869873046875,\n                           2.314160108566284,\n                           0.985912024974823,\n                           36.09769821166992,\n                           2.3503799438476562,\n                           1.0000300407409668,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           4.339280128479004,\n                           0,\n                           39.501399993896484,\n                           4.140230178833008,\n                           0,\n                           37.97869873046875,\n                           2.5080299377441406,\n                           0,\n                           36.09769821166992,\n                           2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           2.3503799438476562,\n                           -1.0000300407409668,\n                           34.39580154418945,\n                           5.361800193786621,\n                           -2.2813100814819336,\n                           33.261199951171875,\n                           5.812250137329102,\n                           0,\n                           33.261199951171875,\n                           9.695320129394531,\n                           -4.125110149383545,\n                           32.484901428222656,\n                           10.50979995727539,\n                           0,\n                           32.484901428222656,\n                           13.58810043334961,\n                           -5.781400203704834,\n                           31.708599090576172,\n                           14.729700088500977,\n                           0,\n                           31.708599090576172,\n                           15.27750015258789,\n                           -6.5001702308654785,\n                           30.573999404907227,\n                           16.56089973449707,\n                           0,\n                           30.573999404907227,\n                           1.8089599609375,\n                           -1.8089599609375,\n                           34.39580154418945,\n                           4.126699924468994,\n                           -4.126699924468994,\n                           33.261199951171875,\n                           7.461979866027832,\n                           -7.461979866027832,\n                           32.484901428222656,\n                           10.458100318908691,\n                           -10.458100318908691,\n                           31.708599090576172,\n                           11.758299827575684,\n                           -11.758299827575684,\n                           30.573999404907227,\n                           1.0000300407409668,\n                           -2.3503799438476562,\n                           34.39580154418945,\n                           2.2813100814819336,\n                           -5.361800193786621,\n                           33.261199951171875,\n                           4.125110149383545,\n                           -9.695320129394531,\n                           32.484901428222656,\n                           5.781400203704834,\n                           -13.58810043334961,\n                           31.708599090576172,\n                           6.5001702308654785,\n                           -15.27750015258789,\n                           30.573999404907227,\n                           0,\n                           -2.547840118408203,\n                           34.39580154418945,\n                           0,\n                           -5.812250137329102,\n                           33.261199951171875,\n                           0,\n                           -10.50979995727539,\n                           32.484901428222656,\n                           0,\n                           -14.729700088500977,\n                           31.708599090576172,\n                           0,\n                           -16.56089973449707,\n                           30.573999404907227,\n                           0,\n                           -2.547840118408203,\n                           34.39580154418945,\n                           -1.0000300407409668,\n                           -2.3503799438476562,\n                           34.39580154418945,\n                           -2.2813100814819336,\n                           -5.361800193786621,\n                           33.261199951171875,\n                           0,\n                           -5.812250137329102,\n                           33.261199951171875,\n                           -4.125110149383545,\n                           -9.695320129394531,\n                           32.484901428222656,\n                           0,\n                           -10.50979995727539,\n                           32.484901428222656,\n                           -5.781400203704834,\n                           -13.58810043334961,\n                           31.708599090576172,\n                           0,\n                           -14.729700088500977,\n                           31.708599090576172,\n                           -6.5001702308654785,\n                           -15.27750015258789,\n                           30.573999404907227,\n                           0,\n                           -16.56089973449707,\n                           30.573999404907227,\n                           -1.8089599609375,\n                           -1.8089599609375,\n                           34.39580154418945,\n                           -4.126699924468994,\n                           -4.126699924468994,\n                           33.261199951171875,\n                           -7.461979866027832,\n                           -7.461979866027832,\n                           32.484901428222656,\n                           -10.458100318908691,\n                           -10.458100318908691,\n                           31.708599090576172,\n                           -11.758299827575684,\n                           -11.758299827575684,\n                           30.573999404907227,\n                           -2.3503799438476562,\n                           -1.0000300407409668,\n                           34.39580154418945,\n                           -5.361800193786621,\n                           -2.2813100814819336,\n                           33.261199951171875,\n                           -9.695320129394531,\n                           -4.125110149383545,\n                           32.484901428222656,\n                           -13.58810043334961,\n                           -5.781400203704834,\n                           31.708599090576172,\n                           -15.27750015258789,\n                           -6.5001702308654785,\n                           30.573999404907227,\n                           -2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           -5.812250137329102,\n                           0,\n                           33.261199951171875,\n                           -10.50979995727539,\n                           0,\n                           32.484901428222656,\n                           -14.729700088500977,\n                           0,\n                           31.708599090576172,\n                           -16.56089973449707,\n                           0,\n                           30.573999404907227,\n                           -2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           -2.3503799438476562,\n                           1.0000300407409668,\n                           34.39580154418945,\n                           -5.361800193786621,\n                           2.2813100814819336,\n                           33.261199951171875,\n                           -5.812250137329102,\n                           0,\n                           33.261199951171875,\n                           -9.695320129394531,\n                           4.125110149383545,\n                           32.484901428222656,\n                           -10.50979995727539,\n                           0,\n                           32.484901428222656,\n                           -13.58810043334961,\n                           5.781400203704834,\n                           31.708599090576172,\n                           -14.729700088500977,\n                           0,\n                           31.708599090576172,\n                           -15.27750015258789,\n                           6.5001702308654785,\n                           30.573999404907227,\n                           -16.56089973449707,\n                           0,\n                           30.573999404907227,\n                           -1.8089599609375,\n                           1.8089599609375,\n                           34.39580154418945,\n                           -4.126699924468994,\n                           4.126699924468994,\n                           33.261199951171875,\n                           -7.461979866027832,\n                           7.461979866027832,\n                           32.484901428222656,\n                           -10.458100318908691,\n                           10.458100318908691,\n                           31.708599090576172,\n                           -11.758299827575684,\n                           11.758299827575684,\n                           30.573999404907227,\n                           -1.0000300407409668,\n                           2.3503799438476562,\n                           34.39580154418945,\n                           -2.2813100814819336,\n                           5.361800193786621,\n                           33.261199951171875,\n                           -4.125110149383545,\n                           9.695320129394531,\n                           32.484901428222656,\n                           -5.781400203704834,\n                           13.58810043334961,\n                           31.708599090576172,\n                           -6.5001702308654785,\n                           15.27750015258789,\n                           30.573999404907227,\n                           0,\n                           2.547840118408203,\n                           34.39580154418945,\n                           0,\n                           5.812250137329102,\n                           33.261199951171875,\n                           0,\n                           10.50979995727539,\n                           32.484901428222656,\n                           0,\n                           14.729700088500977,\n                           31.708599090576172,\n                           0,\n                           16.56089973449707,\n                           30.573999404907227,\n                           0,\n                           2.547840118408203,\n                           34.39580154418945,\n                           1.0000300407409668,\n                           2.3503799438476562,\n                           34.39580154418945,\n                           2.2813100814819336,\n                           5.361800193786621,\n                           33.261199951171875,\n                           0,\n                           5.812250137329102,\n                           33.261199951171875,\n                           4.125110149383545,\n                           9.695320129394531,\n                           32.484901428222656,\n                           0,\n                           10.50979995727539,\n                           32.484901428222656,\n                           5.781400203704834,\n                           13.58810043334961,\n                           31.708599090576172,\n                           0,\n                           14.729700088500977,\n                           31.708599090576172,\n                           6.5001702308654785,\n                           15.27750015258789,\n                           30.573999404907227,\n                           0,\n                           16.56089973449707,\n                           30.573999404907227,\n                           1.8089599609375,\n                           1.8089599609375,\n                           34.39580154418945,\n                           4.126699924468994,\n                           4.126699924468994,\n                           33.261199951171875,\n                           7.461979866027832,\n                           7.461979866027832,\n                           32.484901428222656,\n                           10.458100318908691,\n                           10.458100318908691,\n                           31.708599090576172,\n                           11.758299827575684,\n                           11.758299827575684,\n                           30.573999404907227,\n                           2.3503799438476562,\n                           1.0000300407409668,\n                           34.39580154418945,\n                           5.361800193786621,\n                           2.2813100814819336,\n                           33.261199951171875,\n                           9.695320129394531,\n                           4.125110149383545,\n                           32.484901428222656,\n                           13.58810043334961,\n                           5.781400203704834,\n                           31.708599090576172,\n                           15.27750015258789,\n                           6.5001702308654785,\n                           30.573999404907227,\n                           2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           5.812250137329102,\n                           0,\n                           33.261199951171875,\n                           10.50979995727539,\n                           0,\n                           32.484901428222656,\n                           14.729700088500977,\n                           0,\n                           31.708599090576172,\n                           16.56089973449707,\n                           0,\n                           30.573999404907227};\n\nfloat teapotNormals[] = {-0.9667419791221619,\n                         0,\n                         -0.25575199723243713,\n                         -0.8930140137672424,\n                         0.3698819875717163,\n                         -0.2563450038433075,\n                         -0.8934370279312134,\n                         0.36910200119018555,\n                         0.2559970021247864,\n                         -0.9668239951133728,\n                         0,\n                         0.2554430067539215,\n                         -0.0838799998164177,\n                         0.03550700098276138,\n                         0.9958429932594299,\n                         -0.09205400198698044,\n                         0,\n                         0.9957540035247803,\n                         0.629721999168396,\n                         -0.2604379951953888,\n                         0.7318620085716248,\n                         0.6820489764213562,\n                         0,\n                         0.7313070297241211,\n                         0.803725004196167,\n                         -0.3325839936733246,\n                         0.4933690130710602,\n                         0.8703010082244873,\n                         0,\n                         0.4925200045108795,\n                         -0.6834070086479187,\n                         0.6834070086479187,\n                         -0.2567310035228729,\n                         -0.6835309863090515,\n                         0.6835309863090515,\n                         0.25606799125671387,\n                         -0.06492599844932556,\n                         0.06492500007152557,\n                         0.9957759976387024,\n                         0.48139700293540955,\n                         -0.48139700293540955,\n                         0.7324709892272949,\n                         0.6148040294647217,\n                         -0.6148040294647217,\n                         0.4939970076084137,\n                         -0.3698819875717163,\n                         0.8930140137672424,\n                         -0.2563450038433075,\n                         -0.36910200119018555,\n                         0.8934370279312134,\n                         0.2559959888458252,\n                         -0.03550700098276138,\n                         0.0838790014386177,\n                         0.9958429932594299,\n                         0.26043900847435,\n                         -0.6297230124473572,\n                         0.7318609952926636,\n                         0.3325839936733246,\n                         -0.803725004196167,\n                         0.4933690130710602,\n                         -0.002848000032827258,\n                         0.9661769866943359,\n                         -0.25786298513412476,\n                         -0.001921999966725707,\n                         0.9670090079307556,\n                         0.2547360062599182,\n                         -0.00026500000967644155,\n                         0.09227199852466583,\n                         0.9957339763641357,\n                         0.00002300000051036477,\n                         -0.6820600032806396,\n                         0.7312960028648376,\n                         0,\n                         -0.8703010082244873,\n                         0.4925200045108795,\n                         -0.002848000032827258,\n                         0.9661769866943359,\n                         -0.25786298513412476,\n                         0.37905800342559814,\n                         0.852770984172821,\n                         -0.35929998755455017,\n                         0.37711000442504883,\n                         0.9140909910202026,\n                         0.14908500015735626,\n                         -0.001921999966725707,\n                         0.9670090079307556,\n                         0.2547360062599182,\n                         0.0275030005723238,\n                         0.12255500257015228,\n                         0.9920809864997864,\n                         -0.00026500000967644155,\n                         0.09227199852466583,\n                         0.9957339763641357,\n                         -0.26100900769233704,\n                         -0.6353650093078613,\n                         0.7267630100250244,\n                         0.00002300000051036477,\n                         -0.6820600032806396,\n                         0.7312960028648376,\n                         -0.33248499035835266,\n                         -0.8042709827423096,\n                         0.4925459921360016,\n                         0,\n                         -0.8703010082244873,\n                         0.4925200045108795,\n                         0.6635469794273376,\n                         0.6252639889717102,\n                         -0.4107919931411743,\n                         0.712664008140564,\n                         0.6976209878921509,\n                         0.07372400164604187,\n                         0.09972699731588364,\n                         0.12198299914598465,\n                         0.98750901222229,\n                         -0.4873189926147461,\n                         -0.4885669946670532,\n                         0.7237560153007507,\n                         -0.6152420043945312,\n                         -0.6154839992523193,\n                         0.4926010072231293,\n                         0.8800280094146729,\n                         0.3387089967727661,\n                         -0.3329069912433624,\n                         0.9172769784927368,\n                         0.36149299144744873,\n                         0.16711199283599854,\n                         0.11358699947595596,\n                         0.04806999862194061,\n                         0.9923650026321411,\n                         -0.6341490149497986,\n                         -0.2618879973888397,\n                         0.7275090217590332,\n                         -0.8041260242462158,\n                         -0.33270499110221863,\n                         0.49263399839401245,\n                         0.9666900038719177,\n                         -0.010453999973833561,\n                         -0.2557379901409149,\n                         0.967441976070404,\n                         -0.00810300000011921,\n                         0.25296199321746826,\n                         0.0934389978647232,\n                         -0.0012799999676644802,\n                         0.9956240057945251,\n                         -0.6821659803390503,\n                         0.0003429999924264848,\n                         0.7311969995498657,\n                         -0.8703219890594482,\n                         0.00005400000009103678,\n                         0.492482990026474,\n                         0.9666900038719177,\n                         -0.010453999973833561,\n                         -0.2557379901409149,\n                         0.8930140137672424,\n                         -0.3698819875717163,\n                         -0.2563450038433075,\n                         0.8934370279312134,\n                         -0.36910200119018555,\n                         0.2559970021247864,\n                         0.967441976070404,\n                         -0.00810300000011921,\n                         0.25296199321746826,\n                         0.0838799998164177,\n                         -0.03550700098276138,\n                         0.9958429932594299,\n                         0.0934389978647232,\n                         -0.0012799999676644802,\n                         0.9956240057945251,\n                         -0.629721999168396,\n                         0.2604379951953888,\n                         0.7318620085716248,\n                         -0.6821659803390503,\n                         0.0003429999924264848,\n                         0.7311969995498657,\n                         -0.803725004196167,\n                         0.3325839936733246,\n                         0.4933690130710602,\n                         -0.8703219890594482,\n                         0.00005400000009103678,\n                         0.492482990026474,\n                         0.6834070086479187,\n                         -0.6834070086479187,\n                         -0.2567310035228729,\n                         0.6835309863090515,\n                         -0.6835309863090515,\n                         0.25606799125671387,\n                         0.06492599844932556,\n                         -0.06492500007152557,\n                         0.9957759976387024,\n                         -0.48139700293540955,\n                         0.48139700293540955,\n                         0.7324709892272949,\n                         -0.6148040294647217,\n                         0.6148040294647217,\n                         0.4939970076084137,\n                         0.3698819875717163,\n                         -0.8930140137672424,\n                         -0.2563450038433075,\n                         0.36910200119018555,\n                         -0.8934370279312134,\n                         0.2559959888458252,\n                         0.03550700098276138,\n                         -0.0838790014386177,\n                         0.9958429932594299,\n                         -0.26043900847435,\n                         0.6297230124473572,\n                         0.7318609952926636,\n                         -0.3325839936733246,\n                         0.803725004196167,\n                         0.4933690130710602,\n                         0,\n                         -0.9667419791221619,\n                         -0.25575199723243713,\n                         0,\n                         -0.9668239951133728,\n                         0.2554430067539215,\n                         0,\n                         -0.09205400198698044,\n                         0.9957540035247803,\n                         0,\n                         0.6820489764213562,\n                         0.7313070297241211,\n                         0,\n                         0.8703010082244873,\n                         0.4925200045108795,\n                         0,\n                         -0.9667419791221619,\n                         -0.25575199723243713,\n                         -0.3698819875717163,\n                         -0.8930140137672424,\n                         -0.2563450038433075,\n                         -0.36910200119018555,\n                         -0.8934370279312134,\n                         0.2559970021247864,\n                         0,\n                         -0.9668239951133728,\n                         0.2554430067539215,\n                         -0.03550700098276138,\n                         -0.0838799998164177,\n                         0.9958429932594299,\n                         0,\n                         -0.09205400198698044,\n                         0.9957540035247803,\n                         0.2604379951953888,\n                         0.629721999168396,\n                         0.7318620085716248,\n                         0,\n                         0.6820489764213562,\n                         0.7313070297241211,\n                         0.3325839936733246,\n                         0.803725004196167,\n                         0.4933690130710602,\n                         0,\n                         0.8703010082244873,\n                         0.4925200045108795,\n                         -0.6834070086479187,\n                         -0.6834070086479187,\n                         -0.2567310035228729,\n                         -0.6835309863090515,\n                         -0.6835309863090515,\n                         0.25606799125671387,\n                         -0.06492500007152557,\n                         -0.06492599844932556,\n                         0.9957759976387024,\n                         0.48139700293540955,\n                         0.48139700293540955,\n                         0.7324709892272949,\n                         0.6148040294647217,\n                         0.6148040294647217,\n                         0.4939970076084137,\n                         -0.8930140137672424,\n                         -0.3698819875717163,\n                         -0.2563450038433075,\n                         -0.8934370279312134,\n                         -0.36910200119018555,\n                         0.2559959888458252,\n                         -0.0838790014386177,\n                         -0.03550700098276138,\n                         0.9958429932594299,\n                         0.6297230124473572,\n                         0.26043900847435,\n                         0.7318609952926636,\n                         0.803725004196167,\n                         0.3325839936733246,\n                         0.4933690130710602,\n                         -0.9667419791221619,\n                         0,\n                         -0.25575199723243713,\n                         -0.9668239951133728,\n                         0,\n                         0.2554430067539215,\n                         -0.09205400198698044,\n                         0,\n                         0.9957540035247803,\n                         0.6820489764213562,\n                         0,\n                         0.7313070297241211,\n                         0.8703010082244873,\n                         0,\n                         0.4925200045108795,\n                         0.8703010082244873,\n                         0,\n                         0.4925200045108795,\n                         0.803725004196167,\n                         -0.3325839936733246,\n                         0.4933690130710602,\n                         0.8454390168190002,\n                         -0.34983500838279724,\n                         0.40354499220848083,\n                         0.9153209924697876,\n                         0,\n                         0.4027250111103058,\n                         0.8699960112571716,\n                         -0.36004599928855896,\n                         0.33685898780822754,\n                         0.9418079853057861,\n                         0,\n                         0.33615100383758545,\n                         0.9041929841041565,\n                         -0.37428000569343567,\n                         0.20579099655151367,\n                         0.9786900281906128,\n                         0,\n                         0.20534199476242065,\n                         0.9218789935112,\n                         -0.38175201416015625,\n                         -0.06636899709701538,\n                         0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         0.6148040294647217,\n                         -0.6148040294647217,\n                         0.4939970076084137,\n                         0.6468020081520081,\n                         -0.6468020081520081,\n                         0.40409600734710693,\n                         0.6656550168991089,\n                         -0.6656550168991089,\n                         0.3373520076274872,\n                         0.6919230222702026,\n                         -0.6919230222702026,\n                         0.20611999928951263,\n                         0.7055429816246033,\n                         -0.7055429816246033,\n                         -0.06647899746894836,\n                         0.3325839936733246,\n                         -0.803725004196167,\n                         0.4933690130710602,\n                         0.34983500838279724,\n                         -0.8454390168190002,\n                         0.40354499220848083,\n                         0.36004701256752014,\n                         -0.8699960112571716,\n                         0.33685800433158875,\n                         0.37428000569343567,\n                         -0.9041929841041565,\n                         0.20579099655151367,\n                         0.38175201416015625,\n                         -0.9218789935112,\n                         -0.06636899709701538,\n                         0,\n                         -0.8703010082244873,\n                         0.4925200045108795,\n                         0,\n                         -0.9153209924697876,\n                         0.4027250111103058,\n                         0,\n                         -0.9418079853057861,\n                         0.33615100383758545,\n                         0,\n                         -0.9786900281906128,\n                         0.20534199476242065,\n                         0,\n                         -0.9978039860725403,\n                         -0.06623899936676025,\n                         0,\n                         -0.8703010082244873,\n                         0.4925200045108795,\n                         -0.33248499035835266,\n                         -0.8042709827423096,\n                         0.4925459921360016,\n                         -0.34983500838279724,\n                         -0.8454390168190002,\n                         0.40354499220848083,\n                         0,\n                         -0.9153209924697876,\n                         0.4027250111103058,\n                         -0.36004599928855896,\n                         -0.8699960112571716,\n                         0.33685898780822754,\n                         0,\n                         -0.9418079853057861,\n                         0.33615100383758545,\n                         -0.37428000569343567,\n                         -0.9041929841041565,\n                         0.20579099655151367,\n                         0,\n                         -0.9786900281906128,\n                         0.20534199476242065,\n                         -0.38175201416015625,\n                         -0.9218789935112,\n                         -0.06636899709701538,\n                         0,\n                         -0.9978039860725403,\n                         -0.06623899936676025,\n                         -0.6152420043945312,\n                         -0.6154839992523193,\n                         0.4926010072231293,\n                         -0.6468020081520081,\n                         -0.6468020081520081,\n                         0.40409600734710693,\n                         -0.6656550168991089,\n                         -0.6656550168991089,\n                         0.3373520076274872,\n                         -0.6919230222702026,\n                         -0.6919230222702026,\n                         0.20611999928951263,\n                         -0.7055429816246033,\n                         -0.7055429816246033,\n                         -0.06647899746894836,\n                         -0.8041260242462158,\n                         -0.33270499110221863,\n                         0.49263399839401245,\n                         -0.8454390168190002,\n                         -0.34983500838279724,\n                         0.40354499220848083,\n                         -0.8699960112571716,\n                         -0.36004701256752014,\n                         0.33685800433158875,\n                         -0.9041929841041565,\n                         -0.37428000569343567,\n                         0.20579099655151367,\n                         -0.9218789935112,\n                         -0.38175201416015625,\n                         -0.06636899709701538,\n                         -0.8703219890594482,\n                         0.00005400000009103678,\n                         0.492482990026474,\n                         -0.9153209924697876,\n                         0,\n                         0.4027250111103058,\n                         -0.9418079853057861,\n                         0,\n                         0.33615100383758545,\n                         -0.9786900281906128,\n                         0,\n                         0.20534199476242065,\n                         -0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         -0.8703219890594482,\n                         0.00005400000009103678,\n                         0.492482990026474,\n                         -0.803725004196167,\n                         0.3325839936733246,\n                         0.4933690130710602,\n                         -0.8454390168190002,\n                         0.34983500838279724,\n                         0.40354499220848083,\n                         -0.9153209924697876,\n                         0,\n                         0.4027250111103058,\n                         -0.8699960112571716,\n                         0.36004599928855896,\n                         0.33685898780822754,\n                         -0.9418079853057861,\n                         0,\n                         0.33615100383758545,\n                         -0.9041929841041565,\n                         0.37428000569343567,\n                         0.20579099655151367,\n                         -0.9786900281906128,\n                         0,\n                         0.20534199476242065,\n                         -0.9218789935112,\n                         0.38175201416015625,\n                         -0.06636899709701538,\n                         -0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         -0.6148040294647217,\n                         0.6148040294647217,\n                         0.4939970076084137,\n                         -0.6468020081520081,\n                         0.6468020081520081,\n                         0.40409600734710693,\n                         -0.6656550168991089,\n                         0.6656550168991089,\n                         0.3373520076274872,\n                         -0.6919230222702026,\n                         0.6919230222702026,\n                         0.20611999928951263,\n                         -0.7055429816246033,\n                         0.7055429816246033,\n                         -0.06647899746894836,\n                         -0.3325839936733246,\n                         0.803725004196167,\n                         0.4933690130710602,\n                         -0.34983500838279724,\n                         0.8454390168190002,\n                         0.40354499220848083,\n                         -0.36004701256752014,\n                         0.8699960112571716,\n                         0.33685800433158875,\n                         -0.37428000569343567,\n                         0.9041929841041565,\n                         0.20579099655151367,\n                         -0.38175201416015625,\n                         0.9218789935112,\n                         -0.06636899709701538,\n                         0,\n                         0.8703010082244873,\n                         0.4925200045108795,\n                         0,\n                         0.9153209924697876,\n                         0.4027250111103058,\n                         0,\n                         0.9418079853057861,\n                         0.33615100383758545,\n                         0,\n                         0.9786900281906128,\n                         0.20534199476242065,\n                         0,\n                         0.9978039860725403,\n                         -0.06623899936676025,\n                         0,\n                         0.8703010082244873,\n                         0.4925200045108795,\n                         0.3325839936733246,\n                         0.803725004196167,\n                         0.4933690130710602,\n                         0.34983500838279724,\n                         0.8454390168190002,\n                         0.40354499220848083,\n                         0,\n                         0.9153209924697876,\n                         0.4027250111103058,\n                         0.36004599928855896,\n                         0.8699960112571716,\n                         0.33685898780822754,\n                         0,\n                         0.9418079853057861,\n                         0.33615100383758545,\n                         0.37428000569343567,\n                         0.9041929841041565,\n                         0.20579099655151367,\n                         0,\n                         0.9786900281906128,\n                         0.20534199476242065,\n                         0.38175201416015625,\n                         0.9218789935112,\n                         -0.06636899709701538,\n                         0,\n                         0.9978039860725403,\n                         -0.06623899936676025,\n                         0.6148040294647217,\n                         0.6148040294647217,\n                         0.4939970076084137,\n                         0.6468020081520081,\n                         0.6468020081520081,\n                         0.40409600734710693,\n                         0.6656550168991089,\n                         0.6656550168991089,\n                         0.3373520076274872,\n                         0.6919230222702026,\n                         0.6919230222702026,\n                         0.20611999928951263,\n                         0.7055429816246033,\n                         0.7055429816246033,\n                         -0.06647899746894836,\n                         0.803725004196167,\n                         0.3325839936733246,\n                         0.4933690130710602,\n                         0.8454390168190002,\n                         0.34983500838279724,\n                         0.40354499220848083,\n                         0.8699960112571716,\n                         0.36004701256752014,\n                         0.33685800433158875,\n                         0.9041929841041565,\n                         0.37428000569343567,\n                         0.20579099655151367,\n                         0.9218789935112,\n                         0.38175201416015625,\n                         -0.06636899709701538,\n                         0.8703010082244873,\n                         0,\n                         0.4925200045108795,\n                         0.9153209924697876,\n                         0,\n                         0.4027250111103058,\n                         0.9418079853057861,\n                         0,\n                         0.33615100383758545,\n                         0.9786900281906128,\n                         0,\n                         0.20534199476242065,\n                         0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         0.9218789935112,\n                         -0.38175201416015625,\n                         -0.06636899709701538,\n                         0.8314369916915894,\n                         -0.3441790044307709,\n                         -0.4361799955368042,\n                         0.9001820087432861,\n                         0,\n                         -0.4355129897594452,\n                         0.6735119819641113,\n                         -0.2785939872264862,\n                         -0.6846650242805481,\n                         0.7296109795570374,\n                         0,\n                         -0.6838629841804504,\n                         0.6403989791870117,\n                         -0.26487401127815247,\n                         -0.7209240198135376,\n                         0.6939510107040405,\n                         0,\n                         -0.7200220227241516,\n                         0.7329490184783936,\n                         -0.303166002035141,\n                         -0.6089959740638733,\n                         0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         0.7055429816246033,\n                         -0.7055429816246033,\n                         -0.06647899746894836,\n                         0.6360920071601868,\n                         -0.6360920071601868,\n                         -0.4367780089378357,\n                         0.5149649977684021,\n                         -0.5149649977684021,\n                         -0.6852890253067017,\n                         0.48965099453926086,\n                         -0.48965099453926086,\n                         -0.7214459776878357,\n                         0.5605549812316895,\n                         -0.5605549812316895,\n                         -0.6095539927482605,\n                         0.38175201416015625,\n                         -0.9218789935112,\n                         -0.06636899709701538,\n                         0.3441790044307709,\n                         -0.8314369916915894,\n                         -0.4361799955368042,\n                         0.2785939872264862,\n                         -0.6735119819641113,\n                         -0.6846650242805481,\n                         0.26487401127815247,\n                         -0.6403989791870117,\n                         -0.7209240198135376,\n                         0.303166002035141,\n                         -0.7329490184783936,\n                         -0.6089959740638733,\n                         0,\n                         -0.9978039860725403,\n                         -0.06623899936676025,\n                         0,\n                         -0.9001820087432861,\n                         -0.4355129897594452,\n                         0,\n                         -0.7296109795570374,\n                         -0.6838629841804504,\n                         0,\n                         -0.6939510107040405,\n                         -0.7200220227241516,\n                         0,\n                         -0.7939500212669373,\n                         -0.6079840064048767,\n                         0,\n                         -0.9978039860725403,\n                         -0.06623899936676025,\n                         -0.38175201416015625,\n                         -0.9218789935112,\n                         -0.06636899709701538,\n                         -0.3441790044307709,\n                         -0.8314369916915894,\n                         -0.4361799955368042,\n                         0,\n                         -0.9001820087432861,\n                         -0.4355129897594452,\n                         -0.2785939872264862,\n                         -0.6735119819641113,\n                         -0.6846650242805481,\n                         0,\n                         -0.7296109795570374,\n                         -0.6838629841804504,\n                         -0.26487401127815247,\n                         -0.6403989791870117,\n                         -0.7209240198135376,\n                         0,\n                         -0.6939510107040405,\n                         -0.7200220227241516,\n                         -0.303166002035141,\n                         -0.7329490184783936,\n                         -0.6089959740638733,\n                         0,\n                         -0.7939500212669373,\n                         -0.6079840064048767,\n                         -0.7055429816246033,\n                         -0.7055429816246033,\n                         -0.06647899746894836,\n                         -0.6360920071601868,\n                         -0.6360920071601868,\n                         -0.4367780089378357,\n                         -0.5149649977684021,\n                         -0.5149649977684021,\n                         -0.6852890253067017,\n                         -0.48965099453926086,\n                         -0.48965099453926086,\n                         -0.7214459776878357,\n                         -0.5605549812316895,\n                         -0.5605549812316895,\n                         -0.6095539927482605,\n                         -0.9218789935112,\n                         -0.38175201416015625,\n                         -0.06636899709701538,\n                         -0.8314369916915894,\n                         -0.3441790044307709,\n                         -0.4361799955368042,\n                         -0.6735119819641113,\n                         -0.2785939872264862,\n                         -0.6846650242805481,\n                         -0.6403989791870117,\n                         -0.26487401127815247,\n                         -0.7209240198135376,\n                         -0.7329490184783936,\n                         -0.303166002035141,\n                         -0.6089959740638733,\n                         -0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         -0.9001820087432861,\n                         0,\n                         -0.4355129897594452,\n                         -0.7296109795570374,\n                         0,\n                         -0.6838629841804504,\n                         -0.6939510107040405,\n                         0,\n                         -0.7200220227241516,\n                         -0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         -0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         -0.9218789935112,\n                         0.38175201416015625,\n                         -0.06636899709701538,\n                         -0.8314369916915894,\n                         0.3441790044307709,\n                         -0.4361799955368042,\n                         -0.9001820087432861,\n                         0,\n                         -0.4355129897594452,\n                         -0.6735119819641113,\n                         0.2785939872264862,\n                         -0.6846650242805481,\n                         -0.7296109795570374,\n                         0,\n                         -0.6838629841804504,\n                         -0.6403989791870117,\n                         0.26487401127815247,\n                         -0.7209240198135376,\n                         -0.6939510107040405,\n                         0,\n                         -0.7200220227241516,\n                         -0.7329490184783936,\n                         0.303166002035141,\n                         -0.6089959740638733,\n                         -0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         -0.7055429816246033,\n                         0.7055429816246033,\n                         -0.06647899746894836,\n                         -0.6360920071601868,\n                         0.6360920071601868,\n                         -0.4367780089378357,\n                         -0.5149649977684021,\n                         0.5149649977684021,\n                         -0.6852890253067017,\n                         -0.48965099453926086,\n                         0.48965099453926086,\n                         -0.7214459776878357,\n                         -0.5605549812316895,\n                         0.5605549812316895,\n                         -0.6095539927482605,\n                         -0.38175201416015625,\n                         0.9218789935112,\n                         -0.06636899709701538,\n                         -0.3441790044307709,\n                         0.8314369916915894,\n                         -0.4361799955368042,\n                         -0.2785939872264862,\n                         0.6735119819641113,\n                         -0.6846650242805481,\n                         -0.26487401127815247,\n                         0.6403989791870117,\n                         -0.7209240198135376,\n                         -0.303166002035141,\n                         0.7329490184783936,\n                         -0.6089959740638733,\n                         0,\n                         0.9978039860725403,\n                         -0.06623899936676025,\n                         0,\n                         0.9001820087432861,\n                         -0.4355129897594452,\n                         0,\n                         0.7296109795570374,\n                         -0.6838629841804504,\n                         0,\n                         0.6939510107040405,\n                         -0.7200220227241516,\n                         0,\n                         0.7939500212669373,\n                         -0.6079840064048767,\n                         0,\n                         0.9978039860725403,\n                         -0.06623899936676025,\n                         0.38175201416015625,\n                         0.9218789935112,\n                         -0.06636899709701538,\n                         0.3441790044307709,\n                         0.8314369916915894,\n                         -0.4361799955368042,\n                         0,\n                         0.9001820087432861,\n                         -0.4355129897594452,\n                         0.2785939872264862,\n                         0.6735119819641113,\n                         -0.6846650242805481,\n                         0,\n                         0.7296109795570374,\n                         -0.6838629841804504,\n                         0.26487401127815247,\n                         0.6403989791870117,\n                         -0.7209240198135376,\n                         0,\n                         0.6939510107040405,\n                         -0.7200220227241516,\n                         0.303166002035141,\n                         0.7329490184783936,\n                         -0.6089959740638733,\n                         0,\n                         0.7939500212669373,\n                         -0.6079840064048767,\n                         0.7055429816246033,\n                         0.7055429816246033,\n                         -0.06647899746894836,\n                         0.6360920071601868,\n                         0.6360920071601868,\n                         -0.4367780089378357,\n                         0.5149649977684021,\n                         0.5149649977684021,\n                         -0.6852890253067017,\n                         0.48965099453926086,\n                         0.48965099453926086,\n                         -0.7214459776878357,\n                         0.5605549812316895,\n                         0.5605549812316895,\n                         -0.6095539927482605,\n                         0.9218789935112,\n                         0.38175201416015625,\n                         -0.06636899709701538,\n                         0.8314369916915894,\n                         0.3441790044307709,\n                         -0.4361799955368042,\n                         0.6735119819641113,\n                         0.2785939872264862,\n                         -0.6846650242805481,\n                         0.6403989791870117,\n                         0.26487401127815247,\n                         -0.7209240198135376,\n                         0.7329490184783936,\n                         0.303166002035141,\n                         -0.6089959740638733,\n                         0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         0.9001820087432861,\n                         0,\n                         -0.4355129897594452,\n                         0.7296109795570374,\n                         0,\n                         -0.6838629841804504,\n                         0.6939510107040405,\n                         0,\n                         -0.7200220227241516,\n                         0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         0.7329490184783936,\n                         -0.303166002035141,\n                         -0.6089959740638733,\n                         0.576229989528656,\n                         -0.23821599781513214,\n                         -0.7818009853363037,\n                         0.6238600015640259,\n                         0,\n                         -0.7815359830856323,\n                         0.16362899541854858,\n                         -0.06752700358629227,\n                         -0.9842079877853394,\n                         0.17729100584983826,\n                         0,\n                         -0.984158992767334,\n                         0.04542100057005882,\n                         -0.018735000863671303,\n                         -0.9987919926643372,\n                         0.04920699819922447,\n                         0,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         0,\n                         -1,\n                         0.5605549812316895,\n                         -0.5605549812316895,\n                         -0.6095539927482605,\n                         0.44041600823402405,\n                         -0.44041600823402405,\n                         -0.7823479771614075,\n                         0.12490200251340866,\n                         -0.12490200251340866,\n                         -0.9842759966850281,\n                         0.034662000834941864,\n                         -0.034662000834941864,\n                         -0.9987980127334595,\n                         0,\n                         0,\n                         -1,\n                         0.303166002035141,\n                         -0.7329490184783936,\n                         -0.6089959740638733,\n                         0.23821599781513214,\n                         -0.576229989528656,\n                         -0.7818009853363037,\n                         0.06752700358629227,\n                         -0.16362899541854858,\n                         -0.9842079877853394,\n                         0.018735000863671303,\n                         -0.04542100057005882,\n                         -0.9987919926643372,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         -0.7939500212669373,\n                         -0.6079840064048767,\n                         0,\n                         -0.6238600015640259,\n                         -0.7815359830856323,\n                         0,\n                         -0.17729100584983826,\n                         -0.984158992767334,\n                         0,\n                         -0.04920699819922447,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         -0.7939500212669373,\n                         -0.6079840064048767,\n                         -0.303166002035141,\n                         -0.7329490184783936,\n                         -0.6089959740638733,\n                         -0.23821599781513214,\n                         -0.576229989528656,\n                         -0.7818009853363037,\n                         0,\n                         -0.6238600015640259,\n                         -0.7815359830856323,\n                         -0.06752700358629227,\n                         -0.16362899541854858,\n                         -0.9842079877853394,\n                         0,\n                         -0.17729100584983826,\n                         -0.984158992767334,\n                         -0.018735000863671303,\n                         -0.04542100057005882,\n                         -0.9987919926643372,\n                         0,\n                         -0.04920699819922447,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         0,\n                         -1,\n                         -0.5605549812316895,\n                         -0.5605549812316895,\n                         -0.6095539927482605,\n                         -0.44041600823402405,\n                         -0.44041600823402405,\n                         -0.7823479771614075,\n                         -0.12490200251340866,\n                         -0.12490200251340866,\n                         -0.9842759966850281,\n                         -0.034662000834941864,\n                         -0.034662000834941864,\n                         -0.9987980127334595,\n                         0,\n                         0,\n                         -1,\n                         -0.7329490184783936,\n                         -0.303166002035141,\n                         -0.6089959740638733,\n                         -0.576229989528656,\n                         -0.23821599781513214,\n                         -0.7818009853363037,\n                         -0.16362899541854858,\n                         -0.06752700358629227,\n                         -0.9842079877853394,\n                         -0.04542100057005882,\n                         -0.018735000863671303,\n                         -0.9987919926643372,\n                         0,\n                         0,\n                         -1,\n                         -0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         -0.6238600015640259,\n                         0,\n                         -0.7815359830856323,\n                         -0.17729100584983826,\n                         0,\n                         -0.984158992767334,\n                         -0.04920699819922447,\n                         0,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         -0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         -0.7329490184783936,\n                         0.303166002035141,\n                         -0.6089959740638733,\n                         -0.576229989528656,\n                         0.23821599781513214,\n                         -0.7818009853363037,\n                         -0.6238600015640259,\n                         0,\n                         -0.7815359830856323,\n                         -0.16362899541854858,\n                         0.06752700358629227,\n                         -0.9842079877853394,\n                         -0.17729100584983826,\n                         0,\n                         -0.984158992767334,\n                         -0.04542100057005882,\n                         0.018735000863671303,\n                         -0.9987919926643372,\n                         -0.04920699819922447,\n                         0,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         0,\n                         -1,\n                         -0.5605549812316895,\n                         0.5605549812316895,\n                         -0.6095539927482605,\n                         -0.44041600823402405,\n                         0.44041600823402405,\n                         -0.7823479771614075,\n                         -0.12490200251340866,\n                         0.12490200251340866,\n                         -0.9842759966850281,\n                         -0.034662000834941864,\n                         0.034662000834941864,\n                         -0.9987980127334595,\n                         0,\n                         0,\n                         -1,\n                         -0.303166002035141,\n                         0.7329490184783936,\n                         -0.6089959740638733,\n                         -0.23821599781513214,\n                         0.576229989528656,\n                         -0.7818009853363037,\n                         -0.06752700358629227,\n                         0.16362899541854858,\n                         -0.9842079877853394,\n                         -0.018735000863671303,\n                         0.04542100057005882,\n                         -0.9987919926643372,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         0.7939500212669373,\n                         -0.6079840064048767,\n                         0,\n                         0.6238600015640259,\n                         -0.7815359830856323,\n                         0,\n                         0.17729100584983826,\n                         -0.984158992767334,\n                         0,\n                         0.04920699819922447,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         0.7939500212669373,\n                         -0.6079840064048767,\n                         0.303166002035141,\n                         0.7329490184783936,\n                         -0.6089959740638733,\n                         0.23821599781513214,\n                         0.576229989528656,\n                         -0.7818009853363037,\n                         0,\n                         0.6238600015640259,\n                         -0.7815359830856323,\n                         0.06752700358629227,\n                         0.16362899541854858,\n                         -0.9842079877853394,\n                         0,\n                         0.17729100584983826,\n                         -0.984158992767334,\n                         0.018735000863671303,\n                         0.04542100057005882,\n                         -0.9987919926643372,\n                         0,\n                         0.04920699819922447,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         0,\n                         -1,\n                         0.5605549812316895,\n                         0.5605549812316895,\n                         -0.6095539927482605,\n                         0.44041600823402405,\n                         0.44041600823402405,\n                         -0.7823479771614075,\n                         0.12490200251340866,\n                         0.12490200251340866,\n                         -0.9842759966850281,\n                         0.034662000834941864,\n                         0.034662000834941864,\n                         -0.9987980127334595,\n                         0,\n                         0,\n                         -1,\n                         0.7329490184783936,\n                         0.303166002035141,\n                         -0.6089959740638733,\n                         0.576229989528656,\n                         0.23821599781513214,\n                         -0.7818009853363037,\n                         0.16362899541854858,\n                         0.06752700358629227,\n                         -0.9842079877853394,\n                         0.04542100057005882,\n                         0.018735000863671303,\n                         -0.9987919926643372,\n                         0,\n                         0,\n                         -1,\n                         0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         0.6238600015640259,\n                         0,\n                         -0.7815359830856323,\n                         0.17729100584983826,\n                         0,\n                         -0.984158992767334,\n                         0.04920699819922447,\n                         0,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0.007784999907016754,\n                         0.00021499999274965376,\n                         -0.999970018863678,\n                         0.007038000039756298,\n                         -0.5829259753227234,\n                         -0.8124949932098389,\n                         0.0361270010471344,\n                         -0.5456140041351318,\n                         -0.837257981300354,\n                         0.03913800045847893,\n                         0.0009879999561235309,\n                         -0.9992330074310303,\n                         0.16184599697589874,\n                         -0.5630490183830261,\n                         -0.8104209899902344,\n                         0.17951199412345886,\n                         0.0043680001981556416,\n                         -0.9837459921836853,\n                         0.4823650121688843,\n                         -0.6427459716796875,\n                         -0.5951480269432068,\n                         0.6122999787330627,\n                         0.010459000244736671,\n                         -0.790556013584137,\n                         0.7387199997901917,\n                         -0.6641989946365356,\n                         -0.11459299921989441,\n                         0.9861519932746887,\n                         0.006668999791145325,\n                         -0.16570700705051422,\n                         -0.0019079999765381217,\n                         -0.9867690205574036,\n                         0.1621209979057312,\n                         0.002761000068858266,\n                         -0.9998499751091003,\n                         0.017105000093579292,\n                         0.010532000102102757,\n                         -0.9972469806671143,\n                         0.07339800149202347,\n                         -0.06604000180959702,\n                         -0.9893029928207397,\n                         0.13006900250911713,\n                         -0.09442699700593948,\n                         -0.9953929781913757,\n                         0.016594000160694122,\n                         -0.009201999753713608,\n                         -0.4902929961681366,\n                         0.8715090155601501,\n                         -0.04860600084066391,\n                         -0.5394579768180847,\n                         0.8406090140342712,\n                         -0.22329799830913544,\n                         -0.5527390241622925,\n                         0.8028810024261475,\n                         -0.5963649749755859,\n                         -0.5751349925994873,\n                         0.5599709749221802,\n                         -0.8033369779586792,\n                         -0.5916029810905457,\n                         0.06823500245809555,\n                         -0.01056000031530857,\n                         -0.00010299999848939478,\n                         0.9999439716339111,\n                         -0.05879800021648407,\n                         -0.0007089999853633344,\n                         0.9982699751853943,\n                         -0.28071001172065735,\n                         -0.0032679999712854624,\n                         0.9597870111465454,\n                         -0.7497230172157288,\n                         -0.004267000127583742,\n                         0.6617379784584045,\n                         -0.9973509907722473,\n                         -0.0020580000709742308,\n                         0.07271400094032288,\n                         -0.01056000031530857,\n                         -0.00010299999848939478,\n                         0.9999439716339111,\n                         -0.008791999891400337,\n                         0.49032899737358093,\n                         0.8714929819107056,\n                         -0.04649300128221512,\n                         0.5387560129165649,\n                         0.8411779999732971,\n                         -0.05879800021648407,\n                         -0.0007089999853633344,\n                         0.9982699751853943,\n                         -0.21790899336338043,\n                         0.5491610169410706,\n                         0.8068069815635681,\n                         -0.28071001172065735,\n                         -0.0032679999712854624,\n                         0.9597870111465454,\n                         -0.5972909927368164,\n                         0.5741199851036072,\n                         0.560027003288269,\n                         -0.7497230172157288,\n                         -0.004267000127583742,\n                         0.6617379784584045,\n                         -0.8040000200271606,\n                         0.5912910103797913,\n                         0.0629120022058487,\n                         -0.9973509907722473,\n                         -0.0020580000709742308,\n                         0.07271400094032288,\n                         -0.0018050000071525574,\n                         0.986840009689331,\n                         0.16169099509716034,\n                         0.0020310000982135534,\n                         0.999891996383667,\n                         0.014553000219166279,\n                         0.009215000085532665,\n                         0.9981520175933838,\n                         0.060068998485803604,\n                         -0.059335000813007355,\n                         0.9917230010032654,\n                         0.11386600136756897,\n                         -0.08690100163221359,\n                         0.9961410164833069,\n                         0.01228999998420477,\n                         0.006417000200599432,\n                         0.5830950140953064,\n                         -0.812379002571106,\n                         0.03378299996256828,\n                         0.5453730225563049,\n                         -0.8375130295753479,\n                         0.1571130007505417,\n                         0.562188982963562,\n                         -0.8119469881057739,\n                         0.4844059944152832,\n                         0.6465290188789368,\n                         -0.5893650054931641,\n                         0.7388700246810913,\n                         0.6661880016326904,\n                         -0.10131999850273132,\n                         0.007784999907016754,\n                         0.00021499999274965376,\n                         -0.999970018863678,\n                         0.03913800045847893,\n                         0.0009879999561235309,\n                         -0.9992330074310303,\n                         0.17951199412345886,\n                         0.0043680001981556416,\n                         -0.9837459921836853,\n                         0.6122999787330627,\n                         0.010459000244736671,\n                         -0.790556013584137,\n                         0.9861519932746887,\n                         0.006668999791145325,\n                         -0.16570700705051422,\n                         0.9861519932746887,\n                         0.006668999791145325,\n                         -0.16570700705051422,\n                         0.7387199997901917,\n                         -0.6641989946365356,\n                         -0.11459299921989441,\n                         0.7256090044975281,\n                         -0.6373609900474548,\n                         0.25935098528862,\n                         0.94651198387146,\n                         0.0033569999504834414,\n                         0.3226499855518341,\n                         0.6459450125694275,\n                         -0.6077200174331665,\n                         0.46198800206184387,\n                         0.8258299827575684,\n                         0.007451999932527542,\n                         0.5638700127601624,\n                         0.5316150188446045,\n                         -0.5586140155792236,\n                         0.6366599798202515,\n                         0.6500110030174255,\n                         0.006936000194400549,\n                         0.759893000125885,\n                         0.4249640107154846,\n                         -0.5955389738082886,\n                         0.6817179918289185,\n                         0.5324289798736572,\n                         0.005243999883532524,\n                         0.8464580178260803,\n                         -0.09442699700593948,\n                         -0.9953929781913757,\n                         0.016594000160694122,\n                         -0.04956100136041641,\n                         -0.9985759854316711,\n                         -0.01975500024855137,\n                         -0.03781700134277344,\n                         -0.998649001121521,\n                         -0.035624999552965164,\n                         -0.0379129983484745,\n                         -0.9986140131950378,\n                         -0.03651199862360954,\n                         -0.1688539981842041,\n                         -0.9395300149917603,\n                         -0.2979460060596466,\n                         -0.8033369779586792,\n                         -0.5916029810905457,\n                         0.06823500245809555,\n                         -0.7423409819602966,\n                         -0.5995240211486816,\n                         -0.2991659939289093,\n                         -0.6196020245552063,\n                         -0.5795029997825623,\n                         -0.5294060111045837,\n                         -0.483707994222641,\n                         -0.5438370108604431,\n                         -0.6857600212097168,\n                         -0.44529199600219727,\n                         -0.4131770133972168,\n                         -0.7943549752235413,\n                         -0.9973509907722473,\n                         -0.0020580000709742308,\n                         0.07271400094032288,\n                         -0.9265130162239075,\n                         -0.0019950000569224358,\n                         -0.3762570023536682,\n                         -0.7539200186729431,\n                         -0.004317000042647123,\n                         -0.6569520235061646,\n                         -0.5662239789962769,\n                         -0.003461000043898821,\n                         -0.8242440223693848,\n                         -0.4818040132522583,\n                         -0.0018500000005587935,\n                         -0.8762770295143127,\n                         -0.9973509907722473,\n                         -0.0020580000709742308,\n                         0.07271400094032288,\n                         -0.8040000200271606,\n                         0.5912910103797913,\n                         0.0629120022058487,\n                         -0.7446749806404114,\n                         0.5989770293235779,\n                         -0.29442399740219116,\n                         -0.9265130162239075,\n                         -0.0019950000569224358,\n                         -0.3762570023536682,\n                         -0.6219490170478821,\n                         0.5781649947166443,\n                         -0.5281140208244324,\n                         -0.7539200186729431,\n                         -0.004317000042647123,\n                         -0.6569520235061646,\n                         -0.48117101192474365,\n                         0.5428280234336853,\n                         -0.6883400082588196,\n                         -0.5662239789962769,\n                         -0.003461000043898821,\n                         -0.8242440223693848,\n                         -0.43805500864982605,\n                         0.41574400663375854,\n                         -0.7970349788665771,\n                         -0.4818040132522583,\n                         -0.0018500000005587935,\n                         -0.8762770295143127,\n                         -0.08690100163221359,\n                         0.9961410164833069,\n                         0.01228999998420477,\n                         -0.04433799907565117,\n                         0.9988710284233093,\n                         -0.017055999487638474,\n                         -0.026177000254392624,\n                         0.9992600083351135,\n                         -0.02816700004041195,\n                         -0.025293000042438507,\n                         0.9992780089378357,\n                         -0.028332000598311424,\n                         -0.15748199820518494,\n                         0.9441670179367065,\n                         -0.28939300775527954,\n                         0.7388700246810913,\n                         0.6661880016326904,\n                         -0.10131999850273132,\n                         0.7282440066337585,\n                         0.63714200258255,\n                         0.25240999460220337,\n                         0.6470540165901184,\n                         0.6082550287246704,\n                         0.4597249925136566,\n                         0.5229939818382263,\n                         0.5621700286865234,\n                         0.6406570076942444,\n                         0.4099780023097992,\n                         0.6046689748764038,\n                         0.6828569769859314,\n                         0.9861519932746887,\n                         0.006668999791145325,\n                         -0.16570700705051422,\n                         0.94651198387146,\n                         0.0033569999504834414,\n                         0.3226499855518341,\n                         0.8258299827575684,\n                         0.007451999932527542,\n                         0.5638700127601624,\n                         0.6500110030174255,\n                         0.006936000194400549,\n                         0.759893000125885,\n                         0.5324289798736572,\n                         0.005243999883532524,\n                         0.8464580178260803,\n                         -0.230786994099617,\n                         0.006523000076413155,\n                         0.9729819893836975,\n                         -0.15287800133228302,\n                         -0.7101899981498718,\n                         0.6872109770774841,\n                         -0.31672099232673645,\n                         -0.7021129727363586,\n                         0.6377500295639038,\n                         -0.5489360094070435,\n                         0.0015109999803826213,\n                         0.8358629941940308,\n                         -0.6010670065879822,\n                         -0.645330011844635,\n                         0.471451997756958,\n                         -0.8756710290908813,\n                         -0.009891999885439873,\n                         0.4828070104122162,\n                         -0.635890007019043,\n                         -0.629800021648407,\n                         0.4460900127887726,\n                         -0.8775539994239807,\n                         -0.01909100078046322,\n                         0.47909700870513916,\n                         -0.4357450008392334,\n                         -0.670009970664978,\n                         0.6010090112686157,\n                         -0.6961889863014221,\n                         -0.02449600026011467,\n                         0.7174400091171265,\n                         0.11111299693584442,\n                         -0.9901599884033203,\n                         -0.08506900072097778,\n                         0.22330999374389648,\n                         -0.9747260212898254,\n                         0.006539999973028898,\n                         0.19009700417518616,\n                         -0.9694579839706421,\n                         0.15496399998664856,\n                         0.005270000081509352,\n                         -0.9818699955940247,\n                         0.18948200345039368,\n                         -0.011750999838113785,\n                         -0.9690240025520325,\n                         0.24668699502944946,\n                         0.3439059853553772,\n                         -0.5994120240211487,\n                         -0.7227950096130371,\n                         0.5724899768829346,\n                         -0.5916270017623901,\n                         -0.5676559805870056,\n                         0.7874360084533691,\n                         -0.5605109930038452,\n                         -0.2564600110054016,\n                         0.6470969915390015,\n                         -0.6981409788131714,\n                         -0.3063740134239197,\n                         0.4275279939174652,\n                         -0.7535750269889832,\n                         -0.49934399127960205,\n                         0.4109260141849518,\n                         -0.0012839999981224537,\n                         -0.9116680026054382,\n                         0.6715199947357178,\n                         0.0008989999769255519,\n                         -0.7409859895706177,\n                         0.9220259785652161,\n                         0.00725199980661273,\n                         -0.3870599865913391,\n                         0.8469099998474121,\n                         0.01385399978607893,\n                         -0.5315560102462769,\n                         0.5359240174293518,\n                         0.010503999888896942,\n                         -0.8442010283470154,\n                         0.4109260141849518,\n                         -0.0012839999981224537,\n                         -0.9116680026054382,\n                         0.3411880135536194,\n                         0.6009309887886047,\n                         -0.7228230237960815,\n                         0.5786640048027039,\n                         0.591838002204895,\n                         -0.5611389875411987,\n                         0.6715199947357178,\n                         0.0008989999769255519,\n                         -0.7409859895706177,\n                         0.7848690152168274,\n                         0.5665420293807983,\n                         -0.25102001428604126,\n                         0.9220259785652161,\n                         0.00725199980661273,\n                         -0.3870599865913391,\n                         0.6426810026168823,\n                         0.7039899826049805,\n                         -0.3022570013999939,\n                         0.8469099998474121,\n                         0.01385399978607893,\n                         -0.5315560102462769,\n                         0.4185889959335327,\n                         0.7581170201301575,\n                         -0.5000420212745667,\n                         0.5359240174293518,\n                         0.010503999888896942,\n                         -0.8442010283470154,\n                         0.11580599844455719,\n                         0.9901139736175537,\n                         -0.07913900166749954,\n                         0.23281100392341614,\n                         0.9724410176277161,\n                         0.012564999982714653,\n                         0.20666299760341644,\n                         0.9662799835205078,\n                         0.15360000729560852,\n                         0.02449899911880493,\n                         0.9865779876708984,\n                         0.16144299507141113,\n                         0.0033809999004006386,\n                         0.9774550199508667,\n                         0.2111150026321411,\n                         -0.13491199910640717,\n                         0.7135509848594666,\n                         0.6874909996986389,\n                         -0.31953999400138855,\n                         0.7050619721412659,\n                         0.6330729722976685,\n                         -0.6039019823074341,\n                         0.6499029994010925,\n                         0.4614419937133789,\n                         -0.6318150162696838,\n                         0.6400719881057739,\n                         0.43716898560523987,\n                         -0.4243049919605255,\n                         0.6667500138282776,\n                         0.6127070188522339,\n                         -0.230786994099617,\n                         0.006523000076413155,\n                         0.9729819893836975,\n                         -0.5489360094070435,\n                         0.0015109999803826213,\n                         0.8358629941940308,\n                         -0.8756710290908813,\n                         -0.009891999885439873,\n                         0.4828070104122162,\n                         -0.8775539994239807,\n                         -0.01909100078046322,\n                         0.47909700870513916,\n                         -0.6961889863014221,\n                         -0.02449600026011467,\n                         0.7174400091171265,\n                         -0.6961889863014221,\n                         -0.02449600026011467,\n                         0.7174400091171265,\n                         -0.4357450008392334,\n                         -0.670009970664978,\n                         0.6010090112686157,\n                         -0.25985801219940186,\n                         -0.5525479912757874,\n                         0.7919380068778992,\n                         -0.42579901218414307,\n                         -0.010804999619722366,\n                         0.9047530293464661,\n                         0.009537000209093094,\n                         0.021669000387191772,\n                         0.9997199773788452,\n                         0.022041000425815582,\n                         -0.001623000018298626,\n                         0.9997559785842896,\n                         0.4101540148258209,\n                         0.8490809798240662,\n                         0.3329179883003235,\n                         0.9995980262756348,\n                         -0.01155600044876337,\n                         0.02587899938225746,\n                         0.5415220260620117,\n                         0.6370009779930115,\n                         -0.5486199855804443,\n                         0.7095860242843628,\n                         -0.009670999832451344,\n                         -0.7045519948005676,\n                         -0.011750999838113785,\n                         -0.9690240025520325,\n                         0.24668699502944946,\n                         0.046310000121593475,\n                         -0.8891720175743103,\n                         0.45522499084472656,\n                         -0.010688000358641148,\n                         -0.14889900386333466,\n                         0.9887949824333191,\n                         -0.04437499865889549,\n                         0.7291200160980225,\n                         0.6829460263252258,\n                         0.12282499670982361,\n                         0.9923850297927856,\n                         0.009232000447809696,\n                         0.4275279939174652,\n                         -0.7535750269889832,\n                         -0.49934399127960205,\n                         0.48183900117874146,\n                         -0.857479989528656,\n                         -0.18044300377368927,\n                         0.45527198910713196,\n                         -0.49992498755455017,\n                         0.7367510199546814,\n                         -0.22054199874401093,\n                         0.3582780063152313,\n                         0.9071930050849915,\n                         -0.23591899871826172,\n                         0.7157959938049316,\n                         0.6572499871253967,\n                         0.5359240174293518,\n                         0.010503999888896942,\n                         -0.8442010283470154,\n                         0.7280910015106201,\n                         0.015584999695420265,\n                         -0.6853029727935791,\n                         0.8887389898300171,\n                         0.016679000109434128,\n                         0.4581089913845062,\n                         -0.26009801030158997,\n                         -0.0007999999797903001,\n                         0.965582013130188,\n                         -0.37161099910736084,\n                         0.004416999872773886,\n                         0.9283779859542847,\n                         0.5359240174293518,\n                         0.010503999888896942,\n                         -0.8442010283470154,\n                         0.4185889959335327,\n                         0.7581170201301575,\n                         -0.5000420212745667,\n                         0.4801650047302246,\n                         0.8588529825210571,\n                         -0.17836299538612366,\n                         0.7280910015106201,\n                         0.015584999695420265,\n                         -0.6853029727935791,\n                         0.4881030023097992,\n                         0.49794700741767883,\n                         0.7168020009994507,\n                         0.8887389898300171,\n                         0.016679000109434128,\n                         0.4581089913845062,\n                         -0.2220049947500229,\n                         -0.36189401149749756,\n                         0.9053990244865417,\n                         -0.26009801030158997,\n                         -0.0007999999797903001,\n                         0.965582013130188,\n                         -0.23540399968624115,\n                         -0.7104769945144653,\n                         0.6631799936294556,\n                         -0.37161099910736084,\n                         0.004416999872773886,\n                         0.9283779859542847,\n                         0.0033809999004006386,\n                         0.9774550199508667,\n                         0.2111150026321411,\n                         0.058719001710414886,\n                         0.8971999883651733,\n                         0.437703013420105,\n                         0.0013249999610707164,\n                         0.164000004529953,\n                         0.9864590167999268,\n                         -0.04418899863958359,\n                         -0.7303190231323242,\n                         0.6816750168800354,\n                         0.13880200684070587,\n                         -0.9897300004959106,\n                         -0.034189000725746155,\n                         -0.4243049919605255,\n                         0.6667500138282776,\n                         0.6127070188522339,\n                         -0.25888898968696594,\n                         0.5453789830207825,\n                         0.7972059845924377,\n                         0.012268000282347202,\n                         -0.01928500086069107,\n                         0.9997389912605286,\n                         0.3986299932003021,\n                         -0.8456630110740662,\n                         0.3548929989337921,\n                         0.5375639796257019,\n                         -0.6107370257377625,\n                         -0.5813990235328674,\n                         -0.6961889863014221,\n                         -0.02449600026011467,\n                         0.7174400091171265,\n                         -0.42579901218414307,\n                         -0.010804999619722366,\n                         0.9047530293464661,\n                         0.022041000425815582,\n                         -0.001623000018298626,\n                         0.9997559785842896,\n                         0.9995980262756348,\n                         -0.01155600044876337,\n                         0.02587899938225746,\n                         0.7095860242843628,\n                         -0.009670999832451344,\n                         -0.7045519948005676,\n                         0,\n                         0,\n                         1,\n                         0,\n                         0,\n                         1,\n                         0.7626410126686096,\n                         -0.31482499837875366,\n                         0.5650339722633362,\n                         0.8245400190353394,\n                         -0.00001700000029813964,\n                         0.5658029913902283,\n                         0.8479819893836975,\n                         -0.3500339984893799,\n                         -0.39799800515174866,\n                         0.917701005935669,\n                         -0.00003300000025774352,\n                         -0.397271990776062,\n                         0.8641409873962402,\n                         -0.35644200444221497,\n                         -0.3552600145339966,\n                         0.9352689981460571,\n                         -0.00011200000153621659,\n                         -0.3539389967918396,\n                         0.7209920287132263,\n                         -0.29793301224708557,\n                         0.6256250143051147,\n                         0.7807120084762573,\n                         -0.00007500000356230885,\n                         0.6248909831047058,\n                         0,\n                         0,\n                         1,\n                         0.5833569765090942,\n                         -0.5833380222320557,\n                         0.5651649832725525,\n                         0.648485004901886,\n                         -0.6484479904174805,\n                         -0.3987259864807129,\n                         0.6608719825744629,\n                         -0.6607480049133301,\n                         -0.35589399933815,\n                         0.5518630146980286,\n                         -0.5517799854278564,\n                         0.6252880096435547,\n                         0,\n                         0,\n                         1,\n                         0.31482499837875366,\n                         -0.762628972530365,\n                         0.5650510191917419,\n                         0.35004499554634094,\n                         -0.8479880094528198,\n                         -0.39797601103782654,\n                         0.35647401213645935,\n                         -0.8641520142555237,\n                         -0.35519900918006897,\n                         0.29798200726509094,\n                         -0.7210670113563538,\n                         0.6255149841308594,\n                         0,\n                         0,\n                         1,\n                         -0.00001700000029813964,\n                         -0.8245400190353394,\n                         0.5658029913902283,\n                         -0.00003300000025774352,\n                         -0.917701005935669,\n                         -0.397271990776062,\n                         -0.00011200000153621659,\n                         -0.9352689981460571,\n                         -0.3539389967918396,\n                         -0.00007500000356230885,\n                         -0.7807120084762573,\n                         0.6248900294303894,\n                         0,\n                         0,\n                         1,\n                         0,\n                         0,\n                         1,\n                         -0.31482499837875366,\n                         -0.7626410126686096,\n                         0.5650339722633362,\n                         -0.00001700000029813964,\n                         -0.8245400190353394,\n                         0.5658029913902283,\n                         -0.3500339984893799,\n                         -0.8479819893836975,\n                         -0.39799800515174866,\n                         -0.00003300000025774352,\n                         -0.917701005935669,\n                         -0.397271990776062,\n                         -0.35644200444221497,\n                         -0.8641409873962402,\n                         -0.3552600145339966,\n                         -0.00011200000153621659,\n                         -0.9352689981460571,\n                         -0.3539389967918396,\n                         -0.29793301224708557,\n                         -0.7209920287132263,\n                         0.6256250143051147,\n                         -0.00007500000356230885,\n                         -0.7807120084762573,\n                         0.6248900294303894,\n                         0,\n                         0,\n                         1,\n                         -0.5833380222320557,\n                         -0.5833569765090942,\n                         0.5651649832725525,\n                         -0.6484479904174805,\n                         -0.648485004901886,\n                         -0.3987259864807129,\n                         -0.6607480049133301,\n                         -0.6608719825744629,\n                         -0.35589399933815,\n                         -0.5517799854278564,\n                         -0.5518630146980286,\n                         0.6252880096435547,\n                         0,\n                         0,\n                         1,\n                         -0.762628972530365,\n                         -0.31482499837875366,\n                         0.5650510191917419,\n                         -0.8479880094528198,\n                         -0.35004499554634094,\n                         -0.39797601103782654,\n                         -0.8641520142555237,\n                         -0.35647401213645935,\n                         -0.35519900918006897,\n                         -0.7210670113563538,\n                         -0.29798200726509094,\n                         0.6255149841308594,\n                         0,\n                         0,\n                         1,\n                         -0.8245400190353394,\n                         0.00001700000029813964,\n                         0.5658029913902283,\n                         -0.917701005935669,\n                         0.00003300000025774352,\n                         -0.397271990776062,\n                         -0.9352689981460571,\n                         0.00011200000153621659,\n                         -0.3539389967918396,\n                         -0.7807120084762573,\n                         0.00007500000356230885,\n                         0.6248900294303894,\n                         0,\n                         0,\n                         1,\n                         0,\n                         0,\n                         1,\n                         -0.7626410126686096,\n                         0.31482499837875366,\n                         0.5650339722633362,\n                         -0.8245400190353394,\n                         0.00001700000029813964,\n                         0.5658029913902283,\n                         -0.8479819893836975,\n                         0.3500339984893799,\n                         -0.39799800515174866,\n                         -0.917701005935669,\n                         0.00003300000025774352,\n                         -0.397271990776062,\n                         -0.8641409873962402,\n                         0.35644200444221497,\n                         -0.3552600145339966,\n                         -0.9352689981460571,\n                         0.00011200000153621659,\n                         -0.3539389967918396,\n                         -0.7209920287132263,\n                         0.29793301224708557,\n                         0.6256250143051147,\n                         -0.7807120084762573,\n                         0.00007500000356230885,\n                         0.6248900294303894,\n                         0,\n                         0,\n                         1,\n                         -0.5833569765090942,\n                         0.5833380222320557,\n                         0.5651649832725525,\n                         -0.648485004901886,\n                         0.6484479904174805,\n                         -0.3987259864807129,\n                         -0.6608719825744629,\n                         0.6607480049133301,\n                         -0.35589399933815,\n                         -0.5518630146980286,\n                         0.5517799854278564,\n                         0.6252880096435547,\n                         0,\n                         0,\n                         1,\n                         -0.31482499837875366,\n                         0.762628972530365,\n                         0.5650510191917419,\n                         -0.35004499554634094,\n                         0.8479880094528198,\n                         -0.39797601103782654,\n                         -0.35647401213645935,\n                         0.8641520142555237,\n                         -0.35519900918006897,\n                         -0.29798200726509094,\n                         0.7210670113563538,\n                         0.6255149841308594,\n                         0,\n                         0,\n                         1,\n                         0.00001700000029813964,\n                         0.8245400190353394,\n                         0.5658029913902283,\n                         0.00003300000025774352,\n                         0.917701005935669,\n                         -0.397271990776062,\n                         0.00011200000153621659,\n                         0.9352689981460571,\n                         -0.3539389967918396,\n                         0.00007500000356230885,\n                         0.7807120084762573,\n                         0.6248900294303894,\n                         0,\n                         0,\n                         1,\n                         0,\n                         0,\n                         1,\n                         0.31482499837875366,\n                         0.7626410126686096,\n                         0.5650339722633362,\n                         0.00001700000029813964,\n                         0.8245400190353394,\n                         0.5658029913902283,\n                         0.3500339984893799,\n                         0.8479819893836975,\n                         -0.39799800515174866,\n                         0.00003300000025774352,\n                         0.917701005935669,\n                         -0.397271990776062,\n                         0.35644200444221497,\n                         0.8641409873962402,\n                         -0.3552600145339966,\n                         0.00011200000153621659,\n                         0.9352689981460571,\n                         -0.3539389967918396,\n                         0.29793301224708557,\n                         0.7209920287132263,\n                         0.6256250143051147,\n                         0.00007500000356230885,\n                         0.7807120084762573,\n                         0.6248900294303894,\n                         0,\n                         0,\n                         1,\n                         0.5833380222320557,\n                         0.5833569765090942,\n                         0.5651649832725525,\n                         0.6484479904174805,\n                         0.648485004901886,\n                         -0.3987259864807129,\n                         0.6607480049133301,\n                         0.6608719825744629,\n                         -0.35589399933815,\n                         0.5517799854278564,\n                         0.5518630146980286,\n                         0.6252880096435547,\n                         0,\n                         0,\n                         1,\n                         0.762628972530365,\n                         0.31482499837875366,\n                         0.5650510191917419,\n                         0.8479880094528198,\n                         0.35004499554634094,\n                         -0.39797601103782654,\n                         0.8641520142555237,\n                         0.35647401213645935,\n                         -0.35519900918006897,\n                         0.7210670113563538,\n                         0.29798200726509094,\n                         0.6255149841308594,\n                         0,\n                         0,\n                         1,\n                         0.8245400190353394,\n                         -0.00001700000029813964,\n                         0.5658029913902283,\n                         0.917701005935669,\n                         -0.00003300000025774352,\n                         -0.397271990776062,\n                         0.9352689981460571,\n                         -0.00011200000153621659,\n                         -0.3539389967918396,\n                         0.7807120084762573,\n                         -0.00007500000356230885,\n                         0.6248909831047058,\n                         0.7807120084762573,\n                         -0.00007500000356230885,\n                         0.6248909831047058,\n                         0.7209920287132263,\n                         -0.29793301224708557,\n                         0.6256250143051147,\n                         0.21797800064086914,\n                         -0.0902160033583641,\n                         0.9717749953269958,\n                         0.23658299446105957,\n                         0,\n                         0.9716110229492188,\n                         0.1595889925956726,\n                         -0.06596100330352783,\n                         0.9849770069122314,\n                         0.17308400571346283,\n                         0,\n                         0.9849069714546204,\n                         0.3504979908466339,\n                         -0.1447400003671646,\n                         0.9253119826316833,\n                         0.37970298528671265,\n                         0,\n                         0.925108015537262,\n                         0.48558899760246277,\n                         -0.20147399604320526,\n                         0.8506529927253723,\n                         0.5266720056533813,\n                         0,\n                         0.8500679731369019,\n                         0.5518630146980286,\n                         -0.5517799854278564,\n                         0.6252880096435547,\n                         0.16663099825382233,\n                         -0.16663099825382233,\n                         0.9718379974365234,\n                         0.12190800160169601,\n                         -0.12190800160169601,\n                         0.9850260019302368,\n                         0.2676680088043213,\n                         -0.2676680088043213,\n                         0.9255849719047546,\n                         0.37131500244140625,\n                         -0.37131500244140625,\n                         0.8510289788246155,\n                         0.29798200726509094,\n                         -0.7210670113563538,\n                         0.6255149841308594,\n                         0.0902160033583641,\n                         -0.21797800064086914,\n                         0.9717749953269958,\n                         0.06596100330352783,\n                         -0.1595889925956726,\n                         0.9849770069122314,\n                         0.1447400003671646,\n                         -0.3504979908466339,\n                         0.9253119826316833,\n                         0.20147399604320526,\n                         -0.48558899760246277,\n                         0.8506529927253723,\n                         -0.00007500000356230885,\n                         -0.7807120084762573,\n                         0.6248900294303894,\n                         0,\n                         -0.23658299446105957,\n                         0.9716110229492188,\n                         0,\n                         -0.17308400571346283,\n                         0.9849069714546204,\n                         0,\n                         -0.37970298528671265,\n                         0.925108015537262,\n                         0,\n                         -0.5266720056533813,\n                         0.8500679731369019,\n                         -0.00007500000356230885,\n                         -0.7807120084762573,\n                         0.6248900294303894,\n                         -0.29793301224708557,\n                         -0.7209920287132263,\n                         0.6256250143051147,\n                         -0.0902160033583641,\n                         -0.21797800064086914,\n                         0.9717749953269958,\n                         0,\n                         -0.23658299446105957,\n                         0.9716110229492188,\n                         -0.06596100330352783,\n                         -0.1595889925956726,\n                         0.9849770069122314,\n                         0,\n                         -0.17308400571346283,\n                         0.9849069714546204,\n                         -0.1447400003671646,\n                         -0.3504979908466339,\n                         0.9253119826316833,\n                         0,\n                         -0.37970298528671265,\n                         0.925108015537262,\n                         -0.20147399604320526,\n                         -0.48558899760246277,\n                         0.8506529927253723,\n                         0,\n                         -0.5266720056533813,\n                         0.8500679731369019,\n                         -0.5517799854278564,\n                         -0.5518630146980286,\n                         0.6252880096435547,\n                         -0.16663099825382233,\n                         -0.16663099825382233,\n                         0.9718379974365234,\n                         -0.12190800160169601,\n                         -0.12190800160169601,\n                         0.9850260019302368,\n                         -0.2676680088043213,\n                         -0.2676680088043213,\n                         0.9255849719047546,\n                         -0.37131500244140625,\n                         -0.37131500244140625,\n                         0.8510289788246155,\n                         -0.7210670113563538,\n                         -0.29798200726509094,\n                         0.6255149841308594,\n                         -0.21797800064086914,\n                         -0.0902160033583641,\n                         0.9717749953269958,\n                         -0.1595889925956726,\n                         -0.06596100330352783,\n                         0.9849770069122314,\n                         -0.3504979908466339,\n                         -0.1447400003671646,\n                         0.9253119826316833,\n                         -0.48558899760246277,\n                         -0.20147399604320526,\n                         0.8506529927253723,\n                         -0.7807120084762573,\n                         0.00007500000356230885,\n                         0.6248900294303894,\n                         -0.23658299446105957,\n                         0,\n                         0.9716110229492188,\n                         -0.17308400571346283,\n                         0,\n                         0.9849069714546204,\n                         -0.37970298528671265,\n                         0,\n                         0.925108015537262,\n                         -0.5266720056533813,\n                         0,\n                         0.8500679731369019,\n                         -0.7807120084762573,\n                         0.00007500000356230885,\n                         0.6248900294303894,\n                         -0.7209920287132263,\n                         0.29793301224708557,\n                         0.6256250143051147,\n                         -0.21797800064086914,\n                         0.0902160033583641,\n                         0.9717749953269958,\n                         -0.23658299446105957,\n                         0,\n                         0.9716110229492188,\n                         -0.1595889925956726,\n                         0.06596100330352783,\n                         0.9849770069122314,\n                         -0.17308400571346283,\n                         0,\n                         0.9849069714546204,\n                         -0.3504979908466339,\n                         0.1447400003671646,\n                         0.9253119826316833,\n                         -0.37970298528671265,\n                         0,\n                         0.925108015537262,\n                         -0.48558899760246277,\n                         0.20147399604320526,\n                         0.8506529927253723,\n                         -0.5266720056533813,\n                         0,\n                         0.8500679731369019,\n                         -0.5518630146980286,\n                         0.5517799854278564,\n                         0.6252880096435547,\n                         -0.16663099825382233,\n                         0.16663099825382233,\n                         0.9718379974365234,\n                         -0.12190800160169601,\n                         0.12190800160169601,\n                         0.9850260019302368,\n                         -0.2676680088043213,\n                         0.2676680088043213,\n                         0.9255849719047546,\n                         -0.37131500244140625,\n                         0.37131500244140625,\n                         0.8510289788246155,\n                         -0.29798200726509094,\n                         0.7210670113563538,\n                         0.6255149841308594,\n                         -0.0902160033583641,\n                         0.21797800064086914,\n                         0.9717749953269958,\n                         -0.06596100330352783,\n                         0.1595889925956726,\n                         0.9849770069122314,\n                         -0.1447400003671646,\n                         0.3504979908466339,\n                         0.9253119826316833,\n                         -0.20147399604320526,\n                         0.48558899760246277,\n                         0.8506529927253723,\n                         0.00007500000356230885,\n                         0.7807120084762573,\n                         0.6248900294303894,\n                         0,\n                         0.23658299446105957,\n                         0.9716110229492188,\n                         0,\n                         0.17308400571346283,\n                         0.9849069714546204,\n                         0,\n                         0.37970298528671265,\n                         0.925108015537262,\n                         0,\n                         0.5266720056533813,\n                         0.8500679731369019,\n                         0.00007500000356230885,\n                         0.7807120084762573,\n                         0.6248900294303894,\n                         0.29793301224708557,\n                         0.7209920287132263,\n                         0.6256250143051147,\n                         0.0902160033583641,\n                         0.21797800064086914,\n                         0.9717749953269958,\n                         0,\n                         0.23658299446105957,\n                         0.9716110229492188,\n                         0.06596100330352783,\n                         0.1595889925956726,\n                         0.9849770069122314,\n                         0,\n                         0.17308400571346283,\n                         0.9849069714546204,\n                         0.1447400003671646,\n                         0.3504979908466339,\n                         0.9253119826316833,\n                         0,\n                         0.37970298528671265,\n                         0.925108015537262,\n                         0.20147399604320526,\n                         0.48558899760246277,\n                         0.8506529927253723,\n                         0,\n                         0.5266720056533813,\n                         0.8500679731369019,\n                         0.5517799854278564,\n                         0.5518630146980286,\n                         0.6252880096435547,\n                         0.16663099825382233,\n                         0.16663099825382233,\n                         0.9718379974365234,\n                         0.12190800160169601,\n                         0.12190800160169601,\n                         0.9850260019302368,\n                         0.2676680088043213,\n                         0.2676680088043213,\n                         0.9255849719047546,\n                         0.37131500244140625,\n                         0.37131500244140625,\n                         0.8510289788246155,\n                         0.7210670113563538,\n                         0.29798200726509094,\n                         0.6255149841308594,\n                         0.21797800064086914,\n                         0.0902160033583641,\n                         0.9717749953269958,\n                         0.1595889925956726,\n                         0.06596100330352783,\n                         0.9849770069122314,\n                         0.3504979908466339,\n                         0.1447400003671646,\n                         0.9253119826316833,\n                         0.48558899760246277,\n                         0.20147399604320526,\n                         0.8506529927253723,\n                         0.7807120084762573,\n                         -0.00007500000356230885,\n                         0.6248909831047058,\n                         0.23658299446105957,\n                         0,\n                         0.9716110229492188,\n                         0.17308400571346283,\n                         0,\n                         0.9849069714546204,\n                         0.37970298528671265,\n                         0,\n                         0.925108015537262,\n                         0.5266720056533813,\n                         0,\n                         0.8500679731369019};\n\nfloat teapotTangents[] = {0.012897999957203865,\n                          0.998727023601532,\n                          -0.048757001757621765,\n                          0.3861910104751587,\n                          0.9210079908370972,\n                          -0.016421999782323837,\n                          0.38136398792266846,\n                          0.9230089783668518,\n                          0.000155999994603917,\n                          0.012866999953985214,\n                          0.9987300038337708,\n                          0.04870200157165527,\n                          0.3750790059566498,\n                          0.9061710238456726,\n                          -0.0007169999880716205,\n                          0.19210100173950195,\n                          0.9812139868736267,\n                          0.01775900088250637,\n                          0.3782620131969452,\n                          0.9142940044403076,\n                          -0.00011300000187475234,\n                          0.10451500117778778,\n                          0.9897350072860718,\n                          -0.09747499972581863,\n                          0.3655939996242523,\n                          0.9257190227508545,\n                          0.028463000431656837,\n                          0.04767199978232384,\n                          0.9953050017356873,\n                          -0.08423800021409988,\n                          0.7092679738998413,\n                          0.7031199932098389,\n                          -0.016364000737667084,\n                          0.7061989903450012,\n                          0.7061989903450012,\n                          0,\n                          0.6937360167503357,\n                          0.6937360167503357,\n                          0,\n                          0.6997770071029663,\n                          0.6997770071029663,\n                          0,\n                          0.6924030184745789,\n                          0.7150859832763672,\n                          0.02822900004684925,\n                          0.9243540167808533,\n                          0.37810400128364563,\n                          -0.01657800003886223,\n                          0.9230089783668518,\n                          0.38136398792266846,\n                          -0.000155999994603917,\n                          0.9061710238456726,\n                          0.3750790059566498,\n                          0.0007169999880716205,\n                          0.9142940044403076,\n                          0.3782620131969452,\n                          0.00011300000187475234,\n                          0.9133660197257996,\n                          0.39544400572776794,\n                          0.028490999713540077,\n                          0.9987040162086487,\n                          0.015853000804781914,\n                          0.04836999997496605,\n                          0.9987369775772095,\n                          0.014649000018835068,\n                          -0.04806999862194061,\n                          0.9812150001525879,\n                          0.19211700558662415,\n                          -0.01754000037908554,\n                          0.9897350072860718,\n                          0.10452800244092941,\n                          0.09745799750089645,\n                          0.9953050017356873,\n                          0.04767199978232384,\n                          0.08423800021409988,\n                          0.9988179802894592,\n                          -0.009758999571204185,\n                          -0.047600001096725464,\n                          0.9094679951667786,\n                          -0.4095839858055115,\n                          -0.012636999599635601,\n                          0.9240090250968933,\n                          -0.3811509907245636,\n                          -0.0003150000120513141,\n                          0.9987890124320984,\n                          -0.01066299993544817,\n                          0.04801800101995468,\n                          0.9072269797325134,\n                          -0.37142300605773926,\n                          0.0207310002297163,\n                          0.9814350008964539,\n                          -0.19095200300216675,\n                          0.01795700006186962,\n                          0.914870023727417,\n                          -0.3771440088748932,\n                          -0.0011480000102892518,\n                          0.989749014377594,\n                          -0.10442499816417694,\n                          -0.09742700308561325,\n                          0.925815999507904,\n                          -0.3653950095176697,\n                          0.028308000415563583,\n                          0.9953050017356873,\n                          -0.04767199978232384,\n                          -0.08423800021409988,\n                          0.6768929958343506,\n                          -0.7314029932022095,\n                          -0.01988700032234192,\n                          0.6994619965553284,\n                          -0.7145140171051025,\n                          -0.00029799999902024865,\n                          0.6940590143203735,\n                          -0.6933979988098145,\n                          0.015560000203549862,\n                          0.7002580165863037,\n                          -0.6996300220489502,\n                          -0.000783999974373728,\n                          0.715142011642456,\n                          -0.6923869848251343,\n                          0.028078999370336533,\n                          0.351936012506485,\n                          -0.933899998664856,\n                          -0.019843999296426773,\n                          0.36654001474380493,\n                          -0.9298419952392578,\n                          -0.0005210000090301037,\n                          0.37116900086402893,\n                          -0.9084830284118652,\n                          0.00152299995534122,\n                          0.3776479959487915,\n                          -0.9147650003433228,\n                          -0.00011000000085914508,\n                          0.39533698558807373,\n                          -0.9134349822998047,\n                          0.028410999104380608,\n                          0.0013210000470280647,\n                          -0.9989479780197144,\n                          0.045830998569726944,\n                          0.003897000104188919,\n                          -0.9988909959793091,\n                          -0.04690299928188324,\n                          0.18705999851226807,\n                          -0.9821630120277405,\n                          -0.018818000331521034,\n                          0.10363999754190445,\n                          -0.9898579716682434,\n                          0.09715499728918076,\n                          0.04757700115442276,\n                          -0.9953129887580872,\n                          0.08418799936771393,\n                          -0.02296699956059456,\n                          -0.9986780285835266,\n                          -0.04599199816584587,\n                          -0.3861910104751587,\n                          -0.9210079908370972,\n                          -0.016421999782323837,\n                          -0.38136398792266846,\n                          -0.9230089783668518,\n                          0.000155999994603917,\n                          -0.020431000739336014,\n                          -0.9987260103225708,\n                          0.04614400118589401,\n                          -0.3750790059566498,\n                          -0.9061710238456726,\n                          -0.0007169999880716205,\n                          -0.19216600060462952,\n                          -0.9812189936637878,\n                          0.01677200011909008,\n                          -0.3782620131969452,\n                          -0.9142940044403076,\n                          -0.00011300000187475234,\n                          -0.10471200197935104,\n                          -0.9897390007972717,\n                          -0.09722500294446945,\n                          -0.3655939996242523,\n                          -0.9257190227508545,\n                          0.028463000431656837,\n                          -0.047710999846458435,\n                          -0.9953050017356873,\n                          -0.08420699834823608,\n                          -0.7092679738998413,\n                          -0.7031199932098389,\n                          -0.016364000737667084,\n                          -0.7061989903450012,\n                          -0.7061989903450012,\n                          0,\n                          -0.6937360167503357,\n                          -0.6937360167503357,\n                          0,\n                          -0.6997770071029663,\n                          -0.6997770071029663,\n                          0,\n                          -0.6924030184745789,\n                          -0.7150859832763672,\n                          0.02822900004684925,\n                          -0.9243540167808533,\n                          -0.37810400128364563,\n                          -0.01657800003886223,\n                          -0.9230089783668518,\n                          -0.38136398792266846,\n                          -0.000155999994603917,\n                          -0.9061710238456726,\n                          -0.3750790059566498,\n                          0.0007169999880716205,\n                          -0.9142940044403076,\n                          -0.3782620131969452,\n                          0.00011300000187475234,\n                          -0.9133660197257996,\n                          -0.39544400572776794,\n                          0.028490999713540077,\n                          -0.998727023601532,\n                          -0.012897999957203865,\n                          0.048757001757621765,\n                          -0.9987300038337708,\n                          -0.012866999953985214,\n                          -0.04870200157165527,\n                          -0.9812139868736267,\n                          -0.19210100173950195,\n                          -0.01775900088250637,\n                          -0.9897350072860718,\n                          -0.10451500117778778,\n                          0.09747499972581863,\n                          -0.9953050017356873,\n                          -0.04767199978232384,\n                          0.08423800021409988,\n                          -0.998727023601532,\n                          0.012897999957203865,\n                          -0.048757001757621765,\n                          -0.9210079908370972,\n                          0.3861910104751587,\n                          -0.016421999782323837,\n                          -0.9230089783668518,\n                          0.38136398792266846,\n                          0.000155999994603917,\n                          -0.9987300038337708,\n                          0.012866999953985214,\n                          0.04870200157165527,\n                          -0.9061710238456726,\n                          0.3750790059566498,\n                          -0.0007169999880716205,\n                          -0.9812139868736267,\n                          0.19210100173950195,\n                          0.01775900088250637,\n                          -0.9142940044403076,\n                          0.3782620131969452,\n                          -0.00011300000187475234,\n                          -0.9897350072860718,\n                          0.10451500117778778,\n                          -0.09747499972581863,\n                          -0.9257190227508545,\n                          0.3655939996242523,\n                          0.028463000431656837,\n                          -0.9953050017356873,\n                          0.04767199978232384,\n                          -0.08423800021409988,\n                          -0.7031199932098389,\n                          0.7092679738998413,\n                          -0.016364000737667084,\n                          -0.7061989903450012,\n                          0.7061989903450012,\n                          0,\n                          -0.6937360167503357,\n                          0.6937360167503357,\n                          0,\n                          -0.6997770071029663,\n                          0.6997770071029663,\n                          0,\n                          -0.7150859832763672,\n                          0.6924030184745789,\n                          0.02822900004684925,\n                          -0.37810400128364563,\n                          0.9243540167808533,\n                          -0.01657800003886223,\n                          -0.38136398792266846,\n                          0.9230089783668518,\n                          -0.000155999994603917,\n                          -0.3750790059566498,\n                          0.9061710238456726,\n                          0.0007169999880716205,\n                          -0.3782620131969452,\n                          0.9142940044403076,\n                          0.00011300000187475234,\n                          -0.39544400572776794,\n                          0.9133660197257996,\n                          0.028490999713540077,\n                          -0.012897999957203865,\n                          0.998727023601532,\n                          0.048757001757621765,\n                          -0.012866999953985214,\n                          0.9987300038337708,\n                          -0.04870200157165527,\n                          -0.19210100173950195,\n                          0.9812139868736267,\n                          -0.01775900088250637,\n                          -0.10451500117778778,\n                          0.9897350072860718,\n                          0.09747499972581863,\n                          -0.04767199978232384,\n                          0.9953050017356873,\n                          0.08423800021409988,\n                          0.04767199978232384,\n                          0.9953050017356873,\n                          -0.08423800021409988,\n                          0.39544400572776794,\n                          0.9133660197257996,\n                          -0.028490999713540077,\n                          0.38111698627471924,\n                          0.9210190176963806,\n                          -0.000015999999959603883,\n                          0.031922999769449234,\n                          0.9968529939651489,\n                          -0.07255599647760391,\n                          0.3815299868583679,\n                          0.9219080209732056,\n                          0.0000019999999949504854,\n                          0.022261999547481537,\n                          0.9978039860725403,\n                          -0.06237399950623512,\n                          0.3821389973163605,\n                          0.9231889843940735,\n                          0.00001700000029813964,\n                          0.008317999541759491,\n                          0.9991790056228638,\n                          -0.03964800015091896,\n                          0.38228899240493774,\n                          0.9239469766616821,\n                          -0.004430000204592943,\n                          0.0008660000166855752,\n                          0.9999139904975891,\n                          0.013048999942839146,\n                          0.7150859832763672,\n                          0.6924030184745789,\n                          -0.02822900004684925,\n                          0.7048519849777222,\n                          0.7048519849777222,\n                          0,\n                          0.7055330276489258,\n                          0.7055330276489258,\n                          0,\n                          0.7065179944038391,\n                          0.7065179944038391,\n                          0,\n                          0.7068390250205994,\n                          0.707252025604248,\n                          -0.004379999823868275,\n                          0.9257190227508545,\n                          0.3655939996242523,\n                          -0.028463000431656837,\n                          0.9210180044174194,\n                          0.38111698627471924,\n                          0.000015999999959603883,\n                          0.9219080209732056,\n                          0.3815299868583679,\n                          -0.0000019999999949504854,\n                          0.9231889843940735,\n                          0.3821389973163605,\n                          -0.00001700000029813964,\n                          0.9237229824066162,\n                          0.38283199071884155,\n                          -0.004399999976158142,\n                          0.9953050017356873,\n                          0.04767199978232384,\n                          0.08423800021409988,\n                          0.9968529939651489,\n                          0.031922999769449234,\n                          0.07255599647760391,\n                          0.9978039860725403,\n                          0.022261999547481537,\n                          0.06237399950623512,\n                          0.9991790056228638,\n                          0.008317999541759491,\n                          0.03964800015091896,\n                          0.9999139904975891,\n                          0.0008660000166855752,\n                          -0.013048999942839146,\n                          0.9953050017356873,\n                          -0.04767199978232384,\n                          -0.08423800021409988,\n                          0.9135000109672546,\n                          -0.3951619863510132,\n                          -0.02861100062727928,\n                          0.9210190176963806,\n                          -0.38111698627471924,\n                          -0.000015999999959603883,\n                          0.9968529939651489,\n                          -0.031922999769449234,\n                          -0.07255599647760391,\n                          0.9219080209732056,\n                          -0.3815299868583679,\n                          0.0000019999999949504854,\n                          0.9978039860725403,\n                          -0.022261999547481537,\n                          -0.06237399950623512,\n                          0.9231889843940735,\n                          -0.3821389973163605,\n                          0.00001700000029813964,\n                          0.9991790056228638,\n                          -0.008317999541759491,\n                          -0.03964800015091896,\n                          0.9239469766616821,\n                          -0.38228899240493774,\n                          -0.004430000204592943,\n                          0.9999139904975891,\n                          -0.0008660000166855752,\n                          0.013048999942839146,\n                          0.6925899982452393,\n                          -0.7149369716644287,\n                          -0.028262000530958176,\n                          0.7048519849777222,\n                          -0.7048519849777222,\n                          0,\n                          0.7055330276489258,\n                          -0.7055330276489258,\n                          0,\n                          0.7065179944038391,\n                          -0.7065179944038391,\n                          0,\n                          0.707252025604248,\n                          -0.7068390250205994,\n                          -0.004379999823868275,\n                          0.3656100034713745,\n                          -0.9257280230522156,\n                          -0.02841299958527088,\n                          0.38111698627471924,\n                          -0.9210180044174194,\n                          0.000015999999959603883,\n                          0.3815299868583679,\n                          -0.9219080209732056,\n                          -0.0000019999999949504854,\n                          0.3821389973163605,\n                          -0.9231889843940735,\n                          -0.00001700000029813964,\n                          0.38283199071884155,\n                          -0.9237229824066162,\n                          -0.004399999976158142,\n                          0.04757700115442276,\n                          -0.9953129887580872,\n                          0.08418799936771393,\n                          0.031922999769449234,\n                          -0.9968529939651489,\n                          0.07255599647760391,\n                          0.022261999547481537,\n                          -0.9978039860725403,\n                          0.06237399950623512,\n                          0.008317999541759491,\n                          -0.9991790056228638,\n                          0.03964800015091896,\n                          0.0008660000166855752,\n                          -0.9999139904975891,\n                          -0.013048999942839146,\n                          -0.047710999846458435,\n                          -0.9953050017356873,\n                          -0.08420699834823608,\n                          -0.39544400572776794,\n                          -0.9133660197257996,\n                          -0.028490999713540077,\n                          -0.38111698627471924,\n                          -0.9210190176963806,\n                          -0.000015999999959603883,\n                          -0.031922999769449234,\n                          -0.9968529939651489,\n                          -0.07255599647760391,\n                          -0.3815299868583679,\n                          -0.9219080209732056,\n                          0.0000019999999949504854,\n                          -0.022261999547481537,\n                          -0.9978039860725403,\n                          -0.06237399950623512,\n                          -0.3821389973163605,\n                          -0.9231889843940735,\n                          0.00001700000029813964,\n                          -0.008317999541759491,\n                          -0.9991790056228638,\n                          -0.03964800015091896,\n                          -0.38228899240493774,\n                          -0.9239469766616821,\n                          -0.004430000204592943,\n                          -0.0008660000166855752,\n                          -0.9999139904975891,\n                          0.013048999942839146,\n                          -0.7150859832763672,\n                          -0.6924030184745789,\n                          -0.02822900004684925,\n                          -0.7048519849777222,\n                          -0.7048519849777222,\n                          0,\n                          -0.7055330276489258,\n                          -0.7055330276489258,\n                          0,\n                          -0.7065179944038391,\n                          -0.7065179944038391,\n                          0,\n                          -0.7068390250205994,\n                          -0.707252025604248,\n                          -0.004379999823868275,\n                          -0.9257190227508545,\n                          -0.3655939996242523,\n                          -0.028463000431656837,\n                          -0.9210180044174194,\n                          -0.38111698627471924,\n                          0.000015999999959603883,\n                          -0.9219080209732056,\n                          -0.3815299868583679,\n                          -0.0000019999999949504854,\n                          -0.9231889843940735,\n                          -0.3821389973163605,\n                          -0.00001700000029813964,\n                          -0.9237229824066162,\n                          -0.38283199071884155,\n                          -0.004399999976158142,\n                          -0.9953050017356873,\n                          -0.04767199978232384,\n                          0.08423800021409988,\n                          -0.9968529939651489,\n                          -0.031922999769449234,\n                          0.07255599647760391,\n                          -0.9978039860725403,\n                          -0.022261999547481537,\n                          0.06237399950623512,\n                          -0.9991790056228638,\n                          -0.008317999541759491,\n                          0.03964800015091896,\n                          -0.9999139904975891,\n                          -0.0008660000166855752,\n                          -0.013048999942839146,\n                          -0.9953050017356873,\n                          0.04767199978232384,\n                          -0.08423800021409988,\n                          -0.9133660197257996,\n                          0.39544400572776794,\n                          -0.028490999713540077,\n                          -0.9210190176963806,\n                          0.38111698627471924,\n                          -0.000015999999959603883,\n                          -0.9968529939651489,\n                          0.031922999769449234,\n                          -0.07255599647760391,\n                          -0.9219080209732056,\n                          0.3815299868583679,\n                          0.0000019999999949504854,\n                          -0.9978039860725403,\n                          0.022261999547481537,\n                          -0.06237399950623512,\n                          -0.9231889843940735,\n                          0.3821389973163605,\n                          0.00001700000029813964,\n                          -0.9991790056228638,\n                          0.008317999541759491,\n                          -0.03964800015091896,\n                          -0.9239469766616821,\n                          0.38228899240493774,\n                          -0.004430000204592943,\n                          -0.9999139904975891,\n                          0.0008660000166855752,\n                          0.013048999942839146,\n                          -0.6924030184745789,\n                          0.7150859832763672,\n                          -0.02822900004684925,\n                          -0.7048519849777222,\n                          0.7048519849777222,\n                          0,\n                          -0.7055330276489258,\n                          0.7055330276489258,\n                          0,\n                          -0.7065179944038391,\n                          0.7065179944038391,\n                          0,\n                          -0.707252025604248,\n                          0.7068390250205994,\n                          -0.004379999823868275,\n                          -0.3655939996242523,\n                          0.9257190227508545,\n                          -0.028463000431656837,\n                          -0.38111698627471924,\n                          0.9210180044174194,\n                          0.000015999999959603883,\n                          -0.3815299868583679,\n                          0.9219080209732056,\n                          -0.0000019999999949504854,\n                          -0.3821389973163605,\n                          0.9231889843940735,\n                          -0.00001700000029813964,\n                          -0.38283199071884155,\n                          0.9237229824066162,\n                          -0.004399999976158142,\n                          -0.04767199978232384,\n                          0.9953050017356873,\n                          0.08423800021409988,\n                          -0.031922999769449234,\n                          0.9968529939651489,\n                          0.07255599647760391,\n                          -0.022261999547481537,\n                          0.9978039860725403,\n                          0.06237399950623512,\n                          -0.008317999541759491,\n                          0.9991790056228638,\n                          0.03964800015091896,\n                          -0.0008660000166855752,\n                          0.9999139904975891,\n                          -0.013048999942839146,\n                          0.0008660000166855752,\n                          0.9999139904975891,\n                          0.013048999942839146,\n                          0.38283199071884155,\n                          0.9237229824066162,\n                          0.004399999976158142,\n                          0.38101500272750854,\n                          0.9204739928245544,\n                          -0.00003899999865097925,\n                          0.03731299936771393,\n                          0.9963229894638062,\n                          0.07712399959564209,\n                          0.37877199053764343,\n                          0.9154880046844482,\n                          0.00008399999933317304,\n                          0.09151100367307663,\n                          0.9910060167312622,\n                          0.097632996737957,\n                          0.378387987613678,\n                          0.9145749807357788,\n                          0.00009999999747378752,\n                          0.10134600102901459,\n                          0.9900450110435486,\n                          0.09767600148916245,\n                          0.356795996427536,\n                          0.9266510009765625,\n                          -0.03188199922442436,\n                          0.07246600091457367,\n                          0.9928709864616394,\n                          0.09463199973106384,\n                          0.707252025604248,\n                          0.7068390250205994,\n                          0.004379999823868275,\n                          0.7044739723205566,\n                          0.7044739723205566,\n                          0,\n                          0.7006790041923523,\n                          0.7006790041923523,\n                          0,\n                          0.6999930143356323,\n                          0.6999930143356323,\n                          0,\n                          0.6847820281982422,\n                          0.7192310094833374,\n                          -0.03167999908328056,\n                          0.9239469766616821,\n                          0.38228899240493774,\n                          0.004430000204592943,\n                          0.9204739928245544,\n                          0.38101500272750854,\n                          0.00003899999865097925,\n                          0.9154880046844482,\n                          0.37877199053764343,\n                          -0.00008399999933317304,\n                          0.9145749807357788,\n                          0.378387987613678,\n                          -0.00009999999747378752,\n                          0.9078760147094727,\n                          0.40216198563575745,\n                          -0.03206299990415573,\n                          0.9999139904975891,\n                          0.0008660000166855752,\n                          -0.013048999942839146,\n                          0.9963229894638062,\n                          0.03731299936771393,\n                          -0.07712399959564209,\n                          0.9910060167312622,\n                          0.09151100367307663,\n                          -0.097632996737957,\n                          0.9900450110435486,\n                          0.10134600102901459,\n                          -0.09767600148916245,\n                          0.9928709864616394,\n                          0.07246600091457367,\n                          -0.09463199973106384,\n                          0.9999139904975891,\n                          -0.0008660000166855752,\n                          0.013048999942839146,\n                          0.9237229824066162,\n                          -0.38283199071884155,\n                          0.004399999976158142,\n                          0.9204739928245544,\n                          -0.38101500272750854,\n                          -0.00003899999865097925,\n                          0.9963229894638062,\n                          -0.03731299936771393,\n                          0.07712399959564209,\n                          0.9154880046844482,\n                          -0.37877199053764343,\n                          0.00008399999933317304,\n                          0.9910060167312622,\n                          -0.09151100367307663,\n                          0.097632996737957,\n                          0.9145749807357788,\n                          -0.378387987613678,\n                          0.00009999999747378752,\n                          0.9900450110435486,\n                          -0.10134600102901459,\n                          0.09767600148916245,\n                          0.9266510009765625,\n                          -0.356795996427536,\n                          -0.03188199922442436,\n                          0.9928709864616394,\n                          -0.07246600091457367,\n                          0.09463199973106384,\n                          0.7068390250205994,\n                          -0.707252025604248,\n                          0.004379999823868275,\n                          0.7044739723205566,\n                          -0.7044739723205566,\n                          0,\n                          0.7006790041923523,\n                          -0.7006790041923523,\n                          0,\n                          0.6999930143356323,\n                          -0.6999930143356323,\n                          0,\n                          0.7192310094833374,\n                          -0.6847820281982422,\n                          -0.03167999908328056,\n                          0.38228899240493774,\n                          -0.9239469766616821,\n                          0.004430000204592943,\n                          0.38101500272750854,\n                          -0.9204739928245544,\n                          0.00003899999865097925,\n                          0.37877199053764343,\n                          -0.9154880046844482,\n                          -0.00008399999933317304,\n                          0.378387987613678,\n                          -0.9145749807357788,\n                          -0.00009999999747378752,\n                          0.40216198563575745,\n                          -0.9078760147094727,\n                          -0.03206299990415573,\n                          0.0008660000166855752,\n                          -0.9999139904975891,\n                          -0.013048999942839146,\n                          0.03731299936771393,\n                          -0.9963229894638062,\n                          -0.07712399959564209,\n                          0.09151100367307663,\n                          -0.9910060167312622,\n                          -0.097632996737957,\n                          0.10134600102901459,\n                          -0.9900450110435486,\n                          -0.09767600148916245,\n                          0.07246600091457367,\n                          -0.9928709864616394,\n                          -0.09463199973106384,\n                          -0.0008660000166855752,\n                          -0.9999139904975891,\n                          0.013048999942839146,\n                          -0.38283199071884155,\n                          -0.9237229824066162,\n                          0.004399999976158142,\n                          -0.38101500272750854,\n                          -0.9204739928245544,\n                          -0.00003899999865097925,\n                          -0.03731299936771393,\n                          -0.9963229894638062,\n                          0.07712399959564209,\n                          -0.37877199053764343,\n                          -0.9154880046844482,\n                          0.00008399999933317304,\n                          -0.09151100367307663,\n                          -0.9910060167312622,\n                          0.097632996737957,\n                          -0.378387987613678,\n                          -0.9145749807357788,\n                          0.00009999999747378752,\n                          -0.10134600102901459,\n                          -0.9900450110435486,\n                          0.09767600148916245,\n                          -0.356795996427536,\n                          -0.9266510009765625,\n                          -0.03188199922442436,\n                          -0.07246600091457367,\n                          -0.9928709864616394,\n                          0.09463199973106384,\n                          -0.707252025604248,\n                          -0.7068390250205994,\n                          0.004379999823868275,\n                          -0.7044739723205566,\n                          -0.7044739723205566,\n                          0,\n                          -0.7006790041923523,\n                          -0.7006790041923523,\n                          0,\n                          -0.6999930143356323,\n                          -0.6999930143356323,\n                          0,\n                          -0.6847820281982422,\n                          -0.7192310094833374,\n                          -0.03167999908328056,\n                          -0.9239469766616821,\n                          -0.38228899240493774,\n                          0.004430000204592943,\n                          -0.9204739928245544,\n                          -0.38101500272750854,\n                          0.00003899999865097925,\n                          -0.9154880046844482,\n                          -0.37877199053764343,\n                          -0.00008399999933317304,\n                          -0.9145749807357788,\n                          -0.378387987613678,\n                          -0.00009999999747378752,\n                          -0.9078760147094727,\n                          -0.40216198563575745,\n                          -0.03206299990415573,\n                          -0.9999139904975891,\n                          -0.0008660000166855752,\n                          -0.013048999942839146,\n                          -0.9963229894638062,\n                          -0.03731299936771393,\n                          -0.07712399959564209,\n                          -0.9910060167312622,\n                          -0.09151100367307663,\n                          -0.097632996737957,\n                          -0.9900450110435486,\n                          -0.10134600102901459,\n                          -0.09767600148916245,\n                          -0.9928709864616394,\n                          -0.07246600091457367,\n                          -0.09463199973106384,\n                          -0.9999139904975891,\n                          0.0008660000166855752,\n                          0.013048999942839146,\n                          -0.9237229824066162,\n                          0.38283199071884155,\n                          0.004399999976158142,\n                          -0.9204739928245544,\n                          0.38101500272750854,\n                          -0.00003899999865097925,\n                          -0.9963229894638062,\n                          0.03731299936771393,\n                          0.07712399959564209,\n                          -0.9154880046844482,\n                          0.37877199053764343,\n                          0.00008399999933317304,\n                          -0.9910060167312622,\n                          0.09151100367307663,\n                          0.097632996737957,\n                          -0.9145749807357788,\n                          0.378387987613678,\n                          0.00009999999747378752,\n                          -0.9900450110435486,\n                          0.10134600102901459,\n                          0.09767600148916245,\n                          -0.9266510009765625,\n                          0.356795996427536,\n                          -0.03188199922442436,\n                          -0.9928709864616394,\n                          0.07246600091457367,\n                          0.09463199973106384,\n                          -0.7068390250205994,\n                          0.707252025604248,\n                          0.004379999823868275,\n                          -0.7044739723205566,\n                          0.7044739723205566,\n                          0,\n                          -0.7006790041923523,\n                          0.7006790041923523,\n                          0,\n                          -0.6999930143356323,\n                          0.6999930143356323,\n                          0,\n                          -0.7192310094833374,\n                          0.6847820281982422,\n                          -0.03167999908328056,\n                          -0.38228899240493774,\n                          0.9239469766616821,\n                          0.004430000204592943,\n                          -0.38101500272750854,\n                          0.9204739928245544,\n                          0.00003899999865097925,\n                          -0.37877199053764343,\n                          0.9154880046844482,\n                          -0.00008399999933317304,\n                          -0.378387987613678,\n                          0.9145749807357788,\n                          -0.00009999999747378752,\n                          -0.40216198563575745,\n                          0.9078760147094727,\n                          -0.03206299990415573,\n                          -0.0008660000166855752,\n                          0.9999139904975891,\n                          -0.013048999942839146,\n                          -0.03731299936771393,\n                          0.9963229894638062,\n                          -0.07712399959564209,\n                          -0.09151100367307663,\n                          0.9910060167312622,\n                          -0.097632996737957,\n                          -0.10134600102901459,\n                          0.9900450110435486,\n                          -0.09767600148916245,\n                          -0.07246600091457367,\n                          0.9928709864616394,\n                          -0.09463199973106384,\n                          0.07246600091457367,\n                          0.9928709864616394,\n                          0.09463199973106384,\n                          0.40216198563575745,\n                          0.9078760147094727,\n                          0.03206299990415573,\n                          0.37766799330711365,\n                          0.912958025932312,\n                          0.00018099999579135329,\n                          0.11919300258159637,\n                          0.9883019924163818,\n                          0.09514500200748444,\n                          0.37516000866889954,\n                          0.906607985496521,\n                          0.00016799999866634607,\n                          0.187733992934227,\n                          0.9816380143165588,\n                          0.03381900116801262,\n                          0.2823430001735687,\n                          0.767549991607666,\n                          -0.1682250052690506,\n                          0.12883399426937103,\n                          0.6540690064430237,\n                          -0.32698601484298706,\n                          0.06457000225782394,\n                          0.32701900601387024,\n                          -0.6666669845581055,\n                          0,\n                          0,\n                          -1,\n                          0.7192320227622986,\n                          0.6847820281982422,\n                          0.03167999908328056,\n                          0.6987630128860474,\n                          0.6987630128860474,\n                          0,\n                          0.694034993648529,\n                          0.694034993648529,\n                          0,\n                          0.5551990270614624,\n                          0.6008960008621216,\n                          -0.16825300455093384,\n                          0.1854030042886734,\n                          0.27701398730278015,\n                          -0.6666669845581055,\n                          0.9266499876976013,\n                          0.3567950129508972,\n                          0.03188199922442436,\n                          0.912958025932312,\n                          0.37766799330711365,\n                          -0.00018099999579135329,\n                          0.906607985496521,\n                          0.37516000866889954,\n                          -0.00016799999866634607,\n                          0.742605984210968,\n                          0.3426159918308258,\n                          -0.1683180034160614,\n                          0.27701398730278015,\n                          0.1854030042886734,\n                          -0.6666669845581055,\n                          0.9928709864616394,\n                          0.07246600091457367,\n                          -0.09463199973106384,\n                          0.9883019924163818,\n                          0.11919300258159637,\n                          -0.09514500200748444,\n                          0.9816370010375977,\n                          0.187733992934227,\n                          -0.03381900116801262,\n                          0.9811030030250549,\n                          0.19325199723243713,\n                          -0.009519999846816063,\n                          0.49052900075912476,\n                          0.0968559980392456,\n                          -0.5,\n                          0.9928709864616394,\n                          -0.07246600091457367,\n                          0.09463199973106384,\n                          0.9078760147094727,\n                          -0.40216198563575745,\n                          0.03206299990415573,\n                          0.912958025932312,\n                          -0.37766799330711365,\n                          0.00018099999579135329,\n                          0.9883019924163818,\n                          -0.11919300258159637,\n                          0.09514500200748444,\n                          0.906607985496521,\n                          -0.37516000866889954,\n                          0.00016799999866634607,\n                          0.9816380143165588,\n                          -0.187733992934227,\n                          0.03381900116801262,\n                          0.767549991607666,\n                          -0.2823430001735687,\n                          -0.1682250052690506,\n                          0.6540690064430237,\n                          -0.12883399426937103,\n                          -0.32698601484298706,\n                          0.32701900601387024,\n                          -0.06457000225782394,\n                          -0.6666669845581055,\n                          0,\n                          0,\n                          -1,\n                          0.6847820281982422,\n                          -0.7192320227622986,\n                          0.03167999908328056,\n                          0.6987630128860474,\n                          -0.6987630128860474,\n                          0,\n                          0.694034993648529,\n                          -0.694034993648529,\n                          0,\n                          0.6008960008621216,\n                          -0.5551990270614624,\n                          -0.16825300455093384,\n                          0.27701398730278015,\n                          -0.1854030042886734,\n                          -0.6666669845581055,\n                          0.3567950129508972,\n                          -0.9266499876976013,\n                          0.03188199922442436,\n                          0.37766799330711365,\n                          -0.912958025932312,\n                          -0.00018099999579135329,\n                          0.37516000866889954,\n                          -0.906607985496521,\n                          -0.00016799999866634607,\n                          0.3426159918308258,\n                          -0.742605984210968,\n                          -0.1683180034160614,\n                          0.1854030042886734,\n                          -0.27701398730278015,\n                          -0.6666669845581055,\n                          0.07246600091457367,\n                          -0.9928709864616394,\n                          -0.09463199973106384,\n                          0.11919300258159637,\n                          -0.9883019924163818,\n                          -0.09514500200748444,\n                          0.187733992934227,\n                          -0.9816370010375977,\n                          -0.03381900116801262,\n                          0.19325199723243713,\n                          -0.9811030030250549,\n                          -0.009519999846816063,\n                          0.0968559980392456,\n                          -0.49052900075912476,\n                          -0.5,\n                          -0.07246600091457367,\n                          -0.9928709864616394,\n                          0.09463199973106384,\n                          -0.40216198563575745,\n                          -0.9078760147094727,\n                          0.03206299990415573,\n                          -0.37766799330711365,\n                          -0.912958025932312,\n                          0.00018099999579135329,\n                          -0.11919300258159637,\n                          -0.9883019924163818,\n                          0.09514500200748444,\n                          -0.37516000866889954,\n                          -0.906607985496521,\n                          0.00016799999866634607,\n                          -0.187733992934227,\n                          -0.9816380143165588,\n                          0.03381900116801262,\n                          -0.2823430001735687,\n                          -0.767549991607666,\n                          -0.1682250052690506,\n                          -0.12883399426937103,\n                          -0.6540690064430237,\n                          -0.32698601484298706,\n                          -0.06457000225782394,\n                          -0.32701900601387024,\n                          -0.6666669845581055,\n                          0,\n                          0,\n                          -1,\n                          -0.7192320227622986,\n                          -0.6847820281982422,\n                          0.03167999908328056,\n                          -0.6987630128860474,\n                          -0.6987630128860474,\n                          0,\n                          -0.694034993648529,\n                          -0.694034993648529,\n                          0,\n                          -0.5551990270614624,\n                          -0.6008960008621216,\n                          -0.16825300455093384,\n                          -0.1854030042886734,\n                          -0.27701398730278015,\n                          -0.6666669845581055,\n                          -0.9266499876976013,\n                          -0.3567950129508972,\n                          0.03188199922442436,\n                          -0.912958025932312,\n                          -0.37766799330711365,\n                          -0.00018099999579135329,\n                          -0.906607985496521,\n                          -0.37516000866889954,\n                          -0.00016799999866634607,\n                          -0.742605984210968,\n                          -0.3426159918308258,\n                          -0.1683180034160614,\n                          -0.27701398730278015,\n                          -0.1854030042886734,\n                          -0.6666669845581055,\n                          -0.9928709864616394,\n                          -0.07246600091457367,\n                          -0.09463199973106384,\n                          -0.9883019924163818,\n                          -0.11919300258159637,\n                          -0.09514500200748444,\n                          -0.9816370010375977,\n                          -0.187733992934227,\n                          -0.03381900116801262,\n                          -0.9811030030250549,\n                          -0.19325199723243713,\n                          -0.009519999846816063,\n                          -0.49052900075912476,\n                          -0.0968559980392456,\n                          -0.5,\n                          -0.9928709864616394,\n                          0.07246600091457367,\n                          0.09463199973106384,\n                          -0.9078760147094727,\n                          0.40216198563575745,\n                          0.03206299990415573,\n                          -0.912958025932312,\n                          0.37766799330711365,\n                          0.00018099999579135329,\n                          -0.9883019924163818,\n                          0.11919300258159637,\n                          0.09514500200748444,\n                          -0.906607985496521,\n                          0.37516000866889954,\n                          0.00016799999866634607,\n                          -0.9816380143165588,\n                          0.187733992934227,\n                          0.03381900116801262,\n                          -0.767549991607666,\n                          0.2823430001735687,\n                          -0.1682250052690506,\n                          -0.6540690064430237,\n                          0.12883399426937103,\n                          -0.32698601484298706,\n                          -0.32701900601387024,\n                          0.06457000225782394,\n                          -0.6666669845581055,\n                          0,\n                          0,\n                          -1,\n                          -0.6847820281982422,\n                          0.7192320227622986,\n                          0.03167999908328056,\n                          -0.6987630128860474,\n                          0.6987630128860474,\n                          0,\n                          -0.694034993648529,\n                          0.694034993648529,\n                          0,\n                          -0.6008960008621216,\n                          0.5551990270614624,\n                          -0.16825300455093384,\n                          -0.27701398730278015,\n                          0.1854030042886734,\n                          -0.6666669845581055,\n                          -0.3567950129508972,\n                          0.9266499876976013,\n                          0.03188199922442436,\n                          -0.37766799330711365,\n                          0.912958025932312,\n                          -0.00018099999579135329,\n                          -0.37516000866889954,\n                          0.906607985496521,\n                          -0.00016799999866634607,\n                          -0.3426159918308258,\n                          0.742605984210968,\n                          -0.1683180034160614,\n                          -0.1854030042886734,\n                          0.27701398730278015,\n                          -0.6666669845581055,\n                          -0.07246600091457367,\n                          0.9928709864616394,\n                          -0.09463199973106384,\n                          -0.11919300258159637,\n                          0.9883019924163818,\n                          -0.09514500200748444,\n                          -0.187733992934227,\n                          0.9816370010375977,\n                          -0.03381900116801262,\n                          -0.19325199723243713,\n                          0.9811030030250549,\n                          -0.009519999846816063,\n                          -0.0968559980392456,\n                          0.49052900075912476,\n                          -0.5,\n                          -0.006597999949008226,\n                          0.9961680173873901,\n                          0.0001630000042496249,\n                          -0.043907999992370605,\n                          0.779125988483429,\n                          -0.55936598777771,\n                          0.23287899792194366,\n                          0.79271000623703,\n                          -0.506534993648529,\n                          0.11139900237321854,\n                          0.9923329949378967,\n                          0.0053449999541044235,\n                          0.4521920084953308,\n                          0.7370989918708801,\n                          -0.42180201411247253,\n                          0.17797799408435822,\n                          0.9827970266342163,\n                          0.036841001361608505,\n                          0.6075379848480225,\n                          0.7066869735717773,\n                          -0.270797997713089,\n                          0.11894699931144714,\n                          0.9864829778671265,\n                          0.10517799854278564,\n                          0.6583719849586487,\n                          0.7438470125198364,\n                          -0.06727500259876251,\n                          0.0010629999451339245,\n                          0.99891597032547,\n                          0.04653400182723999,\n                          -0.1622990071773529,\n                          -0.14869500696659088,\n                          -0.9069569706916809,\n                          0.3020159900188446,\n                          -0.014301000162959099,\n                          -0.8847119808197021,\n                          0.7048640251159668,\n                          -0.042514998465776443,\n                          -0.6788020133972168,\n                          0.8948519825935364,\n                          -0.11078000068664551,\n                          -0.38824599981307983,\n                          0.9622920155525208,\n                          -0.09367900341749191,\n                          -0.14349600672721863,\n                          -0.12511900067329407,\n                          -0.8479049801826477,\n                          -0.4783349931240082,\n                          0.11315400153398514,\n                          -0.8153669834136963,\n                          -0.5167160034179688,\n                          0.3956319987773895,\n                          -0.7910019755363464,\n                          -0.4345270097255707,\n                          0.5244609713554382,\n                          -0.8012329936027527,\n                          -0.2643829882144928,\n                          0.571465015411377,\n                          -0.7902160286903381,\n                          -0.12332800030708313,\n                          -0.0943560004234314,\n                          -0.9955379962921143,\n                          -0.0010989999864250422,\n                          0.012040999718010426,\n                          -0.9965500235557556,\n                          0,\n                          0.09501499682664871,\n                          -0.9936969876289368,\n                          0.02440500073134899,\n                          0.03737499937415123,\n                          -0.9978089928627014,\n                          0.035909999161958694,\n                          -0.0008800000068731606,\n                          -0.9973530173301697,\n                          -0.04031199961900711,\n                          0.007164000067859888,\n                          -0.9961649775505066,\n                          -0.00002700000004551839,\n                          0.043988000601530075,\n                          -0.8330309987068176,\n                          0.4691329896450043,\n                          -0.2334270030260086,\n                          -0.7983189821243286,\n                          0.49840399622917175,\n                          -0.10737399756908417,\n                          -0.9927549958229065,\n                          -0.007029999978840351,\n                          -0.45147499442100525,\n                          -0.7576299905776978,\n                          0.39375001192092896,\n                          -0.15364399552345276,\n                          -0.9863160252571106,\n                          -0.048294998705387115,\n                          -0.5575600266456604,\n                          -0.7753210067749023,\n                          0.2001740038394928,\n                          -0.07242999970912933,\n                          -0.9923030138015747,\n                          -0.08845999836921692,\n                          -0.5877019762992859,\n                          -0.8041930198669434,\n                          0.04768599942326546,\n                          0.0005830000154674053,\n                          -0.9997940063476562,\n                          -0.020301999524235725,\n                          0.13663700222969055,\n                          -0.14665700495243073,\n                          0.8966140151023865,\n                          -0.3045389950275421,\n                          -0.012237999588251114,\n                          0.8833180069923401,\n                          -0.7020289897918701,\n                          -0.033987998962402344,\n                          0.6724730134010315,\n                          -0.8890330195426941,\n                          -0.09636799991130829,\n                          0.37605398893356323,\n                          -0.9668099880218506,\n                          -0.08601800352334976,\n                          0.1358419954776764,\n                          0.12022499740123749,\n                          0.7918559908866882,\n                          0.5693140029907227,\n                          -0.11313500255346298,\n                          0.8111780285835266,\n                          0.5236610174179077,\n                          -0.39790698885917664,\n                          0.7734419703483582,\n                          0.45853298902511597,\n                          -0.5793390274047852,\n                          0.7346490025520325,\n                          0.32973799109458923,\n                          -0.6447499990463257,\n                          0.7340419888496399,\n                          0.12459299713373184,\n                          0.09378799796104431,\n                          0.9955919981002808,\n                          0.000944000028539449,\n                          -0.01607999950647354,\n                          0.9964879751205444,\n                          0.00035600000410340726,\n                          -0.11933200061321259,\n                          0.9912199974060059,\n                          -0.01737299934029579,\n                          -0.08618299663066864,\n                          0.9940080046653748,\n                          -0.053598999977111816,\n                          -0.004110999871045351,\n                          0.9980229735374451,\n                          0.015703000128269196,\n                          0.010142000392079353,\n                          0.9933879971504211,\n                          0.10034400224685669,\n                          0.6597890257835388,\n                          0.7114480137825012,\n                          0.12964099645614624,\n                          0.5634239912033081,\n                          0.7594000101089478,\n                          0.289902001619339,\n                          -0.021227000281214714,\n                          0.9976930022239685,\n                          0.05189099907875061,\n                          0.3972559869289398,\n                          0.7709670066833496,\n                          0.45872700214385986,\n                          -0.05054600164294243,\n                          0.9957669973373413,\n                          0.060869000852108,\n                          0.11805199831724167,\n                          0.7611619830131531,\n                          0.5692800283432007,\n                          -0.11414600163698196,\n                          0.9869359731674194,\n                          0.08862999826669693,\n                          -0.0012870000209659338,\n                          0.7195389866828918,\n                          0.6293820142745972,\n                          -0.18971200287342072,\n                          0.9752820134162903,\n                          0.11328700184822083,\n                          0.9685969948768616,\n                          -0.08966200053691864,\n                          0.13331100344657898,\n                          0.8902140259742737,\n                          -0.051961999386548996,\n                          0.39323100447654724,\n                          0.6728280186653137,\n                          -0.050324998795986176,\n                          0.6965069770812988,\n                          0.25133201479911804,\n                          -0.04306900128722191,\n                          0.9169719815254211,\n                          -0.19813700020313263,\n                          -0.2512879967689514,\n                          0.9046909809112549,\n                          0.5937719941139221,\n                          -0.8024669885635376,\n                          0.03307799994945526,\n                          0.5571249723434448,\n                          -0.7907459735870361,\n                          0.2022089958190918,\n                          0.4313510060310364,\n                          -0.8083119988441467,\n                          0.37996000051498413,\n                          0.19395600259304047,\n                          -0.8197799921035767,\n                          0.5133119821548462,\n                          -0.1517219990491867,\n                          -0.8084930181503296,\n                          0.5055829882621765,\n                          0.0035200000274926424,\n                          -0.9997940063476562,\n                          0.019979000091552734,\n                          0.01159599982202053,\n                          -0.9981369972229004,\n                          -0.02326199971139431,\n                          0.01310999970883131,\n                          -0.9988970160484314,\n                          -0.008480999618768692,\n                          -0.02485400065779686,\n                          -0.9978809952735901,\n                          0.021263999864459038,\n                          -0.11335399746894836,\n                          -0.9881970286369324,\n                          0.06441199779510498,\n                          -0.0035459999926388264,\n                          -0.9954169988632202,\n                          -0.07682599872350693,\n                          -0.5816869735717773,\n                          -0.7760900259017944,\n                          -0.13957500457763672,\n                          -0.5260769724845886,\n                          -0.790789008140564,\n                          -0.2781960070133209,\n                          0.017288999632000923,\n                          -0.9983699917793274,\n                          -0.03728000074625015,\n                          -0.36800798773765564,\n                          -0.7982890009880066,\n                          -0.4405499994754791,\n                          0.03743100166320801,\n                          -0.9973520040512085,\n                          -0.03640099987387657,\n                          -0.09636899828910828,\n                          -0.7829139828681946,\n                          -0.5500450134277344,\n                          0.10426300019025803,\n                          -0.9894949793815613,\n                          -0.06746900081634521,\n                          0.10083399713039398,\n                          -0.8161320090293884,\n                          -0.48112401366233826,\n                          0.18510299921035767,\n                          -0.9776470065116882,\n                          -0.09971100091934204,\n                          -0.9615049958229065,\n                          -0.08203399926424026,\n                          -0.14958199858665466,\n                          -0.8876789808273315,\n                          -0.04622500017285347,\n                          -0.39955899119377136,\n                          -0.6675580143928528,\n                          -0.03723999857902527,\n                          -0.7007560133934021,\n                          -0.245511993765831,\n                          -0.03216199949383736,\n                          -0.9151920080184937,\n                          0.15477199852466583,\n                          -0.24929499626159668,\n                          -0.8975690007209778,\n                          -0.6700729727745056,\n                          0.7402250170707703,\n                          -0.01942499913275242,\n                          -0.5923460125923157,\n                          0.7624830007553101,\n                          -0.21566900610923767,\n                          -0.45611900091171265,\n                          0.7868310213088989,\n                          -0.39906400442123413,\n                          -0.21001900732517242,\n                          0.8031420111656189,\n                          -0.5333020091056824,\n                          0.05119999870657921,\n                          0.7096909880638123,\n                          -0.6591699719429016,\n                          -0.014175999909639359,\n                          0.9989240169525146,\n                          -0.04416000097990036,\n                          -0.0065449997782707214,\n                          0.9983869791030884,\n                          0.008813999593257904,\n                          0.0023960000835359097,\n                          0.9989259839057922,\n                          -0.016711000353097916,\n                          0.03813000023365021,\n                          0.9969249963760376,\n                          -0.04171599820256233,\n                          0.11744900047779083,\n                          0.986670970916748,\n                          -0.0799890011548996,\n                          -0.02072799950838089,\n                          -0.997963011264801,\n                          0.0017740000039339066,\n                          0.10236400365829468,\n                          -0.695684015750885,\n                          -0.6961740255355835,\n                          0.28174999356269836,\n                          -0.7065439820289612,\n                          -0.6379269957542419,\n                          -0.027713999152183533,\n                          -0.9983959794044495,\n                          -0.016395000740885735,\n                          0.4621469974517822,\n                          -0.7501789927482605,\n                          -0.43765199184417725,\n                          -0.014942999929189682,\n                          -0.9960020184516907,\n                          -0.04751100018620491,\n                          0.6121799945831299,\n                          -0.7355859875679016,\n                          -0.1658719927072525,\n                          0.08200599998235703,\n                          -0.9833409786224365,\n                          0.11102399975061417,\n                          0.7232419848442078,\n                          -0.6012910008430481,\n                          -0.14595800638198853,\n                          0.32238098978996277,\n                          -0.9036369919776917,\n                          0.28197699785232544,\n                          0.1188960000872612,\n                          0.09661199897527695,\n                          -0.9692260026931763,\n                          0.3230240046977997,\n                          0.06791900098323822,\n                          -0.9069269895553589,\n                          0.6287810206413269,\n                          0.00962899997830391,\n                          -0.711097002029419,\n                          0.8952469825744629,\n                          -0.060169998556375504,\n                          -0.3366979956626892,\n                          0.9689210057258606,\n                          -0.04508800059556961,\n                          -0.13095800578594208,\n                          0.06500200182199478,\n                          0.7708680033683777,\n                          -0.6083509922027588,\n                          0.1816529929637909,\n                          0.7457069754600525,\n                          -0.593995988368988,\n                          0.37600401043891907,\n                          0.7467949986457825,\n                          -0.4776870012283325,\n                          0.6288849711418152,\n                          0.7020969986915588,\n                          -0.27160701155662537,\n                          0.8230010271072388,\n                          0.5295370221138,\n                          -0.09450399875640869,\n                          -0.12820099294185638,\n                          0.9899809956550598,\n                          -0.05917999893426895,\n                          -0.11097600311040878,\n                          0.9872509837150574,\n                          -0.09937400370836258,\n                          -0.06767299771308899,\n                          0.9865689873695374,\n                          -0.1427209973335266,\n                          -0.0003349999897181988,\n                          0.9967420101165771,\n                          0.025443999096751213,\n                          0.29019099473953247,\n                          0.9243509769439697,\n                          0.1957239955663681,\n                          0.07294999808073044,\n                          0.9949049949645996,\n                          0.03147900104522705,\n                          -0.04948300123214722,\n                          0.7695090174674988,\n                          0.6163870096206665,\n                          -0.24193400144577026,\n                          0.7750219702720642,\n                          0.5679330229759216,\n                          0.05620399862527847,\n                          0.9959489703178406,\n                          0.052143000066280365,\n                          -0.4294399917125702,\n                          0.779321014881134,\n                          0.41615501046180725,\n                          0.023887999355793,\n                          0.9943940043449402,\n                          0.07553800195455551,\n                          -0.6655910015106201,\n                          0.6939520239830017,\n                          0.20106400549411774,\n                          -0.09678799659013748,\n                          0.9791589975357056,\n                          -0.12869000434875488,\n                          -0.7716730237007141,\n                          0.5443729758262634,\n                          0.1793539971113205,\n                          -0.417836993932724,\n                          0.8721759915351868,\n                          -0.2544029951095581,\n                          -0.09499499946832657,\n                          0.08934500068426132,\n                          0.9787889719009399,\n                          -0.3299880027770996,\n                          0.06701900064945221,\n                          0.9273520112037659,\n                          -0.6511250138282776,\n                          0.023523999378085136,\n                          0.7280719876289368,\n                          -0.9116759896278381,\n                          -0.033263999968767166,\n                          0.34162598848342896,\n                          -0.9896330237388611,\n                          -0.013496000319719315,\n                          0.07834099978208542,\n                          -0.07044100016355515,\n                          -0.6954740285873413,\n                          0.7080140113830566,\n                          -0.21969600021839142,\n                          -0.6959800124168396,\n                          0.6642320156097412,\n                          -0.4075010120868683,\n                          -0.7370589971542358,\n                          0.5047789812088013,\n                          -0.5866039991378784,\n                          -0.7473030090332031,\n                          0.24636299908161163,\n                          -0.799036979675293,\n                          -0.5617390275001526,\n                          0.05794600024819374,\n                          0.07605399936437607,\n                          -0.9967970252037048,\n                          0.02472200058400631,\n                          0.08756300061941147,\n                          -0.9926980137825012,\n                          0.05929899960756302,\n                          0.07250799983739853,\n                          -0.9901790022850037,\n                          0.11122000217437744,\n                          0.015556000173091888,\n                          -0.9970260262489319,\n                          -0.011235999874770641,\n                          -0.194814994931221,\n                          -0.9439409971237183,\n                          -0.22127500176429749,\n                          0.3417310118675232,\n                          -0.8896859884262085,\n                          0.3012309968471527,\n                          0.8375009894371033,\n                          -0.4931910037994385,\n                          0.05739299952983856,\n                          0.8273029923439026,\n                          -0.4684619903564453,\n                          -0.05539099872112274,\n                          0.5311300158500671,\n                          -0.8121910095214844,\n                          0.24026300013065338,\n                          0.8069959878921509,\n                          -0.47689300775527954,\n                          0.002638000063598156,\n                          0.644743025302887,\n                          -0.7642210125923157,\n                          -0.015455000102519989,\n                          0.8856800198554993,\n                          -0.4464530050754547,\n                          0.047488000243902206,\n                          -0.011536000296473503,\n                          -0.999845027923584,\n                          -0.0008730000117793679,\n                          0.7597830295562744,\n                          -0.6229599714279175,\n                          0.026636000722646713,\n                          0.321245014667511,\n                          -0.8855000138282776,\n                          0.3356960117816925,\n                          0.998091995716095,\n                          -0.005673000123351812,\n                          0.025262000039219856,\n                          0.9941530227661133,\n                          0.046904999762773514,\n                          -0.00951599981635809,\n                          0.9838590025901794,\n                          -0.00041700000292621553,\n                          0.010572000406682491,\n                          0.990556001663208,\n                          0.01886500045657158,\n                          0.04422200098633766,\n                          0.9921990036964417,\n                          -0.12290599942207336,\n                          0.011202000081539154,\n                          0.828000009059906,\n                          0.5258169770240784,\n                          -0.0846100002527237,\n                          0.8704839944839478,\n                          0.4878079891204834,\n                          0.00635599996894598,\n                          0.7773939967155457,\n                          0.5659670233726501,\n                          -0.09634699672460556,\n                          0.8190580010414124,\n                          0.4740380048751831,\n                          0.01190400030463934,\n                          0.9017590284347534,\n                          0.3486430048942566,\n                          -0.05601400136947632,\n                          0.41038599610328674,\n                          0.870602011680603,\n                          0.27135801315307617,\n                          0.3019320070743561,\n                          0.8897680044174194,\n                          0.34101900458335876,\n                          0.13912299275398254,\n                          0.9423390030860901,\n                          -0.3042120039463043,\n                          0.6167309880256653,\n                          0.7692840099334717,\n                          0.1667650043964386,\n                          0.5558350086212158,\n                          0.8010749816894531,\n                          0.21867799758911133,\n                          -0.4410029947757721,\n                          0.8555399775505066,\n                          -0.2693159878253937,\n                          -0.8639690279960632,\n                          0.464356005191803,\n                          -0.019222000613808632,\n                          -0.8705710172653198,\n                          0.4855479896068573,\n                          -0.005623999983072281,\n                          -0.33969300985336304,\n                          0.8762779831886292,\n                          -0.34097298979759216,\n                          -0.7608209848403931,\n                          0.5840269923210144,\n                          0.11236599832773209,\n                          -0.16763299703598022,\n                          0.9419429898262024,\n                          0.29091599583625793,\n                          -0.8260639905929565,\n                          0.47304999828338623,\n                          -0.0134699996560812,\n                          -0.6006280183792114,\n                          0.7822970151901245,\n                          -0.1611420065164566,\n                          -0.8495870232582092,\n                          0.4440779983997345,\n                          0.17417700588703156,\n                          -0.5251449942588806,\n                          0.8236340284347534,\n                          -0.21412399411201477,\n                          -0.9991480112075806,\n                          0.0017519999528303742,\n                          0.007890000008046627,\n                          -0.9946579933166504,\n                          0.06129400059580803,\n                          0.007796999998390675,\n                          -0.9840919971466064,\n                          0.008732999674975872,\n                          -0.0001289999927394092,\n                          -0.9916059970855713,\n                          0.015207000076770782,\n                          -0.04798699915409088,\n                          -0.9899899959564209,\n                          -0.13816699385643005,\n                          -0.019433999434113503,\n                          -0.7927820086479187,\n                          -0.5669599771499634,\n                          0.06795799732208252,\n                          -0.8363490104675293,\n                          -0.4685719907283783,\n                          0.048955000936985016,\n                          -0.8138830065727234,\n                          -0.4743089973926544,\n                          0.0008379999781027436,\n                          -0.8869869709014893,\n                          -0.4417180120944977,\n                          -0.05625399947166443,\n                          -0.7898640036582947,\n                          -0.5522750020027161,\n                          -0.15016800165176392,\n                          -0.297340989112854,\n                          -0.8998129963874817,\n                          -0.3192580044269562,\n                          -0.49759799242019653,\n                          -0.8317790031433105,\n                          -0.24411599338054657,\n                          -0.6295620203018188,\n                          -0.7765420079231262,\n                          0.01261799968779087,\n                          -0.011338000185787678,\n                          -0.9998990297317505,\n                          -0.008561000227928162,\n                          -0.3547320067882538,\n                          -0.8679590225219727,\n                          -0.3453510105609894,\n                          0.09618999809026718,\n                          0.49066001176834106,\n                          -0.5,\n                          0.1851000040769577,\n                          0.27721700072288513,\n                          -0.6666669845581055,\n                          0.32566601037979126,\n                          0.76139897108078,\n                          -0.18199099600315094,\n                          0.062401000410318375,\n                          0.9939020276069641,\n                          -0.09090700000524521,\n                          0.3803209960460663,\n                          0.9214360117912292,\n                          -0.00007100000220816582,\n                          0.030918000265955925,\n                          0.9969729781150818,\n                          0.07133600115776062,\n                          0.3804109990596771,\n                          0.9220889806747437,\n                          0.0001630000042496249,\n                          0.02471200004220009,\n                          0.9975799918174744,\n                          0.06498300284147263,\n                          0.35510900616645813,\n                          0.926891028881073,\n                          0.03216100111603737,\n                          0.07657899707555771,\n                          0.9924740195274353,\n                          -0.09555599838495255,\n                          0.27721700072288513,\n                          0.1851000040769577,\n                          -0.6666669845581055,\n                          0.5929989814758301,\n                          0.5781109929084778,\n                          -0.18205299973487854,\n                          0.7048519849777222,\n                          0.7048519849777222,\n                          0,\n                          0.7052720189094543,\n                          0.7054179906845093,\n                          -0.00002499999936844688,\n                          0.6835219860076904,\n                          0.7199410200119019,\n                          0.03204600140452385,\n                          0.3271070122718811,\n                          0.06412599980831146,\n                          -0.6666669845581055,\n                          0.7694699764251709,\n                          0.3061000108718872,\n                          -0.18225300312042236,\n                          0.9214379787445068,\n                          0.38033199310302734,\n                          0.0000670000008540228,\n                          0.9220880270004272,\n                          0.3804430067539215,\n                          -0.00016799999866634607,\n                          0.9071130156517029,\n                          0.403003990650177,\n                          0.032437000423669815,\n                          0,\n                          0,\n                          -1,\n                          0.6626030206680298,\n                          0.04157499969005585,\n                          -0.272724986076355,\n                          0.9969789981842041,\n                          0.03082600049674511,\n                          -0.07129299640655518,\n                          0.9975910186767578,\n                          0.024447999894618988,\n                          -0.06492199748754501,\n                          0.9925040006637573,\n                          0.07630900293588638,\n                          0.09545700252056122,\n                          0.49066001176834106,\n                          -0.09618999809026718,\n                          -0.5,\n                          0.27721700072288513,\n                          -0.1851000040769577,\n                          -0.6666669845581055,\n                          0.76139897108078,\n                          -0.32566601037979126,\n                          -0.18199099600315094,\n                          0.9939020276069641,\n                          -0.062401000410318375,\n                          -0.09090700000524521,\n                          0.9214360117912292,\n                          -0.3803209960460663,\n                          -0.00007100000220816582,\n                          0.9969729781150818,\n                          -0.030918000265955925,\n                          0.07133600115776062,\n                          0.9220889806747437,\n                          -0.3804109990596771,\n                          0.0001630000042496249,\n                          0.9975799918174744,\n                          -0.02471200004220009,\n                          0.06498300284147263,\n                          0.926891028881073,\n                          -0.35510900616645813,\n                          0.03216100111603737,\n                          0.9924740195274353,\n                          -0.07657899707555771,\n                          -0.09555599838495255,\n                          0.1851000040769577,\n                          -0.27721700072288513,\n                          -0.6666669845581055,\n                          0.5781109929084778,\n                          -0.5929989814758301,\n                          -0.18205299973487854,\n                          0.7048519849777222,\n                          -0.7048519849777222,\n                          0,\n                          0.7054179906845093,\n                          -0.7052720189094543,\n                          -0.00002499999936844688,\n                          0.7199410200119019,\n                          -0.6835219860076904,\n                          0.03204600140452385,\n                          0.06412599980831146,\n                          -0.3271070122718811,\n                          -0.6666669845581055,\n                          0.3061000108718872,\n                          -0.7694699764251709,\n                          -0.18225300312042236,\n                          0.38033199310302734,\n                          -0.9214379787445068,\n                          0.0000670000008540228,\n                          0.3804430067539215,\n                          -0.9220880270004272,\n                          -0.00016799999866634607,\n                          0.403003990650177,\n                          -0.9071130156517029,\n                          0.032437000423669815,\n                          0,\n                          0,\n                          -1,\n                          0.04157499969005585,\n                          -0.6626030206680298,\n                          -0.272724986076355,\n                          0.03082600049674511,\n                          -0.9969789981842041,\n                          -0.07129299640655518,\n                          0.024447999894618988,\n                          -0.9975910186767578,\n                          -0.06492199748754501,\n                          0.07630900293588638,\n                          -0.9925040006637573,\n                          0.09545700252056122,\n                          -0.09618999809026718,\n                          -0.49066001176834106,\n                          -0.5,\n                          -0.1851000040769577,\n                          -0.27721700072288513,\n                          -0.6666669845581055,\n                          -0.32566601037979126,\n                          -0.76139897108078,\n                          -0.18199099600315094,\n                          -0.062401000410318375,\n                          -0.9939020276069641,\n                          -0.09090700000524521,\n                          -0.3803209960460663,\n                          -0.9214360117912292,\n                          -0.00007100000220816582,\n                          -0.030918000265955925,\n                          -0.9969729781150818,\n                          0.07133600115776062,\n                          -0.3804109990596771,\n                          -0.9220889806747437,\n                          0.0001630000042496249,\n                          -0.02471200004220009,\n                          -0.9975799918174744,\n                          0.06498300284147263,\n                          -0.35510900616645813,\n                          -0.926891028881073,\n                          0.03216100111603737,\n                          -0.07657899707555771,\n                          -0.9924740195274353,\n                          -0.09555599838495255,\n                          -0.27721700072288513,\n                          -0.1851000040769577,\n                          -0.6666669845581055,\n                          -0.5929989814758301,\n                          -0.5781109929084778,\n                          -0.18205299973487854,\n                          -0.7048519849777222,\n                          -0.7048519849777222,\n                          0,\n                          -0.7052720189094543,\n                          -0.7054179906845093,\n                          -0.00002499999936844688,\n                          -0.6835219860076904,\n                          -0.7199410200119019,\n                          0.03204600140452385,\n                          -0.3271070122718811,\n                          -0.06412599980831146,\n                          -0.6666669845581055,\n                          -0.7694699764251709,\n                          -0.3061000108718872,\n                          -0.18225300312042236,\n                          -0.9214379787445068,\n                          -0.38033199310302734,\n                          0.0000670000008540228,\n                          -0.9220880270004272,\n                          -0.3804430067539215,\n                          -0.00016799999866634607,\n                          -0.9071130156517029,\n                          -0.403003990650177,\n                          0.032437000423669815,\n                          0,\n                          0,\n                          -1,\n                          -0.6626030206680298,\n                          -0.04157499969005585,\n                          -0.272724986076355,\n                          -0.9969789981842041,\n                          -0.03082600049674511,\n                          -0.07129299640655518,\n                          -0.9975910186767578,\n                          -0.024447999894618988,\n                          -0.06492199748754501,\n                          -0.9925040006637573,\n                          -0.07630900293588638,\n                          0.09545700252056122,\n                          -0.49066001176834106,\n                          0.09618999809026718,\n                          -0.5,\n                          -0.27721700072288513,\n                          0.1851000040769577,\n                          -0.6666669845581055,\n                          -0.76139897108078,\n                          0.32566601037979126,\n                          -0.18199099600315094,\n                          -0.9939020276069641,\n                          0.062401000410318375,\n                          -0.09090700000524521,\n                          -0.9214360117912292,\n                          0.3803209960460663,\n                          -0.00007100000220816582,\n                          -0.9969729781150818,\n                          0.030918000265955925,\n                          0.07133600115776062,\n                          -0.9220889806747437,\n                          0.3804109990596771,\n                          0.0001630000042496249,\n                          -0.9975799918174744,\n                          0.02471200004220009,\n                          0.06498300284147263,\n                          -0.926891028881073,\n                          0.35510900616645813,\n                          0.03216100111603737,\n                          -0.9924740195274353,\n                          0.07657899707555771,\n                          -0.09555599838495255,\n                          -0.1851000040769577,\n                          0.27721700072288513,\n                          -0.6666669845581055,\n                          -0.5781109929084778,\n                          0.5929989814758301,\n                          -0.18205299973487854,\n                          -0.7048519849777222,\n                          0.7048519849777222,\n                          0,\n                          -0.7054179906845093,\n                          0.7052720189094543,\n                          -0.00002499999936844688,\n                          -0.7199410200119019,\n                          0.6835219860076904,\n                          0.03204600140452385,\n                          -0.06412599980831146,\n                          0.3271070122718811,\n                          -0.6666669845581055,\n                          -0.3061000108718872,\n                          0.7694699764251709,\n                          -0.18225300312042236,\n                          -0.38033199310302734,\n                          0.9214379787445068,\n                          0.0000670000008540228,\n                          -0.3804430067539215,\n                          0.9220880270004272,\n                          -0.00016799999866634607,\n                          -0.403003990650177,\n                          0.9071130156517029,\n                          0.032437000423669815,\n                          0,\n                          0,\n                          -1,\n                          -0.04157499969005585,\n                          0.6626030206680298,\n                          -0.272724986076355,\n                          -0.03082600049674511,\n                          0.9969789981842041,\n                          -0.07129299640655518,\n                          -0.024447999894618988,\n                          0.9975910186767578,\n                          -0.06492199748754501,\n                          -0.07630900293588638,\n                          0.9925040006637573,\n                          0.09545700252056122,\n                          0.07657899707555771,\n                          0.9924740195274353,\n                          -0.09555599838495255,\n                          0.40307098627090454,\n                          0.9070649743080139,\n                          -0.03255299851298332,\n                          0.3753640055656433,\n                          0.9070209860801697,\n                          0.000007000000096013537,\n                          0.18306200206279755,\n                          0.9820899963378906,\n                          -0.04457399994134903,\n                          0.3751649856567383,\n                          0.9065750241279602,\n                          -0.00007400000322377309,\n                          0.18801499903202057,\n                          0.9816100001335144,\n                          -0.03304100036621094,\n                          0.3759070038795471,\n                          0.908607006072998,\n                          -0.00026199998683296144,\n                          0.16623400151729584,\n                          0.983722984790802,\n                          -0.06822899729013443,\n                          0.33324098587036133,\n                          0.9290030002593994,\n                          0.029803000390529633,\n                          0.14071400463581085,\n                          0.9862040281295776,\n                          -0.08718100190162659,\n                          0.7198299765586853,\n                          0.6836559772491455,\n                          -0.032017000019550323,\n                          0.6943539977073669,\n                          0.6943539977073669,\n                          0,\n                          0.694034993648529,\n                          0.694034993648529,\n                          0,\n                          0.6955100297927856,\n                          0.6955100297927856,\n                          0,\n                          0.6639170050621033,\n                          0.7306150197982788,\n                          0.029100999236106873,\n                          0.9268649816513062,\n                          0.35523301362991333,\n                          -0.03203999996185303,\n                          0.9070209860801697,\n                          0.3753649890422821,\n                          -0.000007000000096013537,\n                          0.9065750241279602,\n                          0.3751649856567383,\n                          0.00007300000288523734,\n                          0.908607006072998,\n                          0.3759070038795471,\n                          0.00026199998683296144,\n                          0.8926259875297546,\n                          0.4211460053920746,\n                          0.028991999104619026,\n                          0.9924740195274353,\n                          0.07646500319242477,\n                          0.09565100073814392,\n                          0.9820899963378906,\n                          0.18306200206279755,\n                          0.04457399994134903,\n                          0.9816100001335144,\n                          0.18801499903202057,\n                          0.03304100036621094,\n                          0.983722984790802,\n                          0.16623400151729584,\n                          0.06822899729013443,\n                          0.9862040281295776,\n                          0.14071400463581085,\n                          0.08718100190162659,\n                          0.9924740195274353,\n                          -0.07657899707555771,\n                          -0.09555599838495255,\n                          0.9070649743080139,\n                          -0.40307098627090454,\n                          -0.03255299851298332,\n                          0.9070209860801697,\n                          -0.3753640055656433,\n                          0.000007000000096013537,\n                          0.9820899963378906,\n                          -0.18306200206279755,\n                          -0.04457399994134903,\n                          0.9065750241279602,\n                          -0.3751649856567383,\n                          -0.00007400000322377309,\n                          0.9816100001335144,\n                          -0.18801499903202057,\n                          -0.03304100036621094,\n                          0.908607006072998,\n                          -0.3759070038795471,\n                          -0.00026199998683296144,\n                          0.983722984790802,\n                          -0.16623400151729584,\n                          -0.06822899729013443,\n                          0.9290030002593994,\n                          -0.33324098587036133,\n                          0.029803000390529633,\n                          0.9862040281295776,\n                          -0.14071400463581085,\n                          -0.08718100190162659,\n                          0.6836559772491455,\n                          -0.7198299765586853,\n                          -0.032017000019550323,\n                          0.6943539977073669,\n                          -0.6943539977073669,\n                          0,\n                          0.694034993648529,\n                          -0.694034993648529,\n                          0,\n                          0.6955100297927856,\n                          -0.6955100297927856,\n                          0,\n                          0.7306150197982788,\n                          -0.6639170050621033,\n                          0.029100999236106873,\n                          0.35523301362991333,\n                          -0.9268649816513062,\n                          -0.03203999996185303,\n                          0.3753649890422821,\n                          -0.9070209860801697,\n                          -0.000007000000096013537,\n                          0.3751649856567383,\n                          -0.9065750241279602,\n                          0.00007300000288523734,\n                          0.3759070038795471,\n                          -0.908607006072998,\n                          0.00026199998683296144,\n                          0.4211460053920746,\n                          -0.8926259875297546,\n                          0.028991999104619026,\n                          0.07646500319242477,\n                          -0.9924740195274353,\n                          0.09565100073814392,\n                          0.18306200206279755,\n                          -0.9820899963378906,\n                          0.04457399994134903,\n                          0.18801499903202057,\n                          -0.9816100001335144,\n                          0.03304100036621094,\n                          0.16623400151729584,\n                          -0.983722984790802,\n                          0.06822899729013443,\n                          0.14071400463581085,\n                          -0.9862040281295776,\n                          0.08718100190162659,\n                          -0.07657899707555771,\n                          -0.9924740195274353,\n                          -0.09555599838495255,\n                          -0.40307098627090454,\n                          -0.9070649743080139,\n                          -0.03255299851298332,\n                          -0.3753640055656433,\n                          -0.9070209860801697,\n                          0.000007000000096013537,\n                          -0.18306200206279755,\n                          -0.9820899963378906,\n                          -0.04457399994134903,\n                          -0.3751649856567383,\n                          -0.9065750241279602,\n                          -0.00007400000322377309,\n                          -0.18801499903202057,\n                          -0.9816100001335144,\n                          -0.03304100036621094,\n                          -0.3759070038795471,\n                          -0.908607006072998,\n                          -0.00026199998683296144,\n                          -0.16623400151729584,\n                          -0.983722984790802,\n                          -0.06822899729013443,\n                          -0.33324098587036133,\n                          -0.9290030002593994,\n                          0.029803000390529633,\n                          -0.14071400463581085,\n                          -0.9862040281295776,\n                          -0.08718100190162659,\n                          -0.7198299765586853,\n                          -0.6836559772491455,\n                          -0.032017000019550323,\n                          -0.6943539977073669,\n                          -0.6943539977073669,\n                          0,\n                          -0.694034993648529,\n                          -0.694034993648529,\n                          0,\n                          -0.6955100297927856,\n                          -0.6955100297927856,\n                          0,\n                          -0.6639170050621033,\n                          -0.7306150197982788,\n                          0.029100999236106873,\n                          -0.9268649816513062,\n                          -0.35523301362991333,\n                          -0.03203999996185303,\n                          -0.9070209860801697,\n                          -0.3753649890422821,\n                          -0.000007000000096013537,\n                          -0.9065750241279602,\n                          -0.3751649856567383,\n                          0.00007300000288523734,\n                          -0.908607006072998,\n                          -0.3759070038795471,\n                          0.00026199998683296144,\n                          -0.8926259875297546,\n                          -0.4211460053920746,\n                          0.028991999104619026,\n                          -0.9924740195274353,\n                          -0.07646500319242477,\n                          0.09565100073814392,\n                          -0.9820899963378906,\n                          -0.18306200206279755,\n                          0.04457399994134903,\n                          -0.9816100001335144,\n                          -0.18801499903202057,\n                          0.03304100036621094,\n                          -0.983722984790802,\n                          -0.16623400151729584,\n                          0.06822899729013443,\n                          -0.9862040281295776,\n                          -0.14071400463581085,\n                          0.08718100190162659,\n                          -0.9924740195274353,\n                          0.07657899707555771,\n                          -0.09555599838495255,\n                          -0.9070649743080139,\n                          0.40307098627090454,\n                          -0.03255299851298332,\n                          -0.9070209860801697,\n                          0.3753640055656433,\n                          0.000007000000096013537,\n                          -0.9820899963378906,\n                          0.18306200206279755,\n                          -0.04457399994134903,\n                          -0.9065750241279602,\n                          0.3751649856567383,\n                          -0.00007400000322377309,\n                          -0.9816100001335144,\n                          0.18801499903202057,\n                          -0.03304100036621094,\n                          -0.908607006072998,\n                          0.3759070038795471,\n                          -0.00026199998683296144,\n                          -0.983722984790802,\n                          0.16623400151729584,\n                          -0.06822899729013443,\n                          -0.9290030002593994,\n                          0.33324098587036133,\n                          0.029803000390529633,\n                          -0.9862040281295776,\n                          0.14071400463581085,\n                          -0.08718100190162659,\n                          -0.6836559772491455,\n                          0.7198299765586853,\n                          -0.032017000019550323,\n                          -0.6943539977073669,\n                          0.6943539977073669,\n                          0,\n                          -0.694034993648529,\n                          0.694034993648529,\n                          0,\n                          -0.6955100297927856,\n                          0.6955100297927856,\n                          0,\n                          -0.7306150197982788,\n                          0.6639170050621033,\n                          0.029100999236106873,\n                          -0.35523301362991333,\n                          0.9268649816513062,\n                          -0.03203999996185303,\n                          -0.3753649890422821,\n                          0.9070209860801697,\n                          -0.000007000000096013537,\n                          -0.3751649856567383,\n                          0.9065750241279602,\n                          0.00007300000288523734,\n                          -0.3759070038795471,\n                          0.908607006072998,\n                          0.00026199998683296144,\n                          -0.4211460053920746,\n                          0.8926259875297546,\n                          0.028991999104619026,\n                          -0.07646500319242477,\n                          0.9924740195274353,\n                          0.09565100073814392,\n                          -0.18306200206279755,\n                          0.9820899963378906,\n                          0.04457399994134903,\n                          -0.18801499903202057,\n                          0.9816100001335144,\n                          0.03304100036621094,\n                          -0.16623400151729584,\n                          0.983722984790802,\n                          0.06822899729013443,\n                          -0.14071400463581085,\n                          0.9862040281295776,\n                          0.08718100190162659};\n\nfloat teapotBinormals[] = {0.2554270029067993,\n                           -0.05043400079011917,\n                           -0.9655119776725769,\n                           0.2302899956703186,\n                           -0.11379700154066086,\n                           -0.9664459824562073,\n                           -0.23653900623321533,\n                           0.09789499640464783,\n                           -0.9666780233383179,\n                           -0.2551180124282837,\n                           0.05037299916148186,\n                           -0.9655969738960266,\n                           -0.9201610088348389,\n                           0.38079801201820374,\n                           -0.09108299762010574,\n                           -0.9770479798316956,\n                           0.1929199993610382,\n                           -0.09032399952411652,\n                           -0.6762400269508362,\n                           0.2798590064048767,\n                           0.6814529895782471,\n                           -0.723800003528595,\n                           0.1429159939289093,\n                           0.6750479936599731,\n                           -0.4681990146636963,\n                           0.1581760048866272,\n                           0.869350016117096,\n                           -0.4902079999446869,\n                           0.09679199755191803,\n                           0.8662149906158447,\n                           0.16952399909496307,\n                           -0.1934960037469864,\n                           -0.9663439989089966,\n                           -0.18106800317764282,\n                           0.18106800317764282,\n                           -0.9666590094566345,\n                           -0.7041199803352356,\n                           0.7041199803352356,\n                           -0.09181900322437286,\n                           -0.5179349780082703,\n                           0.5179349780082703,\n                           0.6807990074157715,\n                           -0.37217798829078674,\n                           0.3260670006275177,\n                           0.8690019845962524,\n                           0.08221600204706192,\n                           -0.243368998169899,\n                           -0.9664430022239685,\n                           -0.09789499640464783,\n                           0.23653900623321533,\n                           -0.9666780233383179,\n                           -0.38079801201820374,\n                           0.9201610088348389,\n                           -0.09108199924230576,\n                           -0.2798590064048767,\n                           0.6762400269508362,\n                           0.6814540028572083,\n                           -0.21894000470638275,\n                           0.44305500388145447,\n                           0.8693490028381348,\n                           0.050822000950574875,\n                           -0.2573910057544708,\n                           -0.9649699926376343,\n                           -0.05021600052714348,\n                           0.25432100892066956,\n                           -0.965815007686615,\n                           -0.19291600584983826,\n                           0.9770249724388123,\n                           -0.09059000015258789,\n                           -0.14291299879550934,\n                           0.7237870097160339,\n                           0.6750609874725342,\n                           -0.09679199755191803,\n                           0.4902079999446869,\n                           0.8662149906158447,\n                           -0.048507001250982285,\n                           -0.2576940059661865,\n                           -0.965008020401001,\n                           -0.15833300352096558,\n                           -0.3227809965610504,\n                           -0.933135986328125,\n                           0.05656199902296066,\n                           0.13793900609016418,\n                           -0.9888240098953247,\n                           0.049150001257658005,\n                           0.2545199990272522,\n                           -0.9658179879188538,\n                           0.378387987613678,\n                           0.9173290133476257,\n                           -0.12381099909543991,\n                           0.1917950063943863,\n                           0.9772530198097229,\n                           -0.09050799906253815,\n                           0.2777239978313446,\n                           0.6716070175170898,\n                           0.6868870258331299,\n                           0.14281700551509857,\n                           0.7238019704818726,\n                           0.6750659942626953,\n                           0.15788200497627258,\n                           0.4674209952354431,\n                           0.8698220252990723,\n                           0.09679199755191803,\n                           0.4902079999446869,\n                           0.8662149906158447,\n                           -0.3139069974422455,\n                           -0.2657270133495331,\n                           -0.9115110039710999,\n                           0.05247500166296959,\n                           0.05178600177168846,\n                           -0.9972789883613586,\n                           0.699787974357605,\n                           0.6969379782676697,\n                           -0.15676100552082062,\n                           0.511929988861084,\n                           0.5116159915924072,\n                           0.6900550127029419,\n                           0.32515400648117065,\n                           0.37111398577690125,\n                           0.8697980046272278,\n                           -0.3181929886341095,\n                           -0.09987600147724152,\n                           -0.9427499771118164,\n                           0.1552799940109253,\n                           0.06176299974322319,\n                           -0.9859380125999451,\n                           0.9187250137329102,\n                           0.3751460015773773,\n                           -0.1233299970626831,\n                           0.6724870204925537,\n                           0.2775439918041229,\n                           0.6860979795455933,\n                           0.4424299895763397,\n                           0.21853800117969513,\n                           0.8697689771652222,\n                           -0.255948007106781,\n                           -0.04464200139045715,\n                           -0.9656590223312378,\n                           0.25306200981140137,\n                           0.046362001448869705,\n                           -0.9663389921188354,\n                           0.9778940081596375,\n                           0.18800100684165955,\n                           -0.09153299778699875,\n                           0.7238150238990784,\n                           0.14205799996852875,\n                           0.675212025642395,\n                           0.49017900228500366,\n                           0.0967010036110878,\n                           0.8662409782409668,\n                           -0.25491899251937866,\n                           0.05033399909734726,\n                           -0.9656509757041931,\n                           -0.2302899956703186,\n                           0.11379700154066086,\n                           -0.9664459824562073,\n                           0.23653900623321533,\n                           -0.09789499640464783,\n                           -0.9666780233383179,\n                           0.252265989780426,\n                           -0.04980999976396561,\n                           -0.9663749933242798,\n                           0.9201610088348389,\n                           -0.38079801201820374,\n                           -0.09108299762010574,\n                           0.9769039750099182,\n                           -0.19289200007915497,\n                           -0.09193000197410583,\n                           0.6762400269508362,\n                           -0.2798590064048767,\n                           0.6814529895782471,\n                           0.7236610054969788,\n                           -0.14288799464702606,\n                           0.6752020120620728,\n                           0.4681990146636963,\n                           -0.1581760048866272,\n                           0.869350016117096,\n                           0.4901660084724426,\n                           -0.09678400307893753,\n                           0.8662390112876892,\n                           -0.16952399909496307,\n                           0.1934960037469864,\n                           -0.9663439989089966,\n                           0.18106800317764282,\n                           -0.18106800317764282,\n                           -0.9666590094566345,\n                           0.7041199803352356,\n                           -0.7041199803352356,\n                           -0.09181900322437286,\n                           0.5179349780082703,\n                           -0.5179349780082703,\n                           0.6807990074157715,\n                           0.37217798829078674,\n                           -0.3260670006275177,\n                           0.8690019845962524,\n                           -0.08221600204706192,\n                           0.243368998169899,\n                           -0.9664430022239685,\n                           0.09789499640464783,\n                           -0.23653900623321533,\n                           -0.9666780233383179,\n                           0.38079801201820374,\n                           -0.9201610088348389,\n                           -0.09108199924230576,\n                           0.2798590064048767,\n                           -0.6762400269508362,\n                           0.6814540028572083,\n                           0.21894000470638275,\n                           -0.44305500388145447,\n                           0.8693490028381348,\n                           -0.05043400079011917,\n                           0.2554270029067993,\n                           -0.9655119776725769,\n                           0.05037299916148186,\n                           -0.2551180124282837,\n                           -0.9655969738960266,\n                           0.1929199993610382,\n                           -0.9770479798316956,\n                           -0.09032399952411652,\n                           0.1429159939289093,\n                           -0.723800003528595,\n                           0.6750479936599731,\n                           0.09679199755191803,\n                           -0.4902079999446869,\n                           0.8662149906158447,\n                           0.05043400079011917,\n                           0.2554270029067993,\n                           -0.9655119776725769,\n                           0.11379700154066086,\n                           0.2302899956703186,\n                           -0.9664459824562073,\n                           -0.09789499640464783,\n                           -0.23653900623321533,\n                           -0.9666780233383179,\n                           -0.05037299916148186,\n                           -0.2551180124282837,\n                           -0.9655969738960266,\n                           -0.38079801201820374,\n                           -0.9201610088348389,\n                           -0.09108299762010574,\n                           -0.1929199993610382,\n                           -0.9770479798316956,\n                           -0.09032399952411652,\n                           -0.2798590064048767,\n                           -0.6762400269508362,\n                           0.6814529895782471,\n                           -0.1429159939289093,\n                           -0.723800003528595,\n                           0.6750479936599731,\n                           -0.1581760048866272,\n                           -0.4681990146636963,\n                           0.869350016117096,\n                           -0.09679199755191803,\n                           -0.4902079999446869,\n                           0.8662149906158447,\n                           0.1934960037469864,\n                           0.16952399909496307,\n                           -0.9663439989089966,\n                           -0.18106800317764282,\n                           -0.18106800317764282,\n                           -0.9666590094566345,\n                           -0.7041199803352356,\n                           -0.7041199803352356,\n                           -0.09181900322437286,\n                           -0.5179349780082703,\n                           -0.5179349780082703,\n                           0.6807990074157715,\n                           -0.3260670006275177,\n                           -0.37217798829078674,\n                           0.8690019845962524,\n                           0.243368998169899,\n                           0.08221600204706192,\n                           -0.9664430022239685,\n                           -0.23653900623321533,\n                           -0.09789499640464783,\n                           -0.9666780233383179,\n                           -0.9201610088348389,\n                           -0.38079801201820374,\n                           -0.09108199924230576,\n                           -0.6762400269508362,\n                           -0.2798590064048767,\n                           0.6814540028572083,\n                           -0.44305500388145447,\n                           -0.21894000470638275,\n                           0.8693490028381348,\n                           0.2554270029067993,\n                           0.05043400079011917,\n                           -0.9655119776725769,\n                           -0.2551180124282837,\n                           -0.05037299916148186,\n                           -0.9655969738960266,\n                           -0.9770479798316956,\n                           -0.1929199993610382,\n                           -0.09032399952411652,\n                           -0.723800003528595,\n                           -0.1429159939289093,\n                           0.6750479936599731,\n                           -0.4902079999446869,\n                           -0.09679199755191803,\n                           0.8662149906158447,\n                           -0.4902079999446869,\n                           0.09679199755191803,\n                           0.8662149906158447,\n                           -0.44305500388145447,\n                           0.21893900632858276,\n                           0.8693490028381348,\n                           -0.37287598848342896,\n                           0.15431199967861176,\n                           0.9149600267410278,\n                           -0.4014579951763153,\n                           0.07926800101995468,\n                           0.9124410152435303,\n                           -0.3112579882144928,\n                           0.12881100177764893,\n                           0.9415550231933594,\n                           -0.33541300892829895,\n                           0.0662280023097992,\n                           0.939740002155304,\n                           -0.19015200436115265,\n                           0.07869099825620651,\n                           0.9785959720611572,\n                           -0.20517399907112122,\n                           0.040511999279260635,\n                           0.977886974811554,\n                           0.06301800161600113,\n                           -0.021289000287652016,\n                           0.9977849721908569,\n                           0.06623400002717972,\n                           -0.013078000396490097,\n                           0.9977179765701294,\n                           -0.3260670006275177,\n                           0.37217798829078674,\n                           0.8690019845962524,\n                           -0.285739004611969,\n                           0.285739004611969,\n                           0.9147170186042786,\n                           -0.23854400217533112,\n                           0.23854400217533112,\n                           0.9413790106773376,\n                           -0.14574900269508362,\n                           0.14574900269508362,\n                           0.9785270094871521,\n                           0.05011200159788132,\n                           -0.04390300065279007,\n                           0.9977779984474182,\n                           -0.1581760048866272,\n                           0.4681999981403351,\n                           0.869350016117096,\n                           -0.15431199967861176,\n                           0.37287598848342896,\n                           0.9149600267410278,\n                           -0.12881100177764893,\n                           0.3112579882144928,\n                           0.9415550231933594,\n                           -0.07869099825620651,\n                           0.19015100598335266,\n                           0.9785959720611572,\n                           0.02946699969470501,\n                           -0.05963199958205223,\n                           0.9977849721908569,\n                           -0.09679199755191803,\n                           0.4902079999446869,\n                           0.8662149906158447,\n                           -0.07926800101995468,\n                           0.4014579951763153,\n                           0.9124410152435303,\n                           -0.0662280023097992,\n                           0.33541300892829895,\n                           0.939740002155304,\n                           -0.040511999279260635,\n                           0.20517399907112122,\n                           0.977886974811554,\n                           0.013078000396490097,\n                           -0.06623400002717972,\n                           0.9977179765701294,\n                           0.09679199755191803,\n                           0.4902079999446869,\n                           0.8662149906158447,\n                           0.21858200430870056,\n                           0.4423219859600067,\n                           0.86981201171875,\n                           0.15431199967861176,\n                           0.37287598848342896,\n                           0.9149600267410278,\n                           0.07926800101995468,\n                           0.4014579951763153,\n                           0.9124410152435303,\n                           0.12881100177764893,\n                           0.3112579882144928,\n                           0.9415550231933594,\n                           0.0662280023097992,\n                           0.33541300892829895,\n                           0.939740002155304,\n                           0.07869099825620651,\n                           0.19015200436115265,\n                           0.9785959720611572,\n                           0.040511999279260635,\n                           0.20517399907112122,\n                           0.977886974811554,\n                           -0.021289000287652016,\n                           -0.06301800161600113,\n                           0.9977849721908569,\n                           -0.013078000396490097,\n                           -0.06623400002717972,\n                           0.9977179765701294,\n                           0.3711329996585846,\n                           0.3251489996910095,\n                           0.8697919845581055,\n                           0.285739004611969,\n                           0.285739004611969,\n                           0.9147170186042786,\n                           0.23854400217533112,\n                           0.23854400217533112,\n                           0.9413790106773376,\n                           0.14574900269508362,\n                           0.14574900269508362,\n                           0.9785270094871521,\n                           -0.04390300065279007,\n                           -0.05011200159788132,\n                           0.9977779984474182,\n                           0.46750199794769287,\n                           0.15794099867343903,\n                           0.8697680234909058,\n                           0.37287598848342896,\n                           0.15431199967861176,\n                           0.9149600267410278,\n                           0.3112579882144928,\n                           0.12881100177764893,\n                           0.9415550231933594,\n                           0.19015100598335266,\n                           0.07869099825620651,\n                           0.9785959720611572,\n                           -0.05963199958205223,\n                           -0.02946699969470501,\n                           0.9977849721908569,\n                           0.49017900228500366,\n                           0.0967010036110878,\n                           0.8662409782409668,\n                           0.4014579951763153,\n                           0.07926800101995468,\n                           0.9124410152435303,\n                           0.33541300892829895,\n                           0.0662280023097992,\n                           0.939740002155304,\n                           0.20517399907112122,\n                           0.040511999279260635,\n                           0.977886974811554,\n                           -0.06623400002717972,\n                           -0.013078000396490097,\n                           0.9977179765701294,\n                           0.4901660084724426,\n                           -0.09678400307893753,\n                           0.8662390112876892,\n                           0.44305500388145447,\n                           -0.21893900632858276,\n                           0.8693490028381348,\n                           0.37287598848342896,\n                           -0.15431199967861176,\n                           0.9149600267410278,\n                           0.4014579951763153,\n                           -0.07926800101995468,\n                           0.9124410152435303,\n                           0.3112579882144928,\n                           -0.12881100177764893,\n                           0.9415550231933594,\n                           0.33541300892829895,\n                           -0.0662280023097992,\n                           0.939740002155304,\n                           0.19015200436115265,\n                           -0.07869099825620651,\n                           0.9785959720611572,\n                           0.20517399907112122,\n                           -0.040511999279260635,\n                           0.977886974811554,\n                           -0.06301800161600113,\n                           0.021289000287652016,\n                           0.9977849721908569,\n                           -0.06623400002717972,\n                           0.013078000396490097,\n                           0.9977179765701294,\n                           0.3260670006275177,\n                           -0.37217798829078674,\n                           0.8690019845962524,\n                           0.285739004611969,\n                           -0.285739004611969,\n                           0.9147170186042786,\n                           0.23854400217533112,\n                           -0.23854400217533112,\n                           0.9413790106773376,\n                           0.14574900269508362,\n                           -0.14574900269508362,\n                           0.9785270094871521,\n                           -0.05011200159788132,\n                           0.04390300065279007,\n                           0.9977779984474182,\n                           0.1581760048866272,\n                           -0.4681999981403351,\n                           0.869350016117096,\n                           0.15431199967861176,\n                           -0.37287598848342896,\n                           0.9149600267410278,\n                           0.12881100177764893,\n                           -0.3112579882144928,\n                           0.9415550231933594,\n                           0.07869099825620651,\n                           -0.19015100598335266,\n                           0.9785959720611572,\n                           -0.02946699969470501,\n                           0.05963199958205223,\n                           0.9977849721908569,\n                           0.09679199755191803,\n                           -0.4902079999446869,\n                           0.8662149906158447,\n                           0.07926800101995468,\n                           -0.4014579951763153,\n                           0.9124410152435303,\n                           0.0662280023097992,\n                           -0.33541300892829895,\n                           0.939740002155304,\n                           0.040511999279260635,\n                           -0.20517399907112122,\n                           0.977886974811554,\n                           -0.013078000396490097,\n                           0.06623400002717972,\n                           0.9977179765701294,\n                           -0.09679199755191803,\n                           -0.4902079999446869,\n                           0.8662149906158447,\n                           -0.21893900632858276,\n                           -0.44305500388145447,\n                           0.8693490028381348,\n                           -0.15431199967861176,\n                           -0.37287598848342896,\n                           0.9149600267410278,\n                           -0.07926800101995468,\n                           -0.4014579951763153,\n                           0.9124410152435303,\n                           -0.12881100177764893,\n                           -0.3112579882144928,\n                           0.9415550231933594,\n                           -0.0662280023097992,\n                           -0.33541300892829895,\n                           0.939740002155304,\n                           -0.07869099825620651,\n                           -0.19015200436115265,\n                           0.9785959720611572,\n                           -0.040511999279260635,\n                           -0.20517399907112122,\n                           0.977886974811554,\n                           0.021289000287652016,\n                           0.06301800161600113,\n                           0.9977849721908569,\n                           0.013078000396490097,\n                           0.06623400002717972,\n                           0.9977179765701294,\n                           -0.37217798829078674,\n                           -0.3260670006275177,\n                           0.8690019845962524,\n                           -0.285739004611969,\n                           -0.285739004611969,\n                           0.9147170186042786,\n                           -0.23854400217533112,\n                           -0.23854400217533112,\n                           0.9413790106773376,\n                           -0.14574900269508362,\n                           -0.14574900269508362,\n                           0.9785270094871521,\n                           0.04390300065279007,\n                           0.05011200159788132,\n                           0.9977779984474182,\n                           -0.4681999981403351,\n                           -0.1581760048866272,\n                           0.869350016117096,\n                           -0.37287598848342896,\n                           -0.15431199967861176,\n                           0.9149600267410278,\n                           -0.3112579882144928,\n                           -0.12881100177764893,\n                           0.9415550231933594,\n                           -0.19015100598335266,\n                           -0.07869099825620651,\n                           0.9785959720611572,\n                           0.05963199958205223,\n                           0.02946699969470501,\n                           0.9977849721908569,\n                           -0.4902079999446869,\n                           -0.09679199755191803,\n                           0.8662149906158447,\n                           -0.4014579951763153,\n                           -0.07926800101995468,\n                           0.9124410152435303,\n                           -0.33541300892829895,\n                           -0.0662280023097992,\n                           0.939740002155304,\n                           -0.20517399907112122,\n                           -0.040511999279260635,\n                           0.977886974811554,\n                           0.06623400002717972,\n                           0.013078000396490097,\n                           0.9977179765701294,\n                           0.06623400002717972,\n                           -0.013078000396490097,\n                           0.9977179765701294,\n                           0.05963199958205223,\n                           -0.02946699969470501,\n                           0.9977849721908569,\n                           0.40303200483322144,\n                           -0.1667889952659607,\n                           0.8998590111732483,\n                           0.4339120090007782,\n                           -0.08567699790000916,\n                           0.8968719840049744,\n                           0.6326310038566589,\n                           -0.2618109881877899,\n                           0.7288579940795898,\n                           0.6777120232582092,\n                           -0.13381600379943848,\n                           0.723048985004425,\n                           0.6661339998245239,\n                           -0.27567601203918457,\n                           0.6930140256881714,\n                           0.7128540277481079,\n                           -0.14075499773025513,\n                           0.6870430111885071,\n                           0.5777599811553955,\n                           -0.19519099593162537,\n                           0.792523980140686,\n                           0.6036490201950073,\n                           -0.11919199675321579,\n                           0.7882900238037109,\n                           0.04390300065279007,\n                           -0.05011200159788132,\n                           0.9977779984474182,\n                           0.30884799361228943,\n                           -0.30884799361228943,\n                           0.8995699882507324,\n                           0.48457300662994385,\n                           -0.48457300662994385,\n                           0.7282710075378418,\n                           0.510138988494873,\n                           -0.510138988494873,\n                           0.6924710273742676,\n                           0.4591110050678253,\n                           -0.40222999453544617,\n                           0.7921029925346375,\n                           0.021289000287652016,\n                           -0.06301800161600113,\n                           0.9977849721908569,\n                           0.16678999364376068,\n                           -0.40303200483322144,\n                           0.8998590111732483,\n                           0.2618109881877899,\n                           -0.6326310038566589,\n                           0.7288579940795898,\n                           0.27567601203918457,\n                           -0.6661339998245239,\n                           0.6930140256881714,\n                           0.2701770067214966,\n                           -0.546737015247345,\n                           0.7925170063972473,\n                           0.013078000396490097,\n                           -0.06623400002717972,\n                           0.9977179765701294,\n                           0.08567599952220917,\n                           -0.4339120090007782,\n                           0.8968719840049744,\n                           0.13381600379943848,\n                           -0.6777120232582092,\n                           0.723048985004425,\n                           0.14075499773025513,\n                           -0.7128540277481079,\n                           0.6870430111885071,\n                           0.11919199675321579,\n                           -0.6036490201950073,\n                           0.7882900238037109,\n                           -0.013078000396490097,\n                           -0.06623400002717972,\n                           0.9977179765701294,\n                           -0.02946699969470501,\n                           -0.05963199958205223,\n                           0.9977849721908569,\n                           -0.1667889952659607,\n                           -0.40303200483322144,\n                           0.8998590111732483,\n                           -0.08567699790000916,\n                           -0.4339120090007782,\n                           0.8968719840049744,\n                           -0.2618109881877899,\n                           -0.6326310038566589,\n                           0.7288579940795898,\n                           -0.13381600379943848,\n                           -0.6777120232582092,\n                           0.723048985004425,\n                           -0.27567601203918457,\n                           -0.6661339998245239,\n                           0.6930140256881714,\n                           -0.14075499773025513,\n                           -0.7128540277481079,\n                           0.6870430111885071,\n                           -0.19519099593162537,\n                           -0.5777599811553955,\n                           0.792523980140686,\n                           -0.11919199675321579,\n                           -0.6036490201950073,\n                           0.7882900238037109,\n                           -0.05011200159788132,\n                           -0.04390300065279007,\n                           0.9977779984474182,\n                           -0.30884799361228943,\n                           -0.30884799361228943,\n                           0.8995699882507324,\n                           -0.48457300662994385,\n                           -0.48457300662994385,\n                           0.7282710075378418,\n                           -0.510138988494873,\n                           -0.510138988494873,\n                           0.6924710273742676,\n                           -0.40222999453544617,\n                           -0.4591110050678253,\n                           0.7921029925346375,\n                           -0.06301800161600113,\n                           -0.021289000287652016,\n                           0.9977849721908569,\n                           -0.40303200483322144,\n                           -0.16678999364376068,\n                           0.8998590111732483,\n                           -0.6326310038566589,\n                           -0.2618109881877899,\n                           0.7288579940795898,\n                           -0.6661339998245239,\n                           -0.27567601203918457,\n                           0.6930140256881714,\n                           -0.546737015247345,\n                           -0.2701770067214966,\n                           0.7925170063972473,\n                           -0.06623400002717972,\n                           -0.013078000396490097,\n                           0.9977179765701294,\n                           -0.4339120090007782,\n                           -0.08567599952220917,\n                           0.8968719840049744,\n                           -0.6777120232582092,\n                           -0.13381600379943848,\n                           0.723048985004425,\n                           -0.7128540277481079,\n                           -0.14075499773025513,\n                           0.6870430111885071,\n                           -0.6036490201950073,\n                           -0.11919199675321579,\n                           0.7882900238037109,\n                           -0.06623400002717972,\n                           0.013078000396490097,\n                           0.9977179765701294,\n                           -0.05963199958205223,\n                           0.02946699969470501,\n                           0.9977849721908569,\n                           -0.40303200483322144,\n                           0.1667889952659607,\n                           0.8998590111732483,\n                           -0.4339120090007782,\n                           0.08567699790000916,\n                           0.8968719840049744,\n                           -0.6326310038566589,\n                           0.2618109881877899,\n                           0.7288579940795898,\n                           -0.6777120232582092,\n                           0.13381600379943848,\n                           0.723048985004425,\n                           -0.6661339998245239,\n                           0.27567601203918457,\n                           0.6930140256881714,\n                           -0.7128540277481079,\n                           0.14075499773025513,\n                           0.6870430111885071,\n                           -0.5777599811553955,\n                           0.19519099593162537,\n                           0.792523980140686,\n                           -0.6036490201950073,\n                           0.11919199675321579,\n                           0.7882900238037109,\n                           -0.04390300065279007,\n                           0.05011200159788132,\n                           0.9977779984474182,\n                           -0.30884799361228943,\n                           0.30884799361228943,\n                           0.8995699882507324,\n                           -0.48457300662994385,\n                           0.48457300662994385,\n                           0.7282710075378418,\n                           -0.510138988494873,\n                           0.510138988494873,\n                           0.6924710273742676,\n                           -0.4591110050678253,\n                           0.40222999453544617,\n                           0.7921029925346375,\n                           -0.021289000287652016,\n                           0.06301800161600113,\n                           0.9977849721908569,\n                           -0.16678999364376068,\n                           0.40303200483322144,\n                           0.8998590111732483,\n                           -0.2618109881877899,\n                           0.6326310038566589,\n                           0.7288579940795898,\n                           -0.27567601203918457,\n                           0.6661339998245239,\n                           0.6930140256881714,\n                           -0.2701770067214966,\n                           0.546737015247345,\n                           0.7925170063972473,\n                           -0.013078000396490097,\n                           0.06623400002717972,\n                           0.9977179765701294,\n                           -0.08567599952220917,\n                           0.4339120090007782,\n                           0.8968719840049744,\n                           -0.13381600379943848,\n                           0.6777120232582092,\n                           0.723048985004425,\n                           -0.14075499773025513,\n                           0.7128540277481079,\n                           0.6870430111885071,\n                           -0.11919199675321579,\n                           0.6036490201950073,\n                           0.7882900238037109,\n                           0.013078000396490097,\n                           0.06623400002717972,\n                           0.9977179765701294,\n                           0.02946699969470501,\n                           0.05963199958205223,\n                           0.9977849721908569,\n                           0.1667889952659607,\n                           0.40303200483322144,\n                           0.8998590111732483,\n                           0.08567699790000916,\n                           0.4339120090007782,\n                           0.8968719840049744,\n                           0.2618109881877899,\n                           0.6326310038566589,\n                           0.7288579940795898,\n                           0.13381600379943848,\n                           0.6777120232582092,\n                           0.723048985004425,\n                           0.27567601203918457,\n                           0.6661339998245239,\n                           0.6930140256881714,\n                           0.14075499773025513,\n                           0.7128540277481079,\n                           0.6870430111885071,\n                           0.19519099593162537,\n                           0.5777599811553955,\n                           0.792523980140686,\n                           0.11919199675321579,\n                           0.6036490201950073,\n                           0.7882900238037109,\n                           0.05011200159788132,\n                           0.04390300065279007,\n                           0.9977779984474182,\n                           0.30884799361228943,\n                           0.30884799361228943,\n                           0.8995699882507324,\n                           0.48457300662994385,\n                           0.48457300662994385,\n                           0.7282710075378418,\n                           0.510138988494873,\n                           0.510138988494873,\n                           0.6924710273742676,\n                           0.40222999453544617,\n                           0.4591110050678253,\n                           0.7921029925346375,\n                           0.06301800161600113,\n                           0.021289000287652016,\n                           0.9977849721908569,\n                           0.40303200483322144,\n                           0.16678999364376068,\n                           0.8998590111732483,\n                           0.6326310038566589,\n                           0.2618109881877899,\n                           0.7288579940795898,\n                           0.6661339998245239,\n                           0.27567601203918457,\n                           0.6930140256881714,\n                           0.546737015247345,\n                           0.2701770067214966,\n                           0.7925170063972473,\n                           0.06623400002717972,\n                           0.013078000396490097,\n                           0.9977179765701294,\n                           0.4339120090007782,\n                           0.08567599952220917,\n                           0.8968719840049744,\n                           0.6777120232582092,\n                           0.13381600379943848,\n                           0.723048985004425,\n                           0.7128540277481079,\n                           0.14075499773025513,\n                           0.6870430111885071,\n                           0.6036490201950073,\n                           0.11919199675321579,\n                           0.7882900238037109,\n                           0.6036490201950073,\n                           -0.11919199675321579,\n                           0.7882900238037109,\n                           0.546737015247345,\n                           -0.2701770067214966,\n                           0.7925170063972473,\n                           0.7223830223083496,\n                           -0.2989569902420044,\n                           0.623528003692627,\n                           0.7723940014839172,\n                           -0.15251100063323975,\n                           0.616562008857727,\n                           0.9094089865684509,\n                           -0.3763520121574402,\n                           0.1770150065422058,\n                           0.9660869836807251,\n                           -0.19075599312782288,\n                           0.1740349978208542,\n                           0.9408230185508728,\n                           -0.3353259861469269,\n                           0.04907499998807907,\n                           0.9843119978904724,\n                           -0.16964000463485718,\n                           0.048493001610040665,\n                           0.9810580015182495,\n                           -0.1937119960784912,\n                           0,\n                           0.7071070075035095,\n                           -0.7071070075035095,\n                           0,\n                           0.40222999453544617,\n                           -0.4591110050678253,\n                           0.7921029925346375,\n                           0.5532029867172241,\n                           -0.5532029867172241,\n                           0.622842013835907,\n                           0.6959879994392395,\n                           -0.6959879994392395,\n                           0.17663900554180145,\n                           0.7403979897499084,\n                           -0.6703829765319824,\n                           0.048958998173475266,\n                           0.8310419917106628,\n                           -0.5562090277671814,\n                           0,\n                           0.19519099593162537,\n                           -0.5777599811553955,\n                           0.792523980140686,\n                           0.2989560067653656,\n                           -0.7223830223083496,\n                           0.623528003692627,\n                           0.3763520121574402,\n                           -0.9094089865684509,\n                           0.1770150065422058,\n                           0.4275760054588318,\n                           -0.902646005153656,\n                           0.04906899854540825,\n                           0.5562090277671814,\n                           -0.8310419917106628,\n                           0,\n                           0.11919199675321579,\n                           -0.6036490201950073,\n                           0.7882900238037109,\n                           0.15251100063323975,\n                           -0.7723940014839172,\n                           0.616562008857727,\n                           0.19075599312782288,\n                           -0.9660869836807251,\n                           0.1740349978208542,\n                           0.19348600506782532,\n                           -0.9799140095710754,\n                           0.048277001827955246,\n                           0.1937119960784912,\n                           -0.9810580015182495,\n                           0,\n                           -0.11919199675321579,\n                           -0.6036490201950073,\n                           0.7882900238037109,\n                           -0.2701770067214966,\n                           -0.546737015247345,\n                           0.7925170063972473,\n                           -0.2989569902420044,\n                           -0.7223830223083496,\n                           0.623528003692627,\n                           -0.15251100063323975,\n                           -0.7723940014839172,\n                           0.616562008857727,\n                           -0.3763520121574402,\n                           -0.9094089865684509,\n                           0.1770150065422058,\n                           -0.19075599312782288,\n                           -0.9660869836807251,\n                           0.1740349978208542,\n                           -0.3353259861469269,\n                           -0.9408230185508728,\n                           0.04907499998807907,\n                           -0.16964000463485718,\n                           -0.9843119978904724,\n                           0.04849399998784065,\n                           -0.1937119960784912,\n                           -0.9810580015182495,\n                           0,\n                           0.7071070075035095,\n                           -0.7071070075035095,\n                           0,\n                           -0.4591110050678253,\n                           -0.40222999453544617,\n                           0.7921029925346375,\n                           -0.5532029867172241,\n                           -0.5532029867172241,\n                           0.622842013835907,\n                           -0.6959879994392395,\n                           -0.6959879994392395,\n                           0.17663900554180145,\n                           -0.6703829765319824,\n                           -0.7403979897499084,\n                           0.048958998173475266,\n                           -0.5562090277671814,\n                           -0.8310419917106628,\n                           0,\n                           -0.5777599811553955,\n                           -0.19519099593162537,\n                           0.792523980140686,\n                           -0.7223830223083496,\n                           -0.2989560067653656,\n                           0.623528003692627,\n                           -0.9094089865684509,\n                           -0.3763520121574402,\n                           0.1770150065422058,\n                           -0.902646005153656,\n                           -0.4275760054588318,\n                           0.04906899854540825,\n                           -0.8310419917106628,\n                           -0.5562090277671814,\n                           0,\n                           -0.6036490201950073,\n                           -0.11919199675321579,\n                           0.7882900238037109,\n                           -0.7723940014839172,\n                           -0.15251100063323975,\n                           0.616562008857727,\n                           -0.9660869836807251,\n                           -0.19075599312782288,\n                           0.1740349978208542,\n                           -0.9799140095710754,\n                           -0.19348600506782532,\n                           0.048277001827955246,\n                           -0.9810580015182495,\n                           -0.1937119960784912,\n                           0,\n                           -0.6036490201950073,\n                           0.11919199675321579,\n                           0.7882900238037109,\n                           -0.546737015247345,\n                           0.2701770067214966,\n                           0.7925170063972473,\n                           -0.7223830223083496,\n                           0.2989569902420044,\n                           0.623528003692627,\n                           -0.7723940014839172,\n                           0.15251100063323975,\n                           0.616562008857727,\n                           -0.9094089865684509,\n                           0.3763520121574402,\n                           0.1770150065422058,\n                           -0.9660869836807251,\n                           0.19075599312782288,\n                           0.1740349978208542,\n                           -0.9408230185508728,\n                           0.3353259861469269,\n                           0.04907499998807907,\n                           -0.9843119978904724,\n                           0.16964000463485718,\n                           0.04849399998784065,\n                           -0.9810580015182495,\n                           0.1937119960784912,\n                           0,\n                           0.7071070075035095,\n                           -0.7071070075035095,\n                           0,\n                           -0.40222999453544617,\n                           0.4591110050678253,\n                           0.7921029925346375,\n                           -0.5532029867172241,\n                           0.5532029867172241,\n                           0.622842013835907,\n                           -0.6959879994392395,\n                           0.6959879994392395,\n                           0.17663900554180145,\n                           -0.7403979897499084,\n                           0.6703829765319824,\n                           0.048958998173475266,\n                           -0.8310419917106628,\n                           0.5562090277671814,\n                           0,\n                           -0.19519099593162537,\n                           0.5777599811553955,\n                           0.792523980140686,\n                           -0.2989560067653656,\n                           0.7223830223083496,\n                           0.623528003692627,\n                           -0.3763520121574402,\n                           0.9094089865684509,\n                           0.1770150065422058,\n                           -0.4275760054588318,\n                           0.902646005153656,\n                           0.04906899854540825,\n                           -0.5562090277671814,\n                           0.8310419917106628,\n                           0,\n                           -0.11919199675321579,\n                           0.6036490201950073,\n                           0.7882900238037109,\n                           -0.15251100063323975,\n                           0.7723940014839172,\n                           0.616562008857727,\n                           -0.19075599312782288,\n                           0.9660869836807251,\n                           0.1740349978208542,\n                           -0.19348600506782532,\n                           0.9799140095710754,\n                           0.048277001827955246,\n                           -0.1937119960784912,\n                           0.9810580015182495,\n                           0,\n                           0.11919199675321579,\n                           0.6036490201950073,\n                           0.7882900238037109,\n                           0.2701770067214966,\n                           0.546737015247345,\n                           0.7925170063972473,\n                           0.2989569902420044,\n                           0.7223830223083496,\n                           0.623528003692627,\n                           0.15251100063323975,\n                           0.7723940014839172,\n                           0.616562008857727,\n                           0.3763520121574402,\n                           0.9094089865684509,\n                           0.1770150065422058,\n                           0.19075599312782288,\n                           0.9660869836807251,\n                           0.1740349978208542,\n                           0.3353259861469269,\n                           0.9408230185508728,\n                           0.04907499998807907,\n                           0.16964000463485718,\n                           0.9843119978904724,\n                           0.04849399998784065,\n                           0.1937119960784912,\n                           0.9810580015182495,\n                           0,\n                           0.7071070075035095,\n                           -0.7071070075035095,\n                           0,\n                           0.4591110050678253,\n                           0.40222999453544617,\n                           0.7921029925346375,\n                           0.5532029867172241,\n                           0.5532029867172241,\n                           0.622842013835907,\n                           0.6959879994392395,\n                           0.6959879994392395,\n                           0.17663900554180145,\n                           0.6703829765319824,\n                           0.7403979897499084,\n                           0.048958998173475266,\n                           0.5562090277671814,\n                           0.8310419917106628,\n                           0,\n                           0.5777599811553955,\n                           0.19519099593162537,\n                           0.792523980140686,\n                           0.7223830223083496,\n                           0.2989560067653656,\n                           0.623528003692627,\n                           0.9094089865684509,\n                           0.3763520121574402,\n                           0.1770150065422058,\n                           0.902646005153656,\n                           0.4275760054588318,\n                           0.04906899854540825,\n                           0.8310419917106628,\n                           0.5562090277671814,\n                           0,\n                           0.6036490201950073,\n                           0.11919199675321579,\n                           0.7882900238037109,\n                           0.7723940014839172,\n                           0.15251100063323975,\n                           0.616562008857727,\n                           0.9660869836807251,\n                           0.19075599312782288,\n                           0.1740349978208542,\n                           0.9799150228500366,\n                           0.19348600506782532,\n                           0.048277001827955246,\n                           0.9810580015182495,\n                           0.1937119960784912,\n                           0,\n                           0.9999480247497559,\n                           0.006622000131756067,\n                           0.007786999922245741,\n                           0.9989290237426758,\n                           0.04125700145959854,\n                           -0.020945999771356583,\n                           0.9700260162353516,\n                           -0.18230900168418884,\n                           0.1606609970331192,\n                           0.9929869771003723,\n                           -0.1116809993982315,\n                           0.038782998919487,\n                           0.8677089810371399,\n                           -0.30993399024009705,\n                           0.38861599564552307,\n                           0.9675049781799316,\n                           -0.18179599940776825,\n                           0.17574100196361542,\n                           0.6127229928970337,\n                           -0.23797500133514404,\n                           0.753616988658905,\n                           0.781611979007721,\n                           -0.1585649996995926,\n                           0.6032750010490417,\n                           0.13049399852752686,\n                           -0.02585900016129017,\n                           0.9911119937896729,\n                           0.16583800315856934,\n                           -0.04606600105762482,\n                           0.9850770235061646,\n                           0.9847609996795654,\n                           -0.03004699945449829,\n                           -0.17129500210285187,\n                           0.9463850259780884,\n                           0.008138000033795834,\n                           0.3229379951953888,\n                           0.6942890286445618,\n                           0.06011800095438957,\n                           0.7171810269355774,\n                           0.405923992395401,\n                           0.09244199842214584,\n                           0.9092199802398682,\n                           0.1477230042219162,\n                           0.0024739999789744616,\n                           0.9890260100364685,\n                           0.991798996925354,\n                           -0.11557900160551071,\n                           -0.05454900115728378,\n                           0.9920099973678589,\n                           0.07202500104904175,\n                           0.10358300060033798,\n                           0.8882240056991577,\n                           0.2238840013742447,\n                           0.40116599202156067,\n                           0.6046879887580872,\n                           0.13691100478172302,\n                           0.7846069931983948,\n                           0.12908099591732025,\n                           -0.06111999973654747,\n                           0.989749014377594,\n                           0.9954820275306702,\n                           -0.09436299651861191,\n                           0.010502999648451805,\n                           0.9981970191001892,\n                           0.012060999870300293,\n                           0.05880200117826462,\n                           0.9550639986991882,\n                           0.09819000214338303,\n                           0.27966299653053284,\n                           0.6606940031051636,\n                           0.05169999971985817,\n                           0.7488729953765869,\n                           0.07273799926042557,\n                           -0.04034300148487091,\n                           0.9965350031852722,\n                           0.9999179840087891,\n                           0.007191000040620565,\n                           0.010560999624431133,\n                           0.9989050030708313,\n                           0.04436499997973442,\n                           -0.014883999712765217,\n                           0.9694769978523254,\n                           -0.17860299348831177,\n                           0.1679760068655014,\n                           0.9924619793891907,\n                           -0.10775599628686905,\n                           0.058378998190164566,\n                           0.8567489981651306,\n                           -0.28829601407051086,\n                           0.4276289939880371,\n                           0.9473999738693237,\n                           -0.16112199425697327,\n                           0.27653801441192627,\n                           0.5627779960632324,\n                           -0.19747799634933472,\n                           0.8026729822158813,\n                           0.6577669978141785,\n                           -0.11438000202178955,\n                           0.7444859743118286,\n                           0.07901199907064438,\n                           0.0013689999468624592,\n                           0.9968730211257935,\n                           0.07274100184440613,\n                           -0.02020600065588951,\n                           0.9971460103988647,\n                           0.9888780117034912,\n                           0.025808999314904213,\n                           -0.14647500216960907,\n                           0.9453979730606079,\n                           -0.006663000211119652,\n                           0.3258500099182129,\n                           0.6921399831771851,\n                           -0.04972299933433533,\n                           0.7200480103492737,\n                           0.3957499861717224,\n                           -0.08134900033473969,\n                           0.9147480130195618,\n                           0.13914500176906586,\n                           -0.00007899999764049426,\n                           0.9902719855308533,\n                           0.9924669861793518,\n                           -0.10311000049114227,\n                           -0.06616800278425217,\n                           0.9926300048828125,\n                           0.07926999777555466,\n                           0.09165900200605392,\n                           0.900858998298645,\n                           0.2553130090236664,\n                           0.3510949909687042,\n                           0.6513699889183044,\n                           0.18318000435829163,\n                           0.7363160252571106,\n                           0.15978699922561646,\n                           -0.02714099921286106,\n                           0.9867780208587646,\n                           0.9955620169639587,\n                           -0.09379199892282486,\n                           0.0077309999614953995,\n                           0.9991030097007751,\n                           0.01610800065100193,\n                           0.039149001240730286,\n                           0.9764699935913086,\n                           0.12068899720907211,\n                           0.17871999740600586,\n                           0.7859060168266296,\n                           0.10103499889373779,\n                           0.6100350022315979,\n                           0.16579000651836395,\n                           -0.014832000248134136,\n                           0.986050009727478,\n                           0.1655299961566925,\n                           -0.10078699886798859,\n                           0.9810410141944885,\n                           -0.0046790000051259995,\n                           -0.1750659942626953,\n                           0.9845460057258606,\n                           -0.3859579861164093,\n                           -0.06494200229644775,\n                           0.9202280044555664,\n                           -0.3219670057296753,\n                           -0.05600599944591522,\n                           0.9450929760932922,\n                           -0.6471610069274902,\n                           -0.11495299637317657,\n                           0.7536370158195496,\n                           -0.5616440176963806,\n                           -0.078855000436306,\n                           0.8236119747161865,\n                           -0.8379700183868408,\n                           -0.23749999701976776,\n                           0.4913240075111389,\n                           -0.7512590289115906,\n                           -0.1447169929742813,\n                           0.6439470052719116,\n                           -0.9052090048789978,\n                           -0.2807050049304962,\n                           0.3190630078315735,\n                           -0.8249419927597046,\n                           -0.2209009975194931,\n                           0.5202630162239075,\n                           -0.13363699615001678,\n                           0.0291920006275177,\n                           0.9905999898910522,\n                           -0.4039649963378906,\n                           0.0019519999623298645,\n                           0.9147719740867615,\n                           -0.7191359996795654,\n                           0.002443999983370304,\n                           0.6948649883270264,\n                           -0.9637579917907715,\n                           0.026884999126195908,\n                           0.26541900634765625,\n                           -0.9637719988822937,\n                           0.2207069993019104,\n                           -0.14977200329303741,\n                           0.03522900119423866,\n                           0.06716900318861008,\n                           0.9971190094947815,\n                           -0.3620629906654358,\n                           -0.01676199957728386,\n                           0.9320030212402344,\n                           -0.6534259915351868,\n                           0.007120999973267317,\n                           0.7569569945335388,\n                           -0.8528590202331543,\n                           0.11686599999666214,\n                           0.5088940262794495,\n                           -0.8814889788627625,\n                           0.3579840064048767,\n                           0.3079349994659424,\n                           0.0726580023765564,\n                           0.02018200047314167,\n                           0.9971529841423035,\n                           -0.37608298659324646,\n                           -0.025955000892281532,\n                           0.926222026348114,\n                           -0.6568350195884705,\n                           -0.015021000057458878,\n                           0.7538840174674988,\n                           -0.8238760232925415,\n                           0.03257700055837631,\n                           0.5658339858055115,\n                           -0.8688690066337585,\n                           0.13078700006008148,\n                           0.4774540066719055,\n                           0.07265599817037582,\n                           -0.07700400054454803,\n                           0.994379997253418,\n                           -0.0343950018286705,\n                           -0.151870995759964,\n                           0.9878020286560059,\n                           -0.40362000465393066,\n                           -0.05282000079751015,\n                           0.9134010076522827,\n                           -0.37586501240730286,\n                           -0.041078001260757446,\n                           0.9257640242576599,\n                           -0.6878190040588379,\n                           -0.0810059979557991,\n                           0.721347987651825,\n                           -0.6558970212936401,\n                           -0.052101001143455505,\n                           0.7530509829521179,\n                           -0.8708800077438354,\n                           -0.2062380015850067,\n                           0.44613200426101685,\n                           -0.8175939917564392,\n                           -0.12448199838399887,\n                           0.5621780157089233,\n                           -0.8926960229873657,\n                           -0.3055669963359833,\n                           0.33124300837516785,\n                           -0.8565059900283813,\n                           -0.21024300158023834,\n                           0.4713769853115082,\n                           -0.15155400335788727,\n                           -0.025412000715732574,\n                           0.9881219863891602,\n                           -0.41033700108528137,\n                           -0.0026420000940561295,\n                           0.9119300246238708,\n                           -0.7240620255470276,\n                           0.00047400000039488077,\n                           0.6897349953651428,\n                           -0.9655590057373047,\n                           -0.017078999429941177,\n                           0.2596229910850525,\n                           -0.973825991153717,\n                           -0.19711799919605255,\n                           -0.1131730005145073,\n                           0.06214199960231781,\n                           0.08235500007867813,\n                           0.9946640133857727,\n                           -0.3334290087223053,\n                           0.007625999860465527,\n                           0.9427440166473389,\n                           -0.608610987663269,\n                           0.04885999858379364,\n                           0.7919629812240601,\n                           -0.8253309726715088,\n                           0.14631199836730957,\n                           0.5453640222549438,\n                           -0.9105669856071472,\n                           0.3146660029888153,\n                           0.2680560052394867,\n                           0.16523399949073792,\n                           0.04589800164103508,\n                           0.985185980796814,\n                           -0.32260099053382874,\n                           -0.010471000336110592,\n                           0.9464769959449768,\n                           -0.5639140009880066,\n                           0.015166000463068485,\n                           0.8256940245628357,\n                           -0.758965015411377,\n                           0.05617399886250496,\n                           0.6487039923667908,\n                           -0.8382350206375122,\n                           0.14245299994945526,\n                           0.5263739824295044,\n                           0.9727830290794373,\n                           -0.019794000312685966,\n                           0.2308720052242279,\n                           0.9828159809112549,\n                           -0.036465998739004135,\n                           0.18095199763774872,\n                           0.9050639867782593,\n                           -0.02252200059592724,\n                           0.4246790111064911,\n                           0.8354039788246155,\n                           -0.03220000118017197,\n                           0.5486930012702942,\n                           0.6465700268745422,\n                           -0.045921001583337784,\n                           0.7614709734916687,\n                           0.4826749861240387,\n                           -0.04895399883389473,\n                           0.8744300007820129,\n                           0.4453999996185303,\n                           0.17256900668144226,\n                           0.8785430192947388,\n                           0.47231200337409973,\n                           0.13768500089645386,\n                           0.8706120252609253,\n                           0.4824250042438507,\n                           0.3898639976978302,\n                           0.7843930125236511,\n                           0.641398012638092,\n                           0.4275979995727539,\n                           0.6370000243186951,\n                           0.9863939881324768,\n                           0.0994419977068901,\n                           0.13091400265693665,\n                           0.9154840111732483,\n                           0.2120320051908493,\n                           0.34195101261138916,\n                           0.7246469855308533,\n                           0.245046004652977,\n                           0.6440799832344055,\n                           0.35685500502586365,\n                           0.17885500192642212,\n                           0.9168779850006104,\n                           0.14101800322532654,\n                           0.24263200163841248,\n                           0.9598140120506287,\n                           0.9366779923439026,\n                           0.16484400629997253,\n                           0.3089669942855835,\n                           0.7982620000839233,\n                           0.2441370040178299,\n                           0.5506129860877991,\n                           0.4769439995288849,\n                           0.2904820144176483,\n                           0.8295450210571289,\n                           0.4125959873199463,\n                           -0.017246000468730927,\n                           0.9107509851455688,\n                           0.341374009847641,\n                           -0.37689098715782166,\n                           0.8610560297966003,\n                           0.9026100039482117,\n                           0.14119599759578705,\n                           0.40664398670196533,\n                           0.7326020002365112,\n                           0.1491979956626892,\n                           0.6641039848327637,\n                           0.38115599751472473,\n                           0.15792299807071686,\n                           0.9109230041503906,\n                           0.5317370295524597,\n                           -0.02143399976193905,\n                           0.846638023853302,\n                           0.7915729880332947,\n                           -0.3539769947528839,\n                           0.49810999631881714,\n                           0.9087340235710144,\n                           -0.07959599792957306,\n                           0.40971601009368896,\n                           0.9386569857597351,\n                           -0.17680299282073975,\n                           0.29607900977134705,\n                           0.7781569957733154,\n                           -0.19467000663280487,\n                           0.5971400141716003,\n                           0.738847017288208,\n                           -0.07674700021743774,\n                           0.6694890260696411,\n                           0.43915998935699463,\n                           -0.22276799380779266,\n                           0.870352029800415,\n                           0.3863860070705414,\n                           -0.0790880024433136,\n                           0.918940007686615,\n                           0.3576120138168335,\n                           0.07325199991464615,\n                           0.9309930205345154,\n                           0.5227140188217163,\n                           0.16167999804019928,\n                           0.8370360136032104,\n                           0.4246380031108856,\n                           0.3233239948749542,\n                           0.845661997795105,\n                           0.733618974685669,\n                           0.48907899856567383,\n                           0.4718089997768402,\n                           0.9886019825935364,\n                           -0.10717800259590149,\n                           0.10573200136423111,\n                           0.9131960272789001,\n                           -0.22303399443626404,\n                           0.3410690128803253,\n                           0.7163559794425964,\n                           -0.25636500120162964,\n                           0.6489310264587402,\n                           0.35149699449539185,\n                           -0.15968100726604462,\n                           0.922469973564148,\n                           0.07999800145626068,\n                           -0.2107039988040924,\n                           0.9742709994316101,\n                           0.9883249998092651,\n                           0.04732999950647354,\n                           0.14482200145721436,\n                           0.9210500121116638,\n                           0.07413999736309052,\n                           0.3823229968547821,\n                           0.6804890036582947,\n                           0.11895299702882767,\n                           0.7230389714241028,\n                           0.4935390055179596,\n                           -0.10269299894571304,\n                           0.8636389970779419,\n                           0.3912479877471924,\n                           -0.4752289950847626,\n                           0.7880880236625671,\n                           0.9700270295143127,\n                           0.07970499992370605,\n                           0.2295520007610321,\n                           0.831250011920929,\n                           0.10592100024223328,\n                           0.5457149744033813,\n                           0.4774230122566223,\n                           0.13252699375152588,\n                           0.8686220049858093,\n                           0.47922399640083313,\n                           -0.0024129999801516533,\n                           0.877689003944397,\n                           0.6902980208396912,\n                           -0.29711300134658813,\n                           0.6597059965133667,\n                           0.6312130093574524,\n                           0.4550989866256714,\n                           0.628055989742279,\n                           0.26494699716567993,\n                           0.5426689982414246,\n                           0.797065019607544,\n                           0.4216960072517395,\n                           0.6728450059890747,\n                           0.6078259944915771,\n                           0.7324270009994507,\n                           0.5829970240592957,\n                           0.35166099667549133,\n                           0.5086709856987,\n                           0.8606399893760681,\n                           -0.023507000878453255,\n                           0.7640720009803772,\n                           0.6449369788169861,\n                           -0.015798000618815422,\n                           0.19029100239276886,\n                           0.2773289978504181,\n                           -0.9417420029640198,\n                           0.02588699944317341,\n                           0.0005750000127591193,\n                           -0.9996650218963623,\n                           -0.33045700192451477,\n                           -0.4387669861316681,\n                           -0.8356329798698425,\n                           -0.6271269917488098,\n                           -0.4645389914512634,\n                           -0.6252319812774658,\n                           -0.02311599999666214,\n                           0.2469020038843155,\n                           0.9687650203704834,\n                           -0.012950999662280083,\n                           0.45514100790023804,\n                           0.8903250098228455,\n                           -0.001180000021122396,\n                           0.9888520240783691,\n                           0.14889399707317352,\n                           0.019520999863743782,\n                           0.6841210126876831,\n                           -0.7291070222854614,\n                           0.012253000400960445,\n                           0.007784999907016754,\n                           -0.9998949766159058,\n                           0.3314639925956726,\n                           -0.3832260072231293,\n                           0.8621309995651245,\n                           0.08274699747562408,\n                           -0.16047699749469757,\n                           0.9835649728775024,\n                           -0.381630003452301,\n                           0.638043999671936,\n                           0.6687729954719543,\n                           -0.44988399744033813,\n                           0.787883996963501,\n                           -0.42052799463272095,\n                           -0.2780170142650604,\n                           0.5983560085296631,\n                           -0.7514500021934509,\n                           0.7378140091896057,\n                           -0.4918749928474426,\n                           0.4622659981250763,\n                           0.6153389811515808,\n                           -0.45540300011634827,\n                           0.6434019804000854,\n                           -0.43678900599479675,\n                           0.33411499857902527,\n                           0.8352140188217163,\n                           -0.7429530024528503,\n                           0.6388909816741943,\n                           -0.1995989978313446,\n                           -0.7432950139045715,\n                           0.5977380275726318,\n                           -0.3003700077533722,\n                           0.7197920083999634,\n                           0.5168960094451904,\n                           0.4633769989013672,\n                           0.22183099389076233,\n                           0.4485720098018646,\n                           0.8657789826393127,\n                           0.08203200250864029,\n                           0.15848000347614288,\n                           0.9839479923248291,\n                           0.5953459739685059,\n                           0.4811680018901825,\n                           0.6434599757194519,\n                           -0.37556400895118713,\n                           -0.6215270161628723,\n                           0.6875,\n                           -0.42666301131248474,\n                           -0.33534398674964905,\n                           0.8399419784545898,\n                           -0.44476398825645447,\n                           -0.7887529730796814,\n                           -0.42432600259780884,\n                           -0.7557309865951538,\n                           -0.6222699880599976,\n                           -0.20408600568771362,\n                           -0.4292669892311096,\n                           -0.5361850261688232,\n                           -0.7267979979515076,\n                           -0.7655900120735168,\n                           -0.5671039819717407,\n                           -0.30375200510025024,\n                           0.007348000071942806,\n                           -0.21113499999046326,\n                           0.9774289727210999,\n                           -0.01990099996328354,\n                           -0.4373210072517395,\n                           0.8990849852561951,\n                           -0.008775000460445881,\n                           -0.9864199757575989,\n                           0.16400499641895294,\n                           0.024855999276041985,\n                           -0.6829339861869812,\n                           -0.7300570011138916,\n                           0.014514000155031681,\n                           0.03655200079083443,\n                           -0.9992259740829468,\n                           0.40192899107933044,\n                           -0.4676550030708313,\n                           0.7872430086135864,\n                           0.41696101427078247,\n                           -0.6813820004463196,\n                           0.6015490293502808,\n                           0.5033609867095947,\n                           -0.8637740015983582,\n                           -0.022839000448584557,\n                           0.2058819979429245,\n                           -0.2945750057697296,\n                           -0.9331870079040527,\n                           -0.2351589947938919,\n                           0.5535579919815063,\n                           -0.7989199757575989,\n                           0.6533820033073425,\n                           -0.435588002204895,\n                           0.619156002998352,\n                           0.7555500268936157,\n                           -0.554410994052887,\n                           0.3489600121974945,\n                           0.7765160202980042,\n                           -0.6298360228538513,\n                           -0.01814199984073639,\n                           0.025975000113248825,\n                           0.008264999836683273,\n                           -0.9996280074119568,\n                           -0.6086519956588745,\n                           0.49536699056625366,\n                           -0.6198019981384277,\n                           -0.9813200235366821,\n                           0.19238099455833435,\n                           0,\n                           -0.831650972366333,\n                           0.5552989840507507,\n                           0,\n                           -0.4425640106201172,\n                           0.38308998942375183,\n                           0.8107889890670776,\n                           -0.5623509883880615,\n                           0.11026400327682495,\n                           0.8195139765739441,\n                           0.367917001247406,\n                           -0.15178599953651428,\n                           0.917385995388031,\n                           0.3960669934749603,\n                           -0.07774800062179565,\n                           0.9149240255355835,\n                           0.3283520042896271,\n                           -0.13562799990177155,\n                           0.9347670078277588,\n                           0.3530749976634979,\n                           -0.06952299922704697,\n                           0.9330080151557922,\n                           -0.5935590267181396,\n                           0.20035800337791443,\n                           0.7794510126113892,\n                           -0.6201800107955933,\n                           0.12245599925518036,\n                           0.7748429775238037,\n                           -0.5552989840507507,\n                           0.831650972366333,\n                           0,\n                           -0.2616960108280182,\n                           0.523730993270874,\n                           0.8106920123100281,\n                           0.2819640040397644,\n                           -0.2819199860095978,\n                           0.9170699715614319,\n                           0.25169798731803894,\n                           -0.25161200761795044,\n                           0.9345269799232483,\n                           -0.4710330069065094,\n                           0.41249701380729675,\n                           0.7797269821166992,\n                           -0.19238099455833435,\n                           0.9813200235366821,\n                           0,\n                           -0.04031100124120712,\n                           0.5840420126914978,\n                           0.8107219934463501,\n                           0.1517850011587143,\n                           -0.3678950071334839,\n                           0.9173960089683533,\n                           0.13561999797821045,\n                           -0.3282899856567383,\n                           0.9347900152206421,\n                           -0.27737799286842346,\n                           0.561601996421814,\n                           0.779528021812439,\n                           -1,\n                           0,\n                           0,\n                           0.29074999690055847,\n                           0.5413560271263123,\n                           0.7889220118522644,\n                           0.07767199724912643,\n                           -0.39607399702072144,\n                           0.9149270057678223,\n                           0.0693729966878891,\n                           -0.3530940115451813,\n                           0.9330130219459534,\n                           -0.12221000343561172,\n                           0.6202139854431152,\n                           0.7748550176620483,\n                           0.19238099455833435,\n                           0.9813200235366821,\n                           0,\n                           0.5552989840507507,\n                           0.831650972366333,\n                           0,\n                           0.38308998942375183,\n                           0.4425640106201172,\n                           0.8107889890670776,\n                           0.11026400327682495,\n                           0.5623509883880615,\n                           0.8195139765739441,\n                           -0.15178599953651428,\n                           -0.367917001247406,\n                           0.917385995388031,\n                           -0.07774800062179565,\n                           -0.3960669934749603,\n                           0.9149240255355835,\n                           -0.13562799990177155,\n                           -0.3283520042896271,\n                           0.9347670078277588,\n                           -0.06952299922704697,\n                           -0.3530749976634979,\n                           0.9330080151557922,\n                           0.20035800337791443,\n                           0.5935590267181396,\n                           0.7794510126113892,\n                           0.12245599925518036,\n                           0.6201800107955933,\n                           0.7748429775238037,\n                           0.831650972366333,\n                           0.5552989840507507,\n                           0,\n                           0.523730993270874,\n                           0.2616960108280182,\n                           0.8106920123100281,\n                           -0.2819199860095978,\n                           -0.2819640040397644,\n                           0.9170699715614319,\n                           -0.25161200761795044,\n                           -0.25169798731803894,\n                           0.9345269799232483,\n                           0.41249701380729675,\n                           0.4710330069065094,\n                           0.7797269821166992,\n                           0.9813200235366821,\n                           0.19238099455833435,\n                           0,\n                           0.5840420126914978,\n                           0.04031100124120712,\n                           0.8107219934463501,\n                           -0.3678950071334839,\n                           -0.1517850011587143,\n                           0.9173960089683533,\n                           -0.3282899856567383,\n                           -0.13561999797821045,\n                           0.9347900152206421,\n                           0.561601996421814,\n                           0.27737799286842346,\n                           0.779528021812439,\n                           -1,\n                           0,\n                           0,\n                           0.5413560271263123,\n                           -0.29074999690055847,\n                           0.7889220118522644,\n                           -0.39607399702072144,\n                           -0.07767199724912643,\n                           0.9149270057678223,\n                           -0.3530940115451813,\n                           -0.0693729966878891,\n                           0.9330130219459534,\n                           0.6202139854431152,\n                           0.12221000343561172,\n                           0.7748550176620483,\n                           0.9813200235366821,\n                           -0.19238099455833435,\n                           0,\n                           0.831650972366333,\n                           -0.5552989840507507,\n                           0,\n                           0.4425640106201172,\n                           -0.38308998942375183,\n                           0.8107889890670776,\n                           0.5623509883880615,\n                           -0.11026400327682495,\n                           0.8195139765739441,\n                           -0.367917001247406,\n                           0.15178599953651428,\n                           0.917385995388031,\n                           -0.3960669934749603,\n                           0.07774800062179565,\n                           0.9149240255355835,\n                           -0.3283520042896271,\n                           0.13562799990177155,\n                           0.9347670078277588,\n                           -0.3530749976634979,\n                           0.06952299922704697,\n                           0.9330080151557922,\n                           0.5935590267181396,\n                           -0.20035800337791443,\n                           0.7794510126113892,\n                           0.6201800107955933,\n                           -0.12245599925518036,\n                           0.7748429775238037,\n                           0.5552989840507507,\n                           -0.831650972366333,\n                           0,\n                           0.2616960108280182,\n                           -0.523730993270874,\n                           0.8106920123100281,\n                           -0.2819640040397644,\n                           0.2819199860095978,\n                           0.9170699715614319,\n                           -0.25169798731803894,\n                           0.25161200761795044,\n                           0.9345269799232483,\n                           0.4710330069065094,\n                           -0.41249701380729675,\n                           0.7797269821166992,\n                           0.19238099455833435,\n                           -0.9813200235366821,\n                           0,\n                           0.04031100124120712,\n                           -0.5840420126914978,\n                           0.8107219934463501,\n                           -0.1517850011587143,\n                           0.3678950071334839,\n                           0.9173960089683533,\n                           -0.13561999797821045,\n                           0.3282899856567383,\n                           0.9347900152206421,\n                           0.27737799286842346,\n                           -0.561601996421814,\n                           0.779528021812439,\n                           -1,\n                           0,\n                           0,\n                           -0.29074999690055847,\n                           -0.5413560271263123,\n                           0.7889220118522644,\n                           -0.07767199724912643,\n                           0.39607399702072144,\n                           0.9149270057678223,\n                           -0.0693729966878891,\n                           0.3530940115451813,\n                           0.9330130219459534,\n                           0.12221000343561172,\n                           -0.6202139854431152,\n                           0.7748550176620483,\n                           -0.19238099455833435,\n                           -0.9813200235366821,\n                           0,\n                           -0.5552989840507507,\n                           -0.831650972366333,\n                           0,\n                           -0.38308998942375183,\n                           -0.4425640106201172,\n                           0.8107889890670776,\n                           -0.11026400327682495,\n                           -0.5623509883880615,\n                           0.8195139765739441,\n                           0.15178599953651428,\n                           0.367917001247406,\n                           0.917385995388031,\n                           0.07774800062179565,\n                           0.3960669934749603,\n                           0.9149240255355835,\n                           0.13562799990177155,\n                           0.3283520042896271,\n                           0.9347670078277588,\n                           0.06952299922704697,\n                           0.3530749976634979,\n                           0.9330080151557922,\n                           -0.20035800337791443,\n                           -0.5935590267181396,\n                           0.7794510126113892,\n                           -0.12245599925518036,\n                           -0.6201800107955933,\n                           0.7748429775238037,\n                           -0.831650972366333,\n                           -0.5552989840507507,\n                           0,\n                           -0.523730993270874,\n                           -0.2616960108280182,\n                           0.8106920123100281,\n                           0.2819199860095978,\n                           0.2819640040397644,\n                           0.9170699715614319,\n                           0.25161200761795044,\n                           0.25169798731803894,\n                           0.9345269799232483,\n                           -0.41249701380729675,\n                           -0.4710330069065094,\n                           0.7797269821166992,\n                           -0.9813200235366821,\n                           -0.19238099455833435,\n                           0,\n                           -0.5840420126914978,\n                           -0.04031100124120712,\n                           0.8107219934463501,\n                           0.3678950071334839,\n                           0.1517850011587143,\n                           0.9173960089683533,\n                           0.3282899856567383,\n                           0.13561999797821045,\n                           0.9347900152206421,\n                           -0.561601996421814,\n                           -0.27737799286842346,\n                           0.779528021812439,\n                           -1,\n                           0,\n                           0,\n                           -0.5413560271263123,\n                           0.29074999690055847,\n                           0.7889220118522644,\n                           0.39607399702072144,\n                           0.07767199724912643,\n                           0.9149270057678223,\n                           0.3530940115451813,\n                           0.0693729966878891,\n                           0.9330130219459534,\n                           -0.6202139854431152,\n                           -0.12221000343561172,\n                           0.7748550176620483,\n                           -0.6201800107955933,\n                           0.12245599925518036,\n                           0.7748429775238037,\n                           -0.5616469979286194,\n                           0.27755099534988403,\n                           0.7794349789619446,\n                           -0.8979210257530212,\n                           0.37159600853919983,\n                           0.23590999841690063,\n                           -0.9542099833488464,\n                           0.18841099739074707,\n                           0.23234599828720093,\n                           -0.9101200103759766,\n                           0.3766449987888336,\n                           0.17268399894237518,\n                           -0.966795027256012,\n                           0.19089600443840027,\n                           0.16990099847316742,\n                           -0.8549879789352417,\n                           0.35383298993110657,\n                           0.3792079985141754,\n                           -0.9100499749183655,\n                           0.17969100177288055,\n                           0.3735229969024658,\n                           -0.8064150214195251,\n                           0.2724289894104004,\n                           0.5248600244522095,\n                           -0.8383409976959229,\n                           0.16553199291229248,\n                           0.5194069743156433,\n                           -0.4125959873199463,\n                           0.47094500064849854,\n                           0.7797279953956604,\n                           -0.687192976474762,\n                           0.687192976474762,\n                           0.23565199971199036,\n                           -0.6965190172195435,\n                           0.6965190172195435,\n                           0.17240400612354279,\n                           -0.6544880270957947,\n                           0.6544870138168335,\n                           0.37853899598121643,\n                           -0.6404970288276672,\n                           0.5611429810523987,\n                           0.5242909789085388,\n                           -0.20047900080680847,\n                           0.5933949947357178,\n                           0.7795450091362,\n                           -0.3715969920158386,\n                           0.8979210257530212,\n                           0.23590999841690063,\n                           -0.3766449987888336,\n                           0.9101200103759766,\n                           0.17268399894237518,\n                           -0.35383298993110657,\n                           0.8549879789352417,\n                           0.3792079985141754,\n                           -0.3770729899406433,\n                           0.7630789875984192,\n                           0.5249059796333313,\n                           -0.12245900183916092,\n                           0.6201940178871155,\n                           0.7748309969902039,\n                           -0.18841099739074707,\n                           0.9542099833488464,\n                           0.23234599828720093,\n                           -0.19089600443840027,\n                           0.966795027256012,\n                           0.16990099847316742,\n                           -0.17969200015068054,\n                           0.9100499749183655,\n                           0.3735229969024658,\n                           -0.16553199291229248,\n                           0.8383409976959229,\n                           0.5194069743156433,\n                           0.12245599925518036,\n                           0.6201800107955933,\n                           0.7748429775238037,\n                           0.27755099534988403,\n                           0.5616469979286194,\n                           0.7794349789619446,\n                           0.37159600853919983,\n                           0.8979210257530212,\n                           0.23590999841690063,\n                           0.18841099739074707,\n                           0.9542099833488464,\n                           0.23234599828720093,\n                           0.3766449987888336,\n                           0.9101200103759766,\n                           0.17268399894237518,\n                           0.19089600443840027,\n                           0.966795027256012,\n                           0.16990099847316742,\n                           0.35383298993110657,\n                           0.8549879789352417,\n                           0.3792079985141754,\n                           0.17969100177288055,\n                           0.9100499749183655,\n                           0.3735229969024658,\n                           0.2724289894104004,\n                           0.8064150214195251,\n                           0.5248600244522095,\n                           0.16553199291229248,\n                           0.8383409976959229,\n                           0.5194069743156433,\n                           0.47094500064849854,\n                           0.4125959873199463,\n                           0.7797279953956604,\n                           0.687192976474762,\n                           0.687192976474762,\n                           0.23565199971199036,\n                           0.6965190172195435,\n                           0.6965190172195435,\n                           0.17240400612354279,\n                           0.6544870138168335,\n                           0.6544880270957947,\n                           0.37853899598121643,\n                           0.5611429810523987,\n                           0.6404970288276672,\n                           0.5242909789085388,\n                           0.5933949947357178,\n                           0.20047900080680847,\n                           0.7795450091362,\n                           0.8979210257530212,\n                           0.3715969920158386,\n                           0.23590999841690063,\n                           0.9101200103759766,\n                           0.3766449987888336,\n                           0.17268399894237518,\n                           0.8549879789352417,\n                           0.35383298993110657,\n                           0.3792079985141754,\n                           0.7630789875984192,\n                           0.3770729899406433,\n                           0.5249059796333313,\n                           0.6201940178871155,\n                           0.12245900183916092,\n                           0.7748309969902039,\n                           0.9542099833488464,\n                           0.18841099739074707,\n                           0.23234599828720093,\n                           0.966795027256012,\n                           0.19089600443840027,\n                           0.16990099847316742,\n                           0.9100499749183655,\n                           0.17969200015068054,\n                           0.3735229969024658,\n                           0.8383409976959229,\n                           0.16553199291229248,\n                           0.5194069743156433,\n                           0.6201800107955933,\n                           -0.12245599925518036,\n                           0.7748429775238037,\n                           0.5616469979286194,\n                           -0.27755099534988403,\n                           0.7794349789619446,\n                           0.8979210257530212,\n                           -0.37159600853919983,\n                           0.23590999841690063,\n                           0.9542099833488464,\n                           -0.18841099739074707,\n                           0.23234599828720093,\n                           0.9101200103759766,\n                           -0.3766449987888336,\n                           0.17268399894237518,\n                           0.966795027256012,\n                           -0.19089600443840027,\n                           0.16990099847316742,\n                           0.8549879789352417,\n                           -0.35383298993110657,\n                           0.3792079985141754,\n                           0.9100499749183655,\n                           -0.17969100177288055,\n                           0.3735229969024658,\n                           0.8064150214195251,\n                           -0.2724289894104004,\n                           0.5248600244522095,\n                           0.8383409976959229,\n                           -0.16553199291229248,\n                           0.5194069743156433,\n                           0.4125959873199463,\n                           -0.47094500064849854,\n                           0.7797279953956604,\n                           0.687192976474762,\n                           -0.687192976474762,\n                           0.23565199971199036,\n                           0.6965190172195435,\n                           -0.6965190172195435,\n                           0.17240400612354279,\n                           0.6544880270957947,\n                           -0.6544870138168335,\n                           0.37853899598121643,\n                           0.6404970288276672,\n                           -0.5611429810523987,\n                           0.5242909789085388,\n                           0.20047900080680847,\n                           -0.5933949947357178,\n                           0.7795450091362,\n                           0.3715969920158386,\n                           -0.8979210257530212,\n                           0.23590999841690063,\n                           0.3766449987888336,\n                           -0.9101200103759766,\n                           0.17268399894237518,\n                           0.35383298993110657,\n                           -0.8549879789352417,\n                           0.3792079985141754,\n                           0.3770729899406433,\n                           -0.7630789875984192,\n                           0.5249059796333313,\n                           0.12245900183916092,\n                           -0.6201940178871155,\n                           0.7748309969902039,\n                           0.18841099739074707,\n                           -0.9542099833488464,\n                           0.23234599828720093,\n                           0.19089600443840027,\n                           -0.966795027256012,\n                           0.16990099847316742,\n                           0.17969200015068054,\n                           -0.9100499749183655,\n                           0.3735229969024658,\n                           0.16553199291229248,\n                           -0.8383409976959229,\n                           0.5194069743156433,\n                           -0.12245599925518036,\n                           -0.6201800107955933,\n                           0.7748429775238037,\n                           -0.27755099534988403,\n                           -0.5616469979286194,\n                           0.7794349789619446,\n                           -0.37159600853919983,\n                           -0.8979210257530212,\n                           0.23590999841690063,\n                           -0.18841099739074707,\n                           -0.9542099833488464,\n                           0.23234599828720093,\n                           -0.3766449987888336,\n                           -0.9101200103759766,\n                           0.17268399894237518,\n                           -0.19089600443840027,\n                           -0.966795027256012,\n                           0.16990099847316742,\n                           -0.35383298993110657,\n                           -0.8549879789352417,\n                           0.3792079985141754,\n                           -0.17969100177288055,\n                           -0.9100499749183655,\n                           0.3735229969024658,\n                           -0.2724289894104004,\n                           -0.8064150214195251,\n                           0.5248600244522095,\n                           -0.16553199291229248,\n                           -0.8383409976959229,\n                           0.5194069743156433,\n                           -0.47094500064849854,\n                           -0.4125959873199463,\n                           0.7797279953956604,\n                           -0.687192976474762,\n                           -0.687192976474762,\n                           0.23565199971199036,\n                           -0.6965190172195435,\n                           -0.6965190172195435,\n                           0.17240400612354279,\n                           -0.6544870138168335,\n                           -0.6544880270957947,\n                           0.37853899598121643,\n                           -0.5611429810523987,\n                           -0.6404970288276672,\n                           0.5242909789085388,\n                           -0.5933949947357178,\n                           -0.20047900080680847,\n                           0.7795450091362,\n                           -0.8979210257530212,\n                           -0.3715969920158386,\n                           0.23590999841690063,\n                           -0.9101200103759766,\n                           -0.3766449987888336,\n                           0.17268399894237518,\n                           -0.8549879789352417,\n                           -0.35383298993110657,\n                           0.3792079985141754,\n                           -0.7630789875984192,\n                           -0.3770729899406433,\n                           0.5249059796333313,\n                           -0.6201940178871155,\n                           -0.12245900183916092,\n                           0.7748309969902039,\n                           -0.9542099833488464,\n                           -0.18841099739074707,\n                           0.23234599828720093,\n                           -0.966795027256012,\n                           -0.19089600443840027,\n                           0.16990099847316742,\n                           -0.9100499749183655,\n                           -0.17969200015068054,\n                           0.3735229969024658,\n                           -0.8383409976959229,\n                           -0.16553199291229248,\n                           0.5194069743156433};\n\nfloat teapotTexCoords[] = {2,\n                           2,\n                           0,\n                           1.75,\n                           2,\n                           0,\n                           1.75,\n                           1.975000023841858,\n                           0,\n                           2,\n                           1.975000023841858,\n                           0,\n                           1.75,\n                           1.9500000476837158,\n                           0,\n                           2,\n                           1.9500000476837158,\n                           0,\n                           1.75,\n                           1.9249999523162842,\n                           0,\n                           2,\n                           1.9249999523162842,\n                           0,\n                           1.75,\n                           1.899999976158142,\n                           0,\n                           2,\n                           1.899999976158142,\n                           0,\n                           1.5,\n                           2,\n                           0,\n                           1.5,\n                           1.975000023841858,\n                           0,\n                           1.5,\n                           1.9500000476837158,\n                           0,\n                           1.5,\n                           1.9249999523162842,\n                           0,\n                           1.5,\n                           1.899999976158142,\n                           0,\n                           1.25,\n                           2,\n                           0,\n                           1.25,\n                           1.975000023841858,\n                           0,\n                           1.25,\n                           1.9500000476837158,\n                           0,\n                           1.25,\n                           1.9249999523162842,\n                           0,\n                           1.25,\n                           1.899999976158142,\n                           0,\n                           1,\n                           2,\n                           0,\n                           1,\n                           1.975000023841858,\n                           0,\n                           1,\n                           1.9500000476837158,\n                           0,\n                           1,\n                           1.9249999523162842,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           1,\n                           2,\n                           0,\n                           0.75,\n                           2,\n                           0,\n                           0.75,\n                           1.975000023841858,\n                           0,\n                           1,\n                           1.975000023841858,\n                           0,\n                           0.75,\n                           1.9500000476837158,\n                           0,\n                           1,\n                           1.9500000476837158,\n                           0,\n                           0.75,\n                           1.9249999523162842,\n                           0,\n                           1,\n                           1.9249999523162842,\n                           0,\n                           0.75,\n                           1.899999976158142,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           0.5,\n                           2,\n                           0,\n                           0.5,\n                           1.975000023841858,\n                           0,\n                           0.5,\n                           1.9500000476837158,\n                           0,\n                           0.5,\n                           1.9249999523162842,\n                           0,\n                           0.5,\n                           1.899999976158142,\n                           0,\n                           0.25,\n                           2,\n                           0,\n                           0.25,\n                           1.975000023841858,\n                           0,\n                           0.25,\n                           1.9500000476837158,\n                           0,\n                           0.25,\n                           1.9249999523162842,\n                           0,\n                           0.25,\n                           1.899999976158142,\n                           0,\n                           0,\n                           2,\n                           0,\n                           0,\n                           1.975000023841858,\n                           0,\n                           0,\n                           1.9500000476837158,\n                           0,\n                           0,\n                           1.9249999523162842,\n                           0,\n                           0,\n                           1.899999976158142,\n                           0,\n                           2,\n                           2,\n                           0,\n                           1.75,\n                           2,\n                           0,\n                           1.75,\n                           1.975000023841858,\n                           0,\n                           2,\n                           1.975000023841858,\n                           0,\n                           1.75,\n                           1.9500000476837158,\n                           0,\n                           2,\n                           1.9500000476837158,\n                           0,\n                           1.75,\n                           1.9249999523162842,\n                           0,\n                           2,\n                           1.9249999523162842,\n                           0,\n                           1.75,\n                           1.899999976158142,\n                           0,\n                           2,\n                           1.899999976158142,\n                           0,\n                           1.5,\n                           2,\n                           0,\n                           1.5,\n                           1.975000023841858,\n                           0,\n                           1.5,\n                           1.9500000476837158,\n                           0,\n                           1.5,\n                           1.9249999523162842,\n                           0,\n                           1.5,\n                           1.899999976158142,\n                           0,\n                           1.25,\n                           2,\n                           0,\n                           1.25,\n                           1.975000023841858,\n                           0,\n                           1.25,\n                           1.9500000476837158,\n                           0,\n                           1.25,\n                           1.9249999523162842,\n                           0,\n                           1.25,\n                           1.899999976158142,\n                           0,\n                           1,\n                           2,\n                           0,\n                           1,\n                           1.975000023841858,\n                           0,\n                           1,\n                           1.9500000476837158,\n                           0,\n                           1,\n                           1.9249999523162842,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           1,\n                           2,\n                           0,\n                           0.75,\n                           2,\n                           0,\n                           0.75,\n                           1.975000023841858,\n                           0,\n                           1,\n                           1.975000023841858,\n                           0,\n                           0.75,\n                           1.9500000476837158,\n                           0,\n                           1,\n                           1.9500000476837158,\n                           0,\n                           0.75,\n                           1.9249999523162842,\n                           0,\n                           1,\n                           1.9249999523162842,\n                           0,\n                           0.75,\n                           1.899999976158142,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           0.5,\n                           2,\n                           0,\n                           0.5,\n                           1.975000023841858,\n                           0,\n                           0.5,\n                           1.9500000476837158,\n                           0,\n                           0.5,\n                           1.9249999523162842,\n                           0,\n                           0.5,\n                           1.899999976158142,\n                           0,\n                           0.25,\n                           2,\n                           0,\n                           0.25,\n                           1.975000023841858,\n                           0,\n                           0.25,\n                           1.9500000476837158,\n                           0,\n                           0.25,\n                           1.9249999523162842,\n                           0,\n                           0.25,\n                           1.899999976158142,\n                           0,\n                           0,\n                           2,\n                           0,\n                           0,\n                           1.975000023841858,\n                           0,\n                           0,\n                           1.9500000476837158,\n                           0,\n                           0,\n                           1.9249999523162842,\n                           0,\n                           0,\n                           1.899999976158142,\n                           0,\n                           2,\n                           1.899999976158142,\n                           0,\n                           1.75,\n                           1.899999976158142,\n                           0,\n                           1.75,\n                           1.6749999523162842,\n                           0,\n                           2,\n                           1.6749999523162842,\n                           0,\n                           1.75,\n                           1.4500000476837158,\n                           0,\n                           2,\n                           1.4500000476837158,\n                           0,\n                           1.75,\n                           1.225000023841858,\n                           0,\n                           2,\n                           1.225000023841858,\n                           0,\n                           1.75,\n                           1,\n                           0,\n                           2,\n                           1,\n                           0,\n                           1.5,\n                           1.899999976158142,\n                           0,\n                           1.5,\n                           1.6749999523162842,\n                           0,\n                           1.5,\n                           1.4500000476837158,\n                           0,\n                           1.5,\n                           1.225000023841858,\n                           0,\n                           1.5,\n                           1,\n                           0,\n                           1.25,\n                           1.899999976158142,\n                           0,\n                           1.25,\n                           1.6749999523162842,\n                           0,\n                           1.25,\n                           1.4500000476837158,\n                           0,\n                           1.25,\n                           1.225000023841858,\n                           0,\n                           1.25,\n                           1,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           1,\n                           1.6749999523162842,\n                           0,\n                           1,\n                           1.4500000476837158,\n                           0,\n                           1,\n                           1.225000023841858,\n                           0,\n                           1,\n                           1,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           0.75,\n                           1.899999976158142,\n                           0,\n                           0.75,\n                           1.6749999523162842,\n                           0,\n                           1,\n                           1.6749999523162842,\n                           0,\n                           0.75,\n                           1.4500000476837158,\n                           0,\n                           1,\n                           1.4500000476837158,\n                           0,\n                           0.75,\n                           1.225000023841858,\n                           0,\n                           1,\n                           1.225000023841858,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.5,\n                           1.899999976158142,\n                           0,\n                           0.5,\n                           1.6749999523162842,\n                           0,\n                           0.5,\n                           1.4500000476837158,\n                           0,\n                           0.5,\n                           1.225000023841858,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.25,\n                           1.899999976158142,\n                           0,\n                           0.25,\n                           1.6749999523162842,\n                           0,\n                           0.25,\n                           1.4500000476837158,\n                           0,\n                           0.25,\n                           1.225000023841858,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0,\n                           1.899999976158142,\n                           0,\n                           0,\n                           1.6749999523162842,\n                           0,\n                           0,\n                           1.4500000476837158,\n                           0,\n                           0,\n                           1.225000023841858,\n                           0,\n                           0,\n                           1,\n                           0,\n                           2,\n                           1.899999976158142,\n                           0,\n                           1.75,\n                           1.899999976158142,\n                           0,\n                           1.75,\n                           1.6749999523162842,\n                           0,\n                           2,\n                           1.6749999523162842,\n                           0,\n                           1.75,\n                           1.4500000476837158,\n                           0,\n                           2,\n                           1.4500000476837158,\n                           0,\n                           1.75,\n                           1.225000023841858,\n                           0,\n                           2,\n                           1.225000023841858,\n                           0,\n                           1.75,\n                           1,\n                           0,\n                           2,\n                           1,\n                           0,\n                           1.5,\n                           1.899999976158142,\n                           0,\n                           1.5,\n                           1.6749999523162842,\n                           0,\n                           1.5,\n                           1.4500000476837158,\n                           0,\n                           1.5,\n                           1.225000023841858,\n                           0,\n                           1.5,\n                           1,\n                           0,\n                           1.25,\n                           1.899999976158142,\n                           0,\n                           1.25,\n                           1.6749999523162842,\n                           0,\n                           1.25,\n                           1.4500000476837158,\n                           0,\n                           1.25,\n                           1.225000023841858,\n                           0,\n                           1.25,\n                           1,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           1,\n                           1.6749999523162842,\n                           0,\n                           1,\n                           1.4500000476837158,\n                           0,\n                           1,\n                           1.225000023841858,\n                           0,\n                           1,\n                           1,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           0.75,\n                           1.899999976158142,\n                           0,\n                           0.75,\n                           1.6749999523162842,\n                           0,\n                           1,\n                           1.6749999523162842,\n                           0,\n                           0.75,\n                           1.4500000476837158,\n                           0,\n                           1,\n                           1.4500000476837158,\n                           0,\n                           0.75,\n                           1.225000023841858,\n                           0,\n                           1,\n                           1.225000023841858,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.5,\n                           1.899999976158142,\n                           0,\n                           0.5,\n                           1.6749999523162842,\n                           0,\n                           0.5,\n                           1.4500000476837158,\n                           0,\n                           0.5,\n                           1.225000023841858,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.25,\n                           1.899999976158142,\n                           0,\n                           0.25,\n                           1.6749999523162842,\n                           0,\n                           0.25,\n                           1.4500000476837158,\n                           0,\n                           0.25,\n                           1.225000023841858,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0,\n                           1.899999976158142,\n                           0,\n                           0,\n                           1.6749999523162842,\n                           0,\n                           0,\n                           1.4500000476837158,\n                           0,\n                           0,\n                           1.225000023841858,\n                           0,\n                           0,\n                           1,\n                           0,\n                           2,\n                           1,\n                           0,\n                           1.75,\n                           1,\n                           0,\n                           1.75,\n                           0.8500000238418579,\n                           0,\n                           2,\n                           0.8500000238418579,\n                           0,\n                           1.75,\n                           0.699999988079071,\n                           0,\n                           2,\n                           0.699999988079071,\n                           0,\n                           1.75,\n                           0.550000011920929,\n                           0,\n                           2,\n                           0.550000011920929,\n                           0,\n                           1.75,\n                           0.4000000059604645,\n                           0,\n                           2,\n                           0.4000000059604645,\n                           0,\n                           1.5,\n                           1,\n                           0,\n                           1.5,\n                           0.8500000238418579,\n                           0,\n                           1.5,\n                           0.699999988079071,\n                           0,\n                           1.5,\n                           0.550000011920929,\n                           0,\n                           1.5,\n                           0.4000000059604645,\n                           0,\n                           1.25,\n                           1,\n                           0,\n                           1.25,\n                           0.8500000238418579,\n                           0,\n                           1.25,\n                           0.699999988079071,\n                           0,\n                           1.25,\n                           0.550000011920929,\n                           0,\n                           1.25,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           1,\n                           0,\n                           1,\n                           0.8500000238418579,\n                           0,\n                           1,\n                           0.699999988079071,\n                           0,\n                           1,\n                           0.550000011920929,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.8500000238418579,\n                           0,\n                           1,\n                           0.8500000238418579,\n                           0,\n                           0.75,\n                           0.699999988079071,\n                           0,\n                           1,\n                           0.699999988079071,\n                           0,\n                           0.75,\n                           0.550000011920929,\n                           0,\n                           1,\n                           0.550000011920929,\n                           0,\n                           0.75,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.8500000238418579,\n                           0,\n                           0.5,\n                           0.699999988079071,\n                           0,\n                           0.5,\n                           0.550000011920929,\n                           0,\n                           0.5,\n                           0.4000000059604645,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.8500000238418579,\n                           0,\n                           0.25,\n                           0.699999988079071,\n                           0,\n                           0.25,\n                           0.550000011920929,\n                           0,\n                           0.25,\n                           0.4000000059604645,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.8500000238418579,\n                           0,\n                           0,\n                           0.699999988079071,\n                           0,\n                           0,\n                           0.550000011920929,\n                           0,\n                           0,\n                           0.4000000059604645,\n                           0,\n                           2,\n                           1,\n                           0,\n                           1.75,\n                           1,\n                           0,\n                           1.75,\n                           0.8500000238418579,\n                           0,\n                           2,\n                           0.8500000238418579,\n                           0,\n                           1.75,\n                           0.699999988079071,\n                           0,\n                           2,\n                           0.699999988079071,\n                           0,\n                           1.75,\n                           0.550000011920929,\n                           0,\n                           2,\n                           0.550000011920929,\n                           0,\n                           1.75,\n                           0.4000000059604645,\n                           0,\n                           2,\n                           0.4000000059604645,\n                           0,\n                           1.5,\n                           1,\n                           0,\n                           1.5,\n                           0.8500000238418579,\n                           0,\n                           1.5,\n                           0.699999988079071,\n                           0,\n                           1.5,\n                           0.550000011920929,\n                           0,\n                           1.5,\n                           0.4000000059604645,\n                           0,\n                           1.25,\n                           1,\n                           0,\n                           1.25,\n                           0.8500000238418579,\n                           0,\n                           1.25,\n                           0.699999988079071,\n                           0,\n                           1.25,\n                           0.550000011920929,\n                           0,\n                           1.25,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           1,\n                           0,\n                           1,\n                           0.8500000238418579,\n                           0,\n                           1,\n                           0.699999988079071,\n                           0,\n                           1,\n                           0.550000011920929,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.8500000238418579,\n                           0,\n                           1,\n                           0.8500000238418579,\n                           0,\n                           0.75,\n                           0.699999988079071,\n                           0,\n                           1,\n                           0.699999988079071,\n                           0,\n                           0.75,\n                           0.550000011920929,\n                           0,\n                           1,\n                           0.550000011920929,\n                           0,\n                           0.75,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.8500000238418579,\n                           0,\n                           0.5,\n                           0.699999988079071,\n                           0,\n                           0.5,\n                           0.550000011920929,\n                           0,\n                           0.5,\n                           0.4000000059604645,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.8500000238418579,\n                           0,\n                           0.25,\n                           0.699999988079071,\n                           0,\n                           0.25,\n                           0.550000011920929,\n                           0,\n                           0.25,\n                           0.4000000059604645,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.8500000238418579,\n                           0,\n                           0,\n                           0.699999988079071,\n                           0,\n                           0,\n                           0.550000011920929,\n                           0,\n                           0,\n                           0.4000000059604645,\n                           0,\n                           2,\n                           0.4000000059604645,\n                           0,\n                           1.75,\n                           0.4000000059604645,\n                           0,\n                           1.75,\n                           0.30000001192092896,\n                           0,\n                           2,\n                           0.30000001192092896,\n                           0,\n                           1.75,\n                           0.20000000298023224,\n                           0,\n                           2,\n                           0.20000000298023224,\n                           0,\n                           1.75,\n                           0.10000000149011612,\n                           0,\n                           2,\n                           0.10000000149011612,\n                           0,\n                           1.75,\n                           0,\n                           0,\n                           2,\n                           0,\n                           0,\n                           1.5,\n                           0.4000000059604645,\n                           0,\n                           1.5,\n                           0.30000001192092896,\n                           0,\n                           1.5,\n                           0.20000000298023224,\n                           0,\n                           1.5,\n                           0.10000000149011612,\n                           0,\n                           1.5,\n                           0,\n                           0,\n                           1.25,\n                           0.4000000059604645,\n                           0,\n                           1.25,\n                           0.30000001192092896,\n                           0,\n                           1.25,\n                           0.20000000298023224,\n                           0,\n                           1.25,\n                           0.10000000149011612,\n                           0,\n                           1.25,\n                           0,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           0.30000001192092896,\n                           0,\n                           1,\n                           0.20000000298023224,\n                           0,\n                           1,\n                           0.10000000149011612,\n                           0,\n                           1,\n                           0,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           0.75,\n                           0.4000000059604645,\n                           0,\n                           0.75,\n                           0.30000001192092896,\n                           0,\n                           1,\n                           0.30000001192092896,\n                           0,\n                           0.75,\n                           0.20000000298023224,\n                           0,\n                           1,\n                           0.20000000298023224,\n                           0,\n                           0.75,\n                           0.10000000149011612,\n                           0,\n                           1,\n                           0.10000000149011612,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.5,\n                           0.4000000059604645,\n                           0,\n                           0.5,\n                           0.30000001192092896,\n                           0,\n                           0.5,\n                           0.20000000298023224,\n                           0,\n                           0.5,\n                           0.10000000149011612,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0.4000000059604645,\n                           0,\n                           0.25,\n                           0.30000001192092896,\n                           0,\n                           0.25,\n                           0.20000000298023224,\n                           0,\n                           0.25,\n                           0.10000000149011612,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0,\n                           0.4000000059604645,\n                           0,\n                           0,\n                           0.30000001192092896,\n                           0,\n                           0,\n                           0.20000000298023224,\n                           0,\n                           0,\n                           0.10000000149011612,\n                           0,\n                           0,\n                           0,\n                           0,\n                           2,\n                           0.4000000059604645,\n                           0,\n                           1.75,\n                           0.4000000059604645,\n                           0,\n                           1.75,\n                           0.30000001192092896,\n                           0,\n                           2,\n                           0.30000001192092896,\n                           0,\n                           1.75,\n                           0.20000000298023224,\n                           0,\n                           2,\n                           0.20000000298023224,\n                           0,\n                           1.75,\n                           0.10000000149011612,\n                           0,\n                           2,\n                           0.10000000149011612,\n                           0,\n                           1.75,\n                           0,\n                           0,\n                           2,\n                           0,\n                           0,\n                           1.5,\n                           0.4000000059604645,\n                           0,\n                           1.5,\n                           0.30000001192092896,\n                           0,\n                           1.5,\n                           0.20000000298023224,\n                           0,\n                           1.5,\n                           0.10000000149011612,\n                           0,\n                           1.5,\n                           0,\n                           0,\n                           1.25,\n                           0.4000000059604645,\n                           0,\n                           1.25,\n                           0.30000001192092896,\n                           0,\n                           1.25,\n                           0.20000000298023224,\n                           0,\n                           1.25,\n                           0.10000000149011612,\n                           0,\n                           1.25,\n                           0,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           0.30000001192092896,\n                           0,\n                           1,\n                           0.20000000298023224,\n                           0,\n                           1,\n                           0.10000000149011612,\n                           0,\n                           1,\n                           0,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           0.75,\n                           0.4000000059604645,\n                           0,\n                           0.75,\n                           0.30000001192092896,\n                           0,\n                           1,\n                           0.30000001192092896,\n                           0,\n                           0.75,\n                           0.20000000298023224,\n                           0,\n                           1,\n                           0.20000000298023224,\n                           0,\n                           0.75,\n                           0.10000000149011612,\n                           0,\n                           1,\n                           0.10000000149011612,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.5,\n                           0.4000000059604645,\n                           0,\n                           0.5,\n                           0.30000001192092896,\n                           0,\n                           0.5,\n                           0.20000000298023224,\n                           0,\n                           0.5,\n                           0.10000000149011612,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0.4000000059604645,\n                           0,\n                           0.25,\n                           0.30000001192092896,\n                           0,\n                           0.25,\n                           0.20000000298023224,\n                           0,\n                           0.25,\n                           0.10000000149011612,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0,\n                           0.4000000059604645,\n                           0,\n                           0,\n                           0.30000001192092896,\n                           0,\n                           0,\n                           0.20000000298023224,\n                           0,\n                           0,\n                           0.10000000149011612,\n                           0,\n                           0,\n                           0,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.875,\n                           1,\n                           0,\n                           0.875,\n                           0.875,\n                           0,\n                           1,\n                           0.875,\n                           0,\n                           0.875,\n                           0.75,\n                           0,\n                           1,\n                           0.75,\n                           0,\n                           0.875,\n                           0.625,\n                           0,\n                           1,\n                           0.625,\n                           0,\n                           0.875,\n                           0.5,\n                           0,\n                           1,\n                           0.5,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.875,\n                           0,\n                           0.75,\n                           0.75,\n                           0,\n                           0.75,\n                           0.625,\n                           0,\n                           0.75,\n                           0.5,\n                           0,\n                           0.625,\n                           1,\n                           0,\n                           0.625,\n                           0.875,\n                           0,\n                           0.625,\n                           0.75,\n                           0,\n                           0.625,\n                           0.625,\n                           0,\n                           0.625,\n                           0.5,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.875,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.5,\n                           0.625,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.375,\n                           1,\n                           0,\n                           0.375,\n                           0.875,\n                           0,\n                           0.5,\n                           0.875,\n                           0,\n                           0.375,\n                           0.75,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.375,\n                           0.625,\n                           0,\n                           0.5,\n                           0.625,\n                           0,\n                           0.375,\n                           0.5,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.875,\n                           0,\n                           0.25,\n                           0.75,\n                           0,\n                           0.25,\n                           0.625,\n                           0,\n                           0.25,\n                           0.5,\n                           0,\n                           0.125,\n                           1,\n                           0,\n                           0.125,\n                           0.875,\n                           0,\n                           0.125,\n                           0.75,\n                           0,\n                           0.125,\n                           0.625,\n                           0,\n                           0.125,\n                           0.5,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           1,\n                           0.5,\n                           0,\n                           0.875,\n                           0.5,\n                           0,\n                           0.875,\n                           0.375,\n                           0,\n                           1,\n                           0.375,\n                           0,\n                           0.875,\n                           0.25,\n                           0,\n                           1,\n                           0.25,\n                           0,\n                           0.875,\n                           0.125,\n                           0,\n                           1,\n                           0.125,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           0.5,\n                           0,\n                           0.75,\n                           0.375,\n                           0,\n                           0.75,\n                           0.25,\n                           0,\n                           0.75,\n                           0.125,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.625,\n                           0.5,\n                           0,\n                           0.625,\n                           0.375,\n                           0,\n                           0.625,\n                           0.25,\n                           0,\n                           0.625,\n                           0.125,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.5,\n                           0.375,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.5,\n                           0.125,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.375,\n                           0.5,\n                           0,\n                           0.375,\n                           0.375,\n                           0,\n                           0.5,\n                           0.375,\n                           0,\n                           0.375,\n                           0.25,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.375,\n                           0.125,\n                           0,\n                           0.5,\n                           0.125,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0.5,\n                           0,\n                           0.25,\n                           0.375,\n                           0,\n                           0.25,\n                           0.25,\n                           0,\n                           0.25,\n                           0.125,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.125,\n                           0.5,\n                           0,\n                           0.125,\n                           0.375,\n                           0,\n                           0.125,\n                           0.25,\n                           0,\n                           0.125,\n                           0.125,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.625,\n                           0.22499999403953552,\n                           0,\n                           0.5,\n                           0.22499999403953552,\n                           0,\n                           0.625,\n                           0.44999998807907104,\n                           0,\n                           0.5,\n                           0.44999998807907104,\n                           0,\n                           0.625,\n                           0.675000011920929,\n                           0,\n                           0.5,\n                           0.675000011920929,\n                           0,\n                           0.625,\n                           0.8999999761581421,\n                           0,\n                           0.5,\n                           0.8999999761581421,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.75,\n                           0.22499999403953552,\n                           0,\n                           0.75,\n                           0.44999998807907104,\n                           0,\n                           0.75,\n                           0.675000011920929,\n                           0,\n                           0.75,\n                           0.8999999761581421,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           0.875,\n                           0.22499999403953552,\n                           0,\n                           0.875,\n                           0.44999998807907104,\n                           0,\n                           0.875,\n                           0.675000011920929,\n                           0,\n                           0.875,\n                           0.8999999761581421,\n                           0,\n                           1,\n                           0,\n                           0,\n                           1,\n                           0.22499999403953552,\n                           0,\n                           1,\n                           0.44999998807907104,\n                           0,\n                           1,\n                           0.675000011920929,\n                           0,\n                           1,\n                           0.8999999761581421,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0.125,\n                           0.22499999403953552,\n                           0,\n                           0,\n                           0.22499999403953552,\n                           0,\n                           0.125,\n                           0.44999998807907104,\n                           0,\n                           0,\n                           0.44999998807907104,\n                           0,\n                           0.125,\n                           0.675000011920929,\n                           0,\n                           0,\n                           0.675000011920929,\n                           0,\n                           0.125,\n                           0.8999999761581421,\n                           0,\n                           0,\n                           0.8999999761581421,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.25,\n                           0.22499999403953552,\n                           0,\n                           0.25,\n                           0.44999998807907104,\n                           0,\n                           0.25,\n                           0.675000011920929,\n                           0,\n                           0.25,\n                           0.8999999761581421,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.375,\n                           0.22499999403953552,\n                           0,\n                           0.375,\n                           0.44999998807907104,\n                           0,\n                           0.375,\n                           0.675000011920929,\n                           0,\n                           0.375,\n                           0.8999999761581421,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.5,\n                           0.22499999403953552,\n                           0,\n                           0.5,\n                           0.44999998807907104,\n                           0,\n                           0.5,\n                           0.675000011920929,\n                           0,\n                           0.5,\n                           0.8999999761581421,\n                           0,\n                           0.5,\n                           0.8999999761581421,\n                           0,\n                           0.625,\n                           0.8999999761581421,\n                           0,\n                           0.625,\n                           0.925000011920929,\n                           0,\n                           0.5,\n                           0.925000011920929,\n                           0,\n                           0.625,\n                           0.949999988079071,\n                           0,\n                           0.5,\n                           0.949999988079071,\n                           0,\n                           0.625,\n                           0.9750000238418579,\n                           0,\n                           0.5,\n                           0.9750000238418579,\n                           0,\n                           0.625,\n                           1,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.75,\n                           0.8999999761581421,\n                           0,\n                           0.75,\n                           0.925000011920929,\n                           0,\n                           0.75,\n                           0.949999988079071,\n                           0,\n                           0.75,\n                           0.9750000238418579,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.875,\n                           0.8999999761581421,\n                           0,\n                           0.875,\n                           0.925000011920929,\n                           0,\n                           0.875,\n                           0.949999988079071,\n                           0,\n                           0.875,\n                           0.9750000238418579,\n                           0,\n                           0.875,\n                           1,\n                           0,\n                           1,\n                           0.8999999761581421,\n                           0,\n                           1,\n                           0.925000011920929,\n                           0,\n                           1,\n                           0.949999988079071,\n                           0,\n                           1,\n                           0.9750000238418579,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0,\n                           0.8999999761581421,\n                           0,\n                           0.125,\n                           0.8999999761581421,\n                           0,\n                           0.125,\n                           0.925000011920929,\n                           0,\n                           0,\n                           0.925000011920929,\n                           0,\n                           0.125,\n                           0.949999988079071,\n                           0,\n                           0,\n                           0.949999988079071,\n                           0,\n                           0.125,\n                           0.9750000238418579,\n                           0,\n                           0,\n                           0.9750000238418579,\n                           0,\n                           0.125,\n                           1,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0.25,\n                           0.8999999761581421,\n                           0,\n                           0.25,\n                           0.925000011920929,\n                           0,\n                           0.25,\n                           0.949999988079071,\n                           0,\n                           0.25,\n                           0.9750000238418579,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.375,\n                           0.8999999761581421,\n                           0,\n                           0.375,\n                           0.925000011920929,\n                           0,\n                           0.375,\n                           0.949999988079071,\n                           0,\n                           0.375,\n                           0.9750000238418579,\n                           0,\n                           0.375,\n                           1,\n                           0,\n                           0.5,\n                           0.8999999761581421,\n                           0,\n                           0.5,\n                           0.925000011920929,\n                           0,\n                           0.5,\n                           0.949999988079071,\n                           0,\n                           0.5,\n                           0.9750000238418579,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.875,\n                           1,\n                           0,\n                           0.875,\n                           0.75,\n                           0,\n                           1,\n                           0.75,\n                           0,\n                           0.875,\n                           0.5,\n                           0,\n                           1,\n                           0.5,\n                           0,\n                           0.875,\n                           0.25,\n                           0,\n                           1,\n                           0.25,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.75,\n                           0,\n                           0.75,\n                           0.5,\n                           0,\n                           0.75,\n                           0.25,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.625,\n                           1,\n                           0,\n                           0.625,\n                           0.75,\n                           0,\n                           0.625,\n                           0.5,\n                           0,\n                           0.625,\n                           0.25,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.375,\n                           1,\n                           0,\n                           0.375,\n                           0.75,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.375,\n                           0.5,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.375,\n                           0.25,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.75,\n                           0,\n                           0.25,\n                           0.5,\n                           0,\n                           0.25,\n                           0.25,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.125,\n                           1,\n                           0,\n                           0.125,\n                           0.75,\n                           0,\n                           0.125,\n                           0.5,\n                           0,\n                           0.125,\n                           0.25,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.875,\n                           1,\n                           0,\n                           0.875,\n                           0.75,\n                           0,\n                           1,\n                           0.75,\n                           0,\n                           0.875,\n                           0.5,\n                           0,\n                           1,\n                           0.5,\n                           0,\n                           0.875,\n                           0.25,\n                           0,\n                           1,\n                           0.25,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.75,\n                           0,\n                           0.75,\n                           0.5,\n                           0,\n                           0.75,\n                           0.25,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.625,\n                           1,\n                           0,\n                           0.625,\n                           0.75,\n                           0,\n                           0.625,\n                           0.5,\n                           0,\n                           0.625,\n                           0.25,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.375,\n                           1,\n                           0,\n                           0.375,\n                           0.75,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.375,\n                           0.5,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.375,\n                           0.25,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.75,\n                           0,\n                           0.25,\n                           0.5,\n                           0,\n                           0.25,\n                           0.25,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.125,\n                           1,\n                           0,\n                           0.125,\n                           0.75,\n                           0,\n                           0.125,\n                           0.5,\n                           0,\n                           0.125,\n                           0.25,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.875,\n                           1,\n                           0,\n                           0.875,\n                           0.75,\n                           0,\n                           1,\n                           0.75,\n                           0,\n                           0.875,\n                           0.5,\n                           0,\n                           1,\n                           0.5,\n                           0,\n                           0.875,\n                           0.25,\n                           0,\n                           1,\n                           0.25,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.75,\n                           0,\n                           0.75,\n                           0.5,\n                           0,\n                           0.75,\n                           0.25,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.625,\n                           1,\n                           0,\n                           0.625,\n                           0.75,\n                           0,\n                           0.625,\n                           0.5,\n                           0,\n                           0.625,\n                           0.25,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.375,\n                           1,\n                           0,\n                           0.375,\n                           0.75,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.375,\n                           0.5,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.375,\n                           0.25,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.75,\n                           0,\n                           0.25,\n                           0.5,\n                           0,\n                           0.25,\n                           0.25,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.125,\n                           1,\n                           0,\n                           0.125,\n                           0.75,\n                           0,\n                           0.125,\n                           0.5,\n                           0,\n                           0.125,\n                           0.25,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.875,\n                           1,\n                           0,\n                           0.875,\n                           0.75,\n                           0,\n                           1,\n                           0.75,\n                           0,\n                           0.875,\n                           0.5,\n                           0,\n                           1,\n                           0.5,\n                           0,\n                           0.875,\n                           0.25,\n                           0,\n                           1,\n                           0.25,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.75,\n                           0,\n                           0.75,\n                           0.5,\n                           0,\n                           0.75,\n                           0.25,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.625,\n                           1,\n                           0,\n                           0.625,\n                           0.75,\n                           0,\n                           0.625,\n                           0.5,\n                           0,\n                           0.625,\n                           0.25,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.375,\n                           1,\n                           0,\n                           0.375,\n                           0.75,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.375,\n                           0.5,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.375,\n                           0.25,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.75,\n                           0,\n                           0.25,\n                           0.5,\n                           0,\n                           0.25,\n                           0.25,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.125,\n                           1,\n                           0,\n                           0.125,\n                           0.75,\n                           0,\n                           0.125,\n                           0.5,\n                           0,\n                           0.125,\n                           0.25,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0,\n                           0};\n\nuint16_t teapotIndices[] = {\n    0,   1,   2,   2,   3,   0,   3,   2,   4,   4,   5,   3,   5,   4,   6,\n    6,   7,   5,   7,   6,   8,   8,   9,   7,   1,   10,  11,  11,  2,   1,\n    2,   11,  12,  12,  4,   2,   4,   12,  13,  13,  6,   4,   6,   13,  14,\n    14,  8,   6,   10,  15,  16,  16,  11,  10,  11,  16,  17,  17,  12,  11,\n    12,  17,  18,  18,  13,  12,  13,  18,  19,  19,  14,  13,  15,  20,  21,\n    21,  16,  15,  16,  21,  22,  22,  17,  16,  17,  22,  23,  23,  18,  17,\n    18,  23,  24,  24,  19,  18,  25,  26,  27,  27,  28,  25,  28,  27,  29,\n    29,  30,  28,  30,  29,  31,  31,  32,  30,  32,  31,  33,  33,  34,  32,\n    26,  35,  36,  36,  27,  26,  27,  36,  37,  37,  29,  27,  29,  37,  38,\n    38,  31,  29,  31,  38,  39,  39,  33,  31,  35,  40,  41,  41,  36,  35,\n    36,  41,  42,  42,  37,  36,  37,  42,  43,  43,  38,  37,  38,  43,  44,\n    44,  39,  38,  40,  45,  46,  46,  41,  40,  41,  46,  47,  47,  42,  41,\n    42,  47,  48,  48,  43,  42,  43,  48,  49,  49,  44,  43,  50,  51,  52,\n    52,  53,  50,  53,  52,  54,  54,  55,  53,  55,  54,  56,  56,  57,  55,\n    57,  56,  58,  58,  59,  57,  51,  60,  61,  61,  52,  51,  52,  61,  62,\n    62,  54,  52,  54,  62,  63,  63,  56,  54,  56,  63,  64,  64,  58,  56,\n    60,  65,  66,  66,  61,  60,  61,  66,  67,  67,  62,  61,  62,  67,  68,\n    68,  63,  62,  63,  68,  69,  69,  64,  63,  65,  70,  71,  71,  66,  65,\n    66,  71,  72,  72,  67,  66,  67,  72,  73,  73,  68,  67,  68,  73,  74,\n    74,  69,  68,  75,  76,  77,  77,  78,  75,  78,  77,  79,  79,  80,  78,\n    80,  79,  81,  81,  82,  80,  82,  81,  83,  83,  84,  82,  76,  85,  86,\n    86,  77,  76,  77,  86,  87,  87,  79,  77,  79,  87,  88,  88,  81,  79,\n    81,  88,  89,  89,  83,  81,  85,  90,  91,  91,  86,  85,  86,  91,  92,\n    92,  87,  86,  87,  92,  93,  93,  88,  87,  88,  93,  94,  94,  89,  88,\n    90,  95,  96,  96,  91,  90,  91,  96,  97,  97,  92,  91,  92,  97,  98,\n    98,  93,  92,  93,  98,  99,  99,  94,  93,  100, 101, 102, 102, 103, 100,\n    103, 102, 104, 104, 105, 103, 105, 104, 106, 106, 107, 105, 107, 106, 108,\n    108, 109, 107, 101, 110, 111, 111, 102, 101, 102, 111, 112, 112, 104, 102,\n    104, 112, 113, 113, 106, 104, 106, 113, 114, 114, 108, 106, 110, 115, 116,\n    116, 111, 110, 111, 116, 117, 117, 112, 111, 112, 117, 118, 118, 113, 112,\n    113, 118, 119, 119, 114, 113, 115, 120, 121, 121, 116, 115, 116, 121, 122,\n    122, 117, 116, 117, 122, 123, 123, 118, 117, 118, 123, 124, 124, 119, 118,\n    125, 126, 127, 127, 128, 125, 128, 127, 129, 129, 130, 128, 130, 129, 131,\n    131, 132, 130, 132, 131, 133, 133, 134, 132, 126, 135, 136, 136, 127, 126,\n    127, 136, 137, 137, 129, 127, 129, 137, 138, 138, 131, 129, 131, 138, 139,\n    139, 133, 131, 135, 140, 141, 141, 136, 135, 136, 141, 142, 142, 137, 136,\n    137, 142, 143, 143, 138, 137, 138, 143, 144, 144, 139, 138, 140, 145, 146,\n    146, 141, 140, 141, 146, 147, 147, 142, 141, 142, 147, 148, 148, 143, 142,\n    143, 148, 149, 149, 144, 143, 150, 151, 152, 152, 153, 150, 153, 152, 154,\n    154, 155, 153, 155, 154, 156, 156, 157, 155, 157, 156, 158, 158, 159, 157,\n    151, 160, 161, 161, 152, 151, 152, 161, 162, 162, 154, 152, 154, 162, 163,\n    163, 156, 154, 156, 163, 164, 164, 158, 156, 160, 165, 166, 166, 161, 160,\n    161, 166, 167, 167, 162, 161, 162, 167, 168, 168, 163, 162, 163, 168, 169,\n    169, 164, 163, 165, 170, 171, 171, 166, 165, 166, 171, 172, 172, 167, 166,\n    167, 172, 173, 173, 168, 167, 168, 173, 174, 174, 169, 168, 175, 176, 177,\n    177, 178, 175, 178, 177, 179, 179, 180, 178, 180, 179, 181, 181, 182, 180,\n    182, 181, 183, 183, 184, 182, 176, 185, 186, 186, 177, 176, 177, 186, 187,\n    187, 179, 177, 179, 187, 188, 188, 181, 179, 181, 188, 189, 189, 183, 181,\n    185, 190, 191, 191, 186, 185, 186, 191, 192, 192, 187, 186, 187, 192, 193,\n    193, 188, 187, 188, 193, 194, 194, 189, 188, 190, 195, 196, 196, 191, 190,\n    191, 196, 197, 197, 192, 191, 192, 197, 198, 198, 193, 192, 193, 198, 199,\n    199, 194, 193, 200, 201, 202, 202, 203, 200, 203, 202, 204, 204, 205, 203,\n    205, 204, 206, 206, 207, 205, 207, 206, 208, 208, 209, 207, 201, 210, 211,\n    211, 202, 201, 202, 211, 212, 212, 204, 202, 204, 212, 213, 213, 206, 204,\n    206, 213, 214, 214, 208, 206, 210, 215, 216, 216, 211, 210, 211, 216, 217,\n    217, 212, 211, 212, 217, 218, 218, 213, 212, 213, 218, 219, 219, 214, 213,\n    215, 220, 221, 221, 216, 215, 216, 221, 222, 222, 217, 216, 217, 222, 223,\n    223, 218, 217, 218, 223, 224, 224, 219, 218, 225, 226, 227, 227, 228, 225,\n    228, 227, 229, 229, 230, 228, 230, 229, 231, 231, 232, 230, 232, 231, 233,\n    233, 234, 232, 226, 235, 236, 236, 227, 226, 227, 236, 237, 237, 229, 227,\n    229, 237, 238, 238, 231, 229, 231, 238, 239, 239, 233, 231, 235, 240, 241,\n    241, 236, 235, 236, 241, 242, 242, 237, 236, 237, 242, 243, 243, 238, 237,\n    238, 243, 244, 244, 239, 238, 240, 245, 246, 246, 241, 240, 241, 246, 247,\n    247, 242, 241, 242, 247, 248, 248, 243, 242, 243, 248, 249, 249, 244, 243,\n    250, 251, 252, 252, 253, 250, 253, 252, 254, 254, 255, 253, 255, 254, 256,\n    256, 257, 255, 257, 256, 258, 258, 259, 257, 251, 260, 261, 261, 252, 251,\n    252, 261, 262, 262, 254, 252, 254, 262, 263, 263, 256, 254, 256, 263, 264,\n    264, 258, 256, 260, 265, 266, 266, 261, 260, 261, 266, 267, 267, 262, 261,\n    262, 267, 268, 268, 263, 262, 263, 268, 269, 269, 264, 263, 265, 270, 271,\n    271, 266, 265, 266, 271, 272, 272, 267, 266, 267, 272, 273, 273, 268, 267,\n    268, 273, 274, 274, 269, 268, 275, 276, 277, 277, 278, 275, 278, 277, 279,\n    279, 280, 278, 280, 279, 281, 281, 282, 280, 282, 281, 283, 283, 284, 282,\n    276, 285, 286, 286, 277, 276, 277, 286, 287, 287, 279, 277, 279, 287, 288,\n    288, 281, 279, 281, 288, 289, 289, 283, 281, 285, 290, 291, 291, 286, 285,\n    286, 291, 292, 292, 287, 286, 287, 292, 293, 293, 288, 287, 288, 293, 294,\n    294, 289, 288, 290, 295, 296, 296, 291, 290, 291, 296, 297, 297, 292, 291,\n    292, 297, 298, 298, 293, 292, 293, 298, 299, 299, 294, 293, 300, 301, 302,\n    302, 303, 300, 303, 302, 304, 304, 305, 303, 305, 304, 306, 306, 307, 305,\n    307, 306, 308, 308, 309, 307, 301, 310, 311, 311, 302, 301, 302, 311, 312,\n    312, 304, 302, 304, 312, 313, 313, 306, 304, 306, 313, 314, 314, 308, 306,\n    310, 315, 316, 316, 311, 310, 311, 316, 317, 317, 312, 311, 312, 317, 318,\n    318, 313, 312, 313, 318, 319, 319, 314, 313, 315, 320, 321, 321, 316, 315,\n    316, 321, 322, 322, 317, 316, 317, 322, 323, 323, 318, 317, 318, 323, 324,\n    324, 319, 318, 325, 326, 327, 327, 328, 325, 328, 327, 329, 329, 330, 328,\n    330, 329, 331, 331, 332, 330, 332, 331, 333, 333, 334, 332, 326, 335, 336,\n    336, 327, 326, 327, 336, 337, 337, 329, 327, 329, 337, 338, 338, 331, 329,\n    331, 338, 339, 339, 333, 331, 335, 340, 341, 341, 336, 335, 336, 341, 342,\n    342, 337, 336, 337, 342, 343, 343, 338, 337, 338, 343, 344, 344, 339, 338,\n    340, 345, 346, 346, 341, 340, 341, 346, 347, 347, 342, 341, 342, 347, 348,\n    348, 343, 342, 343, 348, 349, 349, 344, 343, 350, 351, 352, 352, 353, 350,\n    353, 352, 354, 354, 355, 353, 355, 354, 356, 356, 357, 355, 357, 356, 358,\n    358, 359, 357, 351, 360, 361, 361, 352, 351, 352, 361, 362, 362, 354, 352,\n    354, 362, 363, 363, 356, 354, 356, 363, 364, 364, 358, 356, 360, 365, 366,\n    366, 361, 360, 361, 366, 367, 367, 362, 361, 362, 367, 368, 368, 363, 362,\n    363, 368, 369, 369, 364, 363, 365, 370, 371, 371, 366, 365, 366, 371, 372,\n    372, 367, 366, 367, 372, 373, 373, 368, 367, 368, 373, 374, 374, 369, 368,\n    375, 376, 377, 377, 378, 375, 378, 377, 379, 379, 380, 378, 380, 379, 381,\n    381, 382, 380, 382, 381, 383, 383, 384, 382, 376, 385, 386, 386, 377, 376,\n    377, 386, 387, 387, 379, 377, 379, 387, 388, 388, 381, 379, 381, 388, 389,\n    389, 383, 381, 385, 390, 391, 391, 386, 385, 386, 391, 392, 392, 387, 386,\n    387, 392, 393, 393, 388, 387, 388, 393, 394, 394, 389, 388, 390, 395, 396,\n    396, 391, 390, 391, 396, 397, 397, 392, 391, 392, 397, 398, 398, 393, 392,\n    393, 398, 399, 399, 394, 393, 400, 401, 402, 402, 403, 400, 403, 402, 404,\n    404, 405, 403, 405, 404, 406, 406, 407, 405, 407, 406, 408, 408, 409, 407,\n    401, 410, 411, 411, 402, 401, 402, 411, 412, 412, 404, 402, 404, 412, 413,\n    413, 406, 404, 406, 413, 414, 414, 408, 406, 410, 415, 416, 416, 411, 410,\n    411, 416, 417, 417, 412, 411, 412, 417, 418, 418, 413, 412, 413, 418, 419,\n    419, 414, 413, 415, 420, 421, 421, 416, 415, 416, 421, 422, 422, 417, 416,\n    417, 422, 423, 423, 418, 417, 418, 423, 424, 424, 419, 418, 425, 426, 427,\n    427, 428, 425, 428, 427, 429, 429, 430, 428, 430, 429, 431, 431, 432, 430,\n    432, 431, 433, 433, 434, 432, 426, 435, 436, 436, 427, 426, 427, 436, 437,\n    437, 429, 427, 429, 437, 438, 438, 431, 429, 431, 438, 439, 439, 433, 431,\n    435, 440, 441, 441, 436, 435, 436, 441, 442, 442, 437, 436, 437, 442, 443,\n    443, 438, 437, 438, 443, 444, 444, 439, 438, 440, 445, 446, 446, 441, 440,\n    441, 446, 447, 447, 442, 441, 442, 447, 448, 448, 443, 442, 443, 448, 449,\n    449, 444, 443, 450, 451, 452, 452, 453, 450, 453, 452, 454, 454, 455, 453,\n    455, 454, 456, 456, 457, 455, 457, 456, 458, 458, 459, 457, 451, 460, 461,\n    461, 452, 451, 452, 461, 462, 462, 454, 452, 454, 462, 463, 463, 456, 454,\n    456, 463, 464, 464, 458, 456, 460, 465, 466, 466, 461, 460, 461, 466, 467,\n    467, 462, 461, 462, 467, 468, 468, 463, 462, 463, 468, 469, 469, 464, 463,\n    465, 470, 471, 471, 466, 465, 466, 471, 472, 472, 467, 466, 467, 472, 473,\n    473, 468, 467, 468, 473, 474, 474, 469, 468, 475, 476, 477, 477, 478, 475,\n    478, 477, 479, 479, 480, 478, 480, 479, 481, 481, 482, 480, 482, 481, 483,\n    483, 484, 482, 476, 485, 486, 486, 477, 476, 477, 486, 487, 487, 479, 477,\n    479, 487, 488, 488, 481, 479, 481, 488, 489, 489, 483, 481, 485, 490, 491,\n    491, 486, 485, 486, 491, 492, 492, 487, 486, 487, 492, 493, 493, 488, 487,\n    488, 493, 494, 494, 489, 488, 490, 495, 496, 496, 491, 490, 491, 496, 497,\n    497, 492, 491, 492, 497, 498, 498, 493, 492, 493, 498, 499, 499, 494, 493,\n    500, 501, 502, 502, 503, 500, 503, 502, 504, 504, 505, 503, 505, 504, 506,\n    506, 507, 505, 507, 506, 508, 508, 509, 507, 501, 510, 511, 511, 502, 501,\n    502, 511, 512, 512, 504, 502, 504, 512, 513, 513, 506, 504, 506, 513, 514,\n    514, 508, 506, 510, 515, 516, 516, 511, 510, 511, 516, 517, 517, 512, 511,\n    512, 517, 518, 518, 513, 512, 513, 518, 519, 519, 514, 513, 515, 520, 521,\n    521, 516, 515, 516, 521, 522, 522, 517, 516, 517, 522, 523, 523, 518, 517,\n    518, 523, 524, 524, 519, 518, 525, 526, 527, 527, 528, 525, 528, 527, 529,\n    529, 530, 528, 530, 529, 531, 531, 532, 530, 532, 531, 533, 533, 534, 532,\n    526, 535, 536, 536, 527, 526, 527, 536, 537, 537, 529, 527, 529, 537, 538,\n    538, 531, 529, 531, 538, 539, 539, 533, 531, 535, 540, 541, 541, 536, 535,\n    536, 541, 542, 542, 537, 536, 537, 542, 543, 543, 538, 537, 538, 543, 544,\n    544, 539, 538, 540, 545, 546, 546, 541, 540, 541, 546, 547, 547, 542, 541,\n    542, 547, 548, 548, 543, 542, 543, 548, 549, 549, 544, 543, 550, 551, 552,\n    552, 553, 550, 553, 552, 554, 554, 555, 553, 555, 554, 556, 556, 557, 555,\n    557, 556, 558, 558, 559, 557, 551, 560, 561, 561, 552, 551, 552, 561, 562,\n    562, 554, 552, 554, 562, 563, 563, 556, 554, 556, 563, 564, 564, 558, 556,\n    560, 565, 566, 566, 561, 560, 561, 566, 567, 567, 562, 561, 562, 567, 568,\n    568, 563, 562, 563, 568, 569, 569, 564, 563, 565, 570, 571, 571, 566, 565,\n    566, 571, 572, 572, 567, 566, 567, 572, 573, 573, 568, 567, 568, 573, 574,\n    574, 569, 568, 575, 576, 577, 577, 578, 575, 578, 577, 579, 579, 580, 578,\n    580, 579, 581, 581, 582, 580, 582, 581, 583, 583, 584, 582, 576, 585, 586,\n    586, 577, 576, 577, 586, 587, 587, 579, 577, 579, 587, 588, 588, 581, 579,\n    581, 588, 589, 589, 583, 581, 585, 590, 591, 591, 586, 585, 586, 591, 592,\n    592, 587, 586, 587, 592, 593, 593, 588, 587, 588, 593, 594, 594, 589, 588,\n    590, 595, 596, 596, 591, 590, 591, 596, 597, 597, 592, 591, 592, 597, 598,\n    598, 593, 592, 593, 598, 599, 599, 594, 593, 600, 601, 602, 602, 603, 600,\n    603, 602, 604, 604, 605, 603, 605, 604, 606, 606, 607, 605, 607, 606, 608,\n    608, 609, 607, 601, 610, 611, 611, 602, 601, 602, 611, 612, 612, 604, 602,\n    604, 612, 613, 613, 606, 604, 606, 613, 614, 614, 608, 606, 610, 615, 616,\n    616, 611, 610, 611, 616, 617, 617, 612, 611, 612, 617, 618, 618, 613, 612,\n    613, 618, 619, 619, 614, 613, 615, 620, 621, 621, 616, 615, 616, 621, 622,\n    622, 617, 616, 617, 622, 623, 623, 618, 617, 618, 623, 624, 624, 619, 618,\n    625, 626, 627, 627, 628, 625, 628, 627, 629, 629, 630, 628, 630, 629, 631,\n    631, 632, 630, 632, 631, 633, 633, 634, 632, 626, 635, 636, 636, 627, 626,\n    627, 636, 637, 637, 629, 627, 629, 637, 638, 638, 631, 629, 631, 638, 639,\n    639, 633, 631, 635, 640, 641, 641, 636, 635, 636, 641, 642, 642, 637, 636,\n    637, 642, 643, 643, 638, 637, 638, 643, 644, 644, 639, 638, 640, 645, 646,\n    646, 641, 640, 641, 646, 647, 647, 642, 641, 642, 647, 648, 648, 643, 642,\n    643, 648, 649, 649, 644, 643, 650, 651, 652, 652, 653, 650, 653, 652, 654,\n    654, 655, 653, 655, 654, 656, 656, 657, 655, 657, 656, 658, 658, 659, 657,\n    651, 660, 661, 661, 652, 651, 652, 661, 662, 662, 654, 652, 654, 662, 663,\n    663, 656, 654, 656, 663, 664, 664, 658, 656, 660, 665, 666, 666, 661, 660,\n    661, 666, 667, 667, 662, 661, 662, 667, 668, 668, 663, 662, 663, 668, 669,\n    669, 664, 663, 665, 670, 671, 671, 666, 665, 666, 671, 672, 672, 667, 666,\n    667, 672, 673, 673, 668, 667, 668, 673, 674, 674, 669, 668, 675, 676, 677,\n    677, 678, 675, 678, 677, 679, 679, 680, 678, 680, 679, 681, 681, 682, 680,\n    682, 681, 683, 683, 684, 682, 676, 685, 686, 686, 677, 676, 677, 686, 687,\n    687, 679, 677, 679, 687, 688, 688, 681, 679, 681, 688, 689, 689, 683, 681,\n    685, 690, 691, 691, 686, 685, 686, 691, 692, 692, 687, 686, 687, 692, 693,\n    693, 688, 687, 688, 693, 694, 694, 689, 688, 690, 695, 696, 696, 691, 690,\n    691, 696, 697, 697, 692, 691, 692, 697, 698, 698, 693, 692, 693, 698, 699,\n    699, 694, 693, 700, 701, 702, 702, 703, 700, 703, 702, 704, 704, 705, 703,\n    705, 704, 706, 706, 707, 705, 707, 706, 708, 708, 709, 707, 701, 710, 711,\n    711, 702, 701, 702, 711, 712, 712, 704, 702, 704, 712, 713, 713, 706, 704,\n    706, 713, 714, 714, 708, 706, 710, 715, 716, 716, 711, 710, 711, 716, 717,\n    717, 712, 711, 712, 717, 718, 718, 713, 712, 713, 718, 719, 719, 714, 713,\n    715, 720, 721, 721, 716, 715, 716, 721, 722, 722, 717, 716, 717, 722, 723,\n    723, 718, 717, 718, 723, 724, 724, 719, 718, 725, 726, 727, 727, 728, 725,\n    728, 727, 729, 729, 730, 728, 730, 729, 731, 731, 732, 730, 732, 731, 733,\n    733, 734, 732, 726, 735, 736, 736, 727, 726, 727, 736, 737, 737, 729, 727,\n    729, 737, 738, 738, 731, 729, 731, 738, 739, 739, 733, 731, 735, 740, 741,\n    741, 736, 735, 736, 741, 742, 742, 737, 736, 737, 742, 743, 743, 738, 737,\n    738, 743, 744, 744, 739, 738, 740, 745, 746, 746, 741, 740, 741, 746, 747,\n    747, 742, 741, 742, 747, 748, 748, 743, 742, 743, 748, 749, 749, 744, 743,\n    750, 751, 752, 752, 753, 750, 753, 752, 754, 754, 755, 753, 755, 754, 756,\n    756, 757, 755, 757, 756, 758, 758, 759, 757, 751, 760, 761, 761, 752, 751,\n    752, 761, 762, 762, 754, 752, 754, 762, 763, 763, 756, 754, 756, 763, 764,\n    764, 758, 756, 760, 765, 766, 766, 761, 760, 761, 766, 767, 767, 762, 761,\n    762, 767, 768, 768, 763, 762, 763, 768, 769, 769, 764, 763, 765, 770, 771,\n    771, 766, 765, 766, 771, 772, 772, 767, 766, 767, 772, 773, 773, 768, 767,\n    768, 773, 774, 774, 769, 768, 775, 776, 777, 777, 778, 775, 778, 777, 779,\n    779, 780, 778, 780, 779, 781, 781, 782, 780, 782, 781, 783, 783, 784, 782,\n    776, 785, 786, 786, 777, 776, 777, 786, 787, 787, 779, 777, 779, 787, 788,\n    788, 781, 779, 781, 788, 789, 789, 783, 781, 785, 790, 791, 791, 786, 785,\n    786, 791, 792, 792, 787, 786, 787, 792, 793, 793, 788, 787, 788, 793, 794,\n    794, 789, 788, 790, 795, 796, 796, 791, 790, 791, 796, 797, 797, 792, 791,\n    792, 797, 798, 798, 793, 792, 793, 798, 799, 799, 794, 793};\n"
  },
  {
    "path": "teapots/image-decoder/src/main/java/com/sample/helper/NDKHelper.java",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.sample.helper;\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.nio.ByteBuffer;\n\nimport javax.microedition.khronos.opengles.GL10;\n\nimport android.R.bool;\nimport android.opengl.GLES30;\n\nimport android.annotation.TargetApi;\nimport android.app.Activity;\nimport android.app.NativeActivity;\nimport android.content.Context;\nimport android.content.pm.ApplicationInfo;\nimport android.content.pm.PackageManager;\nimport android.content.pm.PackageManager.NameNotFoundException;\nimport android.graphics.Bitmap;\nimport android.graphics.Bitmap.CompressFormat;\nimport android.graphics.BitmapFactory;\nimport android.graphics.Matrix;\nimport android.media.AudioManager;\nimport android.media.AudioTrack;\nimport android.opengl.GLUtils;\nimport android.os.Build;\nimport android.util.Log;\nimport android.view.View;\nimport android.view.View.MeasureSpec;\n\n@TargetApi(Build.VERSION_CODES.GINGERBREAD)\npublic class NDKHelper {\n\n    public NDKHelper(NativeActivity act) {\n        activity = act;\n    }\n\n    public void loadLibrary(String soname) {\n        if (soname.isEmpty() == false) {\n            System.loadLibrary(soname);\n            loadedSO = true;\n        }\n    }\n\n    public static Boolean checkSOLoaded() {\n        if (loadedSO == false) {\n            Log.e(\"NDKHelper\",\n                    \"--------------------------------------------\\n\"\n                            + \".so has not been loaded. To use JUI helper, please initialize with \\n\"\n                            + \"NDKHelper::Init( ANativeActivity* activity, const char* helper_class_name, const char* native_soname);\\n\"\n                            + \"--------------------------------------------\\n\");\n            return false;\n        } else\n            return true;\n    }\n\n    private static boolean loadedSO = false;\n    NativeActivity activity;\n\n\n\n    //\n    // Load Bitmap\n    // Java helper is useful decoding PNG, TIFF etc rather than linking libPng\n    // etc separately\n    //\n    private int nextPOT(int i) {\n        int pot = 1;\n        while (pot < i)\n            pot <<= 1;\n        return pot;\n    }\n\n    private Bitmap scaleBitmap(Bitmap bitmapToScale, float newWidth,\n                               float newHeight) {\n        if (bitmapToScale == null)\n            return null;\n        // get the original width and height\n        int width = bitmapToScale.getWidth();\n        int height = bitmapToScale.getHeight();\n        // create a matrix for the manipulation\n        Matrix matrix = new Matrix();\n\n        // resize the bit map\n        matrix.postScale(newWidth / width, newHeight / height);\n\n        // recreate the new Bitmap and set it back\n        return Bitmap.createBitmap(bitmapToScale, 0, 0,\n                bitmapToScale.getWidth(), bitmapToScale.getHeight(), matrix,\n                true);\n    }\n\n    public class TextureInformation {\n        boolean ret;\n        boolean alphaChannel;\n        int originalWidth;\n        int originalHeight;\n        Object image;\n    }\n\n    public Object loadTexture(String path) {\n        Bitmap bitmap = null;\n        TextureInformation info = new TextureInformation();\n        try {\n            String str = path;\n            if (!path.startsWith(\"/\")) {\n                str = \"/\" + path;\n            }\n\n            File file = new File(activity.getExternalFilesDir(null), str);\n            if (file.canRead()) {\n                bitmap = BitmapFactory.decodeStream(new FileInputStream(file));\n            } else {\n                bitmap = BitmapFactory.decodeStream(activity.getResources()\n                        .getAssets().open(path));\n            }\n            // Matrix matrix = new Matrix();\n            // // resize the bit map\n            // matrix.postScale(-1F, 1F);\n            //\n            // // recreate the new Bitmap and set it back\n            // bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),\n            // bitmap.getHeight(), matrix, true);\n\n        } catch (Exception e) {\n            Log.w(\"NDKHelper\", \"Coundn't load a file:\" + path);\n            info.ret = false;\n            return info;\n        }\n\n        if (bitmap != null) {\n            GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);\n        }\n        info.ret = true;\n        info.alphaChannel = bitmap.hasAlpha();\n        info.originalWidth = getBitmapWidth(bitmap);\n        info.originalHeight = getBitmapHeight(bitmap);\n\n        return info;\n    }\n\n    public Object loadCubemapTexture(String path, int face, int miplevel, boolean sRGB) {\n        Bitmap bitmap = null;\n        TextureInformation info = new TextureInformation();\n        try {\n            String str = path;\n            if (!path.startsWith(\"/\")) {\n                str = \"/\" + path;\n            }\n\n            File file = new File(activity.getExternalFilesDir(null), str);\n            if (file.canRead()) {\n                bitmap = BitmapFactory.decodeStream(new FileInputStream(file));\n            } else {\n                bitmap = BitmapFactory.decodeStream(activity.getResources()\n                        .getAssets().open(path));\n            }\n        } catch (Exception e) {\n            Log.w(\"NDKHelper\", \"Coundn't load a file:\" + path);\n            info.ret = false;\n            return info;\n        }\n\n        if (bitmap != null) {\n            if (sRGB)\n            {\n//        \t\tGLUtils.texImage2D(face, miplevel, bitmap, 0);\n//        \t\tGLUtils.texImage2D(face, miplevel,\n//        \t\t\t\tGLUtils.getInternalFormat(bitmap), bitmap, 0);\n//        \t\tint i = GLUtils.getInternalFormat(bitmap);\n//        \t\tif( i == GL10.GL_RGBA)\n//        \t\t{\n//            \t\tGLUtils.texImage2D(face, miplevel,\n//            \t\t\t\tGLES30.GL_SRGB, bitmap, 0);\n//        \t\t}\n                //Leave them for now\n                GLUtils.texImage2D(face, miplevel, bitmap, 0);\n            }\n            else\n                GLUtils.texImage2D(face, miplevel, bitmap, 0);\n        }\n        info.ret = true;\n        info.alphaChannel = bitmap.hasAlpha();\n        info.originalWidth = getBitmapWidth(bitmap);\n        info.originalHeight = getBitmapHeight(bitmap);\n\n        return info;\n\n    }\n\n    public Object loadImage(String path) {\n        Bitmap bitmap = null;\n        TextureInformation info = new TextureInformation();\n        try {\n            String str = path;\n            if (!path.startsWith(\"/\")) {\n                str = \"/\" + path;\n            }\n\n            File file = new File(activity.getExternalFilesDir(null), str);\n            if (file.canRead()) {\n                bitmap = BitmapFactory.decodeStream(new FileInputStream(file));\n            } else {\n                bitmap = BitmapFactory.decodeStream(activity.getResources()\n                        .getAssets().open(path));\n            }\n        } catch (Exception e) {\n            Log.w(\"NDKHelper\", \"Coundn't load a file:\" + path);\n            info.ret = false;\n            return info;\n        }\n\n        if (bitmap != null) {\n            GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);\n        }\n        info.ret = true;\n        info.alphaChannel = bitmap.hasAlpha();\n        info.originalWidth = getBitmapWidth(bitmap);\n        info.originalHeight = getBitmapHeight(bitmap);\n\n        int iBytes = bitmap.getWidth() * bitmap.getHeight() * 4;\n        ByteBuffer buffer = ByteBuffer.allocateDirect(iBytes);\n\n        bitmap.copyPixelsToBuffer(buffer);\n        info.image = buffer;\n        return info;\n    }\n\n    public Bitmap openBitmap(String path, boolean iScalePOT) {\n        Bitmap bitmap = null;\n        try {\n            bitmap = BitmapFactory.decodeStream(activity.getResources()\n                    .getAssets().open(path));\n            if (iScalePOT) {\n                int originalWidth = getBitmapWidth(bitmap);\n                int originalHeight = getBitmapHeight(bitmap);\n                int width = nextPOT(originalWidth);\n                int height = nextPOT(originalHeight);\n                if (originalWidth != width || originalHeight != height) {\n                    // Scale it\n                    bitmap = scaleBitmap(bitmap, width, height);\n                }\n            }\n\n        } catch (Exception e) {\n            Log.w(\"NDKHelper\", \"Coundn't load a file:\" + path);\n        }\n\n        return bitmap;\n    }\n\n    public int getBitmapWidth(Bitmap bmp) {\n        return bmp.getWidth();\n    }\n\n    public int getBitmapHeight(Bitmap bmp) {\n        return bmp.getHeight();\n    }\n\n    public void getBitmapPixels(Bitmap bmp, int[] pixels) {\n        int w = bmp.getWidth();\n        int h = bmp.getHeight();\n        bmp.getPixels(pixels, 0, w, 0, 0, w, h);\n    }\n\n    public void closeBitmap(Bitmap bmp) {\n        bmp.recycle();\n    }\n\n    public String getNativeLibraryDirectory(Context appContext) {\n        ApplicationInfo ai = activity.getApplicationInfo();\n\n        Log.w(\"NDKHelper\", \"ai.nativeLibraryDir:\" + ai.nativeLibraryDir);\n\n        if ((ai.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0\n                || (ai.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {\n            return ai.nativeLibraryDir;\n        }\n        return \"/system/lib/\";\n    }\n\n    public String getApplicationName() {\n        final PackageManager pm = activity.getPackageManager();\n        ApplicationInfo ai;\n        try {\n            ai = pm.getApplicationInfo(activity.getPackageName(), 0);\n        } catch (final NameNotFoundException e) {\n            ai = null;\n        }\n        String applicationName = (String) (ai != null ? pm\n                .getApplicationLabel(ai) : \"(unknown)\");\n        return applicationName;\n    }\n\n    public String getStringResource(String resourceName)\n    {\n        int id = activity.getResources().getIdentifier(resourceName, \"string\", activity.getPackageName());\n        String value = id == 0 ? \"\" : (String)activity.getResources().getText(id);\n        return value;\n    }\n\n    //\n    // Audio related helpers\n    //\n    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)\n    public int getNativeAudioBufferSize() {\n        int SDK_INT = android.os.Build.VERSION.SDK_INT;\n        if (SDK_INT >= 17) {\n            AudioManager am = (AudioManager) activity\n                    .getSystemService(Context.AUDIO_SERVICE);\n            String framesPerBuffer = am\n                    .getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);\n            return Integer.parseInt(framesPerBuffer);\n        } else {\n            return 0;\n        }\n    }\n\n    public int getNativeAudioSampleRate() {\n        return AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_SYSTEM);\n    }\n\n    /*\n     * Helper to execute function in UIThread\n     */\n    public void runOnUIThread(final long p) {\n        if (checkSOLoaded()) {\n            activity.runOnUiThread(new Runnable() {\n                @Override\n                public void run() {\n                    RunOnUiThreadHandler(p);\n                }\n            });\n        }\n        return;\n    }\n\n    /*\n     * Native code helper for RunOnUiThread\n     */\n    native public void RunOnUiThreadHandler(long pointer);\n}\n"
  },
  {
    "path": "teapots/image-decoder/src/main/java/com/sample/imagedecoder/TeapotApplication.java",
    "content": "/*\n * Copyright 2020 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.sample.imagedecoder;\n\nimport javax.microedition.khronos.opengles.GL10;\n\nimport android.app.Application;\nimport android.content.Context;\nimport android.content.pm.ApplicationInfo;\nimport android.content.pm.PackageManager;\nimport android.content.pm.PackageManager.NameNotFoundException;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport android.graphics.Matrix;\nimport android.opengl.GLUtils;\nimport android.util.Log;\nimport android.widget.Toast;\n\npublic class TeapotApplication extends Application {\n    public void onCreate(){\n        super.onCreate();\n        Log.w(\"native-activity\", \"onCreate\");\n\n        final PackageManager pm = getApplicationContext().getPackageManager();\n        ApplicationInfo ai;\n        try {\n            ai = pm.getApplicationInfo( this.getPackageName(), 0);\n        } catch (final NameNotFoundException e) {\n            ai = null;\n        }\n        final String applicationName = (String) (ai != null ? pm.getApplicationLabel(ai) : \"(unknown)\");\n        Toast.makeText(this, applicationName, Toast.LENGTH_SHORT).show();\n    }\n}\n"
  },
  {
    "path": "teapots/image-decoder/src/main/java/com/sample/imagedecoder/TeapotNativeActivity.java",
    "content": "/*\n * Copyright 2020 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.sample.imagedecoder;\n\nimport android.annotation.SuppressLint;\nimport android.annotation.TargetApi;\nimport android.app.NativeActivity;\nimport android.os.Bundle;\nimport android.view.Gravity;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup.MarginLayoutParams;\nimport android.view.WindowManager.LayoutParams;\nimport android.widget.LinearLayout;\nimport android.widget.PopupWindow;\nimport android.widget.TextView;\n\npublic class TeapotNativeActivity extends NativeActivity {\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        //Hide toolbar\n        int SDK_INT = android.os.Build.VERSION.SDK_INT;\n        if(SDK_INT >= 19)\n        {\n            setImmersiveSticky();\n\n            View decorView = getWindow().getDecorView();\n            decorView.setOnSystemUiVisibilityChangeListener\n                    (new View.OnSystemUiVisibilityChangeListener() {\n                @Override\n                public void onSystemUiVisibilityChange(int visibility) {\n                    setImmersiveSticky();\n                }\n            });\n        }\n\n    }\n\n    @TargetApi(19)\n    protected void onResume() {\n        super.onResume();\n\n        //Hide toolbar\n        int SDK_INT = android.os.Build.VERSION.SDK_INT;\n        if(SDK_INT >= 11 && SDK_INT < 14)\n        {\n            getWindow().getDecorView().setSystemUiVisibility(View.STATUS_BAR_HIDDEN);\n        }\n        else if(SDK_INT >= 14 && SDK_INT < 19)\n        {\n            getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LOW_PROFILE);\n        }\n        else if(SDK_INT >= 19)\n        {\n            setImmersiveSticky();\n        }\n\n    }\n    // Our popup window, you will call it from your C/C++ code later\n\n    @TargetApi(19)\n    void setImmersiveSticky() {\n        View decorView = getWindow().getDecorView();\n        decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN\n                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION\n                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY\n                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN\n                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION\n                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);\n    }\n\n    TeapotNativeActivity _activity;\n    PopupWindow _popupWindow;\n    TextView _label;\n\n    @SuppressLint(\"InflateParams\")\n    public void showUI()\n    {\n        if( _popupWindow != null )\n            return;\n\n        _activity = this;\n\n        this.runOnUiThread(new Runnable()  {\n            @Override\n            public void run()  {\n                LayoutInflater layoutInflater\n                = (LayoutInflater)getBaseContext()\n                .getSystemService(LAYOUT_INFLATER_SERVICE);\n                View popupView = layoutInflater.inflate(R.layout.widgets, null);\n                _popupWindow = new PopupWindow(\n                        popupView,\n                        LayoutParams.WRAP_CONTENT,\n                        LayoutParams.WRAP_CONTENT);\n\n                LinearLayout mainLayout = new LinearLayout(_activity);\n                MarginLayoutParams params = new MarginLayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);\n                params.setMargins(0, 0, 0, 0);\n                _activity.setContentView(mainLayout, params);\n\n                // Show our UI over NativeActivity window\n                _popupWindow.showAtLocation(mainLayout, Gravity.TOP | Gravity.START, 10, 10);\n                _popupWindow.update();\n\n                _label = (TextView)popupView.findViewById(R.id.textViewFPS);\n\n            }});\n    }\n\n    protected void onPause()\n    {\n        super.onPause();\n    }\n\n    public void updateFPS(final float fFPS)\n    {\n        if( _label == null )\n            return;\n\n        _activity = this;\n        this.runOnUiThread(new Runnable()  {\n            @Override\n            public void run()  {\n                _label.setText(String.format(\"%2.2f FPS\", fFPS));\n\n            }});\n    }\n}\n\n\n"
  },
  {
    "path": "teapots/image-decoder/src/main/res/layout/widgets.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:gravity=\"top\"\n    android:orientation=\"vertical\" >\n\n    <TextView\n        android:id=\"@+id/textViewFPS\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"end\"\n        android:text=\"@string/fps\"\n        android:textAppearance=\"?android:attr/textAppearanceMedium\"\n        android:textColor=\"@android:color/white\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "teapots/image-decoder/src/main/res/values/strings.xml",
    "content": "<resources>\n\n    <string name=\"app_name\">Android R ImageDecoder Demo</string>\n    <string name=\"fps\">0.0 FPS</string>\n\n</resources>\n"
  },
  {
    "path": "teapots/image-decoder/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!--\n        Base application theme, dependent on API level. This theme is replaced\n        by AppBaseTheme from res/values-vXX/styles.xml on newer devices.\n    -->\n    <style name=\"AppBaseTheme\" parent=\"android:Theme.Light\">\n        <!--\n            Theme customizations available in newer API levels can go in\n            res/values-vXX/styles.xml, while customizations related to\n            backward-compatibility can go here.\n        -->\n    </style>\n\n    <!-- Application theme. -->\n    <style name=\"AppTheme\" parent=\"AppBaseTheme\">\n        <!-- All customizations that are NOT specific to a particular API-level can go here. -->\n    </style>\n\n</resources>"
  },
  {
    "path": "teapots/image-decoder/src/main/res/values-v11/styles.xml",
    "content": "<resources>\n\n    <!--\n        Base application theme for API 11+. This theme completely replaces\n        AppBaseTheme from res/values/styles.xml on API 11+ devices.\n    -->\n    <style name=\"AppBaseTheme\" parent=\"android:Theme.Holo.Light\">\n        <!-- API 11 theme customizations can go here. -->\n    </style>\n\n</resources>"
  },
  {
    "path": "teapots/image-decoder/src/main/res/values-v14/styles.xml",
    "content": "<resources>\n\n    <!--\n        Base application theme for API 14+. This theme completely replaces\n        AppBaseTheme from BOTH res/values/styles.xml and\n        res/values-v11/styles.xml on API 14+ devices.\n    -->\n    <style name=\"AppBaseTheme\" parent=\"android:Theme.Holo.Light.DarkActionBar\">\n        <!-- API 14 theme customizations can go here. -->\n    </style>\n\n</resources>"
  },
  {
    "path": "teapots/more-teapots/build.gradle",
    "content": "plugins {\n    id \"ndksamples.android.application\"\n}\n\nandroid {\n    namespace 'com.sample.moreteapots'\n\n    defaultConfig {\n        applicationId  'com.sample.moreteapots'\n        externalNativeBuild {\n            cmake {\n                arguments '-DANDROID_STL=c++_static'\n            }\n        }\n    }\n\n    externalNativeBuild {\n        cmake {\n            path 'src/main/cpp/CMakeLists.txt'\n        }\n    }\n}\ndependencies {\n    implementation libs.appcompat\n    implementation libs.androidx.constraintlayout\n}\n"
  },
  {
    "path": "teapots/more-teapots/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:versionCode=\"1\"\n          android:versionName=\"1.0\" >\n\n  <uses-feature android:glEsVersion=\"0x00020000\"></uses-feature>\n  <application\n      android:allowBackup=\"false\"\n      android:fullBackupContent=\"false\"\n      android:supportsRtl=\"true\"\n      android:icon=\"@mipmap/ic_launcher\"\n      android:label=\"@string/app_name\"\n      android:theme=\"@style/AppTheme\"\n      android:name=\"com.sample.moreteapots.MoreTeapotsApplication\"\n      >\n\n    <!-- Our activity is the built-in NativeActivity framework class.\n         This will take care of integrating with our NDK code. -->\n    <activity android:name=\"com.sample.moreteapots.MoreTeapotsNativeActivity\"\n              android:label=\"@string/app_name\"\n              android:configChanges=\"orientation|keyboardHidden\"\n        android:exported=\"true\">\n      <!-- Tell NativeActivity the name of our .so -->\n      <meta-data android:name=\"android.app.lib_name\"\n                 android:value=\"MoreTeapotsNativeActivity\" />\n      <intent-filter>\n        <action android:name=\"android.intent.action.MAIN\" />\n        <category android:name=\"android.intent.category.LAUNCHER\" />\n      </intent-filter>\n    </activity>\n  </application>\n</manifest>\n"
  },
  {
    "path": "teapots/more-teapots/src/main/assets/Shaders/ShaderPlain.fsh",
    "content": "//\n// Copyright (C) 2015 The Android Open Source Project\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n//  ShaderPlain.fsh\n//\n\nuniform lowp vec3       vMaterialAmbient;\nuniform lowp vec4       vMaterialSpecular;\n\nvarying lowp vec4 colorDiffuse;\n\nuniform highp vec3      vLight0;\nvarying mediump vec3 position;\nvarying mediump vec3 normal;\n\nvoid main()\n{\n    mediump vec3 halfVector = normalize(-vLight0 + position);\n    mediump float NdotH = max(dot(normalize(normal), halfVector), 0.0);\n    mediump float fPower = vMaterialSpecular.w;\n    mediump float specular = pow(NdotH, fPower);\n\n    lowp vec4 colorSpecular = vec4( vMaterialSpecular.xyz * specular, 1 );\n    gl_FragColor = colorDiffuse + colorSpecular;\n}\n"
  },
  {
    "path": "teapots/more-teapots/src/main/assets/Shaders/ShaderPlainES3.fsh",
    "content": "//\n// Copyright (C) 2015 The Android Open Source Project\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\n#version 300 es\nprecision mediump float;\n\nuniform lowp vec4  vMaterialSpecular;\nuniform highp vec3 vLight0;\n\nin lowp vec4 colorDiffuse;\nin vec3 position;\nin vec3 normal;\nout vec4 outColor;\n\nvoid main()\n{\n    mediump vec3 halfVector = normalize(-vLight0 + position);\n    mediump float NdotH = max(dot(normalize(normal), halfVector), 0.0);\n    mediump float fPower = vMaterialSpecular.w;\n    mediump float specular = pow(NdotH, fPower);\n\n    lowp vec4 colorSpecular = vec4( vMaterialSpecular.xyz * specular, 1 );\n    outColor = colorDiffuse + colorSpecular;\n}\n"
  },
  {
    "path": "teapots/more-teapots/src/main/assets/Shaders/VS_ShaderPlain.vsh",
    "content": "//\n// Copyright (C) 2015 The Android Open Source Project\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n//  ShaderPlain.vsh\n//\n\nattribute highp vec3    myVertex;\nattribute highp vec3    myNormal;\n\nvarying lowp    vec4    colorDiffuse;\n\nvarying mediump vec3 position;\nvarying mediump vec3 normal;\n\nuniform highp mat4      uMVMatrix;\nuniform highp mat4      uPMatrix;\n\nuniform highp vec3      vLight0;\n\nuniform lowp vec4       vMaterialDiffuse;\nuniform lowp vec3       vMaterialAmbient;\n\nvoid main(void)\n{\n    highp vec4 p = vec4(myVertex,1);\n    gl_Position = uPMatrix * p;\n\n    highp vec3 worldNormal = vec3(mat3(uMVMatrix[0].xyz, uMVMatrix[1].xyz, uMVMatrix[2].xyz) * myNormal);\n    highp vec3 ecPosition = p.xyz;\n\n    colorDiffuse = dot( worldNormal, normalize(-vLight0+ecPosition) ) * vMaterialDiffuse  + vec4( vMaterialAmbient, 1 );\n\n    normal = worldNormal;\n    position = ecPosition;\n}\n"
  },
  {
    "path": "teapots/more-teapots/src/main/assets/Shaders/VS_ShaderPlainES3.vsh",
    "content": "//\n// Copyright (C) 2015 The Android Open Source Project\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n#version 300 es\nprecision mediump float;\n\n//\n//Shader with phoneshading + geometry instancing support\n//Parameters with %PARAM_NAME% will be replaced to actual parameter at compile time\n//\n\nconst int NUM_OBJECTS = %NUM_TEAPOT%;\nlayout(location=%LOCATION_VERTEX%) in highp vec3    myVertex;\nlayout(location=%LOCATION_NORMAL%) in highp vec3    myNormal;\n\nlayout(std140) uniform ParamBlock {\n    mat4      uPMatrix[NUM_OBJECTS];\n    mat4      uMVMatrix[NUM_OBJECTS];\n    vec3      vMaterialDiffuse[NUM_OBJECTS];\n};\n\nuniform highp vec3      vLight0;\nuniform lowp vec3       vMaterialAmbient;\nuniform lowp vec4       vMaterialSpecular;\n\nout lowp    vec4    colorDiffuse;\n\nout mediump vec3 position;\nout mediump vec3 normal;\n\nvoid main(void)\n{\n    highp vec4 p = vec4(myVertex,1);\n    gl_Position = uPMatrix[gl_InstanceID%ARB%] * p;\n\n    highp vec3 worldNormal = vec3(mat3(uMVMatrix[gl_InstanceID%ARB%][0].xyz,\n            uMVMatrix[gl_InstanceID%ARB%][1].xyz,\n            uMVMatrix[gl_InstanceID%ARB%][2].xyz) * myNormal);\n    highp vec3 ecPosition = p.xyz;\n\n    colorDiffuse = dot( worldNormal, normalize(-vLight0+ecPosition) ) * vec4(vMaterialDiffuse[gl_InstanceID%ARB%], 1.f)  + vec4( vMaterialAmbient, 1 );\n\n    normal = worldNormal;\n    position = ecPosition;\n}\n"
  },
  {
    "path": "teapots/more-teapots/src/main/cpp/CMakeLists.txt",
    "content": "#\n# Copyright (C) The Android Open Source Project\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\ncmake_minimum_required(VERSION 3.22.1)\nproject(MoreTeapotsNativeActivity LANGUAGES C CXX)\n\ninclude(AppLibrary)\n\n# build the ndk-helper library\nget_filename_component(commonDir ${CMAKE_CURRENT_SOURCE_DIR}/../../../../common ABSOLUTE)\nget_filename_component(ndkHelperSrc ${commonDir}/ndk_helper ABSOLUTE)\nadd_subdirectory(${ndkHelperSrc}\n    ndkHelperBin/${CMAKE_BUILD_TYPE}/${ANDROID_ABI})\n\n\n# now build app's shared lib\nadd_app_library(${PROJECT_NAME}\n    SHARED\n    MoreTeapotsNativeActivity.cpp\n    MoreTeapotsRenderer.cpp\n)\nset_target_properties(${PROJECT_NAME}\n    PROPERTIES\n    CXX_STANDARD 11\n    CXX_STANDARD_REQUIRED YES\n    CXX_EXTENSIONS NO\n)\n\n# Export ANativeActivity_onCreate(),\n# Refer to: https://github.com/android-ndk/ndk/issues/381.\nset_target_properties(${PROJECT_NAME}\n    PROPERTIES LINK_FLAGS \"-u ANativeActivity_onCreate\")\n\n# add lib dependencies\ntarget_link_libraries(${PROJECT_NAME}\n    PRIVATE\n    NdkHelper\n)\n"
  },
  {
    "path": "teapots/more-teapots/src/main/cpp/MoreTeapotsNativeActivity.cpp",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//--------------------------------------------------------------------------------\n// Include files\n//--------------------------------------------------------------------------------\n#include <EGL/egl.h>\n#include <GLES/gl.h>\n#include <android/log.h>\n#include <android/native_window_jni.h>\n#include <android/sensor.h>\n#include <android_native_app_glue.h>\n#include <errno.h>\n#include <jni.h>\n\n#include <vector>\n\n#include \"MoreTeapotsRenderer.h\"\n\n//-------------------------------------------------------------------------\n// Preprocessor\n//-------------------------------------------------------------------------\n#define HELPER_CLASS_NAME \\\n  \"com/sample/helper/NDKHelper\"  // Class name of helper function\n//-------------------------------------------------------------------------\n// Constants\n//-------------------------------------------------------------------------\nconst int32_t NUM_TEAPOTS_X = 8;\nconst int32_t NUM_TEAPOTS_Y = 8;\nconst int32_t NUM_TEAPOTS_Z = 8;\n\n//-------------------------------------------------------------------------\n// Shared state for our app.\n//-------------------------------------------------------------------------\nstruct android_app;\nclass Engine {\n  MoreTeapotsRenderer renderer_;\n\n  ndk_helper::GLContext* gl_context_;\n\n  bool initialized_resources_;\n  bool has_focus_;\n\n  ndk_helper::DoubletapDetector doubletap_detector_;\n  ndk_helper::PinchDetector pinch_detector_;\n  ndk_helper::DragDetector drag_detector_;\n  ndk_helper::PerfMonitor monitor_;\n\n  ndk_helper::TapCamera tap_camera_;\n\n  android_app* app_;\n\n  ASensorManager* sensor_manager_;\n  const ASensor* accelerometer_sensor_;\n  ASensorEventQueue* sensor_event_queue_;\n\n  void UpdateFPS(float fps);\n  void ShowUI();\n  void TransformPosition(ndk_helper::Vec2& vec);\n\n public:\n  static void HandleCmd(struct android_app* app, int32_t cmd);\n  static int32_t HandleInput(android_app* app, AInputEvent* event);\n\n  Engine();\n  ~Engine();\n  void SetState(android_app* app);\n  int InitDisplay(android_app* app);\n  void LoadResources();\n  void UnloadResources();\n  void DrawFrame();\n  void TermDisplay();\n  void TrimMemory();\n  bool IsReady();\n\n  void UpdatePosition(AInputEvent* event, int32_t index, float& x, float& y);\n\n  void InitSensors();\n  void ProcessSensors(int32_t id);\n  void SuspendSensors();\n  void ResumeSensors();\n};\n\n//-------------------------------------------------------------------------\n// Ctor\n//-------------------------------------------------------------------------\nEngine::Engine()\n    : initialized_resources_(false),\n      has_focus_(false),\n      app_(NULL),\n      sensor_manager_(NULL),\n      accelerometer_sensor_(NULL),\n      sensor_event_queue_(NULL) {\n  gl_context_ = ndk_helper::GLContext::GetInstance();\n}\n\n//-------------------------------------------------------------------------\n// Dtor\n//-------------------------------------------------------------------------\nEngine::~Engine() {}\n\n/**\n * Load resources\n */\nvoid Engine::LoadResources() {\n  renderer_.Init(NUM_TEAPOTS_X, NUM_TEAPOTS_Y, NUM_TEAPOTS_Z);\n  renderer_.Bind(&tap_camera_);\n}\n\n/**\n * Unload resources\n */\nvoid Engine::UnloadResources() { renderer_.Unload(); }\n\n/**\n * Initialize an EGL context for the current display.\n */\nint Engine::InitDisplay(android_app* app) {\n  if (!initialized_resources_) {\n    gl_context_->Init(app_->window);\n    LoadResources();\n    initialized_resources_ = true;\n  } else if (app->window != gl_context_->GetANativeWindow()) {\n    // Re-initialize ANativeWindow.\n    // On some devices, ANativeWindow is re-created when the app is resumed\n    assert(gl_context_->GetANativeWindow());\n    UnloadResources();\n    gl_context_->Invalidate();\n    app_ = app;\n    gl_context_->Init(app->window);\n    LoadResources();\n    initialized_resources_ = true;\n  } else {\n    // initialize OpenGL ES and EGL\n    if (EGL_SUCCESS == gl_context_->Resume(app_->window)) {\n      UnloadResources();\n      LoadResources();\n    } else {\n      assert(0);\n    }\n  }\n\n  ShowUI();\n\n  // Initialize GL state.\n  glEnable(GL_CULL_FACE);\n  glEnable(GL_DEPTH_TEST);\n  glDepthFunc(GL_LEQUAL);\n\n  // Note that screen size might have been changed\n  glViewport(0, 0, gl_context_->GetScreenWidth(),\n             gl_context_->GetScreenHeight());\n  renderer_.UpdateViewport();\n\n  tap_camera_.SetFlip(1.f, -1.f, -1.f);\n  tap_camera_.SetPinchTransformFactor(10.f, 10.f, 8.f);\n\n  return 0;\n}\n\n/**\n * Just the current frame in the display.\n */\nvoid Engine::DrawFrame() {\n  float fps;\n  if (monitor_.Update(fps)) {\n    UpdateFPS(fps);\n  }\n  double dTime = monitor_.GetCurrentTime();\n  renderer_.Update(dTime);\n\n  // Just fill the screen with a color.\n  glClearColor(0.5f, 0.5f, 0.5f, 1.f);\n  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n  renderer_.Render();\n\n  // Swap\n  if (EGL_SUCCESS != gl_context_->Swap()) {\n    UnloadResources();\n    LoadResources();\n  }\n}\n\n/**\n * Tear down the EGL context currently associated with the display.\n */\nvoid Engine::TermDisplay() { gl_context_->Suspend(); }\n\nvoid Engine::TrimMemory() {\n  LOGI(\"Trimming memory\");\n  gl_context_->Invalidate();\n}\n/**\n * Process the next input event.\n */\nint32_t Engine::HandleInput(android_app* app, AInputEvent* event) {\n  Engine* eng = (Engine*)app->userData;\n  if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION) {\n    ndk_helper::GESTURE_STATE doubleTapState =\n        eng->doubletap_detector_.Detect(event);\n    ndk_helper::GESTURE_STATE dragState = eng->drag_detector_.Detect(event);\n    ndk_helper::GESTURE_STATE pinchState = eng->pinch_detector_.Detect(event);\n\n    // Double tap detector has a priority over other detectors\n    if (doubleTapState == ndk_helper::GESTURE_STATE_ACTION) {\n      // Detect double tap\n      eng->tap_camera_.Reset(true);\n    } else {\n      // Handle drag state\n      if (dragState & ndk_helper::GESTURE_STATE_START) {\n        // Otherwise, start dragging\n        ndk_helper::Vec2 v;\n        eng->drag_detector_.GetPointer(v);\n        eng->TransformPosition(v);\n        eng->tap_camera_.BeginDrag(v);\n      } else if (dragState & ndk_helper::GESTURE_STATE_MOVE) {\n        ndk_helper::Vec2 v;\n        eng->drag_detector_.GetPointer(v);\n        eng->TransformPosition(v);\n        eng->tap_camera_.Drag(v);\n      } else if (dragState & ndk_helper::GESTURE_STATE_END) {\n        eng->tap_camera_.EndDrag();\n      }\n\n      // Handle pinch state\n      if (pinchState & ndk_helper::GESTURE_STATE_START) {\n        // Start new pinch\n        ndk_helper::Vec2 v1;\n        ndk_helper::Vec2 v2;\n        eng->pinch_detector_.GetPointers(v1, v2);\n        eng->TransformPosition(v1);\n        eng->TransformPosition(v2);\n        eng->tap_camera_.BeginPinch(v1, v2);\n      } else if (pinchState & ndk_helper::GESTURE_STATE_MOVE) {\n        // Multi touch\n        // Start new pinch\n        ndk_helper::Vec2 v1;\n        ndk_helper::Vec2 v2;\n        eng->pinch_detector_.GetPointers(v1, v2);\n        eng->TransformPosition(v1);\n        eng->TransformPosition(v2);\n        eng->tap_camera_.Pinch(v1, v2);\n      }\n    }\n    return 1;\n  }\n  return 0;\n}\n\n/**\n * Process the next main command.\n */\nvoid Engine::HandleCmd(struct android_app* app, int32_t cmd) {\n  Engine* eng = (Engine*)app->userData;\n  switch (cmd) {\n    case APP_CMD_SAVE_STATE:\n      break;\n    case APP_CMD_INIT_WINDOW:\n      // The window is being shown, get it ready.\n      if (app->window != NULL) {\n        eng->InitDisplay(app);\n        eng->has_focus_ = true;\n        eng->DrawFrame();\n      }\n      break;\n    case APP_CMD_TERM_WINDOW:\n      // The window is being hidden or closed, clean it up.\n      eng->TermDisplay();\n      eng->has_focus_ = false;\n      break;\n    case APP_CMD_STOP:\n      break;\n    case APP_CMD_GAINED_FOCUS:\n      eng->ResumeSensors();\n      // Start animation\n      eng->has_focus_ = true;\n      break;\n    case APP_CMD_LOST_FOCUS:\n      eng->SuspendSensors();\n      // Also stop animating.\n      eng->has_focus_ = false;\n      eng->DrawFrame();\n      break;\n    case APP_CMD_LOW_MEMORY:\n      // Free up GL resources\n      eng->TrimMemory();\n      break;\n  }\n}\n\n//-------------------------------------------------------------------------\n// Sensor handlers\n//-------------------------------------------------------------------------\nvoid Engine::InitSensors() {\n  sensor_manager_ = ndk_helper::AcquireASensorManagerInstance(app_);\n  accelerometer_sensor_ = ASensorManager_getDefaultSensor(\n      sensor_manager_, ASENSOR_TYPE_ACCELEROMETER);\n  sensor_event_queue_ = ASensorManager_createEventQueue(\n      sensor_manager_, app_->looper, LOOPER_ID_USER, NULL, NULL);\n}\n\nvoid Engine::ProcessSensors(int32_t id) {\n  // If a sensor has data, process it now.\n  if (id == LOOPER_ID_USER) {\n    if (accelerometer_sensor_ != NULL) {\n      ASensorEvent event;\n      while (ASensorEventQueue_getEvents(sensor_event_queue_, &event, 1) > 0) {\n      }\n    }\n  }\n}\n\nvoid Engine::ResumeSensors() {\n  // When our app gains focus, we start monitoring the accelerometer.\n  if (accelerometer_sensor_ != NULL) {\n    ASensorEventQueue_enableSensor(sensor_event_queue_, accelerometer_sensor_);\n    // We'd like to get 60 events per second (in us).\n    ASensorEventQueue_setEventRate(sensor_event_queue_, accelerometer_sensor_,\n                                   (1000L / 60) * 1000);\n  }\n}\n\nvoid Engine::SuspendSensors() {\n  // When our app loses focus, we stop monitoring the accelerometer.\n  // This is to avoid consuming battery while not being used.\n  if (accelerometer_sensor_ != NULL) {\n    ASensorEventQueue_disableSensor(sensor_event_queue_, accelerometer_sensor_);\n  }\n}\n\n//-------------------------------------------------------------------------\n// Misc\n//-------------------------------------------------------------------------\nvoid Engine::SetState(android_app* state) {\n  app_ = state;\n  doubletap_detector_.SetConfiguration(app_->config);\n  drag_detector_.SetConfiguration(app_->config);\n  pinch_detector_.SetConfiguration(app_->config);\n}\n\nbool Engine::IsReady() {\n  if (has_focus_) return true;\n\n  return false;\n}\n\nvoid Engine::TransformPosition(ndk_helper::Vec2& vec) {\n  vec = ndk_helper::Vec2(2.0f, 2.0f) * vec /\n            ndk_helper::Vec2(gl_context_->GetScreenWidth(),\n                             gl_context_->GetScreenHeight()) -\n        ndk_helper::Vec2(1.f, 1.f);\n}\n\nvoid Engine::ShowUI() {\n  JNIEnv* jni;\n  app_->activity->vm->AttachCurrentThread(&jni, NULL);\n\n  // Default class retrieval\n  jclass clazz = jni->GetObjectClass(app_->activity->clazz);\n  jmethodID methodID = jni->GetMethodID(clazz, \"showUI\", \"()V\");\n  jni->CallVoidMethod(app_->activity->clazz, methodID);\n\n  app_->activity->vm->DetachCurrentThread();\n  return;\n}\n\nvoid Engine::UpdateFPS(float fps) {\n  JNIEnv* jni;\n  app_->activity->vm->AttachCurrentThread(&jni, NULL);\n\n  // Default class retrieval\n  jclass clazz = jni->GetObjectClass(app_->activity->clazz);\n  jmethodID methodID = jni->GetMethodID(clazz, \"updateFPS\", \"(F)V\");\n  jni->CallVoidMethod(app_->activity->clazz, methodID, fps);\n\n  app_->activity->vm->DetachCurrentThread();\n  return;\n}\n\nEngine g_engine;\n\n/**\n * This is the main entry point of a native application that is using\n * android_native_app_glue.  It runs in its own thread, with its own\n * event loop for receiving input events and doing other things.\n */\nvoid android_main(android_app* state) {\n  g_engine.SetState(state);\n\n  // Init helper functions\n  ndk_helper::JNIHelper::GetInstance()->Init(state->activity,\n                                             HELPER_CLASS_NAME);\n\n  state->userData = &g_engine;\n  state->onAppCmd = Engine::HandleCmd;\n  state->onInputEvent = Engine::HandleInput;\n\n#ifdef USE_NDK_PROFILER\n  monstartup(\"libMoreTeapotsNativeActivity.so\");\n#endif\n\n  // Prepare to monitor accelerometer\n  g_engine.InitSensors();\n\n  // loop waiting for stuff to do.\n  while (!state->destroyRequested) {\n    // If not animating, we will block forever waiting for events.\n    // If animating, we loop until all events are read, then continue\n    // to draw the next frame of animation.\n    android_poll_source* source = nullptr;\n    auto result = ALooper_pollOnce(g_engine.IsReady() ? 0 : -1, nullptr,\n                                   nullptr, (void**)&source);\n    if (result == ALOOPER_POLL_ERROR) {\n      LOGE(\"ALooper_pollOnce returned an error\");\n      std::abort();\n    }\n\n    // Process this event.\n    if (source != NULL) source->process(state, source);\n\n    g_engine.ProcessSensors(result);\n\n    if (g_engine.IsReady()) {\n      // Drawing is throttled to the screen update rate, so there\n      // is no need to do timing here.\n      g_engine.DrawFrame();\n    }\n  }\n  g_engine.TermDisplay();\n}\n"
  },
  {
    "path": "teapots/more-teapots/src/main/cpp/MoreTeapotsRenderer.cpp",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//--------------------------------------------------------------------------------\n// MoreTeapotsRenderer.cpp\n// Render teapots\n//--------------------------------------------------------------------------------\n//--------------------------------------------------------------------------------\n// Include files\n//--------------------------------------------------------------------------------\n#include \"MoreTeapotsRenderer.h\"\n\n#include <string.h>\n\n#include <vector>\n\n//--------------------------------------------------------------------------------\n// Teapot model data\n//--------------------------------------------------------------------------------\n#include \"teapot.inl\"\n\n//--------------------------------------------------------------------------------\n// Ctor\n//--------------------------------------------------------------------------------\nMoreTeapotsRenderer::MoreTeapotsRenderer()\n    : geometry_instancing_support_(false) {}\n\n//--------------------------------------------------------------------------------\n// Dtor\n//--------------------------------------------------------------------------------\nMoreTeapotsRenderer::~MoreTeapotsRenderer() { Unload(); }\n\n//--------------------------------------------------------------------------------\n// Init\n//--------------------------------------------------------------------------------\nvoid MoreTeapotsRenderer::Init(const int32_t numX, const int32_t numY,\n                               const int32_t numZ) {\n  if (ndk_helper::GLContext::GetInstance()->GetGLVersion() >= 3.0) {\n    geometry_instancing_support_ = true;\n  } else if (ndk_helper::GLContext::GetInstance()->CheckExtension(\n                 \"GL_NV_draw_instanced\") &&\n             ndk_helper::GLContext::GetInstance()->CheckExtension(\n                 \"GL_NV_uniform_buffer_object\")) {\n    LOGI(\"Supported via extension!\");\n    //_bGeometryInstancingSupport = true;\n    //_bARBSupport = true; //Need to patch shaders\n    // Currently this has been disabled\n  }\n\n  // Settings\n  glFrontFace(GL_CCW);\n\n  // Create Index buffer\n  num_indices_ = sizeof(teapotIndices) / sizeof(teapotIndices[0]);\n  glGenBuffers(1, &ibo_);\n  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo_);\n  glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(teapotIndices), teapotIndices,\n               GL_STATIC_DRAW);\n  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);\n\n  // Create VBO\n  num_vertices_ = sizeof(teapotPositions) / sizeof(teapotPositions[0]) / 3;\n  int32_t stride = sizeof(TEAPOT_VERTEX);\n  int32_t index = 0;\n  TEAPOT_VERTEX* p = new TEAPOT_VERTEX[num_vertices_];\n  for (int32_t i = 0; i < num_vertices_; ++i) {\n    p[i].pos[0] = teapotPositions[index];\n    p[i].pos[1] = teapotPositions[index + 1];\n    p[i].pos[2] = teapotPositions[index + 2];\n\n    p[i].normal[0] = teapotNormals[index];\n    p[i].normal[1] = teapotNormals[index + 1];\n    p[i].normal[2] = teapotNormals[index + 2];\n    index += 3;\n  }\n  glGenBuffers(1, &vbo_);\n  glBindBuffer(GL_ARRAY_BUFFER, vbo_);\n  glBufferData(GL_ARRAY_BUFFER, stride * num_vertices_, p, GL_STATIC_DRAW);\n  glBindBuffer(GL_ARRAY_BUFFER, 0);\n  delete[] p;\n\n  // Init Projection matrices\n  teapot_x_ = numX;\n  teapot_y_ = numY;\n  teapot_z_ = numZ;\n  vec_mat_models_.reserve(teapot_x_ * teapot_y_ * teapot_z_);\n\n  UpdateViewport();\n\n  const float total_width = 500.f;\n  float gap_x = total_width / (teapot_x_ - 1);\n  float gap_y = total_width / (teapot_y_ - 1);\n  float gap_z = total_width / (teapot_z_ - 1);\n  float offset_x = -total_width / 2.f;\n  float offset_y = -total_width / 2.f;\n  float offset_z = -total_width / 2.f;\n\n  for (int32_t x = 0; x < teapot_x_; ++x)\n    for (int32_t y = 0; y < teapot_y_; ++y)\n      for (int32_t z = 0; z < teapot_z_; ++z) {\n        vec_mat_models_.push_back(ndk_helper::Mat4::Translation(\n            x * gap_x + offset_x, y * gap_y + offset_y, z * gap_z + offset_z));\n        vec_colors_.push_back(ndk_helper::Vec3(\n            random() / float(RAND_MAX * 1.1), random() / float(RAND_MAX * 1.1),\n            random() / float(RAND_MAX * 1.1)));\n\n        float rotation_x = random() / float(RAND_MAX) - 0.5f;\n        float rotation_y = random() / float(RAND_MAX) - 0.5f;\n        vec_rotations_.push_back(\n            ndk_helper::Vec2(rotation_x * 0.05f, rotation_y * 0.05f));\n        vec_current_rotations_.push_back(\n            ndk_helper::Vec2(rotation_x * M_PI, rotation_y * M_PI));\n      }\n\n  if (geometry_instancing_support_) {\n    //\n    // Create parameter dictionary for shader patch\n    std::map<std::string, std::string> param;\n    param[std::string(\"%NUM_TEAPOT%\")] =\n        ToString(teapot_x_ * teapot_y_ * teapot_z_);\n    param[std::string(\"%LOCATION_VERTEX%\")] = ToString(ATTRIB_VERTEX);\n    param[std::string(\"%LOCATION_NORMAL%\")] = ToString(ATTRIB_NORMAL);\n    if (arb_support_)\n      param[std::string(\"%ARB%\")] = std::string(\"ARB\");\n    else\n      param[std::string(\"%ARB%\")] = std::string(\"\");\n\n    // Load shader\n    bool b = LoadShadersES3(&shader_param_, \"Shaders/VS_ShaderPlainES3.vsh\",\n                            \"Shaders/ShaderPlainES3.fsh\", param);\n    if (b) {\n      //\n      // Create uniform buffer\n      //\n      GLuint bindingPoint = 1;\n      GLuint blockIndex;\n      blockIndex = glGetUniformBlockIndex(shader_param_.program_, \"ParamBlock\");\n      glUniformBlockBinding(shader_param_.program_, blockIndex, bindingPoint);\n\n      // Retrieve array stride value\n      int32_t num_indices;\n      glGetActiveUniformBlockiv(shader_param_.program_, blockIndex,\n                                GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS, &num_indices);\n      std::vector<GLint> indices(num_indices);\n      std::vector<GLint> strides(num_indices);\n      glGetActiveUniformBlockiv(shader_param_.program_, blockIndex,\n                                GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES,\n                                indices.data());\n      glGetActiveUniformsiv(shader_param_.program_, num_indices,\n                            (GLuint*)indices.data(), GL_UNIFORM_ARRAY_STRIDE,\n                            strides.data());\n\n      ubo_matrix_stride_ = strides.at(0) / sizeof(float);\n      ubo_vector_stride_ = strides.at(2) / sizeof(float);\n\n      glGenBuffers(1, &ubo_);\n      glBindBuffer(GL_UNIFORM_BUFFER, ubo_);\n      glBindBufferBase(GL_UNIFORM_BUFFER, bindingPoint, ubo_);\n\n      // Store color value which wouldn't be updated every frame\n      int32_t size = teapot_x_ * teapot_y_ * teapot_z_ *\n                     (ubo_matrix_stride_ + ubo_matrix_stride_ +\n                      ubo_vector_stride_);  // Mat4 + Mat4 + Vec3 + 1 stride\n      float* pBuffer = new float[size];\n      float* pColor =\n          pBuffer + teapot_x_ * teapot_y_ * teapot_z_ * ubo_matrix_stride_ * 2;\n      for (int32_t i = 0; i < teapot_x_ * teapot_y_ * teapot_z_; ++i) {\n        memcpy(pColor, &vec_colors_[i], 3 * sizeof(float));\n        pColor += ubo_vector_stride_;  // Assuming std140 layout which is 4\n                                       // DWORD stride for vectors\n      }\n\n      glBufferData(GL_UNIFORM_BUFFER, size * sizeof(float), pBuffer,\n                   GL_DYNAMIC_DRAW);\n      delete[] pBuffer;\n    } else {\n      LOGI(\"Shader compilation failed!! Falls back to ES2.0 pass\");\n      // This happens some devices.\n      geometry_instancing_support_ = false;\n      // Load shader for GLES2.0\n      LoadShaders(&shader_param_, \"Shaders/VS_ShaderPlain.vsh\",\n                  \"Shaders/ShaderPlain.fsh\");\n    }\n  } else {\n    // Load shader for GLES2.0\n    LoadShaders(&shader_param_, \"Shaders/VS_ShaderPlain.vsh\",\n                \"Shaders/ShaderPlain.fsh\");\n  }\n}\n\nvoid MoreTeapotsRenderer::UpdateViewport() {\n  int32_t viewport[4];\n  glGetIntegerv(GL_VIEWPORT, viewport);\n\n  const float CAM_NEAR = 5.f;\n  const float CAM_FAR = 10000.f;\n  if (viewport[2] < viewport[3]) {\n    float aspect =\n        static_cast<float>(viewport[2]) / static_cast<float>(viewport[3]);\n    mat_projection_ =\n        ndk_helper::Mat4::Perspective(aspect, 1.0f, CAM_NEAR, CAM_FAR);\n  } else {\n    float aspect =\n        static_cast<float>(viewport[3]) / static_cast<float>(viewport[2]);\n    mat_projection_ =\n        ndk_helper::Mat4::Perspective(1.0f, aspect, CAM_NEAR, CAM_FAR);\n  }\n}\n\n//--------------------------------------------------------------------------------\n// Unload\n//--------------------------------------------------------------------------------\nvoid MoreTeapotsRenderer::Unload() {\n  if (vbo_) {\n    glDeleteBuffers(1, &vbo_);\n    vbo_ = 0;\n  }\n  if (ubo_) {\n    glDeleteBuffers(1, &ubo_);\n    ubo_ = 0;\n  }\n  if (ibo_) {\n    glDeleteBuffers(1, &ibo_);\n    ibo_ = 0;\n  }\n  if (shader_param_.program_) {\n    glDeleteProgram(shader_param_.program_);\n    shader_param_.program_ = 0;\n  }\n}\n\n//--------------------------------------------------------------------------------\n// Update\n//--------------------------------------------------------------------------------\nvoid MoreTeapotsRenderer::Update(float) {\n  const float CAM_X = 0.f;\n  const float CAM_Y = 0.f;\n  const float CAM_Z = 2000.f;\n\n  mat_view_ = ndk_helper::Mat4::LookAt(ndk_helper::Vec3(CAM_X, CAM_Y, CAM_Z),\n                                       ndk_helper::Vec3(0.f, 0.f, 0.f),\n                                       ndk_helper::Vec3(0.f, 1.f, 0.f));\n\n  if (camera_) {\n    camera_->Update();\n    mat_view_ = camera_->GetTransformMatrix() * mat_view_ *\n                camera_->GetRotationMatrix();\n  }\n}\n\n//--------------------------------------------------------------------------------\n// Render\n//--------------------------------------------------------------------------------\nvoid MoreTeapotsRenderer::Render() {\n  // Bind the VBO\n  glBindBuffer(GL_ARRAY_BUFFER, vbo_);\n\n  int32_t iStride = sizeof(TEAPOT_VERTEX);\n  // Pass the vertex data\n  glVertexAttribPointer(ATTRIB_VERTEX, 3, GL_FLOAT, GL_FALSE, iStride, nullptr);\n  glEnableVertexAttribArray(ATTRIB_VERTEX);\n\n  glVertexAttribPointer(ATTRIB_NORMAL, 3, GL_FLOAT, GL_FALSE, iStride,\n                        reinterpret_cast<void*>(3 * sizeof(GLfloat)));\n  glEnableVertexAttribArray(ATTRIB_NORMAL);\n\n  // Bind the IB\n  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo_);\n\n  glUseProgram(shader_param_.program_);\n\n  TEAPOT_MATERIALS material = {\n      {1.0f, 1.0f, 1.0f, 10.f},\n      {0.1f, 0.1f, 0.1f},\n  };\n\n  // Update uniforms\n  //\n  // using glUniform3fv here was troublesome..\n  //\n  glUniform4f(shader_param_.material_specular_, material.specular_color[0],\n              material.specular_color[1], material.specular_color[2],\n              material.specular_color[3]);\n  glUniform3f(shader_param_.material_ambient_, material.ambient_color[0],\n              material.ambient_color[1], material.ambient_color[2]);\n\n  glUniform3f(shader_param_.light0_, 100.f, -200.f, -600.f);\n\n  if (geometry_instancing_support_) {\n    //\n    // Geometry instancing, new feature in GLES3.0\n    //\n\n    // Update UBO\n    glBindBuffer(GL_UNIFORM_BUFFER, ubo_);\n    float* p = (float*)glMapBufferRange(\n        GL_UNIFORM_BUFFER, 0,\n        teapot_x_ * teapot_y_ * teapot_z_ * (ubo_matrix_stride_ * 2) *\n            sizeof(float),\n        GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT);\n    float* mat_mvp = p;\n    float* mat_mv = p + teapot_x_ * teapot_y_ * teapot_z_ * ubo_matrix_stride_;\n    for (int32_t i = 0; i < teapot_x_ * teapot_y_ * teapot_z_; ++i) {\n      // Rotation\n      float x, y;\n      vec_current_rotations_[i] += vec_rotations_[i];\n      vec_current_rotations_[i].Value(x, y);\n      ndk_helper::Mat4 mat_rotation =\n          ndk_helper::Mat4::RotationX(x) * ndk_helper::Mat4::RotationY(y);\n\n      // Feed Projection and Model View matrices to the shaders\n      ndk_helper::Mat4 mat_v = mat_view_ * vec_mat_models_[i] * mat_rotation;\n      ndk_helper::Mat4 mat_vp = mat_projection_ * mat_v;\n\n      memcpy(mat_mvp, mat_vp.Ptr(), sizeof(mat_v));\n      mat_mvp += ubo_matrix_stride_;\n\n      memcpy(mat_mv, mat_v.Ptr(), sizeof(mat_v));\n      mat_mv += ubo_matrix_stride_;\n    }\n    glUnmapBuffer(GL_UNIFORM_BUFFER);\n\n    // Instanced rendering\n    glDrawElementsInstanced(GL_TRIANGLES, num_indices_, GL_UNSIGNED_SHORT,\n                            nullptr, teapot_x_ * teapot_y_ * teapot_z_);\n\n  } else {\n    // Regular rendering pass\n    for (int32_t i = 0; i < teapot_x_ * teapot_y_ * teapot_z_; ++i) {\n      // Set diffuse\n      float x, y, z;\n      vec_colors_[i].Value(x, y, z);\n      glUniform4f(shader_param_.material_diffuse_, x, y, z, 1.f);\n\n      // Rotation\n      vec_current_rotations_[i] += vec_rotations_[i];\n      vec_current_rotations_[i].Value(x, y);\n      ndk_helper::Mat4 mat_rotation =\n          ndk_helper::Mat4::RotationX(x) * ndk_helper::Mat4::RotationY(y);\n\n      // Feed Projection and Model View matrices to the shaders\n      ndk_helper::Mat4 mat_v = mat_view_ * vec_mat_models_[i] * mat_rotation;\n      ndk_helper::Mat4 mat_vp = mat_projection_ * mat_v;\n      glUniformMatrix4fv(shader_param_.matrix_projection_, 1, GL_FALSE,\n                         mat_vp.Ptr());\n      glUniformMatrix4fv(shader_param_.matrix_view_, 1, GL_FALSE, mat_v.Ptr());\n\n      glDrawElements(GL_TRIANGLES, num_indices_, GL_UNSIGNED_SHORT, nullptr);\n    }\n  }\n\n  glBindBuffer(GL_ARRAY_BUFFER, 0);\n  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);\n}\n\n//--------------------------------------------------------------------------------\n// LoadShaders\n//--------------------------------------------------------------------------------\nbool MoreTeapotsRenderer::LoadShaders(SHADER_PARAMS* params, const char* strVsh,\n                                      const char* strFsh) {\n  //\n  // Shader load for GLES2\n  // In GLES2.0, shader attribute locations need to be explicitly specified\n  // before linking\n  //\n  GLuint program;\n  GLuint vertShader, fragShader;\n\n  // Create shader program\n  program = glCreateProgram();\n  LOGI(\"Created Shader %d\", program);\n\n  // Create and compile vertex shader\n  if (!ndk_helper::shader::CompileShader(&vertShader, GL_VERTEX_SHADER,\n                                         strVsh)) {\n    LOGI(\"Failed to compile vertex shader\");\n    glDeleteProgram(program);\n    return false;\n  }\n\n  // Create and compile fragment shader\n  if (!ndk_helper::shader::CompileShader(&fragShader, GL_FRAGMENT_SHADER,\n                                         strFsh)) {\n    LOGI(\"Failed to compile fragment shader\");\n    glDeleteProgram(program);\n    return false;\n  }\n\n  // Attach vertex shader to program\n  glAttachShader(program, vertShader);\n\n  // Attach fragment shader to program\n  glAttachShader(program, fragShader);\n\n  // Bind attribute locations\n  // this needs to be done prior to linking\n  glBindAttribLocation(program, ATTRIB_VERTEX, \"myVertex\");\n  glBindAttribLocation(program, ATTRIB_NORMAL, \"myNormal\");\n\n  // Link program\n  if (!ndk_helper::shader::LinkProgram(program)) {\n    LOGI(\"Failed to link program: %d\", program);\n\n    if (vertShader) {\n      glDeleteShader(vertShader);\n      vertShader = 0;\n    }\n    if (fragShader) {\n      glDeleteShader(fragShader);\n      fragShader = 0;\n    }\n    if (program) {\n      glDeleteProgram(program);\n    }\n    return false;\n  }\n\n  // Get uniform locations\n  params->matrix_projection_ = glGetUniformLocation(program, \"uPMatrix\");\n  params->matrix_view_ = glGetUniformLocation(program, \"uMVMatrix\");\n\n  params->light0_ = glGetUniformLocation(program, \"vLight0\");\n  params->material_diffuse_ = glGetUniformLocation(program, \"vMaterialDiffuse\");\n  params->material_ambient_ = glGetUniformLocation(program, \"vMaterialAmbient\");\n  params->material_specular_ =\n      glGetUniformLocation(program, \"vMaterialSpecular\");\n\n  // Release vertex and fragment shaders\n  if (vertShader) glDeleteShader(vertShader);\n  if (fragShader) glDeleteShader(fragShader);\n\n  params->program_ = program;\n  return true;\n}\n\nbool MoreTeapotsRenderer::LoadShadersES3(\n    SHADER_PARAMS* params, const char* strVsh, const char* strFsh,\n    std::map<std::string, std::string>& shaderParams) {\n  //\n  // Shader load for GLES3\n  // In GLES3.0, shader attribute index can be described in a shader code\n  // directly with layout() attribute\n  //\n  GLuint program;\n  GLuint vertShader, fragShader;\n\n  // Create shader program\n  program = glCreateProgram();\n  LOGI(\"Created Shader %d\", program);\n\n  // Create and compile vertex shader\n  if (!ndk_helper::shader::CompileShader(&vertShader, GL_VERTEX_SHADER, strVsh,\n                                         shaderParams)) {\n    LOGI(\"Failed to compile vertex shader\");\n    glDeleteProgram(program);\n    return false;\n  }\n\n  // Create and compile fragment shader\n  if (!ndk_helper::shader::CompileShader(&fragShader, GL_FRAGMENT_SHADER,\n                                         strFsh, shaderParams)) {\n    LOGI(\"Failed to compile fragment shader\");\n    glDeleteProgram(program);\n    return false;\n  }\n\n  // Attach vertex shader to program\n  glAttachShader(program, vertShader);\n\n  // Attach fragment shader to program\n  glAttachShader(program, fragShader);\n\n  // Link program\n  if (!ndk_helper::shader::LinkProgram(program)) {\n    LOGI(\"Failed to link program: %d\", program);\n\n    if (vertShader) {\n      glDeleteShader(vertShader);\n      vertShader = 0;\n    }\n    if (fragShader) {\n      glDeleteShader(fragShader);\n      fragShader = 0;\n    }\n    if (program) {\n      glDeleteProgram(program);\n    }\n\n    return false;\n  }\n\n  // Get uniform locations\n  params->light0_ = glGetUniformLocation(program, \"vLight0\");\n  params->material_ambient_ = glGetUniformLocation(program, \"vMaterialAmbient\");\n  params->material_specular_ =\n      glGetUniformLocation(program, \"vMaterialSpecular\");\n\n  // Release vertex and fragment shaders\n  if (vertShader) glDeleteShader(vertShader);\n  if (fragShader) glDeleteShader(fragShader);\n\n  params->program_ = program;\n  return true;\n}\n\n//--------------------------------------------------------------------------------\n// Bind\n//--------------------------------------------------------------------------------\nbool MoreTeapotsRenderer::Bind(ndk_helper::TapCamera* camera) {\n  camera_ = camera;\n  return true;\n}\n\n//--------------------------------------------------------------------------------\n// Helper functions\n//--------------------------------------------------------------------------------\nstd::string MoreTeapotsRenderer::ToString(const int32_t i) {\n  char str[64];\n  snprintf(str, sizeof(str), \"%d\", i);\n  return std::string(str);\n}\n"
  },
  {
    "path": "teapots/more-teapots/src/main/cpp/MoreTeapotsRenderer.h",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//--------------------------------------------------------------------------------\n// MoreTeapotsRenderer.h\n// Renderer for teapots\n//--------------------------------------------------------------------------------\n#ifndef _MoreTeapotsRenderer_H\n#define _MoreTeapotsRenderer_H\n\n//--------------------------------------------------------------------------------\n// Include files\n//--------------------------------------------------------------------------------\n#include <EGL/egl.h>\n#include <GLES/gl.h>\n#include <android/log.h>\n#include <android/native_window_jni.h>\n#include <android/sensor.h>\n#include <android_native_app_glue.h>\n#include <errno.h>\n#include <jni.h>\n\n#include <random>\n#include <vector>\n\n#define CLASS_NAME \"android/app/NativeActivity\"\n#define APPLICATION_CLASS_NAME \"com/sample/moreteapots/MoreTeapotsApplication\"\n\n#include \"NDKHelper.h\"\n\nstruct TEAPOT_VERTEX {\n  float pos[3];\n  float normal[3];\n};\n\nenum SHADER_ATTRIBUTES {\n  ATTRIB_VERTEX,\n  ATTRIB_NORMAL,\n  ATTRIB_COLOR,\n  ATTRIB_UV\n};\n\nstruct SHADER_PARAMS {\n  GLuint program_;\n  GLuint light0_;\n  GLuint material_diffuse_;\n  GLuint material_ambient_;\n  GLuint material_specular_;\n\n  GLuint matrix_projection_;\n  GLuint matrix_view_;\n};\n\nstruct TEAPOT_MATERIALS {\n  float specular_color[4];\n  float ambient_color[3];\n};\n\nclass MoreTeapotsRenderer {\n  int32_t num_indices_;\n  int32_t num_vertices_;\n  GLuint ibo_;\n  GLuint vbo_;\n  GLuint ubo_;\n\n  SHADER_PARAMS shader_param_;\n  bool LoadShaders(SHADER_PARAMS* params, const char* strVsh,\n                   const char* strFsh);\n  bool LoadShadersES3(SHADER_PARAMS* params, const char* strVsh,\n                      const char* strFsh,\n                      std::map<std::string, std::string>& shaderParameters);\n\n  ndk_helper::Mat4 mat_projection_;\n  ndk_helper::Mat4 mat_view_;\n  std::vector<ndk_helper::Mat4> vec_mat_models_;\n  std::vector<ndk_helper::Vec3> vec_colors_;\n  std::vector<ndk_helper::Vec2> vec_rotations_;\n  std::vector<ndk_helper::Vec2> vec_current_rotations_;\n\n  ndk_helper::TapCamera* camera_;\n\n  int32_t teapot_x_;\n  int32_t teapot_y_;\n  int32_t teapot_z_;\n  int32_t ubo_matrix_stride_;\n  int32_t ubo_vector_stride_;\n  bool geometry_instancing_support_;\n  bool arb_support_;\n\n  std::string ToString(const int32_t i);\n\n public:\n  MoreTeapotsRenderer();\n  virtual ~MoreTeapotsRenderer();\n  void Init(const int32_t numX, const int32_t numY, const int32_t numZ);\n  void Render();\n  void Update(float dTime);\n  bool Bind(ndk_helper::TapCamera* camera);\n  void Unload();\n  void UpdateViewport();\n};\n\n#endif\n"
  },
  {
    "path": "teapots/more-teapots/src/main/cpp/libMoreTeapotsNativeActivity.map.txt",
    "content": "LIBNDK_CAMERA {\n  global:\n    ANativeActivity_onCreate;\n  local:\n    *;\n};\n"
  },
  {
    "path": "teapots/more-teapots/src/main/cpp/teapot.inl",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//\n// Teapot.inl\n// Derived from WebGL sample\n// https://github.com/KhronosGroup/WebGL/blob/master/sdk/demos/google/shiny-teapot/teapot-streams.js\n//\n\nfloat teapotPositions[] = {17.83489990234375,\n                           0,\n                           30.573999404907227,\n                           16.452699661254883,\n                           -7.000179767608643,\n                           30.573999404907227,\n                           16.223100662231445,\n                           -6.902520179748535,\n                           31.51460075378418,\n                           17.586000442504883,\n                           0,\n                           31.51460075378418,\n                           16.48940086364746,\n                           -7.015810012817383,\n                           31.828100204467773,\n                           17.87470054626465,\n                           0,\n                           31.828100204467773,\n                           17.031099319458008,\n                           -7.246280193328857,\n                           31.51460075378418,\n                           18.46190071105957,\n                           0,\n                           31.51460075378418,\n                           17.62779998779297,\n                           -7.500199794769287,\n                           30.573999404907227,\n                           19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           12.662699699401855,\n                           -12.662699699401855,\n                           30.573999404907227,\n                           12.486100196838379,\n                           -12.486100196838379,\n                           31.51460075378418,\n                           12.690999984741211,\n                           -12.690999984741211,\n                           31.828100204467773,\n                           13.10789966583252,\n                           -13.10789966583252,\n                           31.51460075378418,\n                           13.56719970703125,\n                           -13.56719970703125,\n                           30.573999404907227,\n                           7.000179767608643,\n                           -16.452699661254883,\n                           30.573999404907227,\n                           6.902520179748535,\n                           -16.223100662231445,\n                           31.51460075378418,\n                           7.015810012817383,\n                           -16.48940086364746,\n                           31.828100204467773,\n                           7.246280193328857,\n                           -17.031099319458008,\n                           31.51460075378418,\n                           7.500199794769287,\n                           -17.62779998779297,\n                           30.573999404907227,\n                           0,\n                           -17.83489990234375,\n                           30.573999404907227,\n                           0,\n                           -17.586000442504883,\n                           31.51460075378418,\n                           0,\n                           -17.87470054626465,\n                           31.828100204467773,\n                           0,\n                           -18.46190071105957,\n                           31.51460075378418,\n                           0,\n                           -19.108800888061523,\n                           30.573999404907227,\n                           0,\n                           -17.83489990234375,\n                           30.573999404907227,\n                           -7.483870029449463,\n                           -16.452699661254883,\n                           30.573999404907227,\n                           -7.106579780578613,\n                           -16.223100662231445,\n                           31.51460075378418,\n                           0,\n                           -17.586000442504883,\n                           31.51460075378418,\n                           -7.07627010345459,\n                           -16.48940086364746,\n                           31.828100204467773,\n                           0,\n                           -17.87470054626465,\n                           31.828100204467773,\n                           -7.25383996963501,\n                           -17.031099319458008,\n                           31.51460075378418,\n                           0,\n                           -18.46190071105957,\n                           31.51460075378418,\n                           -7.500199794769287,\n                           -17.62779998779297,\n                           30.573999404907227,\n                           0,\n                           -19.108800888061523,\n                           30.573999404907227,\n                           -13.092700004577637,\n                           -12.662699699401855,\n                           30.573999404907227,\n                           -12.667499542236328,\n                           -12.486100196838379,\n                           31.51460075378418,\n                           -12.744799613952637,\n                           -12.690999984741211,\n                           31.828100204467773,\n                           -13.11460018157959,\n                           -13.10789966583252,\n                           31.51460075378418,\n                           -13.56719970703125,\n                           -13.56719970703125,\n                           30.573999404907227,\n                           -16.61389923095703,\n                           -7.000179767608643,\n                           30.573999404907227,\n                           -16.291099548339844,\n                           -6.902520179748535,\n                           31.51460075378418,\n                           -16.50950050354004,\n                           -7.015810012817383,\n                           31.828100204467773,\n                           -17.033599853515625,\n                           -7.246280193328857,\n                           31.51460075378418,\n                           -17.62779998779297,\n                           -7.500199794769287,\n                           30.573999404907227,\n                           -17.83489990234375,\n                           0,\n                           30.573999404907227,\n                           -17.586000442504883,\n                           0,\n                           31.51460075378418,\n                           -17.87470054626465,\n                           0,\n                           31.828100204467773,\n                           -18.46190071105957,\n                           0,\n                           31.51460075378418,\n                           -19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           -17.83489990234375,\n                           0,\n                           30.573999404907227,\n                           -16.452699661254883,\n                           7.000179767608643,\n                           30.573999404907227,\n                           -16.223100662231445,\n                           6.902520179748535,\n                           31.51460075378418,\n                           -17.586000442504883,\n                           0,\n                           31.51460075378418,\n                           -16.48940086364746,\n                           7.015810012817383,\n                           31.828100204467773,\n                           -17.87470054626465,\n                           0,\n                           31.828100204467773,\n                           -17.031099319458008,\n                           7.246280193328857,\n                           31.51460075378418,\n                           -18.46190071105957,\n                           0,\n                           31.51460075378418,\n                           -17.62779998779297,\n                           7.500199794769287,\n                           30.573999404907227,\n                           -19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           -12.662699699401855,\n                           12.662699699401855,\n                           30.573999404907227,\n                           -12.486100196838379,\n                           12.486100196838379,\n                           31.51460075378418,\n                           -12.690999984741211,\n                           12.690999984741211,\n                           31.828100204467773,\n                           -13.10789966583252,\n                           13.10789966583252,\n                           31.51460075378418,\n                           -13.56719970703125,\n                           13.56719970703125,\n                           30.573999404907227,\n                           -7.000179767608643,\n                           16.452699661254883,\n                           30.573999404907227,\n                           -6.902520179748535,\n                           16.223100662231445,\n                           31.51460075378418,\n                           -7.015810012817383,\n                           16.48940086364746,\n                           31.828100204467773,\n                           -7.246280193328857,\n                           17.031099319458008,\n                           31.51460075378418,\n                           -7.500199794769287,\n                           17.62779998779297,\n                           30.573999404907227,\n                           0,\n                           17.83489990234375,\n                           30.573999404907227,\n                           0,\n                           17.586000442504883,\n                           31.51460075378418,\n                           0,\n                           17.87470054626465,\n                           31.828100204467773,\n                           0,\n                           18.46190071105957,\n                           31.51460075378418,\n                           0,\n                           19.108800888061523,\n                           30.573999404907227,\n                           0,\n                           17.83489990234375,\n                           30.573999404907227,\n                           7.000179767608643,\n                           16.452699661254883,\n                           30.573999404907227,\n                           6.902520179748535,\n                           16.223100662231445,\n                           31.51460075378418,\n                           0,\n                           17.586000442504883,\n                           31.51460075378418,\n                           7.015810012817383,\n                           16.48940086364746,\n                           31.828100204467773,\n                           0,\n                           17.87470054626465,\n                           31.828100204467773,\n                           7.246280193328857,\n                           17.031099319458008,\n                           31.51460075378418,\n                           0,\n                           18.46190071105957,\n                           31.51460075378418,\n                           7.500199794769287,\n                           17.62779998779297,\n                           30.573999404907227,\n                           0,\n                           19.108800888061523,\n                           30.573999404907227,\n                           12.662699699401855,\n                           12.662699699401855,\n                           30.573999404907227,\n                           12.486100196838379,\n                           12.486100196838379,\n                           31.51460075378418,\n                           12.690999984741211,\n                           12.690999984741211,\n                           31.828100204467773,\n                           13.10789966583252,\n                           13.10789966583252,\n                           31.51460075378418,\n                           13.56719970703125,\n                           13.56719970703125,\n                           30.573999404907227,\n                           16.452699661254883,\n                           7.000179767608643,\n                           30.573999404907227,\n                           16.223100662231445,\n                           6.902520179748535,\n                           31.51460075378418,\n                           16.48940086364746,\n                           7.015810012817383,\n                           31.828100204467773,\n                           17.031099319458008,\n                           7.246280193328857,\n                           31.51460075378418,\n                           17.62779998779297,\n                           7.500199794769287,\n                           30.573999404907227,\n                           17.83489990234375,\n                           0,\n                           30.573999404907227,\n                           17.586000442504883,\n                           0,\n                           31.51460075378418,\n                           17.87470054626465,\n                           0,\n                           31.828100204467773,\n                           18.46190071105957,\n                           0,\n                           31.51460075378418,\n                           19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           17.62779998779297,\n                           -7.500199794769287,\n                           30.573999404907227,\n                           19.785400390625,\n                           -8.418190002441406,\n                           25.572900772094727,\n                           21.447599411010742,\n                           0,\n                           25.572900772094727,\n                           21.667600631713867,\n                           -9.218990325927734,\n                           20.661399841308594,\n                           23.487899780273438,\n                           0,\n                           20.661399841308594,\n                           22.99880027770996,\n                           -9.785409927368164,\n                           15.928999900817871,\n                           24.930999755859375,\n                           0,\n                           15.928999900817871,\n                           23.503799438476562,\n                           -10.000300407409668,\n                           11.465299606323242,\n                           25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           13.56719970703125,\n                           -13.56719970703125,\n                           30.573999404907227,\n                           15.227800369262695,\n                           -15.227800369262695,\n                           25.572900772094727,\n                           16.67639923095703,\n                           -16.67639923095703,\n                           20.661399841308594,\n                           17.701000213623047,\n                           -17.701000213623047,\n                           15.928999900817871,\n                           18.089599609375,\n                           -18.089599609375,\n                           11.465299606323242,\n                           7.500199794769287,\n                           -17.62779998779297,\n                           30.573999404907227,\n                           8.418190002441406,\n                           -19.785400390625,\n                           25.572900772094727,\n                           9.218990325927734,\n                           -21.667600631713867,\n                           20.661399841308594,\n                           9.785409927368164,\n                           -22.99880027770996,\n                           15.928999900817871,\n                           10.000300407409668,\n                           -23.503799438476562,\n                           11.465299606323242,\n                           0,\n                           -19.108800888061523,\n                           30.573999404907227,\n                           0,\n                           -21.447599411010742,\n                           25.572900772094727,\n                           0,\n                           -23.487899780273438,\n                           20.661399841308594,\n                           0,\n                           -24.930999755859375,\n                           15.928999900817871,\n                           0,\n                           -25.4783992767334,\n                           11.465299606323242,\n                           0,\n                           -19.108800888061523,\n                           30.573999404907227,\n                           -7.500199794769287,\n                           -17.62779998779297,\n                           30.573999404907227,\n                           -8.418190002441406,\n                           -19.785400390625,\n                           25.572900772094727,\n                           0,\n                           -21.447599411010742,\n                           25.572900772094727,\n                           -9.218990325927734,\n                           -21.667600631713867,\n                           20.661399841308594,\n                           0,\n                           -23.487899780273438,\n                           20.661399841308594,\n                           -9.785409927368164,\n                           -22.99880027770996,\n                           15.928999900817871,\n                           0,\n                           -24.930999755859375,\n                           15.928999900817871,\n                           -10.000300407409668,\n                           -23.503799438476562,\n                           11.465299606323242,\n                           0,\n                           -25.4783992767334,\n                           11.465299606323242,\n                           -13.56719970703125,\n                           -13.56719970703125,\n                           30.573999404907227,\n                           -15.227800369262695,\n                           -15.227800369262695,\n                           25.572900772094727,\n                           -16.67639923095703,\n                           -16.67639923095703,\n                           20.661399841308594,\n                           -17.701000213623047,\n                           -17.701000213623047,\n                           15.928999900817871,\n                           -18.089599609375,\n                           -18.089599609375,\n                           11.465299606323242,\n                           -17.62779998779297,\n                           -7.500199794769287,\n                           30.573999404907227,\n                           -19.785400390625,\n                           -8.418190002441406,\n                           25.572900772094727,\n                           -21.667600631713867,\n                           -9.218990325927734,\n                           20.661399841308594,\n                           -22.99880027770996,\n                           -9.785409927368164,\n                           15.928999900817871,\n                           -23.503799438476562,\n                           -10.000300407409668,\n                           11.465299606323242,\n                           -19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           -21.447599411010742,\n                           0,\n                           25.572900772094727,\n                           -23.487899780273438,\n                           0,\n                           20.661399841308594,\n                           -24.930999755859375,\n                           0,\n                           15.928999900817871,\n                           -25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           -19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           -17.62779998779297,\n                           7.500199794769287,\n                           30.573999404907227,\n                           -19.785400390625,\n                           8.418190002441406,\n                           25.572900772094727,\n                           -21.447599411010742,\n                           0,\n                           25.572900772094727,\n                           -21.667600631713867,\n                           9.218990325927734,\n                           20.661399841308594,\n                           -23.487899780273438,\n                           0,\n                           20.661399841308594,\n                           -22.99880027770996,\n                           9.785409927368164,\n                           15.928999900817871,\n                           -24.930999755859375,\n                           0,\n                           15.928999900817871,\n                           -23.503799438476562,\n                           10.000300407409668,\n                           11.465299606323242,\n                           -25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           -13.56719970703125,\n                           13.56719970703125,\n                           30.573999404907227,\n                           -15.227800369262695,\n                           15.227800369262695,\n                           25.572900772094727,\n                           -16.67639923095703,\n                           16.67639923095703,\n                           20.661399841308594,\n                           -17.701000213623047,\n                           17.701000213623047,\n                           15.928999900817871,\n                           -18.089599609375,\n                           18.089599609375,\n                           11.465299606323242,\n                           -7.500199794769287,\n                           17.62779998779297,\n                           30.573999404907227,\n                           -8.418190002441406,\n                           19.785400390625,\n                           25.572900772094727,\n                           -9.218990325927734,\n                           21.667600631713867,\n                           20.661399841308594,\n                           -9.785409927368164,\n                           22.99880027770996,\n                           15.928999900817871,\n                           -10.000300407409668,\n                           23.503799438476562,\n                           11.465299606323242,\n                           0,\n                           19.108800888061523,\n                           30.573999404907227,\n                           0,\n                           21.447599411010742,\n                           25.572900772094727,\n                           0,\n                           23.487899780273438,\n                           20.661399841308594,\n                           0,\n                           24.930999755859375,\n                           15.928999900817871,\n                           0,\n                           25.4783992767334,\n                           11.465299606323242,\n                           0,\n                           19.108800888061523,\n                           30.573999404907227,\n                           7.500199794769287,\n                           17.62779998779297,\n                           30.573999404907227,\n                           8.418190002441406,\n                           19.785400390625,\n                           25.572900772094727,\n                           0,\n                           21.447599411010742,\n                           25.572900772094727,\n                           9.218990325927734,\n                           21.667600631713867,\n                           20.661399841308594,\n                           0,\n                           23.487899780273438,\n                           20.661399841308594,\n                           9.785409927368164,\n                           22.99880027770996,\n                           15.928999900817871,\n                           0,\n                           24.930999755859375,\n                           15.928999900817871,\n                           10.000300407409668,\n                           23.503799438476562,\n                           11.465299606323242,\n                           0,\n                           25.4783992767334,\n                           11.465299606323242,\n                           13.56719970703125,\n                           13.56719970703125,\n                           30.573999404907227,\n                           15.227800369262695,\n                           15.227800369262695,\n                           25.572900772094727,\n                           16.67639923095703,\n                           16.67639923095703,\n                           20.661399841308594,\n                           17.701000213623047,\n                           17.701000213623047,\n                           15.928999900817871,\n                           18.089599609375,\n                           18.089599609375,\n                           11.465299606323242,\n                           17.62779998779297,\n                           7.500199794769287,\n                           30.573999404907227,\n                           19.785400390625,\n                           8.418190002441406,\n                           25.572900772094727,\n                           21.667600631713867,\n                           9.218990325927734,\n                           20.661399841308594,\n                           22.99880027770996,\n                           9.785409927368164,\n                           15.928999900817871,\n                           23.503799438476562,\n                           10.000300407409668,\n                           11.465299606323242,\n                           19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           21.447599411010742,\n                           0,\n                           25.572900772094727,\n                           23.487899780273438,\n                           0,\n                           20.661399841308594,\n                           24.930999755859375,\n                           0,\n                           15.928999900817871,\n                           25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           23.503799438476562,\n                           -10.000300407409668,\n                           11.465299606323242,\n                           22.5856990814209,\n                           -9.609620094299316,\n                           7.688300132751465,\n                           24.48310089111328,\n                           0,\n                           7.688300132751465,\n                           20.565799713134766,\n                           -8.750229835510254,\n                           4.89661979675293,\n                           22.29360008239746,\n                           0,\n                           4.89661979675293,\n                           18.54599952697754,\n                           -7.890830039978027,\n                           3.0006699562072754,\n                           20.104000091552734,\n                           0,\n                           3.0006699562072754,\n                           17.62779998779297,\n                           -7.500199794769287,\n                           1.9108799695968628,\n                           19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           18.089599609375,\n                           -18.089599609375,\n                           11.465299606323242,\n                           17.382999420166016,\n                           -17.382999420166016,\n                           7.688300132751465,\n                           15.828399658203125,\n                           -15.828399658203125,\n                           4.89661979675293,\n                           14.273900032043457,\n                           -14.273900032043457,\n                           3.0006699562072754,\n                           13.56719970703125,\n                           -13.56719970703125,\n                           1.9108799695968628,\n                           10.000300407409668,\n                           -23.503799438476562,\n                           11.465299606323242,\n                           9.609620094299316,\n                           -22.5856990814209,\n                           7.688300132751465,\n                           8.750229835510254,\n                           -20.565799713134766,\n                           4.89661979675293,\n                           7.890830039978027,\n                           -18.54599952697754,\n                           3.0006699562072754,\n                           7.500199794769287,\n                           -17.62779998779297,\n                           1.9108799695968628,\n                           0,\n                           -25.4783992767334,\n                           11.465299606323242,\n                           0,\n                           -24.48310089111328,\n                           7.688300132751465,\n                           0,\n                           -22.29360008239746,\n                           4.89661979675293,\n                           0,\n                           -20.104000091552734,\n                           3.0006699562072754,\n                           0,\n                           -19.108800888061523,\n                           1.9108799695968628,\n                           0,\n                           -25.4783992767334,\n                           11.465299606323242,\n                           -10.000300407409668,\n                           -23.503799438476562,\n                           11.465299606323242,\n                           -9.609620094299316,\n                           -22.5856990814209,\n                           7.688300132751465,\n                           0,\n                           -24.48310089111328,\n                           7.688300132751465,\n                           -8.750229835510254,\n                           -20.565799713134766,\n                           4.89661979675293,\n                           0,\n                           -22.29360008239746,\n                           4.89661979675293,\n                           -7.890830039978027,\n                           -18.54599952697754,\n                           3.0006699562072754,\n                           0,\n                           -20.104000091552734,\n                           3.0006699562072754,\n                           -7.500199794769287,\n                           -17.62779998779297,\n                           1.9108799695968628,\n                           0,\n                           -19.108800888061523,\n                           1.9108799695968628,\n                           -18.089599609375,\n                           -18.089599609375,\n                           11.465299606323242,\n                           -17.382999420166016,\n                           -17.382999420166016,\n                           7.688300132751465,\n                           -15.828399658203125,\n                           -15.828399658203125,\n                           4.89661979675293,\n                           -14.273900032043457,\n                           -14.273900032043457,\n                           3.0006699562072754,\n                           -13.56719970703125,\n                           -13.56719970703125,\n                           1.9108799695968628,\n                           -23.503799438476562,\n                           -10.000300407409668,\n                           11.465299606323242,\n                           -22.5856990814209,\n                           -9.609620094299316,\n                           7.688300132751465,\n                           -20.565799713134766,\n                           -8.750229835510254,\n                           4.89661979675293,\n                           -18.54599952697754,\n                           -7.890830039978027,\n                           3.0006699562072754,\n                           -17.62779998779297,\n                           -7.500199794769287,\n                           1.9108799695968628,\n                           -25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           -24.48310089111328,\n                           0,\n                           7.688300132751465,\n                           -22.29360008239746,\n                           0,\n                           4.89661979675293,\n                           -20.104000091552734,\n                           0,\n                           3.0006699562072754,\n                           -19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           -25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           -23.503799438476562,\n                           10.000300407409668,\n                           11.465299606323242,\n                           -22.5856990814209,\n                           9.609620094299316,\n                           7.688300132751465,\n                           -24.48310089111328,\n                           0,\n                           7.688300132751465,\n                           -20.565799713134766,\n                           8.750229835510254,\n                           4.89661979675293,\n                           -22.29360008239746,\n                           0,\n                           4.89661979675293,\n                           -18.54599952697754,\n                           7.890830039978027,\n                           3.0006699562072754,\n                           -20.104000091552734,\n                           0,\n                           3.0006699562072754,\n                           -17.62779998779297,\n                           7.500199794769287,\n                           1.9108799695968628,\n                           -19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           -18.089599609375,\n                           18.089599609375,\n                           11.465299606323242,\n                           -17.382999420166016,\n                           17.382999420166016,\n                           7.688300132751465,\n                           -15.828399658203125,\n                           15.828399658203125,\n                           4.89661979675293,\n                           -14.273900032043457,\n                           14.273900032043457,\n                           3.0006699562072754,\n                           -13.56719970703125,\n                           13.56719970703125,\n                           1.9108799695968628,\n                           -10.000300407409668,\n                           23.503799438476562,\n                           11.465299606323242,\n                           -9.609620094299316,\n                           22.5856990814209,\n                           7.688300132751465,\n                           -8.750229835510254,\n                           20.565799713134766,\n                           4.89661979675293,\n                           -7.890830039978027,\n                           18.54599952697754,\n                           3.0006699562072754,\n                           -7.500199794769287,\n                           17.62779998779297,\n                           1.9108799695968628,\n                           0,\n                           25.4783992767334,\n                           11.465299606323242,\n                           0,\n                           24.48310089111328,\n                           7.688300132751465,\n                           0,\n                           22.29360008239746,\n                           4.89661979675293,\n                           0,\n                           20.104000091552734,\n                           3.0006699562072754,\n                           0,\n                           19.108800888061523,\n                           1.9108799695968628,\n                           0,\n                           25.4783992767334,\n                           11.465299606323242,\n                           10.000300407409668,\n                           23.503799438476562,\n                           11.465299606323242,\n                           9.609620094299316,\n                           22.5856990814209,\n                           7.688300132751465,\n                           0,\n                           24.48310089111328,\n                           7.688300132751465,\n                           8.750229835510254,\n                           20.565799713134766,\n                           4.89661979675293,\n                           0,\n                           22.29360008239746,\n                           4.89661979675293,\n                           7.890830039978027,\n                           18.54599952697754,\n                           3.0006699562072754,\n                           0,\n                           20.104000091552734,\n                           3.0006699562072754,\n                           7.500199794769287,\n                           17.62779998779297,\n                           1.9108799695968628,\n                           0,\n                           19.108800888061523,\n                           1.9108799695968628,\n                           18.089599609375,\n                           18.089599609375,\n                           11.465299606323242,\n                           17.382999420166016,\n                           17.382999420166016,\n                           7.688300132751465,\n                           15.828399658203125,\n                           15.828399658203125,\n                           4.89661979675293,\n                           14.273900032043457,\n                           14.273900032043457,\n                           3.0006699562072754,\n                           13.56719970703125,\n                           13.56719970703125,\n                           1.9108799695968628,\n                           23.503799438476562,\n                           10.000300407409668,\n                           11.465299606323242,\n                           22.5856990814209,\n                           9.609620094299316,\n                           7.688300132751465,\n                           20.565799713134766,\n                           8.750229835510254,\n                           4.89661979675293,\n                           18.54599952697754,\n                           7.890830039978027,\n                           3.0006699562072754,\n                           17.62779998779297,\n                           7.500199794769287,\n                           1.9108799695968628,\n                           25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           24.48310089111328,\n                           0,\n                           7.688300132751465,\n                           22.29360008239746,\n                           0,\n                           4.89661979675293,\n                           20.104000091552734,\n                           0,\n                           3.0006699562072754,\n                           19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           17.62779998779297,\n                           -7.500199794769287,\n                           1.9108799695968628,\n                           17.228500366210938,\n                           -7.330269813537598,\n                           1.2092299461364746,\n                           18.675800323486328,\n                           0,\n                           1.2092299461364746,\n                           15.093799591064453,\n                           -6.422039985656738,\n                           0.5971490144729614,\n                           16.361900329589844,\n                           0,\n                           0.5971490144729614,\n                           9.819259643554688,\n                           -4.177840232849121,\n                           0.16421599686145782,\n                           10.644200325012207,\n                           0,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           13.56719970703125,\n                           -13.56719970703125,\n                           1.9108799695968628,\n                           13.25979995727539,\n                           -13.25979995727539,\n                           1.2092299461364746,\n                           11.616900444030762,\n                           -11.616900444030762,\n                           0.5971490144729614,\n                           7.557370185852051,\n                           -7.557370185852051,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           7.500199794769287,\n                           -17.62779998779297,\n                           1.9108799695968628,\n                           7.330269813537598,\n                           -17.228500366210938,\n                           1.2092299461364746,\n                           6.422039985656738,\n                           -15.093799591064453,\n                           0.5971490144729614,\n                           4.177840232849121,\n                           -9.819259643554688,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           -19.108800888061523,\n                           1.9108799695968628,\n                           0,\n                           -18.675800323486328,\n                           1.2092299461364746,\n                           0,\n                           -16.361900329589844,\n                           0.5971490144729614,\n                           0,\n                           -10.644200325012207,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           -19.108800888061523,\n                           1.9108799695968628,\n                           -7.500199794769287,\n                           -17.62779998779297,\n                           1.9108799695968628,\n                           -7.330269813537598,\n                           -17.228500366210938,\n                           1.2092299461364746,\n                           0,\n                           -18.675800323486328,\n                           1.2092299461364746,\n                           -6.422039985656738,\n                           -15.093799591064453,\n                           0.5971490144729614,\n                           0,\n                           -16.361900329589844,\n                           0.5971490144729614,\n                           -4.177840232849121,\n                           -9.819259643554688,\n                           0.16421599686145782,\n                           0,\n                           -10.644200325012207,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           -13.56719970703125,\n                           -13.56719970703125,\n                           1.9108799695968628,\n                           -13.25979995727539,\n                           -13.25979995727539,\n                           1.2092299461364746,\n                           -11.616900444030762,\n                           -11.616900444030762,\n                           0.5971490144729614,\n                           -7.557370185852051,\n                           -7.557370185852051,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           -17.62779998779297,\n                           -7.500199794769287,\n                           1.9108799695968628,\n                           -17.228500366210938,\n                           -7.330269813537598,\n                           1.2092299461364746,\n                           -15.093799591064453,\n                           -6.422039985656738,\n                           0.5971490144729614,\n                           -9.819259643554688,\n                           -4.177840232849121,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           -19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           -18.675800323486328,\n                           0,\n                           1.2092299461364746,\n                           -16.361900329589844,\n                           0,\n                           0.5971490144729614,\n                           -10.644200325012207,\n                           0,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           -19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           -17.62779998779297,\n                           7.500199794769287,\n                           1.9108799695968628,\n                           -17.228500366210938,\n                           7.330269813537598,\n                           1.2092299461364746,\n                           -18.675800323486328,\n                           0,\n                           1.2092299461364746,\n                           -15.093799591064453,\n                           6.422039985656738,\n                           0.5971490144729614,\n                           -16.361900329589844,\n                           0,\n                           0.5971490144729614,\n                           -9.819259643554688,\n                           4.177840232849121,\n                           0.16421599686145782,\n                           -10.644200325012207,\n                           0,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           -13.56719970703125,\n                           13.56719970703125,\n                           1.9108799695968628,\n                           -13.25979995727539,\n                           13.25979995727539,\n                           1.2092299461364746,\n                           -11.616900444030762,\n                           11.616900444030762,\n                           0.5971490144729614,\n                           -7.557370185852051,\n                           7.557370185852051,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           -7.500199794769287,\n                           17.62779998779297,\n                           1.9108799695968628,\n                           -7.330269813537598,\n                           17.228500366210938,\n                           1.2092299461364746,\n                           -6.422039985656738,\n                           15.093799591064453,\n                           0.5971490144729614,\n                           -4.177840232849121,\n                           9.819259643554688,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           19.108800888061523,\n                           1.9108799695968628,\n                           0,\n                           18.675800323486328,\n                           1.2092299461364746,\n                           0,\n                           16.361900329589844,\n                           0.5971490144729614,\n                           0,\n                           10.644200325012207,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           19.108800888061523,\n                           1.9108799695968628,\n                           7.500199794769287,\n                           17.62779998779297,\n                           1.9108799695968628,\n                           7.330269813537598,\n                           17.228500366210938,\n                           1.2092299461364746,\n                           0,\n                           18.675800323486328,\n                           1.2092299461364746,\n                           6.422039985656738,\n                           15.093799591064453,\n                           0.5971490144729614,\n                           0,\n                           16.361900329589844,\n                           0.5971490144729614,\n                           4.177840232849121,\n                           9.819259643554688,\n                           0.16421599686145782,\n                           0,\n                           10.644200325012207,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           13.56719970703125,\n                           13.56719970703125,\n                           1.9108799695968628,\n                           13.25979995727539,\n                           13.25979995727539,\n                           1.2092299461364746,\n                           11.616900444030762,\n                           11.616900444030762,\n                           0.5971490144729614,\n                           7.557370185852051,\n                           7.557370185852051,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           17.62779998779297,\n                           7.500199794769287,\n                           1.9108799695968628,\n                           17.228500366210938,\n                           7.330269813537598,\n                           1.2092299461364746,\n                           15.093799591064453,\n                           6.422039985656738,\n                           0.5971490144729614,\n                           9.819259643554688,\n                           4.177840232849121,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           18.675800323486328,\n                           0,\n                           1.2092299461364746,\n                           16.361900329589844,\n                           0,\n                           0.5971490144729614,\n                           10.644200325012207,\n                           0,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           -20.382699966430664,\n                           0,\n                           25.796899795532227,\n                           -20.1835994720459,\n                           -2.149739980697632,\n                           26.244699478149414,\n                           -26.511600494384766,\n                           -2.149739980697632,\n                           26.192899703979492,\n                           -26.334299087524414,\n                           0,\n                           25.752099990844727,\n                           -31.156299591064453,\n                           -2.149739980697632,\n                           25.830400466918945,\n                           -30.733299255371094,\n                           0,\n                           25.438600540161133,\n                           -34.016998291015625,\n                           -2.149739980697632,\n                           24.846500396728516,\n                           -33.46030044555664,\n                           0,\n                           24.587600708007812,\n                           -34.99290084838867,\n                           -2.149739980697632,\n                           22.930500030517578,\n                           -34.39580154418945,\n                           0,\n                           22.930500030517578,\n                           -19.74570083618164,\n                           -2.8663198947906494,\n                           27.229999542236328,\n                           -26.901599884033203,\n                           -2.8663198947906494,\n                           27.162799835205078,\n                           -32.08679962158203,\n                           -2.8663198947906494,\n                           26.69260025024414,\n                           -35.241798400878906,\n                           -2.8663198947906494,\n                           25.416200637817383,\n                           -36.30670166015625,\n                           -2.8663198947906494,\n                           22.930500030517578,\n                           -19.30780029296875,\n                           -2.149739980697632,\n                           28.215299606323242,\n                           -27.29159927368164,\n                           -2.149739980697632,\n                           28.132699966430664,\n                           -33.017398834228516,\n                           -2.149739980697632,\n                           27.55470085144043,\n                           -36.46649932861328,\n                           -2.149739980697632,\n                           25.98579978942871,\n                           -37.620399475097656,\n                           -2.149739980697632,\n                           22.930500030517578,\n                           -19.108800888061523,\n                           0,\n                           28.66320037841797,\n                           -27.468900680541992,\n                           0,\n                           28.57360076904297,\n                           -33.440399169921875,\n                           0,\n                           27.94659996032715,\n                           -37.02330017089844,\n                           0,\n                           26.244699478149414,\n                           -38.21760177612305,\n                           0,\n                           22.930500030517578,\n                           -19.108800888061523,\n                           0,\n                           28.66320037841797,\n                           -19.30780029296875,\n                           2.149739980697632,\n                           28.215299606323242,\n                           -27.29159927368164,\n                           2.149739980697632,\n                           28.132699966430664,\n                           -27.468900680541992,\n                           0,\n                           28.57360076904297,\n                           -33.017398834228516,\n                           2.149739980697632,\n                           27.55470085144043,\n                           -33.440399169921875,\n                           0,\n                           27.94659996032715,\n                           -36.46649932861328,\n                           2.149739980697632,\n                           25.98579978942871,\n                           -37.02330017089844,\n                           0,\n                           26.244699478149414,\n                           -37.620399475097656,\n                           2.149739980697632,\n                           22.930500030517578,\n                           -38.21760177612305,\n                           0,\n                           22.930500030517578,\n                           -19.74570083618164,\n                           2.8663198947906494,\n                           27.229999542236328,\n                           -26.901599884033203,\n                           2.8663198947906494,\n                           27.162799835205078,\n                           -32.08679962158203,\n                           2.8663198947906494,\n                           26.69260025024414,\n                           -35.241798400878906,\n                           2.8663198947906494,\n                           25.416200637817383,\n                           -36.30670166015625,\n                           2.8663198947906494,\n                           22.930500030517578,\n                           -20.1835994720459,\n                           2.149739980697632,\n                           26.244699478149414,\n                           -26.511600494384766,\n                           2.149739980697632,\n                           26.192899703979492,\n                           -31.156299591064453,\n                           2.149739980697632,\n                           25.830400466918945,\n                           -34.016998291015625,\n                           2.149739980697632,\n                           24.846500396728516,\n                           -34.99290084838867,\n                           2.149739980697632,\n                           22.930500030517578,\n                           -20.382699966430664,\n                           0,\n                           25.796899795532227,\n                           -26.334299087524414,\n                           0,\n                           25.752099990844727,\n                           -30.733299255371094,\n                           0,\n                           25.438600540161133,\n                           -33.46030044555664,\n                           0,\n                           24.587600708007812,\n                           -34.39580154418945,\n                           0,\n                           22.930500030517578,\n                           -34.39580154418945,\n                           0,\n                           22.930500030517578,\n                           -34.99290084838867,\n                           -2.149739980697632,\n                           22.930500030517578,\n                           -34.44089889526367,\n                           -2.149739980697632,\n                           20.082199096679688,\n                           -33.89820098876953,\n                           0,\n                           20.33289909362793,\n                           -32.711299896240234,\n                           -2.149739980697632,\n                           16.81529998779297,\n                           -32.32569885253906,\n                           0,\n                           17.197900772094727,\n                           -29.69420051574707,\n                           -2.149739980697632,\n                           13.590499877929688,\n                           -29.558900833129883,\n                           0,\n                           14.062899589538574,\n                           -25.279300689697266,\n                           -2.149739980697632,\n                           10.8681001663208,\n                           -25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           -36.30670166015625,\n                           -2.8663198947906494,\n                           22.930500030517578,\n                           -35.6348991394043,\n                           -2.8663198947906494,\n                           19.530500411987305,\n                           -33.55979919433594,\n                           -2.8663198947906494,\n                           15.973699569702148,\n                           -29.99180030822754,\n                           -2.8663198947906494,\n                           12.551300048828125,\n                           -24.841400146484375,\n                           -2.8663198947906494,\n                           9.554389953613281,\n                           -37.620399475097656,\n                           -2.149739980697632,\n                           22.930500030517578,\n                           -36.82889938354492,\n                           -2.149739980697632,\n                           18.97879981994629,\n                           -34.408199310302734,\n                           -2.149739980697632,\n                           15.132100105285645,\n                           -30.289499282836914,\n                           -2.149739980697632,\n                           11.512200355529785,\n                           -24.403499603271484,\n                           -2.149739980697632,\n                           8.240659713745117,\n                           -38.21760177612305,\n                           0,\n                           22.930500030517578,\n                           -37.37160110473633,\n                           0,\n                           18.728099822998047,\n                           -34.79389953613281,\n                           0,\n                           14.749600410461426,\n                           -30.424800872802734,\n                           0,\n                           11.039799690246582,\n                           -24.204500198364258,\n                           0,\n                           7.643509864807129,\n                           -38.21760177612305,\n                           0,\n                           22.930500030517578,\n                           -37.620399475097656,\n                           2.149739980697632,\n                           22.930500030517578,\n                           -36.82889938354492,\n                           2.149739980697632,\n                           18.97879981994629,\n                           -37.37160110473633,\n                           0,\n                           18.728099822998047,\n                           -34.408199310302734,\n                           2.149739980697632,\n                           15.132100105285645,\n                           -34.79389953613281,\n                           0,\n                           14.749600410461426,\n                           -30.289499282836914,\n                           2.149739980697632,\n                           11.512200355529785,\n                           -30.424800872802734,\n                           0,\n                           11.039799690246582,\n                           -24.403499603271484,\n                           2.149739980697632,\n                           8.240659713745117,\n                           -24.204500198364258,\n                           0,\n                           7.643509864807129,\n                           -36.30670166015625,\n                           2.8663198947906494,\n                           22.930500030517578,\n                           -35.6348991394043,\n                           2.8663198947906494,\n                           19.530500411987305,\n                           -33.55979919433594,\n                           2.8663198947906494,\n                           15.973699569702148,\n                           -29.99180030822754,\n                           2.8663198947906494,\n                           12.551300048828125,\n                           -24.841400146484375,\n                           2.8663198947906494,\n                           9.554389953613281,\n                           -34.99290084838867,\n                           2.149739980697632,\n                           22.930500030517578,\n                           -34.44089889526367,\n                           2.149739980697632,\n                           20.082199096679688,\n                           -32.711299896240234,\n                           2.149739980697632,\n                           16.81529998779297,\n                           -29.69420051574707,\n                           2.149739980697632,\n                           13.590499877929688,\n                           -25.279300689697266,\n                           2.149739980697632,\n                           10.8681001663208,\n                           -34.39580154418945,\n                           0,\n                           22.930500030517578,\n                           -33.89820098876953,\n                           0,\n                           20.33289909362793,\n                           -32.32569885253906,\n                           0,\n                           17.197900772094727,\n                           -29.558900833129883,\n                           0,\n                           14.062899589538574,\n                           -25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           21.656600952148438,\n                           0,\n                           18.15329933166504,\n                           21.656600952148438,\n                           -4.729420185089111,\n                           16.511199951171875,\n                           28.233999252319336,\n                           -4.270359992980957,\n                           18.339000701904297,\n                           27.76740074157715,\n                           0,\n                           19.55660057067871,\n                           31.011899948120117,\n                           -3.2604401111602783,\n                           22.221399307250977,\n                           30.4148006439209,\n                           0,\n                           22.930500030517578,\n                           32.59560012817383,\n                           -2.2505099773406982,\n                           26.764400482177734,\n                           31.867900848388672,\n                           0,\n                           27.020999908447266,\n                           35.5900993347168,\n                           -1.791450023651123,\n                           30.573999404907227,\n                           34.39580154418945,\n                           0,\n                           30.573999404907227,\n                           21.656600952148438,\n                           -6.3059000968933105,\n                           12.89840030670166,\n                           29.260299682617188,\n                           -5.693819999694824,\n                           15.660200119018555,\n                           32.32569885253906,\n                           -4.347249984741211,\n                           20.661399841308594,\n                           34.19670104980469,\n                           -3.0006699562072754,\n                           26.199899673461914,\n                           38.21760177612305,\n                           -2.3886001110076904,\n                           30.573999404907227,\n                           21.656600952148438,\n                           -4.729420185089111,\n                           9.285670280456543,\n                           30.286699295043945,\n                           -4.270359992980957,\n                           12.981499671936035,\n                           33.639400482177734,\n                           -3.2604401111602783,\n                           19.101299285888672,\n                           35.79790115356445,\n                           -2.2505099773406982,\n                           25.635400772094727,\n                           40.845001220703125,\n                           -1.791450023651123,\n                           30.573999404907227,\n                           21.656600952148438,\n                           0,\n                           7.643509864807129,\n                           30.75320053100586,\n                           0,\n                           11.763799667358398,\n                           34.23659896850586,\n                           0,\n                           18.392200469970703,\n                           36.52560043334961,\n                           0,\n                           25.378799438476562,\n                           42.03929901123047,\n                           0,\n                           30.573999404907227,\n                           21.656600952148438,\n                           0,\n                           7.643509864807129,\n                           21.656600952148438,\n                           4.729420185089111,\n                           9.285670280456543,\n                           30.286699295043945,\n                           4.270359992980957,\n                           12.981499671936035,\n                           30.75320053100586,\n                           0,\n                           11.763799667358398,\n                           33.639400482177734,\n                           3.2604401111602783,\n                           19.101299285888672,\n                           34.23659896850586,\n                           0,\n                           18.392200469970703,\n                           35.79790115356445,\n                           2.2505099773406982,\n                           25.635400772094727,\n                           36.52560043334961,\n                           0,\n                           25.378799438476562,\n                           40.845001220703125,\n                           1.791450023651123,\n                           30.573999404907227,\n                           42.03929901123047,\n                           0,\n                           30.573999404907227,\n                           21.656600952148438,\n                           6.3059000968933105,\n                           12.89840030670166,\n                           29.260299682617188,\n                           5.693819999694824,\n                           15.660200119018555,\n                           32.32569885253906,\n                           4.347249984741211,\n                           20.661399841308594,\n                           34.19670104980469,\n                           3.0006699562072754,\n                           26.199899673461914,\n                           38.21760177612305,\n                           2.3886001110076904,\n                           30.573999404907227,\n                           21.656600952148438,\n                           4.729420185089111,\n                           16.511199951171875,\n                           28.233999252319336,\n                           4.270359992980957,\n                           18.339000701904297,\n                           31.011899948120117,\n                           3.2604401111602783,\n                           22.221399307250977,\n                           32.59560012817383,\n                           2.2505099773406982,\n                           26.764400482177734,\n                           35.5900993347168,\n                           1.791450023651123,\n                           30.573999404907227,\n                           21.656600952148438,\n                           0,\n                           18.15329933166504,\n                           27.76740074157715,\n                           0,\n                           19.55660057067871,\n                           30.4148006439209,\n                           0,\n                           22.930500030517578,\n                           31.867900848388672,\n                           0,\n                           27.020999908447266,\n                           34.39580154418945,\n                           0,\n                           30.573999404907227,\n                           34.39580154418945,\n                           0,\n                           30.573999404907227,\n                           35.5900993347168,\n                           -1.791450023651123,\n                           30.573999404907227,\n                           36.59049987792969,\n                           -1.679479956626892,\n                           31.137699127197266,\n                           35.3114013671875,\n                           0,\n                           31.111499786376953,\n                           37.18870162963867,\n                           -1.4331599473953247,\n                           31.332599639892578,\n                           35.98820114135742,\n                           0,\n                           31.290599822998047,\n                           37.206600189208984,\n                           -1.1868300437927246,\n                           31.1481990814209,\n                           36.187198638916016,\n                           0,\n                           31.111499786376953,\n                           36.46590042114258,\n                           -1.074869990348816,\n                           30.573999404907227,\n                           35.669700622558594,\n                           0,\n                           30.573999404907227,\n                           38.21760177612305,\n                           -2.3886001110076904,\n                           30.573999404907227,\n                           39.40439987182617,\n                           -2.2393100261688232,\n                           31.195499420166016,\n                           39.829898834228516,\n                           -1.9108799695968628,\n                           31.424999237060547,\n                           39.44919967651367,\n                           -1.582450032234192,\n                           31.229000091552734,\n                           38.21760177612305,\n                           -1.4331599473953247,\n                           30.573999404907227,\n                           40.845001220703125,\n                           -1.791450023651123,\n                           30.573999404907227,\n                           42.218299865722656,\n                           -1.679479956626892,\n                           31.25320053100586,\n                           42.47100067138672,\n                           -1.4331599473953247,\n                           31.51740074157715,\n                           41.69169998168945,\n                           -1.1868300437927246,\n                           31.309900283813477,\n                           39.969200134277344,\n                           -1.074869990348816,\n                           30.573999404907227,\n                           42.03929901123047,\n                           0,\n                           30.573999404907227,\n                           43.49729919433594,\n                           0,\n                           31.279399871826172,\n                           43.67150115966797,\n                           0,\n                           31.55929946899414,\n                           42.71110153198242,\n                           0,\n                           31.346599578857422,\n                           40.76539993286133,\n                           0,\n                           30.573999404907227,\n                           42.03929901123047,\n                           0,\n                           30.573999404907227,\n                           40.845001220703125,\n                           1.791450023651123,\n                           30.573999404907227,\n                           42.218299865722656,\n                           1.679479956626892,\n                           31.25320053100586,\n                           43.49729919433594,\n                           0,\n                           31.279399871826172,\n                           42.47100067138672,\n                           1.4331599473953247,\n                           31.51740074157715,\n                           43.67150115966797,\n                           0,\n                           31.55929946899414,\n                           41.69169998168945,\n                           1.1868300437927246,\n                           31.309900283813477,\n                           42.71110153198242,\n                           0,\n                           31.346599578857422,\n                           39.969200134277344,\n                           1.074869990348816,\n                           30.573999404907227,\n                           40.76539993286133,\n                           0,\n                           30.573999404907227,\n                           38.21760177612305,\n                           2.3886001110076904,\n                           30.573999404907227,\n                           39.40439987182617,\n                           2.2393100261688232,\n                           31.195499420166016,\n                           39.829898834228516,\n                           1.9108799695968628,\n                           31.424999237060547,\n                           39.44919967651367,\n                           1.582450032234192,\n                           31.229000091552734,\n                           38.21760177612305,\n                           1.4331599473953247,\n                           30.573999404907227,\n                           35.5900993347168,\n                           1.791450023651123,\n                           30.573999404907227,\n                           36.59049987792969,\n                           1.679479956626892,\n                           31.137699127197266,\n                           37.18870162963867,\n                           1.4331599473953247,\n                           31.332599639892578,\n                           37.206600189208984,\n                           1.1868300437927246,\n                           31.1481990814209,\n                           36.46590042114258,\n                           1.074869990348816,\n                           30.573999404907227,\n                           34.39580154418945,\n                           0,\n                           30.573999404907227,\n                           35.3114013671875,\n                           0,\n                           31.111499786376953,\n                           35.98820114135742,\n                           0,\n                           31.290599822998047,\n                           36.187198638916016,\n                           0,\n                           31.111499786376953,\n                           35.669700622558594,\n                           0,\n                           30.573999404907227,\n                           0,\n                           0,\n                           40.12839889526367,\n                           0,\n                           0,\n                           40.12839889526367,\n                           4.004499912261963,\n                           -1.7077000141143799,\n                           39.501399993896484,\n                           4.339280128479004,\n                           0,\n                           39.501399993896484,\n                           3.8207099437713623,\n                           -1.6290700435638428,\n                           37.97869873046875,\n                           4.140230178833008,\n                           0,\n                           37.97869873046875,\n                           2.314160108566284,\n                           -0.985912024974823,\n                           36.09769821166992,\n                           2.5080299377441406,\n                           0,\n                           36.09769821166992,\n                           2.3503799438476562,\n                           -1.0000300407409668,\n                           34.39580154418945,\n                           2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           3.0849199295043945,\n                           -3.0849199295043945,\n                           39.501399993896484,\n                           2.943150043487549,\n                           -2.943150043487549,\n                           37.97869873046875,\n                           1.782039999961853,\n                           -1.782039999961853,\n                           36.09769821166992,\n                           1.8089599609375,\n                           -1.8089599609375,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           1.7077000141143799,\n                           -4.004499912261963,\n                           39.501399993896484,\n                           1.6290700435638428,\n                           -3.8207099437713623,\n                           37.97869873046875,\n                           0.985912024974823,\n                           -2.314160108566284,\n                           36.09769821166992,\n                           1.0000300407409668,\n                           -2.3503799438476562,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           0,\n                           -4.339280128479004,\n                           39.501399993896484,\n                           0,\n                           -4.140230178833008,\n                           37.97869873046875,\n                           0,\n                           -2.5080299377441406,\n                           36.09769821166992,\n                           0,\n                           -2.547840118408203,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -1.7077000141143799,\n                           -4.004499912261963,\n                           39.501399993896484,\n                           0,\n                           -4.339280128479004,\n                           39.501399993896484,\n                           -1.6290700435638428,\n                           -3.8207099437713623,\n                           37.97869873046875,\n                           0,\n                           -4.140230178833008,\n                           37.97869873046875,\n                           -0.985912024974823,\n                           -2.314160108566284,\n                           36.09769821166992,\n                           0,\n                           -2.5080299377441406,\n                           36.09769821166992,\n                           -1.0000300407409668,\n                           -2.3503799438476562,\n                           34.39580154418945,\n                           0,\n                           -2.547840118408203,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -3.0849199295043945,\n                           -3.0849199295043945,\n                           39.501399993896484,\n                           -2.943150043487549,\n                           -2.943150043487549,\n                           37.97869873046875,\n                           -1.782039999961853,\n                           -1.782039999961853,\n                           36.09769821166992,\n                           -1.8089599609375,\n                           -1.8089599609375,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -4.004499912261963,\n                           -1.7077000141143799,\n                           39.501399993896484,\n                           -3.8207099437713623,\n                           -1.6290700435638428,\n                           37.97869873046875,\n                           -2.314160108566284,\n                           -0.985912024974823,\n                           36.09769821166992,\n                           -2.3503799438476562,\n                           -1.0000300407409668,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -4.339280128479004,\n                           0,\n                           39.501399993896484,\n                           -4.140230178833008,\n                           0,\n                           37.97869873046875,\n                           -2.5080299377441406,\n                           0,\n                           36.09769821166992,\n                           -2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -4.004499912261963,\n                           1.7077000141143799,\n                           39.501399993896484,\n                           -4.339280128479004,\n                           0,\n                           39.501399993896484,\n                           -3.8207099437713623,\n                           1.6290700435638428,\n                           37.97869873046875,\n                           -4.140230178833008,\n                           0,\n                           37.97869873046875,\n                           -2.314160108566284,\n                           0.985912024974823,\n                           36.09769821166992,\n                           -2.5080299377441406,\n                           0,\n                           36.09769821166992,\n                           -2.3503799438476562,\n                           1.0000300407409668,\n                           34.39580154418945,\n                           -2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -3.0849199295043945,\n                           3.0849199295043945,\n                           39.501399993896484,\n                           -2.943150043487549,\n                           2.943150043487549,\n                           37.97869873046875,\n                           -1.782039999961853,\n                           1.782039999961853,\n                           36.09769821166992,\n                           -1.8089599609375,\n                           1.8089599609375,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -1.7077000141143799,\n                           4.004499912261963,\n                           39.501399993896484,\n                           -1.6290700435638428,\n                           3.8207099437713623,\n                           37.97869873046875,\n                           -0.985912024974823,\n                           2.314160108566284,\n                           36.09769821166992,\n                           -1.0000300407409668,\n                           2.3503799438476562,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           0,\n                           4.339280128479004,\n                           39.501399993896484,\n                           0,\n                           4.140230178833008,\n                           37.97869873046875,\n                           0,\n                           2.5080299377441406,\n                           36.09769821166992,\n                           0,\n                           2.547840118408203,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           0,\n                           0,\n                           40.12839889526367,\n                           1.7077000141143799,\n                           4.004499912261963,\n                           39.501399993896484,\n                           0,\n                           4.339280128479004,\n                           39.501399993896484,\n                           1.6290700435638428,\n                           3.8207099437713623,\n                           37.97869873046875,\n                           0,\n                           4.140230178833008,\n                           37.97869873046875,\n                           0.985912024974823,\n                           2.314160108566284,\n                           36.09769821166992,\n                           0,\n                           2.5080299377441406,\n                           36.09769821166992,\n                           1.0000300407409668,\n                           2.3503799438476562,\n                           34.39580154418945,\n                           0,\n                           2.547840118408203,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           3.0849199295043945,\n                           3.0849199295043945,\n                           39.501399993896484,\n                           2.943150043487549,\n                           2.943150043487549,\n                           37.97869873046875,\n                           1.782039999961853,\n                           1.782039999961853,\n                           36.09769821166992,\n                           1.8089599609375,\n                           1.8089599609375,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           4.004499912261963,\n                           1.7077000141143799,\n                           39.501399993896484,\n                           3.8207099437713623,\n                           1.6290700435638428,\n                           37.97869873046875,\n                           2.314160108566284,\n                           0.985912024974823,\n                           36.09769821166992,\n                           2.3503799438476562,\n                           1.0000300407409668,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           4.339280128479004,\n                           0,\n                           39.501399993896484,\n                           4.140230178833008,\n                           0,\n                           37.97869873046875,\n                           2.5080299377441406,\n                           0,\n                           36.09769821166992,\n                           2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           2.3503799438476562,\n                           -1.0000300407409668,\n                           34.39580154418945,\n                           5.361800193786621,\n                           -2.2813100814819336,\n                           33.261199951171875,\n                           5.812250137329102,\n                           0,\n                           33.261199951171875,\n                           9.695320129394531,\n                           -4.125110149383545,\n                           32.484901428222656,\n                           10.50979995727539,\n                           0,\n                           32.484901428222656,\n                           13.58810043334961,\n                           -5.781400203704834,\n                           31.708599090576172,\n                           14.729700088500977,\n                           0,\n                           31.708599090576172,\n                           15.27750015258789,\n                           -6.5001702308654785,\n                           30.573999404907227,\n                           16.56089973449707,\n                           0,\n                           30.573999404907227,\n                           1.8089599609375,\n                           -1.8089599609375,\n                           34.39580154418945,\n                           4.126699924468994,\n                           -4.126699924468994,\n                           33.261199951171875,\n                           7.461979866027832,\n                           -7.461979866027832,\n                           32.484901428222656,\n                           10.458100318908691,\n                           -10.458100318908691,\n                           31.708599090576172,\n                           11.758299827575684,\n                           -11.758299827575684,\n                           30.573999404907227,\n                           1.0000300407409668,\n                           -2.3503799438476562,\n                           34.39580154418945,\n                           2.2813100814819336,\n                           -5.361800193786621,\n                           33.261199951171875,\n                           4.125110149383545,\n                           -9.695320129394531,\n                           32.484901428222656,\n                           5.781400203704834,\n                           -13.58810043334961,\n                           31.708599090576172,\n                           6.5001702308654785,\n                           -15.27750015258789,\n                           30.573999404907227,\n                           0,\n                           -2.547840118408203,\n                           34.39580154418945,\n                           0,\n                           -5.812250137329102,\n                           33.261199951171875,\n                           0,\n                           -10.50979995727539,\n                           32.484901428222656,\n                           0,\n                           -14.729700088500977,\n                           31.708599090576172,\n                           0,\n                           -16.56089973449707,\n                           30.573999404907227,\n                           0,\n                           -2.547840118408203,\n                           34.39580154418945,\n                           -1.0000300407409668,\n                           -2.3503799438476562,\n                           34.39580154418945,\n                           -2.2813100814819336,\n                           -5.361800193786621,\n                           33.261199951171875,\n                           0,\n                           -5.812250137329102,\n                           33.261199951171875,\n                           -4.125110149383545,\n                           -9.695320129394531,\n                           32.484901428222656,\n                           0,\n                           -10.50979995727539,\n                           32.484901428222656,\n                           -5.781400203704834,\n                           -13.58810043334961,\n                           31.708599090576172,\n                           0,\n                           -14.729700088500977,\n                           31.708599090576172,\n                           -6.5001702308654785,\n                           -15.27750015258789,\n                           30.573999404907227,\n                           0,\n                           -16.56089973449707,\n                           30.573999404907227,\n                           -1.8089599609375,\n                           -1.8089599609375,\n                           34.39580154418945,\n                           -4.126699924468994,\n                           -4.126699924468994,\n                           33.261199951171875,\n                           -7.461979866027832,\n                           -7.461979866027832,\n                           32.484901428222656,\n                           -10.458100318908691,\n                           -10.458100318908691,\n                           31.708599090576172,\n                           -11.758299827575684,\n                           -11.758299827575684,\n                           30.573999404907227,\n                           -2.3503799438476562,\n                           -1.0000300407409668,\n                           34.39580154418945,\n                           -5.361800193786621,\n                           -2.2813100814819336,\n                           33.261199951171875,\n                           -9.695320129394531,\n                           -4.125110149383545,\n                           32.484901428222656,\n                           -13.58810043334961,\n                           -5.781400203704834,\n                           31.708599090576172,\n                           -15.27750015258789,\n                           -6.5001702308654785,\n                           30.573999404907227,\n                           -2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           -5.812250137329102,\n                           0,\n                           33.261199951171875,\n                           -10.50979995727539,\n                           0,\n                           32.484901428222656,\n                           -14.729700088500977,\n                           0,\n                           31.708599090576172,\n                           -16.56089973449707,\n                           0,\n                           30.573999404907227,\n                           -2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           -2.3503799438476562,\n                           1.0000300407409668,\n                           34.39580154418945,\n                           -5.361800193786621,\n                           2.2813100814819336,\n                           33.261199951171875,\n                           -5.812250137329102,\n                           0,\n                           33.261199951171875,\n                           -9.695320129394531,\n                           4.125110149383545,\n                           32.484901428222656,\n                           -10.50979995727539,\n                           0,\n                           32.484901428222656,\n                           -13.58810043334961,\n                           5.781400203704834,\n                           31.708599090576172,\n                           -14.729700088500977,\n                           0,\n                           31.708599090576172,\n                           -15.27750015258789,\n                           6.5001702308654785,\n                           30.573999404907227,\n                           -16.56089973449707,\n                           0,\n                           30.573999404907227,\n                           -1.8089599609375,\n                           1.8089599609375,\n                           34.39580154418945,\n                           -4.126699924468994,\n                           4.126699924468994,\n                           33.261199951171875,\n                           -7.461979866027832,\n                           7.461979866027832,\n                           32.484901428222656,\n                           -10.458100318908691,\n                           10.458100318908691,\n                           31.708599090576172,\n                           -11.758299827575684,\n                           11.758299827575684,\n                           30.573999404907227,\n                           -1.0000300407409668,\n                           2.3503799438476562,\n                           34.39580154418945,\n                           -2.2813100814819336,\n                           5.361800193786621,\n                           33.261199951171875,\n                           -4.125110149383545,\n                           9.695320129394531,\n                           32.484901428222656,\n                           -5.781400203704834,\n                           13.58810043334961,\n                           31.708599090576172,\n                           -6.5001702308654785,\n                           15.27750015258789,\n                           30.573999404907227,\n                           0,\n                           2.547840118408203,\n                           34.39580154418945,\n                           0,\n                           5.812250137329102,\n                           33.261199951171875,\n                           0,\n                           10.50979995727539,\n                           32.484901428222656,\n                           0,\n                           14.729700088500977,\n                           31.708599090576172,\n                           0,\n                           16.56089973449707,\n                           30.573999404907227,\n                           0,\n                           2.547840118408203,\n                           34.39580154418945,\n                           1.0000300407409668,\n                           2.3503799438476562,\n                           34.39580154418945,\n                           2.2813100814819336,\n                           5.361800193786621,\n                           33.261199951171875,\n                           0,\n                           5.812250137329102,\n                           33.261199951171875,\n                           4.125110149383545,\n                           9.695320129394531,\n                           32.484901428222656,\n                           0,\n                           10.50979995727539,\n                           32.484901428222656,\n                           5.781400203704834,\n                           13.58810043334961,\n                           31.708599090576172,\n                           0,\n                           14.729700088500977,\n                           31.708599090576172,\n                           6.5001702308654785,\n                           15.27750015258789,\n                           30.573999404907227,\n                           0,\n                           16.56089973449707,\n                           30.573999404907227,\n                           1.8089599609375,\n                           1.8089599609375,\n                           34.39580154418945,\n                           4.126699924468994,\n                           4.126699924468994,\n                           33.261199951171875,\n                           7.461979866027832,\n                           7.461979866027832,\n                           32.484901428222656,\n                           10.458100318908691,\n                           10.458100318908691,\n                           31.708599090576172,\n                           11.758299827575684,\n                           11.758299827575684,\n                           30.573999404907227,\n                           2.3503799438476562,\n                           1.0000300407409668,\n                           34.39580154418945,\n                           5.361800193786621,\n                           2.2813100814819336,\n                           33.261199951171875,\n                           9.695320129394531,\n                           4.125110149383545,\n                           32.484901428222656,\n                           13.58810043334961,\n                           5.781400203704834,\n                           31.708599090576172,\n                           15.27750015258789,\n                           6.5001702308654785,\n                           30.573999404907227,\n                           2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           5.812250137329102,\n                           0,\n                           33.261199951171875,\n                           10.50979995727539,\n                           0,\n                           32.484901428222656,\n                           14.729700088500977,\n                           0,\n                           31.708599090576172,\n                           16.56089973449707,\n                           0,\n                           30.573999404907227};\n\nfloat teapotNormals[] = {-0.9667419791221619,\n                         0,\n                         -0.25575199723243713,\n                         -0.8930140137672424,\n                         0.3698819875717163,\n                         -0.2563450038433075,\n                         -0.8934370279312134,\n                         0.36910200119018555,\n                         0.2559970021247864,\n                         -0.9668239951133728,\n                         0,\n                         0.2554430067539215,\n                         -0.0838799998164177,\n                         0.03550700098276138,\n                         0.9958429932594299,\n                         -0.09205400198698044,\n                         0,\n                         0.9957540035247803,\n                         0.629721999168396,\n                         -0.2604379951953888,\n                         0.7318620085716248,\n                         0.6820489764213562,\n                         0,\n                         0.7313070297241211,\n                         0.803725004196167,\n                         -0.3325839936733246,\n                         0.4933690130710602,\n                         0.8703010082244873,\n                         0,\n                         0.4925200045108795,\n                         -0.6834070086479187,\n                         0.6834070086479187,\n                         -0.2567310035228729,\n                         -0.6835309863090515,\n                         0.6835309863090515,\n                         0.25606799125671387,\n                         -0.06492599844932556,\n                         0.06492500007152557,\n                         0.9957759976387024,\n                         0.48139700293540955,\n                         -0.48139700293540955,\n                         0.7324709892272949,\n                         0.6148040294647217,\n                         -0.6148040294647217,\n                         0.4939970076084137,\n                         -0.3698819875717163,\n                         0.8930140137672424,\n                         -0.2563450038433075,\n                         -0.36910200119018555,\n                         0.8934370279312134,\n                         0.2559959888458252,\n                         -0.03550700098276138,\n                         0.0838790014386177,\n                         0.9958429932594299,\n                         0.26043900847435,\n                         -0.6297230124473572,\n                         0.7318609952926636,\n                         0.3325839936733246,\n                         -0.803725004196167,\n                         0.4933690130710602,\n                         -0.002848000032827258,\n                         0.9661769866943359,\n                         -0.25786298513412476,\n                         -0.001921999966725707,\n                         0.9670090079307556,\n                         0.2547360062599182,\n                         -0.00026500000967644155,\n                         0.09227199852466583,\n                         0.9957339763641357,\n                         0.00002300000051036477,\n                         -0.6820600032806396,\n                         0.7312960028648376,\n                         0,\n                         -0.8703010082244873,\n                         0.4925200045108795,\n                         -0.002848000032827258,\n                         0.9661769866943359,\n                         -0.25786298513412476,\n                         0.37905800342559814,\n                         0.852770984172821,\n                         -0.35929998755455017,\n                         0.37711000442504883,\n                         0.9140909910202026,\n                         0.14908500015735626,\n                         -0.001921999966725707,\n                         0.9670090079307556,\n                         0.2547360062599182,\n                         0.0275030005723238,\n                         0.12255500257015228,\n                         0.9920809864997864,\n                         -0.00026500000967644155,\n                         0.09227199852466583,\n                         0.9957339763641357,\n                         -0.26100900769233704,\n                         -0.6353650093078613,\n                         0.7267630100250244,\n                         0.00002300000051036477,\n                         -0.6820600032806396,\n                         0.7312960028648376,\n                         -0.33248499035835266,\n                         -0.8042709827423096,\n                         0.4925459921360016,\n                         0,\n                         -0.8703010082244873,\n                         0.4925200045108795,\n                         0.6635469794273376,\n                         0.6252639889717102,\n                         -0.4107919931411743,\n                         0.712664008140564,\n                         0.6976209878921509,\n                         0.07372400164604187,\n                         0.09972699731588364,\n                         0.12198299914598465,\n                         0.98750901222229,\n                         -0.4873189926147461,\n                         -0.4885669946670532,\n                         0.7237560153007507,\n                         -0.6152420043945312,\n                         -0.6154839992523193,\n                         0.4926010072231293,\n                         0.8800280094146729,\n                         0.3387089967727661,\n                         -0.3329069912433624,\n                         0.9172769784927368,\n                         0.36149299144744873,\n                         0.16711199283599854,\n                         0.11358699947595596,\n                         0.04806999862194061,\n                         0.9923650026321411,\n                         -0.6341490149497986,\n                         -0.2618879973888397,\n                         0.7275090217590332,\n                         -0.8041260242462158,\n                         -0.33270499110221863,\n                         0.49263399839401245,\n                         0.9666900038719177,\n                         -0.010453999973833561,\n                         -0.2557379901409149,\n                         0.967441976070404,\n                         -0.00810300000011921,\n                         0.25296199321746826,\n                         0.0934389978647232,\n                         -0.0012799999676644802,\n                         0.9956240057945251,\n                         -0.6821659803390503,\n                         0.0003429999924264848,\n                         0.7311969995498657,\n                         -0.8703219890594482,\n                         0.00005400000009103678,\n                         0.492482990026474,\n                         0.9666900038719177,\n                         -0.010453999973833561,\n                         -0.2557379901409149,\n                         0.8930140137672424,\n                         -0.3698819875717163,\n                         -0.2563450038433075,\n                         0.8934370279312134,\n                         -0.36910200119018555,\n                         0.2559970021247864,\n                         0.967441976070404,\n                         -0.00810300000011921,\n                         0.25296199321746826,\n                         0.0838799998164177,\n                         -0.03550700098276138,\n                         0.9958429932594299,\n                         0.0934389978647232,\n                         -0.0012799999676644802,\n                         0.9956240057945251,\n                         -0.629721999168396,\n                         0.2604379951953888,\n                         0.7318620085716248,\n                         -0.6821659803390503,\n                         0.0003429999924264848,\n                         0.7311969995498657,\n                         -0.803725004196167,\n                         0.3325839936733246,\n                         0.4933690130710602,\n                         -0.8703219890594482,\n                         0.00005400000009103678,\n                         0.492482990026474,\n                         0.6834070086479187,\n                         -0.6834070086479187,\n                         -0.2567310035228729,\n                         0.6835309863090515,\n                         -0.6835309863090515,\n                         0.25606799125671387,\n                         0.06492599844932556,\n                         -0.06492500007152557,\n                         0.9957759976387024,\n                         -0.48139700293540955,\n                         0.48139700293540955,\n                         0.7324709892272949,\n                         -0.6148040294647217,\n                         0.6148040294647217,\n                         0.4939970076084137,\n                         0.3698819875717163,\n                         -0.8930140137672424,\n                         -0.2563450038433075,\n                         0.36910200119018555,\n                         -0.8934370279312134,\n                         0.2559959888458252,\n                         0.03550700098276138,\n                         -0.0838790014386177,\n                         0.9958429932594299,\n                         -0.26043900847435,\n                         0.6297230124473572,\n                         0.7318609952926636,\n                         -0.3325839936733246,\n                         0.803725004196167,\n                         0.4933690130710602,\n                         0,\n                         -0.9667419791221619,\n                         -0.25575199723243713,\n                         0,\n                         -0.9668239951133728,\n                         0.2554430067539215,\n                         0,\n                         -0.09205400198698044,\n                         0.9957540035247803,\n                         0,\n                         0.6820489764213562,\n                         0.7313070297241211,\n                         0,\n                         0.8703010082244873,\n                         0.4925200045108795,\n                         0,\n                         -0.9667419791221619,\n                         -0.25575199723243713,\n                         -0.3698819875717163,\n                         -0.8930140137672424,\n                         -0.2563450038433075,\n                         -0.36910200119018555,\n                         -0.8934370279312134,\n                         0.2559970021247864,\n                         0,\n                         -0.9668239951133728,\n                         0.2554430067539215,\n                         -0.03550700098276138,\n                         -0.0838799998164177,\n                         0.9958429932594299,\n                         0,\n                         -0.09205400198698044,\n                         0.9957540035247803,\n                         0.2604379951953888,\n                         0.629721999168396,\n                         0.7318620085716248,\n                         0,\n                         0.6820489764213562,\n                         0.7313070297241211,\n                         0.3325839936733246,\n                         0.803725004196167,\n                         0.4933690130710602,\n                         0,\n                         0.8703010082244873,\n                         0.4925200045108795,\n                         -0.6834070086479187,\n                         -0.6834070086479187,\n                         -0.2567310035228729,\n                         -0.6835309863090515,\n                         -0.6835309863090515,\n                         0.25606799125671387,\n                         -0.06492500007152557,\n                         -0.06492599844932556,\n                         0.9957759976387024,\n                         0.48139700293540955,\n                         0.48139700293540955,\n                         0.7324709892272949,\n                         0.6148040294647217,\n                         0.6148040294647217,\n                         0.4939970076084137,\n                         -0.8930140137672424,\n                         -0.3698819875717163,\n                         -0.2563450038433075,\n                         -0.8934370279312134,\n                         -0.36910200119018555,\n                         0.2559959888458252,\n                         -0.0838790014386177,\n                         -0.03550700098276138,\n                         0.9958429932594299,\n                         0.6297230124473572,\n                         0.26043900847435,\n                         0.7318609952926636,\n                         0.803725004196167,\n                         0.3325839936733246,\n                         0.4933690130710602,\n                         -0.9667419791221619,\n                         0,\n                         -0.25575199723243713,\n                         -0.9668239951133728,\n                         0,\n                         0.2554430067539215,\n                         -0.09205400198698044,\n                         0,\n                         0.9957540035247803,\n                         0.6820489764213562,\n                         0,\n                         0.7313070297241211,\n                         0.8703010082244873,\n                         0,\n                         0.4925200045108795,\n                         0.8703010082244873,\n                         0,\n                         0.4925200045108795,\n                         0.803725004196167,\n                         -0.3325839936733246,\n                         0.4933690130710602,\n                         0.8454390168190002,\n                         -0.34983500838279724,\n                         0.40354499220848083,\n                         0.9153209924697876,\n                         0,\n                         0.4027250111103058,\n                         0.8699960112571716,\n                         -0.36004599928855896,\n                         0.33685898780822754,\n                         0.9418079853057861,\n                         0,\n                         0.33615100383758545,\n                         0.9041929841041565,\n                         -0.37428000569343567,\n                         0.20579099655151367,\n                         0.9786900281906128,\n                         0,\n                         0.20534199476242065,\n                         0.9218789935112,\n                         -0.38175201416015625,\n                         -0.06636899709701538,\n                         0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         0.6148040294647217,\n                         -0.6148040294647217,\n                         0.4939970076084137,\n                         0.6468020081520081,\n                         -0.6468020081520081,\n                         0.40409600734710693,\n                         0.6656550168991089,\n                         -0.6656550168991089,\n                         0.3373520076274872,\n                         0.6919230222702026,\n                         -0.6919230222702026,\n                         0.20611999928951263,\n                         0.7055429816246033,\n                         -0.7055429816246033,\n                         -0.06647899746894836,\n                         0.3325839936733246,\n                         -0.803725004196167,\n                         0.4933690130710602,\n                         0.34983500838279724,\n                         -0.8454390168190002,\n                         0.40354499220848083,\n                         0.36004701256752014,\n                         -0.8699960112571716,\n                         0.33685800433158875,\n                         0.37428000569343567,\n                         -0.9041929841041565,\n                         0.20579099655151367,\n                         0.38175201416015625,\n                         -0.9218789935112,\n                         -0.06636899709701538,\n                         0,\n                         -0.8703010082244873,\n                         0.4925200045108795,\n                         0,\n                         -0.9153209924697876,\n                         0.4027250111103058,\n                         0,\n                         -0.9418079853057861,\n                         0.33615100383758545,\n                         0,\n                         -0.9786900281906128,\n                         0.20534199476242065,\n                         0,\n                         -0.9978039860725403,\n                         -0.06623899936676025,\n                         0,\n                         -0.8703010082244873,\n                         0.4925200045108795,\n                         -0.33248499035835266,\n                         -0.8042709827423096,\n                         0.4925459921360016,\n                         -0.34983500838279724,\n                         -0.8454390168190002,\n                         0.40354499220848083,\n                         0,\n                         -0.9153209924697876,\n                         0.4027250111103058,\n                         -0.36004599928855896,\n                         -0.8699960112571716,\n                         0.33685898780822754,\n                         0,\n                         -0.9418079853057861,\n                         0.33615100383758545,\n                         -0.37428000569343567,\n                         -0.9041929841041565,\n                         0.20579099655151367,\n                         0,\n                         -0.9786900281906128,\n                         0.20534199476242065,\n                         -0.38175201416015625,\n                         -0.9218789935112,\n                         -0.06636899709701538,\n                         0,\n                         -0.9978039860725403,\n                         -0.06623899936676025,\n                         -0.6152420043945312,\n                         -0.6154839992523193,\n                         0.4926010072231293,\n                         -0.6468020081520081,\n                         -0.6468020081520081,\n                         0.40409600734710693,\n                         -0.6656550168991089,\n                         -0.6656550168991089,\n                         0.3373520076274872,\n                         -0.6919230222702026,\n                         -0.6919230222702026,\n                         0.20611999928951263,\n                         -0.7055429816246033,\n                         -0.7055429816246033,\n                         -0.06647899746894836,\n                         -0.8041260242462158,\n                         -0.33270499110221863,\n                         0.49263399839401245,\n                         -0.8454390168190002,\n                         -0.34983500838279724,\n                         0.40354499220848083,\n                         -0.8699960112571716,\n                         -0.36004701256752014,\n                         0.33685800433158875,\n                         -0.9041929841041565,\n                         -0.37428000569343567,\n                         0.20579099655151367,\n                         -0.9218789935112,\n                         -0.38175201416015625,\n                         -0.06636899709701538,\n                         -0.8703219890594482,\n                         0.00005400000009103678,\n                         0.492482990026474,\n                         -0.9153209924697876,\n                         0,\n                         0.4027250111103058,\n                         -0.9418079853057861,\n                         0,\n                         0.33615100383758545,\n                         -0.9786900281906128,\n                         0,\n                         0.20534199476242065,\n                         -0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         -0.8703219890594482,\n                         0.00005400000009103678,\n                         0.492482990026474,\n                         -0.803725004196167,\n                         0.3325839936733246,\n                         0.4933690130710602,\n                         -0.8454390168190002,\n                         0.34983500838279724,\n                         0.40354499220848083,\n                         -0.9153209924697876,\n                         0,\n                         0.4027250111103058,\n                         -0.8699960112571716,\n                         0.36004599928855896,\n                         0.33685898780822754,\n                         -0.9418079853057861,\n                         0,\n                         0.33615100383758545,\n                         -0.9041929841041565,\n                         0.37428000569343567,\n                         0.20579099655151367,\n                         -0.9786900281906128,\n                         0,\n                         0.20534199476242065,\n                         -0.9218789935112,\n                         0.38175201416015625,\n                         -0.06636899709701538,\n                         -0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         -0.6148040294647217,\n                         0.6148040294647217,\n                         0.4939970076084137,\n                         -0.6468020081520081,\n                         0.6468020081520081,\n                         0.40409600734710693,\n                         -0.6656550168991089,\n                         0.6656550168991089,\n                         0.3373520076274872,\n                         -0.6919230222702026,\n                         0.6919230222702026,\n                         0.20611999928951263,\n                         -0.7055429816246033,\n                         0.7055429816246033,\n                         -0.06647899746894836,\n                         -0.3325839936733246,\n                         0.803725004196167,\n                         0.4933690130710602,\n                         -0.34983500838279724,\n                         0.8454390168190002,\n                         0.40354499220848083,\n                         -0.36004701256752014,\n                         0.8699960112571716,\n                         0.33685800433158875,\n                         -0.37428000569343567,\n                         0.9041929841041565,\n                         0.20579099655151367,\n                         -0.38175201416015625,\n                         0.9218789935112,\n                         -0.06636899709701538,\n                         0,\n                         0.8703010082244873,\n                         0.4925200045108795,\n                         0,\n                         0.9153209924697876,\n                         0.4027250111103058,\n                         0,\n                         0.9418079853057861,\n                         0.33615100383758545,\n                         0,\n                         0.9786900281906128,\n                         0.20534199476242065,\n                         0,\n                         0.9978039860725403,\n                         -0.06623899936676025,\n                         0,\n                         0.8703010082244873,\n                         0.4925200045108795,\n                         0.3325839936733246,\n                         0.803725004196167,\n                         0.4933690130710602,\n                         0.34983500838279724,\n                         0.8454390168190002,\n                         0.40354499220848083,\n                         0,\n                         0.9153209924697876,\n                         0.4027250111103058,\n                         0.36004599928855896,\n                         0.8699960112571716,\n                         0.33685898780822754,\n                         0,\n                         0.9418079853057861,\n                         0.33615100383758545,\n                         0.37428000569343567,\n                         0.9041929841041565,\n                         0.20579099655151367,\n                         0,\n                         0.9786900281906128,\n                         0.20534199476242065,\n                         0.38175201416015625,\n                         0.9218789935112,\n                         -0.06636899709701538,\n                         0,\n                         0.9978039860725403,\n                         -0.06623899936676025,\n                         0.6148040294647217,\n                         0.6148040294647217,\n                         0.4939970076084137,\n                         0.6468020081520081,\n                         0.6468020081520081,\n                         0.40409600734710693,\n                         0.6656550168991089,\n                         0.6656550168991089,\n                         0.3373520076274872,\n                         0.6919230222702026,\n                         0.6919230222702026,\n                         0.20611999928951263,\n                         0.7055429816246033,\n                         0.7055429816246033,\n                         -0.06647899746894836,\n                         0.803725004196167,\n                         0.3325839936733246,\n                         0.4933690130710602,\n                         0.8454390168190002,\n                         0.34983500838279724,\n                         0.40354499220848083,\n                         0.8699960112571716,\n                         0.36004701256752014,\n                         0.33685800433158875,\n                         0.9041929841041565,\n                         0.37428000569343567,\n                         0.20579099655151367,\n                         0.9218789935112,\n                         0.38175201416015625,\n                         -0.06636899709701538,\n                         0.8703010082244873,\n                         0,\n                         0.4925200045108795,\n                         0.9153209924697876,\n                         0,\n                         0.4027250111103058,\n                         0.9418079853057861,\n                         0,\n                         0.33615100383758545,\n                         0.9786900281906128,\n                         0,\n                         0.20534199476242065,\n                         0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         0.9218789935112,\n                         -0.38175201416015625,\n                         -0.06636899709701538,\n                         0.8314369916915894,\n                         -0.3441790044307709,\n                         -0.4361799955368042,\n                         0.9001820087432861,\n                         0,\n                         -0.4355129897594452,\n                         0.6735119819641113,\n                         -0.2785939872264862,\n                         -0.6846650242805481,\n                         0.7296109795570374,\n                         0,\n                         -0.6838629841804504,\n                         0.6403989791870117,\n                         -0.26487401127815247,\n                         -0.7209240198135376,\n                         0.6939510107040405,\n                         0,\n                         -0.7200220227241516,\n                         0.7329490184783936,\n                         -0.303166002035141,\n                         -0.6089959740638733,\n                         0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         0.7055429816246033,\n                         -0.7055429816246033,\n                         -0.06647899746894836,\n                         0.6360920071601868,\n                         -0.6360920071601868,\n                         -0.4367780089378357,\n                         0.5149649977684021,\n                         -0.5149649977684021,\n                         -0.6852890253067017,\n                         0.48965099453926086,\n                         -0.48965099453926086,\n                         -0.7214459776878357,\n                         0.5605549812316895,\n                         -0.5605549812316895,\n                         -0.6095539927482605,\n                         0.38175201416015625,\n                         -0.9218789935112,\n                         -0.06636899709701538,\n                         0.3441790044307709,\n                         -0.8314369916915894,\n                         -0.4361799955368042,\n                         0.2785939872264862,\n                         -0.6735119819641113,\n                         -0.6846650242805481,\n                         0.26487401127815247,\n                         -0.6403989791870117,\n                         -0.7209240198135376,\n                         0.303166002035141,\n                         -0.7329490184783936,\n                         -0.6089959740638733,\n                         0,\n                         -0.9978039860725403,\n                         -0.06623899936676025,\n                         0,\n                         -0.9001820087432861,\n                         -0.4355129897594452,\n                         0,\n                         -0.7296109795570374,\n                         -0.6838629841804504,\n                         0,\n                         -0.6939510107040405,\n                         -0.7200220227241516,\n                         0,\n                         -0.7939500212669373,\n                         -0.6079840064048767,\n                         0,\n                         -0.9978039860725403,\n                         -0.06623899936676025,\n                         -0.38175201416015625,\n                         -0.9218789935112,\n                         -0.06636899709701538,\n                         -0.3441790044307709,\n                         -0.8314369916915894,\n                         -0.4361799955368042,\n                         0,\n                         -0.9001820087432861,\n                         -0.4355129897594452,\n                         -0.2785939872264862,\n                         -0.6735119819641113,\n                         -0.6846650242805481,\n                         0,\n                         -0.7296109795570374,\n                         -0.6838629841804504,\n                         -0.26487401127815247,\n                         -0.6403989791870117,\n                         -0.7209240198135376,\n                         0,\n                         -0.6939510107040405,\n                         -0.7200220227241516,\n                         -0.303166002035141,\n                         -0.7329490184783936,\n                         -0.6089959740638733,\n                         0,\n                         -0.7939500212669373,\n                         -0.6079840064048767,\n                         -0.7055429816246033,\n                         -0.7055429816246033,\n                         -0.06647899746894836,\n                         -0.6360920071601868,\n                         -0.6360920071601868,\n                         -0.4367780089378357,\n                         -0.5149649977684021,\n                         -0.5149649977684021,\n                         -0.6852890253067017,\n                         -0.48965099453926086,\n                         -0.48965099453926086,\n                         -0.7214459776878357,\n                         -0.5605549812316895,\n                         -0.5605549812316895,\n                         -0.6095539927482605,\n                         -0.9218789935112,\n                         -0.38175201416015625,\n                         -0.06636899709701538,\n                         -0.8314369916915894,\n                         -0.3441790044307709,\n                         -0.4361799955368042,\n                         -0.6735119819641113,\n                         -0.2785939872264862,\n                         -0.6846650242805481,\n                         -0.6403989791870117,\n                         -0.26487401127815247,\n                         -0.7209240198135376,\n                         -0.7329490184783936,\n                         -0.303166002035141,\n                         -0.6089959740638733,\n                         -0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         -0.9001820087432861,\n                         0,\n                         -0.4355129897594452,\n                         -0.7296109795570374,\n                         0,\n                         -0.6838629841804504,\n                         -0.6939510107040405,\n                         0,\n                         -0.7200220227241516,\n                         -0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         -0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         -0.9218789935112,\n                         0.38175201416015625,\n                         -0.06636899709701538,\n                         -0.8314369916915894,\n                         0.3441790044307709,\n                         -0.4361799955368042,\n                         -0.9001820087432861,\n                         0,\n                         -0.4355129897594452,\n                         -0.6735119819641113,\n                         0.2785939872264862,\n                         -0.6846650242805481,\n                         -0.7296109795570374,\n                         0,\n                         -0.6838629841804504,\n                         -0.6403989791870117,\n                         0.26487401127815247,\n                         -0.7209240198135376,\n                         -0.6939510107040405,\n                         0,\n                         -0.7200220227241516,\n                         -0.7329490184783936,\n                         0.303166002035141,\n                         -0.6089959740638733,\n                         -0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         -0.7055429816246033,\n                         0.7055429816246033,\n                         -0.06647899746894836,\n                         -0.6360920071601868,\n                         0.6360920071601868,\n                         -0.4367780089378357,\n                         -0.5149649977684021,\n                         0.5149649977684021,\n                         -0.6852890253067017,\n                         -0.48965099453926086,\n                         0.48965099453926086,\n                         -0.7214459776878357,\n                         -0.5605549812316895,\n                         0.5605549812316895,\n                         -0.6095539927482605,\n                         -0.38175201416015625,\n                         0.9218789935112,\n                         -0.06636899709701538,\n                         -0.3441790044307709,\n                         0.8314369916915894,\n                         -0.4361799955368042,\n                         -0.2785939872264862,\n                         0.6735119819641113,\n                         -0.6846650242805481,\n                         -0.26487401127815247,\n                         0.6403989791870117,\n                         -0.7209240198135376,\n                         -0.303166002035141,\n                         0.7329490184783936,\n                         -0.6089959740638733,\n                         0,\n                         0.9978039860725403,\n                         -0.06623899936676025,\n                         0,\n                         0.9001820087432861,\n                         -0.4355129897594452,\n                         0,\n                         0.7296109795570374,\n                         -0.6838629841804504,\n                         0,\n                         0.6939510107040405,\n                         -0.7200220227241516,\n                         0,\n                         0.7939500212669373,\n                         -0.6079840064048767,\n                         0,\n                         0.9978039860725403,\n                         -0.06623899936676025,\n                         0.38175201416015625,\n                         0.9218789935112,\n                         -0.06636899709701538,\n                         0.3441790044307709,\n                         0.8314369916915894,\n                         -0.4361799955368042,\n                         0,\n                         0.9001820087432861,\n                         -0.4355129897594452,\n                         0.2785939872264862,\n                         0.6735119819641113,\n                         -0.6846650242805481,\n                         0,\n                         0.7296109795570374,\n                         -0.6838629841804504,\n                         0.26487401127815247,\n                         0.6403989791870117,\n                         -0.7209240198135376,\n                         0,\n                         0.6939510107040405,\n                         -0.7200220227241516,\n                         0.303166002035141,\n                         0.7329490184783936,\n                         -0.6089959740638733,\n                         0,\n                         0.7939500212669373,\n                         -0.6079840064048767,\n                         0.7055429816246033,\n                         0.7055429816246033,\n                         -0.06647899746894836,\n                         0.6360920071601868,\n                         0.6360920071601868,\n                         -0.4367780089378357,\n                         0.5149649977684021,\n                         0.5149649977684021,\n                         -0.6852890253067017,\n                         0.48965099453926086,\n                         0.48965099453926086,\n                         -0.7214459776878357,\n                         0.5605549812316895,\n                         0.5605549812316895,\n                         -0.6095539927482605,\n                         0.9218789935112,\n                         0.38175201416015625,\n                         -0.06636899709701538,\n                         0.8314369916915894,\n                         0.3441790044307709,\n                         -0.4361799955368042,\n                         0.6735119819641113,\n                         0.2785939872264862,\n                         -0.6846650242805481,\n                         0.6403989791870117,\n                         0.26487401127815247,\n                         -0.7209240198135376,\n                         0.7329490184783936,\n                         0.303166002035141,\n                         -0.6089959740638733,\n                         0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         0.9001820087432861,\n                         0,\n                         -0.4355129897594452,\n                         0.7296109795570374,\n                         0,\n                         -0.6838629841804504,\n                         0.6939510107040405,\n                         0,\n                         -0.7200220227241516,\n                         0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         0.7329490184783936,\n                         -0.303166002035141,\n                         -0.6089959740638733,\n                         0.576229989528656,\n                         -0.23821599781513214,\n                         -0.7818009853363037,\n                         0.6238600015640259,\n                         0,\n                         -0.7815359830856323,\n                         0.16362899541854858,\n                         -0.06752700358629227,\n                         -0.9842079877853394,\n                         0.17729100584983826,\n                         0,\n                         -0.984158992767334,\n                         0.04542100057005882,\n                         -0.018735000863671303,\n                         -0.9987919926643372,\n                         0.04920699819922447,\n                         0,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         0,\n                         -1,\n                         0.5605549812316895,\n                         -0.5605549812316895,\n                         -0.6095539927482605,\n                         0.44041600823402405,\n                         -0.44041600823402405,\n                         -0.7823479771614075,\n                         0.12490200251340866,\n                         -0.12490200251340866,\n                         -0.9842759966850281,\n                         0.034662000834941864,\n                         -0.034662000834941864,\n                         -0.9987980127334595,\n                         0,\n                         0,\n                         -1,\n                         0.303166002035141,\n                         -0.7329490184783936,\n                         -0.6089959740638733,\n                         0.23821599781513214,\n                         -0.576229989528656,\n                         -0.7818009853363037,\n                         0.06752700358629227,\n                         -0.16362899541854858,\n                         -0.9842079877853394,\n                         0.018735000863671303,\n                         -0.04542100057005882,\n                         -0.9987919926643372,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         -0.7939500212669373,\n                         -0.6079840064048767,\n                         0,\n                         -0.6238600015640259,\n                         -0.7815359830856323,\n                         0,\n                         -0.17729100584983826,\n                         -0.984158992767334,\n                         0,\n                         -0.04920699819922447,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         -0.7939500212669373,\n                         -0.6079840064048767,\n                         -0.303166002035141,\n                         -0.7329490184783936,\n                         -0.6089959740638733,\n                         -0.23821599781513214,\n                         -0.576229989528656,\n                         -0.7818009853363037,\n                         0,\n                         -0.6238600015640259,\n                         -0.7815359830856323,\n                         -0.06752700358629227,\n                         -0.16362899541854858,\n                         -0.9842079877853394,\n                         0,\n                         -0.17729100584983826,\n                         -0.984158992767334,\n                         -0.018735000863671303,\n                         -0.04542100057005882,\n                         -0.9987919926643372,\n                         0,\n                         -0.04920699819922447,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         0,\n                         -1,\n                         -0.5605549812316895,\n                         -0.5605549812316895,\n                         -0.6095539927482605,\n                         -0.44041600823402405,\n                         -0.44041600823402405,\n                         -0.7823479771614075,\n                         -0.12490200251340866,\n                         -0.12490200251340866,\n                         -0.9842759966850281,\n                         -0.034662000834941864,\n                         -0.034662000834941864,\n                         -0.9987980127334595,\n                         0,\n                         0,\n                         -1,\n                         -0.7329490184783936,\n                         -0.303166002035141,\n                         -0.6089959740638733,\n                         -0.576229989528656,\n                         -0.23821599781513214,\n                         -0.7818009853363037,\n                         -0.16362899541854858,\n                         -0.06752700358629227,\n                         -0.9842079877853394,\n                         -0.04542100057005882,\n                         -0.018735000863671303,\n                         -0.9987919926643372,\n                         0,\n                         0,\n                         -1,\n                         -0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         -0.6238600015640259,\n                         0,\n                         -0.7815359830856323,\n                         -0.17729100584983826,\n                         0,\n                         -0.984158992767334,\n                         -0.04920699819922447,\n                         0,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         -0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         -0.7329490184783936,\n                         0.303166002035141,\n                         -0.6089959740638733,\n                         -0.576229989528656,\n                         0.23821599781513214,\n                         -0.7818009853363037,\n                         -0.6238600015640259,\n                         0,\n                         -0.7815359830856323,\n                         -0.16362899541854858,\n                         0.06752700358629227,\n                         -0.9842079877853394,\n                         -0.17729100584983826,\n                         0,\n                         -0.984158992767334,\n                         -0.04542100057005882,\n                         0.018735000863671303,\n                         -0.9987919926643372,\n                         -0.04920699819922447,\n                         0,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         0,\n                         -1,\n                         -0.5605549812316895,\n                         0.5605549812316895,\n                         -0.6095539927482605,\n                         -0.44041600823402405,\n                         0.44041600823402405,\n                         -0.7823479771614075,\n                         -0.12490200251340866,\n                         0.12490200251340866,\n                         -0.9842759966850281,\n                         -0.034662000834941864,\n                         0.034662000834941864,\n                         -0.9987980127334595,\n                         0,\n                         0,\n                         -1,\n                         -0.303166002035141,\n                         0.7329490184783936,\n                         -0.6089959740638733,\n                         -0.23821599781513214,\n                         0.576229989528656,\n                         -0.7818009853363037,\n                         -0.06752700358629227,\n                         0.16362899541854858,\n                         -0.9842079877853394,\n                         -0.018735000863671303,\n                         0.04542100057005882,\n                         -0.9987919926643372,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         0.7939500212669373,\n                         -0.6079840064048767,\n                         0,\n                         0.6238600015640259,\n                         -0.7815359830856323,\n                         0,\n                         0.17729100584983826,\n                         -0.984158992767334,\n                         0,\n                         0.04920699819922447,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         0.7939500212669373,\n                         -0.6079840064048767,\n                         0.303166002035141,\n                         0.7329490184783936,\n                         -0.6089959740638733,\n                         0.23821599781513214,\n                         0.576229989528656,\n                         -0.7818009853363037,\n                         0,\n                         0.6238600015640259,\n                         -0.7815359830856323,\n                         0.06752700358629227,\n                         0.16362899541854858,\n                         -0.9842079877853394,\n                         0,\n                         0.17729100584983826,\n                         -0.984158992767334,\n                         0.018735000863671303,\n                         0.04542100057005882,\n                         -0.9987919926643372,\n                         0,\n                         0.04920699819922447,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         0,\n                         -1,\n                         0.5605549812316895,\n                         0.5605549812316895,\n                         -0.6095539927482605,\n                         0.44041600823402405,\n                         0.44041600823402405,\n                         -0.7823479771614075,\n                         0.12490200251340866,\n                         0.12490200251340866,\n                         -0.9842759966850281,\n                         0.034662000834941864,\n                         0.034662000834941864,\n                         -0.9987980127334595,\n                         0,\n                         0,\n                         -1,\n                         0.7329490184783936,\n                         0.303166002035141,\n                         -0.6089959740638733,\n                         0.576229989528656,\n                         0.23821599781513214,\n                         -0.7818009853363037,\n                         0.16362899541854858,\n                         0.06752700358629227,\n                         -0.9842079877853394,\n                         0.04542100057005882,\n                         0.018735000863671303,\n                         -0.9987919926643372,\n                         0,\n                         0,\n                         -1,\n                         0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         0.6238600015640259,\n                         0,\n                         -0.7815359830856323,\n                         0.17729100584983826,\n                         0,\n                         -0.984158992767334,\n                         0.04920699819922447,\n                         0,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0.007784999907016754,\n                         0.00021499999274965376,\n                         -0.999970018863678,\n                         0.007038000039756298,\n                         -0.5829259753227234,\n                         -0.8124949932098389,\n                         0.0361270010471344,\n                         -0.5456140041351318,\n                         -0.837257981300354,\n                         0.03913800045847893,\n                         0.0009879999561235309,\n                         -0.9992330074310303,\n                         0.16184599697589874,\n                         -0.5630490183830261,\n                         -0.8104209899902344,\n                         0.17951199412345886,\n                         0.0043680001981556416,\n                         -0.9837459921836853,\n                         0.4823650121688843,\n                         -0.6427459716796875,\n                         -0.5951480269432068,\n                         0.6122999787330627,\n                         0.010459000244736671,\n                         -0.790556013584137,\n                         0.7387199997901917,\n                         -0.6641989946365356,\n                         -0.11459299921989441,\n                         0.9861519932746887,\n                         0.006668999791145325,\n                         -0.16570700705051422,\n                         -0.0019079999765381217,\n                         -0.9867690205574036,\n                         0.1621209979057312,\n                         0.002761000068858266,\n                         -0.9998499751091003,\n                         0.017105000093579292,\n                         0.010532000102102757,\n                         -0.9972469806671143,\n                         0.07339800149202347,\n                         -0.06604000180959702,\n                         -0.9893029928207397,\n                         0.13006900250911713,\n                         -0.09442699700593948,\n                         -0.9953929781913757,\n                         0.016594000160694122,\n                         -0.009201999753713608,\n                         -0.4902929961681366,\n                         0.8715090155601501,\n                         -0.04860600084066391,\n                         -0.5394579768180847,\n                         0.8406090140342712,\n                         -0.22329799830913544,\n                         -0.5527390241622925,\n                         0.8028810024261475,\n                         -0.5963649749755859,\n                         -0.5751349925994873,\n                         0.5599709749221802,\n                         -0.8033369779586792,\n                         -0.5916029810905457,\n                         0.06823500245809555,\n                         -0.01056000031530857,\n                         -0.00010299999848939478,\n                         0.9999439716339111,\n                         -0.05879800021648407,\n                         -0.0007089999853633344,\n                         0.9982699751853943,\n                         -0.28071001172065735,\n                         -0.0032679999712854624,\n                         0.9597870111465454,\n                         -0.7497230172157288,\n                         -0.004267000127583742,\n                         0.6617379784584045,\n                         -0.9973509907722473,\n                         -0.0020580000709742308,\n                         0.07271400094032288,\n                         -0.01056000031530857,\n                         -0.00010299999848939478,\n                         0.9999439716339111,\n                         -0.008791999891400337,\n                         0.49032899737358093,\n                         0.8714929819107056,\n                         -0.04649300128221512,\n                         0.5387560129165649,\n                         0.8411779999732971,\n                         -0.05879800021648407,\n                         -0.0007089999853633344,\n                         0.9982699751853943,\n                         -0.21790899336338043,\n                         0.5491610169410706,\n                         0.8068069815635681,\n                         -0.28071001172065735,\n                         -0.0032679999712854624,\n                         0.9597870111465454,\n                         -0.5972909927368164,\n                         0.5741199851036072,\n                         0.560027003288269,\n                         -0.7497230172157288,\n                         -0.004267000127583742,\n                         0.6617379784584045,\n                         -0.8040000200271606,\n                         0.5912910103797913,\n                         0.0629120022058487,\n                         -0.9973509907722473,\n                         -0.0020580000709742308,\n                         0.07271400094032288,\n                         -0.0018050000071525574,\n                         0.986840009689331,\n                         0.16169099509716034,\n                         0.0020310000982135534,\n                         0.999891996383667,\n                         0.014553000219166279,\n                         0.009215000085532665,\n                         0.9981520175933838,\n                         0.060068998485803604,\n                         -0.059335000813007355,\n                         0.9917230010032654,\n                         0.11386600136756897,\n                         -0.08690100163221359,\n                         0.9961410164833069,\n                         0.01228999998420477,\n                         0.006417000200599432,\n                         0.5830950140953064,\n                         -0.812379002571106,\n                         0.03378299996256828,\n                         0.5453730225563049,\n                         -0.8375130295753479,\n                         0.1571130007505417,\n                         0.562188982963562,\n                         -0.8119469881057739,\n                         0.4844059944152832,\n                         0.6465290188789368,\n                         -0.5893650054931641,\n                         0.7388700246810913,\n                         0.6661880016326904,\n                         -0.10131999850273132,\n                         0.007784999907016754,\n                         0.00021499999274965376,\n                         -0.999970018863678,\n                         0.03913800045847893,\n                         0.0009879999561235309,\n                         -0.9992330074310303,\n                         0.17951199412345886,\n                         0.0043680001981556416,\n                         -0.9837459921836853,\n                         0.6122999787330627,\n                         0.010459000244736671,\n                         -0.790556013584137,\n                         0.9861519932746887,\n                         0.006668999791145325,\n                         -0.16570700705051422,\n                         0.9861519932746887,\n                         0.006668999791145325,\n                         -0.16570700705051422,\n                         0.7387199997901917,\n                         -0.6641989946365356,\n                         -0.11459299921989441,\n                         0.7256090044975281,\n                         -0.6373609900474548,\n                         0.25935098528862,\n                         0.94651198387146,\n                         0.0033569999504834414,\n                         0.3226499855518341,\n                         0.6459450125694275,\n                         -0.6077200174331665,\n                         0.46198800206184387,\n                         0.8258299827575684,\n                         0.007451999932527542,\n                         0.5638700127601624,\n                         0.5316150188446045,\n                         -0.5586140155792236,\n                         0.6366599798202515,\n                         0.6500110030174255,\n                         0.006936000194400549,\n                         0.759893000125885,\n                         0.4249640107154846,\n                         -0.5955389738082886,\n                         0.6817179918289185,\n                         0.5324289798736572,\n                         0.005243999883532524,\n                         0.8464580178260803,\n                         -0.09442699700593948,\n                         -0.9953929781913757,\n                         0.016594000160694122,\n                         -0.04956100136041641,\n                         -0.9985759854316711,\n                         -0.01975500024855137,\n                         -0.03781700134277344,\n                         -0.998649001121521,\n                         -0.035624999552965164,\n                         -0.0379129983484745,\n                         -0.9986140131950378,\n                         -0.03651199862360954,\n                         -0.1688539981842041,\n                         -0.9395300149917603,\n                         -0.2979460060596466,\n                         -0.8033369779586792,\n                         -0.5916029810905457,\n                         0.06823500245809555,\n                         -0.7423409819602966,\n                         -0.5995240211486816,\n                         -0.2991659939289093,\n                         -0.6196020245552063,\n                         -0.5795029997825623,\n                         -0.5294060111045837,\n                         -0.483707994222641,\n                         -0.5438370108604431,\n                         -0.6857600212097168,\n                         -0.44529199600219727,\n                         -0.4131770133972168,\n                         -0.7943549752235413,\n                         -0.9973509907722473,\n                         -0.0020580000709742308,\n                         0.07271400094032288,\n                         -0.9265130162239075,\n                         -0.0019950000569224358,\n                         -0.3762570023536682,\n                         -0.7539200186729431,\n                         -0.004317000042647123,\n                         -0.6569520235061646,\n                         -0.5662239789962769,\n                         -0.003461000043898821,\n                         -0.8242440223693848,\n                         -0.4818040132522583,\n                         -0.0018500000005587935,\n                         -0.8762770295143127,\n                         -0.9973509907722473,\n                         -0.0020580000709742308,\n                         0.07271400094032288,\n                         -0.8040000200271606,\n                         0.5912910103797913,\n                         0.0629120022058487,\n                         -0.7446749806404114,\n                         0.5989770293235779,\n                         -0.29442399740219116,\n                         -0.9265130162239075,\n                         -0.0019950000569224358,\n                         -0.3762570023536682,\n                         -0.6219490170478821,\n                         0.5781649947166443,\n                         -0.5281140208244324,\n                         -0.7539200186729431,\n                         -0.004317000042647123,\n                         -0.6569520235061646,\n                         -0.48117101192474365,\n                         0.5428280234336853,\n                         -0.6883400082588196,\n                         -0.5662239789962769,\n                         -0.003461000043898821,\n                         -0.8242440223693848,\n                         -0.43805500864982605,\n                         0.41574400663375854,\n                         -0.7970349788665771,\n                         -0.4818040132522583,\n                         -0.0018500000005587935,\n                         -0.8762770295143127,\n                         -0.08690100163221359,\n                         0.9961410164833069,\n                         0.01228999998420477,\n                         -0.04433799907565117,\n                         0.9988710284233093,\n                         -0.017055999487638474,\n                         -0.026177000254392624,\n                         0.9992600083351135,\n                         -0.02816700004041195,\n                         -0.025293000042438507,\n                         0.9992780089378357,\n                         -0.028332000598311424,\n                         -0.15748199820518494,\n                         0.9441670179367065,\n                         -0.28939300775527954,\n                         0.7388700246810913,\n                         0.6661880016326904,\n                         -0.10131999850273132,\n                         0.7282440066337585,\n                         0.63714200258255,\n                         0.25240999460220337,\n                         0.6470540165901184,\n                         0.6082550287246704,\n                         0.4597249925136566,\n                         0.5229939818382263,\n                         0.5621700286865234,\n                         0.6406570076942444,\n                         0.4099780023097992,\n                         0.6046689748764038,\n                         0.6828569769859314,\n                         0.9861519932746887,\n                         0.006668999791145325,\n                         -0.16570700705051422,\n                         0.94651198387146,\n                         0.0033569999504834414,\n                         0.3226499855518341,\n                         0.8258299827575684,\n                         0.007451999932527542,\n                         0.5638700127601624,\n                         0.6500110030174255,\n                         0.006936000194400549,\n                         0.759893000125885,\n                         0.5324289798736572,\n                         0.005243999883532524,\n                         0.8464580178260803,\n                         -0.230786994099617,\n                         0.006523000076413155,\n                         0.9729819893836975,\n                         -0.15287800133228302,\n                         -0.7101899981498718,\n                         0.6872109770774841,\n                         -0.31672099232673645,\n                         -0.7021129727363586,\n                         0.6377500295639038,\n                         -0.5489360094070435,\n                         0.0015109999803826213,\n                         0.8358629941940308,\n                         -0.6010670065879822,\n                         -0.645330011844635,\n                         0.471451997756958,\n                         -0.8756710290908813,\n                         -0.009891999885439873,\n                         0.4828070104122162,\n                         -0.635890007019043,\n                         -0.629800021648407,\n                         0.4460900127887726,\n                         -0.8775539994239807,\n                         -0.01909100078046322,\n                         0.47909700870513916,\n                         -0.4357450008392334,\n                         -0.670009970664978,\n                         0.6010090112686157,\n                         -0.6961889863014221,\n                         -0.02449600026011467,\n                         0.7174400091171265,\n                         0.11111299693584442,\n                         -0.9901599884033203,\n                         -0.08506900072097778,\n                         0.22330999374389648,\n                         -0.9747260212898254,\n                         0.006539999973028898,\n                         0.19009700417518616,\n                         -0.9694579839706421,\n                         0.15496399998664856,\n                         0.005270000081509352,\n                         -0.9818699955940247,\n                         0.18948200345039368,\n                         -0.011750999838113785,\n                         -0.9690240025520325,\n                         0.24668699502944946,\n                         0.3439059853553772,\n                         -0.5994120240211487,\n                         -0.7227950096130371,\n                         0.5724899768829346,\n                         -0.5916270017623901,\n                         -0.5676559805870056,\n                         0.7874360084533691,\n                         -0.5605109930038452,\n                         -0.2564600110054016,\n                         0.6470969915390015,\n                         -0.6981409788131714,\n                         -0.3063740134239197,\n                         0.4275279939174652,\n                         -0.7535750269889832,\n                         -0.49934399127960205,\n                         0.4109260141849518,\n                         -0.0012839999981224537,\n                         -0.9116680026054382,\n                         0.6715199947357178,\n                         0.0008989999769255519,\n                         -0.7409859895706177,\n                         0.9220259785652161,\n                         0.00725199980661273,\n                         -0.3870599865913391,\n                         0.8469099998474121,\n                         0.01385399978607893,\n                         -0.5315560102462769,\n                         0.5359240174293518,\n                         0.010503999888896942,\n                         -0.8442010283470154,\n                         0.4109260141849518,\n                         -0.0012839999981224537,\n                         -0.9116680026054382,\n                         0.3411880135536194,\n                         0.6009309887886047,\n                         -0.7228230237960815,\n                         0.5786640048027039,\n                         0.591838002204895,\n                         -0.5611389875411987,\n                         0.6715199947357178,\n                         0.0008989999769255519,\n                         -0.7409859895706177,\n                         0.7848690152168274,\n                         0.5665420293807983,\n                         -0.25102001428604126,\n                         0.9220259785652161,\n                         0.00725199980661273,\n                         -0.3870599865913391,\n                         0.6426810026168823,\n                         0.7039899826049805,\n                         -0.3022570013999939,\n                         0.8469099998474121,\n                         0.01385399978607893,\n                         -0.5315560102462769,\n                         0.4185889959335327,\n                         0.7581170201301575,\n                         -0.5000420212745667,\n                         0.5359240174293518,\n                         0.010503999888896942,\n                         -0.8442010283470154,\n                         0.11580599844455719,\n                         0.9901139736175537,\n                         -0.07913900166749954,\n                         0.23281100392341614,\n                         0.9724410176277161,\n                         0.012564999982714653,\n                         0.20666299760341644,\n                         0.9662799835205078,\n                         0.15360000729560852,\n                         0.02449899911880493,\n                         0.9865779876708984,\n                         0.16144299507141113,\n                         0.0033809999004006386,\n                         0.9774550199508667,\n                         0.2111150026321411,\n                         -0.13491199910640717,\n                         0.7135509848594666,\n                         0.6874909996986389,\n                         -0.31953999400138855,\n                         0.7050619721412659,\n                         0.6330729722976685,\n                         -0.6039019823074341,\n                         0.6499029994010925,\n                         0.4614419937133789,\n                         -0.6318150162696838,\n                         0.6400719881057739,\n                         0.43716898560523987,\n                         -0.4243049919605255,\n                         0.6667500138282776,\n                         0.6127070188522339,\n                         -0.230786994099617,\n                         0.006523000076413155,\n                         0.9729819893836975,\n                         -0.5489360094070435,\n                         0.0015109999803826213,\n                         0.8358629941940308,\n                         -0.8756710290908813,\n                         -0.009891999885439873,\n                         0.4828070104122162,\n                         -0.8775539994239807,\n                         -0.01909100078046322,\n                         0.47909700870513916,\n                         -0.6961889863014221,\n                         -0.02449600026011467,\n                         0.7174400091171265,\n                         -0.6961889863014221,\n                         -0.02449600026011467,\n                         0.7174400091171265,\n                         -0.4357450008392334,\n                         -0.670009970664978,\n                         0.6010090112686157,\n                         -0.25985801219940186,\n                         -0.5525479912757874,\n                         0.7919380068778992,\n                         -0.42579901218414307,\n                         -0.010804999619722366,\n                         0.9047530293464661,\n                         0.009537000209093094,\n                         0.021669000387191772,\n                         0.9997199773788452,\n                         0.022041000425815582,\n                         -0.001623000018298626,\n                         0.9997559785842896,\n                         0.4101540148258209,\n                         0.8490809798240662,\n                         0.3329179883003235,\n                         0.9995980262756348,\n                         -0.01155600044876337,\n                         0.02587899938225746,\n                         0.5415220260620117,\n                         0.6370009779930115,\n                         -0.5486199855804443,\n                         0.7095860242843628,\n                         -0.009670999832451344,\n                         -0.7045519948005676,\n                         -0.011750999838113785,\n                         -0.9690240025520325,\n                         0.24668699502944946,\n                         0.046310000121593475,\n                         -0.8891720175743103,\n                         0.45522499084472656,\n                         -0.010688000358641148,\n                         -0.14889900386333466,\n                         0.9887949824333191,\n                         -0.04437499865889549,\n                         0.7291200160980225,\n                         0.6829460263252258,\n                         0.12282499670982361,\n                         0.9923850297927856,\n                         0.009232000447809696,\n                         0.4275279939174652,\n                         -0.7535750269889832,\n                         -0.49934399127960205,\n                         0.48183900117874146,\n                         -0.857479989528656,\n                         -0.18044300377368927,\n                         0.45527198910713196,\n                         -0.49992498755455017,\n                         0.7367510199546814,\n                         -0.22054199874401093,\n                         0.3582780063152313,\n                         0.9071930050849915,\n                         -0.23591899871826172,\n                         0.7157959938049316,\n                         0.6572499871253967,\n                         0.5359240174293518,\n                         0.010503999888896942,\n                         -0.8442010283470154,\n                         0.7280910015106201,\n                         0.015584999695420265,\n                         -0.6853029727935791,\n                         0.8887389898300171,\n                         0.016679000109434128,\n                         0.4581089913845062,\n                         -0.26009801030158997,\n                         -0.0007999999797903001,\n                         0.965582013130188,\n                         -0.37161099910736084,\n                         0.004416999872773886,\n                         0.9283779859542847,\n                         0.5359240174293518,\n                         0.010503999888896942,\n                         -0.8442010283470154,\n                         0.4185889959335327,\n                         0.7581170201301575,\n                         -0.5000420212745667,\n                         0.4801650047302246,\n                         0.8588529825210571,\n                         -0.17836299538612366,\n                         0.7280910015106201,\n                         0.015584999695420265,\n                         -0.6853029727935791,\n                         0.4881030023097992,\n                         0.49794700741767883,\n                         0.7168020009994507,\n                         0.8887389898300171,\n                         0.016679000109434128,\n                         0.4581089913845062,\n                         -0.2220049947500229,\n                         -0.36189401149749756,\n                         0.9053990244865417,\n                         -0.26009801030158997,\n                         -0.0007999999797903001,\n                         0.965582013130188,\n                         -0.23540399968624115,\n                         -0.7104769945144653,\n                         0.6631799936294556,\n                         -0.37161099910736084,\n                         0.004416999872773886,\n                         0.9283779859542847,\n                         0.0033809999004006386,\n                         0.9774550199508667,\n                         0.2111150026321411,\n                         0.058719001710414886,\n                         0.8971999883651733,\n                         0.437703013420105,\n                         0.0013249999610707164,\n                         0.164000004529953,\n                         0.9864590167999268,\n                         -0.04418899863958359,\n                         -0.7303190231323242,\n                         0.6816750168800354,\n                         0.13880200684070587,\n                         -0.9897300004959106,\n                         -0.034189000725746155,\n                         -0.4243049919605255,\n                         0.6667500138282776,\n                         0.6127070188522339,\n                         -0.25888898968696594,\n                         0.5453789830207825,\n                         0.7972059845924377,\n                         0.012268000282347202,\n                         -0.01928500086069107,\n                         0.9997389912605286,\n                         0.3986299932003021,\n                         -0.8456630110740662,\n                         0.3548929989337921,\n                         0.5375639796257019,\n                         -0.6107370257377625,\n                         -0.5813990235328674,\n                         -0.6961889863014221,\n                         -0.02449600026011467,\n                         0.7174400091171265,\n                         -0.42579901218414307,\n                         -0.010804999619722366,\n                         0.9047530293464661,\n                         0.022041000425815582,\n                         -0.001623000018298626,\n                         0.9997559785842896,\n                         0.9995980262756348,\n                         -0.01155600044876337,\n                         0.02587899938225746,\n                         0.7095860242843628,\n                         -0.009670999832451344,\n                         -0.7045519948005676,\n                         0,\n                         0,\n                         1,\n                         0,\n                         0,\n                         1,\n                         0.7626410126686096,\n                         -0.31482499837875366,\n                         0.5650339722633362,\n                         0.8245400190353394,\n                         -0.00001700000029813964,\n                         0.5658029913902283,\n                         0.8479819893836975,\n                         -0.3500339984893799,\n                         -0.39799800515174866,\n                         0.917701005935669,\n                         -0.00003300000025774352,\n                         -0.397271990776062,\n                         0.8641409873962402,\n                         -0.35644200444221497,\n                         -0.3552600145339966,\n                         0.9352689981460571,\n                         -0.00011200000153621659,\n                         -0.3539389967918396,\n                         0.7209920287132263,\n                         -0.29793301224708557,\n                         0.6256250143051147,\n                         0.7807120084762573,\n                         -0.00007500000356230885,\n                         0.6248909831047058,\n                         0,\n                         0,\n                         1,\n                         0.5833569765090942,\n                         -0.5833380222320557,\n                         0.5651649832725525,\n                         0.648485004901886,\n                         -0.6484479904174805,\n                         -0.3987259864807129,\n                         0.6608719825744629,\n                         -0.6607480049133301,\n                         -0.35589399933815,\n                         0.5518630146980286,\n                         -0.5517799854278564,\n                         0.6252880096435547,\n                         0,\n                         0,\n                         1,\n                         0.31482499837875366,\n                         -0.762628972530365,\n                         0.5650510191917419,\n                         0.35004499554634094,\n                         -0.8479880094528198,\n                         -0.39797601103782654,\n                         0.35647401213645935,\n                         -0.8641520142555237,\n                         -0.35519900918006897,\n                         0.29798200726509094,\n                         -0.7210670113563538,\n                         0.6255149841308594,\n                         0,\n                         0,\n                         1,\n                         -0.00001700000029813964,\n                         -0.8245400190353394,\n                         0.5658029913902283,\n                         -0.00003300000025774352,\n                         -0.917701005935669,\n                         -0.397271990776062,\n                         -0.00011200000153621659,\n                         -0.9352689981460571,\n                         -0.3539389967918396,\n                         -0.00007500000356230885,\n                         -0.7807120084762573,\n                         0.6248900294303894,\n                         0,\n                         0,\n                         1,\n                         0,\n                         0,\n                         1,\n                         -0.31482499837875366,\n                         -0.7626410126686096,\n                         0.5650339722633362,\n                         -0.00001700000029813964,\n                         -0.8245400190353394,\n                         0.5658029913902283,\n                         -0.3500339984893799,\n                         -0.8479819893836975,\n                         -0.39799800515174866,\n                         -0.00003300000025774352,\n                         -0.917701005935669,\n                         -0.397271990776062,\n                         -0.35644200444221497,\n                         -0.8641409873962402,\n                         -0.3552600145339966,\n                         -0.00011200000153621659,\n                         -0.9352689981460571,\n                         -0.3539389967918396,\n                         -0.29793301224708557,\n                         -0.7209920287132263,\n                         0.6256250143051147,\n                         -0.00007500000356230885,\n                         -0.7807120084762573,\n                         0.6248900294303894,\n                         0,\n                         0,\n                         1,\n                         -0.5833380222320557,\n                         -0.5833569765090942,\n                         0.5651649832725525,\n                         -0.6484479904174805,\n                         -0.648485004901886,\n                         -0.3987259864807129,\n                         -0.6607480049133301,\n                         -0.6608719825744629,\n                         -0.35589399933815,\n                         -0.5517799854278564,\n                         -0.5518630146980286,\n                         0.6252880096435547,\n                         0,\n                         0,\n                         1,\n                         -0.762628972530365,\n                         -0.31482499837875366,\n                         0.5650510191917419,\n                         -0.8479880094528198,\n                         -0.35004499554634094,\n                         -0.39797601103782654,\n                         -0.8641520142555237,\n                         -0.35647401213645935,\n                         -0.35519900918006897,\n                         -0.7210670113563538,\n                         -0.29798200726509094,\n                         0.6255149841308594,\n                         0,\n                         0,\n                         1,\n                         -0.8245400190353394,\n                         0.00001700000029813964,\n                         0.5658029913902283,\n                         -0.917701005935669,\n                         0.00003300000025774352,\n                         -0.397271990776062,\n                         -0.9352689981460571,\n                         0.00011200000153621659,\n                         -0.3539389967918396,\n                         -0.7807120084762573,\n                         0.00007500000356230885,\n                         0.6248900294303894,\n                         0,\n                         0,\n                         1,\n                         0,\n                         0,\n                         1,\n                         -0.7626410126686096,\n                         0.31482499837875366,\n                         0.5650339722633362,\n                         -0.8245400190353394,\n                         0.00001700000029813964,\n                         0.5658029913902283,\n                         -0.8479819893836975,\n                         0.3500339984893799,\n                         -0.39799800515174866,\n                         -0.917701005935669,\n                         0.00003300000025774352,\n                         -0.397271990776062,\n                         -0.8641409873962402,\n                         0.35644200444221497,\n                         -0.3552600145339966,\n                         -0.9352689981460571,\n                         0.00011200000153621659,\n                         -0.3539389967918396,\n                         -0.7209920287132263,\n                         0.29793301224708557,\n                         0.6256250143051147,\n                         -0.7807120084762573,\n                         0.00007500000356230885,\n                         0.6248900294303894,\n                         0,\n                         0,\n                         1,\n                         -0.5833569765090942,\n                         0.5833380222320557,\n                         0.5651649832725525,\n                         -0.648485004901886,\n                         0.6484479904174805,\n                         -0.3987259864807129,\n                         -0.6608719825744629,\n                         0.6607480049133301,\n                         -0.35589399933815,\n                         -0.5518630146980286,\n                         0.5517799854278564,\n                         0.6252880096435547,\n                         0,\n                         0,\n                         1,\n                         -0.31482499837875366,\n                         0.762628972530365,\n                         0.5650510191917419,\n                         -0.35004499554634094,\n                         0.8479880094528198,\n                         -0.39797601103782654,\n                         -0.35647401213645935,\n                         0.8641520142555237,\n                         -0.35519900918006897,\n                         -0.29798200726509094,\n                         0.7210670113563538,\n                         0.6255149841308594,\n                         0,\n                         0,\n                         1,\n                         0.00001700000029813964,\n                         0.8245400190353394,\n                         0.5658029913902283,\n                         0.00003300000025774352,\n                         0.917701005935669,\n                         -0.397271990776062,\n                         0.00011200000153621659,\n                         0.9352689981460571,\n                         -0.3539389967918396,\n                         0.00007500000356230885,\n                         0.7807120084762573,\n                         0.6248900294303894,\n                         0,\n                         0,\n                         1,\n                         0,\n                         0,\n                         1,\n                         0.31482499837875366,\n                         0.7626410126686096,\n                         0.5650339722633362,\n                         0.00001700000029813964,\n                         0.8245400190353394,\n                         0.5658029913902283,\n                         0.3500339984893799,\n                         0.8479819893836975,\n                         -0.39799800515174866,\n                         0.00003300000025774352,\n                         0.917701005935669,\n                         -0.397271990776062,\n                         0.35644200444221497,\n                         0.8641409873962402,\n                         -0.3552600145339966,\n                         0.00011200000153621659,\n                         0.9352689981460571,\n                         -0.3539389967918396,\n                         0.29793301224708557,\n                         0.7209920287132263,\n                         0.6256250143051147,\n                         0.00007500000356230885,\n                         0.7807120084762573,\n                         0.6248900294303894,\n                         0,\n                         0,\n                         1,\n                         0.5833380222320557,\n                         0.5833569765090942,\n                         0.5651649832725525,\n                         0.6484479904174805,\n                         0.648485004901886,\n                         -0.3987259864807129,\n                         0.6607480049133301,\n                         0.6608719825744629,\n                         -0.35589399933815,\n                         0.5517799854278564,\n                         0.5518630146980286,\n                         0.6252880096435547,\n                         0,\n                         0,\n                         1,\n                         0.762628972530365,\n                         0.31482499837875366,\n                         0.5650510191917419,\n                         0.8479880094528198,\n                         0.35004499554634094,\n                         -0.39797601103782654,\n                         0.8641520142555237,\n                         0.35647401213645935,\n                         -0.35519900918006897,\n                         0.7210670113563538,\n                         0.29798200726509094,\n                         0.6255149841308594,\n                         0,\n                         0,\n                         1,\n                         0.8245400190353394,\n                         -0.00001700000029813964,\n                         0.5658029913902283,\n                         0.917701005935669,\n                         -0.00003300000025774352,\n                         -0.397271990776062,\n                         0.9352689981460571,\n                         -0.00011200000153621659,\n                         -0.3539389967918396,\n                         0.7807120084762573,\n                         -0.00007500000356230885,\n                         0.6248909831047058,\n                         0.7807120084762573,\n                         -0.00007500000356230885,\n                         0.6248909831047058,\n                         0.7209920287132263,\n                         -0.29793301224708557,\n                         0.6256250143051147,\n                         0.21797800064086914,\n                         -0.0902160033583641,\n                         0.9717749953269958,\n                         0.23658299446105957,\n                         0,\n                         0.9716110229492188,\n                         0.1595889925956726,\n                         -0.06596100330352783,\n                         0.9849770069122314,\n                         0.17308400571346283,\n                         0,\n                         0.9849069714546204,\n                         0.3504979908466339,\n                         -0.1447400003671646,\n                         0.9253119826316833,\n                         0.37970298528671265,\n                         0,\n                         0.925108015537262,\n                         0.48558899760246277,\n                         -0.20147399604320526,\n                         0.8506529927253723,\n                         0.5266720056533813,\n                         0,\n                         0.8500679731369019,\n                         0.5518630146980286,\n                         -0.5517799854278564,\n                         0.6252880096435547,\n                         0.16663099825382233,\n                         -0.16663099825382233,\n                         0.9718379974365234,\n                         0.12190800160169601,\n                         -0.12190800160169601,\n                         0.9850260019302368,\n                         0.2676680088043213,\n                         -0.2676680088043213,\n                         0.9255849719047546,\n                         0.37131500244140625,\n                         -0.37131500244140625,\n                         0.8510289788246155,\n                         0.29798200726509094,\n                         -0.7210670113563538,\n                         0.6255149841308594,\n                         0.0902160033583641,\n                         -0.21797800064086914,\n                         0.9717749953269958,\n                         0.06596100330352783,\n                         -0.1595889925956726,\n                         0.9849770069122314,\n                         0.1447400003671646,\n                         -0.3504979908466339,\n                         0.9253119826316833,\n                         0.20147399604320526,\n                         -0.48558899760246277,\n                         0.8506529927253723,\n                         -0.00007500000356230885,\n                         -0.7807120084762573,\n                         0.6248900294303894,\n                         0,\n                         -0.23658299446105957,\n                         0.9716110229492188,\n                         0,\n                         -0.17308400571346283,\n                         0.9849069714546204,\n                         0,\n                         -0.37970298528671265,\n                         0.925108015537262,\n                         0,\n                         -0.5266720056533813,\n                         0.8500679731369019,\n                         -0.00007500000356230885,\n                         -0.7807120084762573,\n                         0.6248900294303894,\n                         -0.29793301224708557,\n                         -0.7209920287132263,\n                         0.6256250143051147,\n                         -0.0902160033583641,\n                         -0.21797800064086914,\n                         0.9717749953269958,\n                         0,\n                         -0.23658299446105957,\n                         0.9716110229492188,\n                         -0.06596100330352783,\n                         -0.1595889925956726,\n                         0.9849770069122314,\n                         0,\n                         -0.17308400571346283,\n                         0.9849069714546204,\n                         -0.1447400003671646,\n                         -0.3504979908466339,\n                         0.9253119826316833,\n                         0,\n                         -0.37970298528671265,\n                         0.925108015537262,\n                         -0.20147399604320526,\n                         -0.48558899760246277,\n                         0.8506529927253723,\n                         0,\n                         -0.5266720056533813,\n                         0.8500679731369019,\n                         -0.5517799854278564,\n                         -0.5518630146980286,\n                         0.6252880096435547,\n                         -0.16663099825382233,\n                         -0.16663099825382233,\n                         0.9718379974365234,\n                         -0.12190800160169601,\n                         -0.12190800160169601,\n                         0.9850260019302368,\n                         -0.2676680088043213,\n                         -0.2676680088043213,\n                         0.9255849719047546,\n                         -0.37131500244140625,\n                         -0.37131500244140625,\n                         0.8510289788246155,\n                         -0.7210670113563538,\n                         -0.29798200726509094,\n                         0.6255149841308594,\n                         -0.21797800064086914,\n                         -0.0902160033583641,\n                         0.9717749953269958,\n                         -0.1595889925956726,\n                         -0.06596100330352783,\n                         0.9849770069122314,\n                         -0.3504979908466339,\n                         -0.1447400003671646,\n                         0.9253119826316833,\n                         -0.48558899760246277,\n                         -0.20147399604320526,\n                         0.8506529927253723,\n                         -0.7807120084762573,\n                         0.00007500000356230885,\n                         0.6248900294303894,\n                         -0.23658299446105957,\n                         0,\n                         0.9716110229492188,\n                         -0.17308400571346283,\n                         0,\n                         0.9849069714546204,\n                         -0.37970298528671265,\n                         0,\n                         0.925108015537262,\n                         -0.5266720056533813,\n                         0,\n                         0.8500679731369019,\n                         -0.7807120084762573,\n                         0.00007500000356230885,\n                         0.6248900294303894,\n                         -0.7209920287132263,\n                         0.29793301224708557,\n                         0.6256250143051147,\n                         -0.21797800064086914,\n                         0.0902160033583641,\n                         0.9717749953269958,\n                         -0.23658299446105957,\n                         0,\n                         0.9716110229492188,\n                         -0.1595889925956726,\n                         0.06596100330352783,\n                         0.9849770069122314,\n                         -0.17308400571346283,\n                         0,\n                         0.9849069714546204,\n                         -0.3504979908466339,\n                         0.1447400003671646,\n                         0.9253119826316833,\n                         -0.37970298528671265,\n                         0,\n                         0.925108015537262,\n                         -0.48558899760246277,\n                         0.20147399604320526,\n                         0.8506529927253723,\n                         -0.5266720056533813,\n                         0,\n                         0.8500679731369019,\n                         -0.5518630146980286,\n                         0.5517799854278564,\n                         0.6252880096435547,\n                         -0.16663099825382233,\n                         0.16663099825382233,\n                         0.9718379974365234,\n                         -0.12190800160169601,\n                         0.12190800160169601,\n                         0.9850260019302368,\n                         -0.2676680088043213,\n                         0.2676680088043213,\n                         0.9255849719047546,\n                         -0.37131500244140625,\n                         0.37131500244140625,\n                         0.8510289788246155,\n                         -0.29798200726509094,\n                         0.7210670113563538,\n                         0.6255149841308594,\n                         -0.0902160033583641,\n                         0.21797800064086914,\n                         0.9717749953269958,\n                         -0.06596100330352783,\n                         0.1595889925956726,\n                         0.9849770069122314,\n                         -0.1447400003671646,\n                         0.3504979908466339,\n                         0.9253119826316833,\n                         -0.20147399604320526,\n                         0.48558899760246277,\n                         0.8506529927253723,\n                         0.00007500000356230885,\n                         0.7807120084762573,\n                         0.6248900294303894,\n                         0,\n                         0.23658299446105957,\n                         0.9716110229492188,\n                         0,\n                         0.17308400571346283,\n                         0.9849069714546204,\n                         0,\n                         0.37970298528671265,\n                         0.925108015537262,\n                         0,\n                         0.5266720056533813,\n                         0.8500679731369019,\n                         0.00007500000356230885,\n                         0.7807120084762573,\n                         0.6248900294303894,\n                         0.29793301224708557,\n                         0.7209920287132263,\n                         0.6256250143051147,\n                         0.0902160033583641,\n                         0.21797800064086914,\n                         0.9717749953269958,\n                         0,\n                         0.23658299446105957,\n                         0.9716110229492188,\n                         0.06596100330352783,\n                         0.1595889925956726,\n                         0.9849770069122314,\n                         0,\n                         0.17308400571346283,\n                         0.9849069714546204,\n                         0.1447400003671646,\n                         0.3504979908466339,\n                         0.9253119826316833,\n                         0,\n                         0.37970298528671265,\n                         0.925108015537262,\n                         0.20147399604320526,\n                         0.48558899760246277,\n                         0.8506529927253723,\n                         0,\n                         0.5266720056533813,\n                         0.8500679731369019,\n                         0.5517799854278564,\n                         0.5518630146980286,\n                         0.6252880096435547,\n                         0.16663099825382233,\n                         0.16663099825382233,\n                         0.9718379974365234,\n                         0.12190800160169601,\n                         0.12190800160169601,\n                         0.9850260019302368,\n                         0.2676680088043213,\n                         0.2676680088043213,\n                         0.9255849719047546,\n                         0.37131500244140625,\n                         0.37131500244140625,\n                         0.8510289788246155,\n                         0.7210670113563538,\n                         0.29798200726509094,\n                         0.6255149841308594,\n                         0.21797800064086914,\n                         0.0902160033583641,\n                         0.9717749953269958,\n                         0.1595889925956726,\n                         0.06596100330352783,\n                         0.9849770069122314,\n                         0.3504979908466339,\n                         0.1447400003671646,\n                         0.9253119826316833,\n                         0.48558899760246277,\n                         0.20147399604320526,\n                         0.8506529927253723,\n                         0.7807120084762573,\n                         -0.00007500000356230885,\n                         0.6248909831047058,\n                         0.23658299446105957,\n                         0,\n                         0.9716110229492188,\n                         0.17308400571346283,\n                         0,\n                         0.9849069714546204,\n                         0.37970298528671265,\n                         0,\n                         0.925108015537262,\n                         0.5266720056533813,\n                         0,\n                         0.8500679731369019};\n\nfloat teapotTangents[] = {0.012897999957203865,\n                          0.998727023601532,\n                          -0.048757001757621765,\n                          0.3861910104751587,\n                          0.9210079908370972,\n                          -0.016421999782323837,\n                          0.38136398792266846,\n                          0.9230089783668518,\n                          0.000155999994603917,\n                          0.012866999953985214,\n                          0.9987300038337708,\n                          0.04870200157165527,\n                          0.3750790059566498,\n                          0.9061710238456726,\n                          -0.0007169999880716205,\n                          0.19210100173950195,\n                          0.9812139868736267,\n                          0.01775900088250637,\n                          0.3782620131969452,\n                          0.9142940044403076,\n                          -0.00011300000187475234,\n                          0.10451500117778778,\n                          0.9897350072860718,\n                          -0.09747499972581863,\n                          0.3655939996242523,\n                          0.9257190227508545,\n                          0.028463000431656837,\n                          0.04767199978232384,\n                          0.9953050017356873,\n                          -0.08423800021409988,\n                          0.7092679738998413,\n                          0.7031199932098389,\n                          -0.016364000737667084,\n                          0.7061989903450012,\n                          0.7061989903450012,\n                          0,\n                          0.6937360167503357,\n                          0.6937360167503357,\n                          0,\n                          0.6997770071029663,\n                          0.6997770071029663,\n                          0,\n                          0.6924030184745789,\n                          0.7150859832763672,\n                          0.02822900004684925,\n                          0.9243540167808533,\n                          0.37810400128364563,\n                          -0.01657800003886223,\n                          0.9230089783668518,\n                          0.38136398792266846,\n                          -0.000155999994603917,\n                          0.9061710238456726,\n                          0.3750790059566498,\n                          0.0007169999880716205,\n                          0.9142940044403076,\n                          0.3782620131969452,\n                          0.00011300000187475234,\n                          0.9133660197257996,\n                          0.39544400572776794,\n                          0.028490999713540077,\n                          0.9987040162086487,\n                          0.015853000804781914,\n                          0.04836999997496605,\n                          0.9987369775772095,\n                          0.014649000018835068,\n                          -0.04806999862194061,\n                          0.9812150001525879,\n                          0.19211700558662415,\n                          -0.01754000037908554,\n                          0.9897350072860718,\n                          0.10452800244092941,\n                          0.09745799750089645,\n                          0.9953050017356873,\n                          0.04767199978232384,\n                          0.08423800021409988,\n                          0.9988179802894592,\n                          -0.009758999571204185,\n                          -0.047600001096725464,\n                          0.9094679951667786,\n                          -0.4095839858055115,\n                          -0.012636999599635601,\n                          0.9240090250968933,\n                          -0.3811509907245636,\n                          -0.0003150000120513141,\n                          0.9987890124320984,\n                          -0.01066299993544817,\n                          0.04801800101995468,\n                          0.9072269797325134,\n                          -0.37142300605773926,\n                          0.0207310002297163,\n                          0.9814350008964539,\n                          -0.19095200300216675,\n                          0.01795700006186962,\n                          0.914870023727417,\n                          -0.3771440088748932,\n                          -0.0011480000102892518,\n                          0.989749014377594,\n                          -0.10442499816417694,\n                          -0.09742700308561325,\n                          0.925815999507904,\n                          -0.3653950095176697,\n                          0.028308000415563583,\n                          0.9953050017356873,\n                          -0.04767199978232384,\n                          -0.08423800021409988,\n                          0.6768929958343506,\n                          -0.7314029932022095,\n                          -0.01988700032234192,\n                          0.6994619965553284,\n                          -0.7145140171051025,\n                          -0.00029799999902024865,\n                          0.6940590143203735,\n                          -0.6933979988098145,\n                          0.015560000203549862,\n                          0.7002580165863037,\n                          -0.6996300220489502,\n                          -0.000783999974373728,\n                          0.715142011642456,\n                          -0.6923869848251343,\n                          0.028078999370336533,\n                          0.351936012506485,\n                          -0.933899998664856,\n                          -0.019843999296426773,\n                          0.36654001474380493,\n                          -0.9298419952392578,\n                          -0.0005210000090301037,\n                          0.37116900086402893,\n                          -0.9084830284118652,\n                          0.00152299995534122,\n                          0.3776479959487915,\n                          -0.9147650003433228,\n                          -0.00011000000085914508,\n                          0.39533698558807373,\n                          -0.9134349822998047,\n                          0.028410999104380608,\n                          0.0013210000470280647,\n                          -0.9989479780197144,\n                          0.045830998569726944,\n                          0.003897000104188919,\n                          -0.9988909959793091,\n                          -0.04690299928188324,\n                          0.18705999851226807,\n                          -0.9821630120277405,\n                          -0.018818000331521034,\n                          0.10363999754190445,\n                          -0.9898579716682434,\n                          0.09715499728918076,\n                          0.04757700115442276,\n                          -0.9953129887580872,\n                          0.08418799936771393,\n                          -0.02296699956059456,\n                          -0.9986780285835266,\n                          -0.04599199816584587,\n                          -0.3861910104751587,\n                          -0.9210079908370972,\n                          -0.016421999782323837,\n                          -0.38136398792266846,\n                          -0.9230089783668518,\n                          0.000155999994603917,\n                          -0.020431000739336014,\n                          -0.9987260103225708,\n                          0.04614400118589401,\n                          -0.3750790059566498,\n                          -0.9061710238456726,\n                          -0.0007169999880716205,\n                          -0.19216600060462952,\n                          -0.9812189936637878,\n                          0.01677200011909008,\n                          -0.3782620131969452,\n                          -0.9142940044403076,\n                          -0.00011300000187475234,\n                          -0.10471200197935104,\n                          -0.9897390007972717,\n                          -0.09722500294446945,\n                          -0.3655939996242523,\n                          -0.9257190227508545,\n                          0.028463000431656837,\n                          -0.047710999846458435,\n                          -0.9953050017356873,\n                          -0.08420699834823608,\n                          -0.7092679738998413,\n                          -0.7031199932098389,\n                          -0.016364000737667084,\n                          -0.7061989903450012,\n                          -0.7061989903450012,\n                          0,\n                          -0.6937360167503357,\n                          -0.6937360167503357,\n                          0,\n                          -0.6997770071029663,\n                          -0.6997770071029663,\n                          0,\n                          -0.6924030184745789,\n                          -0.7150859832763672,\n                          0.02822900004684925,\n                          -0.9243540167808533,\n                          -0.37810400128364563,\n                          -0.01657800003886223,\n                          -0.9230089783668518,\n                          -0.38136398792266846,\n                          -0.000155999994603917,\n                          -0.9061710238456726,\n                          -0.3750790059566498,\n                          0.0007169999880716205,\n                          -0.9142940044403076,\n                          -0.3782620131969452,\n                          0.00011300000187475234,\n                          -0.9133660197257996,\n                          -0.39544400572776794,\n                          0.028490999713540077,\n                          -0.998727023601532,\n                          -0.012897999957203865,\n                          0.048757001757621765,\n                          -0.9987300038337708,\n                          -0.012866999953985214,\n                          -0.04870200157165527,\n                          -0.9812139868736267,\n                          -0.19210100173950195,\n                          -0.01775900088250637,\n                          -0.9897350072860718,\n                          -0.10451500117778778,\n                          0.09747499972581863,\n                          -0.9953050017356873,\n                          -0.04767199978232384,\n                          0.08423800021409988,\n                          -0.998727023601532,\n                          0.012897999957203865,\n                          -0.048757001757621765,\n                          -0.9210079908370972,\n                          0.3861910104751587,\n                          -0.016421999782323837,\n                          -0.9230089783668518,\n                          0.38136398792266846,\n                          0.000155999994603917,\n                          -0.9987300038337708,\n                          0.012866999953985214,\n                          0.04870200157165527,\n                          -0.9061710238456726,\n                          0.3750790059566498,\n                          -0.0007169999880716205,\n                          -0.9812139868736267,\n                          0.19210100173950195,\n                          0.01775900088250637,\n                          -0.9142940044403076,\n                          0.3782620131969452,\n                          -0.00011300000187475234,\n                          -0.9897350072860718,\n                          0.10451500117778778,\n                          -0.09747499972581863,\n                          -0.9257190227508545,\n                          0.3655939996242523,\n                          0.028463000431656837,\n                          -0.9953050017356873,\n                          0.04767199978232384,\n                          -0.08423800021409988,\n                          -0.7031199932098389,\n                          0.7092679738998413,\n                          -0.016364000737667084,\n                          -0.7061989903450012,\n                          0.7061989903450012,\n                          0,\n                          -0.6937360167503357,\n                          0.6937360167503357,\n                          0,\n                          -0.6997770071029663,\n                          0.6997770071029663,\n                          0,\n                          -0.7150859832763672,\n                          0.6924030184745789,\n                          0.02822900004684925,\n                          -0.37810400128364563,\n                          0.9243540167808533,\n                          -0.01657800003886223,\n                          -0.38136398792266846,\n                          0.9230089783668518,\n                          -0.000155999994603917,\n                          -0.3750790059566498,\n                          0.9061710238456726,\n                          0.0007169999880716205,\n                          -0.3782620131969452,\n                          0.9142940044403076,\n                          0.00011300000187475234,\n                          -0.39544400572776794,\n                          0.9133660197257996,\n                          0.028490999713540077,\n                          -0.012897999957203865,\n                          0.998727023601532,\n                          0.048757001757621765,\n                          -0.012866999953985214,\n                          0.9987300038337708,\n                          -0.04870200157165527,\n                          -0.19210100173950195,\n                          0.9812139868736267,\n                          -0.01775900088250637,\n                          -0.10451500117778778,\n                          0.9897350072860718,\n                          0.09747499972581863,\n                          -0.04767199978232384,\n                          0.9953050017356873,\n                          0.08423800021409988,\n                          0.04767199978232384,\n                          0.9953050017356873,\n                          -0.08423800021409988,\n                          0.39544400572776794,\n                          0.9133660197257996,\n                          -0.028490999713540077,\n                          0.38111698627471924,\n                          0.9210190176963806,\n                          -0.000015999999959603883,\n                          0.031922999769449234,\n                          0.9968529939651489,\n                          -0.07255599647760391,\n                          0.3815299868583679,\n                          0.9219080209732056,\n                          0.0000019999999949504854,\n                          0.022261999547481537,\n                          0.9978039860725403,\n                          -0.06237399950623512,\n                          0.3821389973163605,\n                          0.9231889843940735,\n                          0.00001700000029813964,\n                          0.008317999541759491,\n                          0.9991790056228638,\n                          -0.03964800015091896,\n                          0.38228899240493774,\n                          0.9239469766616821,\n                          -0.004430000204592943,\n                          0.0008660000166855752,\n                          0.9999139904975891,\n                          0.013048999942839146,\n                          0.7150859832763672,\n                          0.6924030184745789,\n                          -0.02822900004684925,\n                          0.7048519849777222,\n                          0.7048519849777222,\n                          0,\n                          0.7055330276489258,\n                          0.7055330276489258,\n                          0,\n                          0.7065179944038391,\n                          0.7065179944038391,\n                          0,\n                          0.7068390250205994,\n                          0.707252025604248,\n                          -0.004379999823868275,\n                          0.9257190227508545,\n                          0.3655939996242523,\n                          -0.028463000431656837,\n                          0.9210180044174194,\n                          0.38111698627471924,\n                          0.000015999999959603883,\n                          0.9219080209732056,\n                          0.3815299868583679,\n                          -0.0000019999999949504854,\n                          0.9231889843940735,\n                          0.3821389973163605,\n                          -0.00001700000029813964,\n                          0.9237229824066162,\n                          0.38283199071884155,\n                          -0.004399999976158142,\n                          0.9953050017356873,\n                          0.04767199978232384,\n                          0.08423800021409988,\n                          0.9968529939651489,\n                          0.031922999769449234,\n                          0.07255599647760391,\n                          0.9978039860725403,\n                          0.022261999547481537,\n                          0.06237399950623512,\n                          0.9991790056228638,\n                          0.008317999541759491,\n                          0.03964800015091896,\n                          0.9999139904975891,\n                          0.0008660000166855752,\n                          -0.013048999942839146,\n                          0.9953050017356873,\n                          -0.04767199978232384,\n                          -0.08423800021409988,\n                          0.9135000109672546,\n                          -0.3951619863510132,\n                          -0.02861100062727928,\n                          0.9210190176963806,\n                          -0.38111698627471924,\n                          -0.000015999999959603883,\n                          0.9968529939651489,\n                          -0.031922999769449234,\n                          -0.07255599647760391,\n                          0.9219080209732056,\n                          -0.3815299868583679,\n                          0.0000019999999949504854,\n                          0.9978039860725403,\n                          -0.022261999547481537,\n                          -0.06237399950623512,\n                          0.9231889843940735,\n                          -0.3821389973163605,\n                          0.00001700000029813964,\n                          0.9991790056228638,\n                          -0.008317999541759491,\n                          -0.03964800015091896,\n                          0.9239469766616821,\n                          -0.38228899240493774,\n                          -0.004430000204592943,\n                          0.9999139904975891,\n                          -0.0008660000166855752,\n                          0.013048999942839146,\n                          0.6925899982452393,\n                          -0.7149369716644287,\n                          -0.028262000530958176,\n                          0.7048519849777222,\n                          -0.7048519849777222,\n                          0,\n                          0.7055330276489258,\n                          -0.7055330276489258,\n                          0,\n                          0.7065179944038391,\n                          -0.7065179944038391,\n                          0,\n                          0.707252025604248,\n                          -0.7068390250205994,\n                          -0.004379999823868275,\n                          0.3656100034713745,\n                          -0.9257280230522156,\n                          -0.02841299958527088,\n                          0.38111698627471924,\n                          -0.9210180044174194,\n                          0.000015999999959603883,\n                          0.3815299868583679,\n                          -0.9219080209732056,\n                          -0.0000019999999949504854,\n                          0.3821389973163605,\n                          -0.9231889843940735,\n                          -0.00001700000029813964,\n                          0.38283199071884155,\n                          -0.9237229824066162,\n                          -0.004399999976158142,\n                          0.04757700115442276,\n                          -0.9953129887580872,\n                          0.08418799936771393,\n                          0.031922999769449234,\n                          -0.9968529939651489,\n                          0.07255599647760391,\n                          0.022261999547481537,\n                          -0.9978039860725403,\n                          0.06237399950623512,\n                          0.008317999541759491,\n                          -0.9991790056228638,\n                          0.03964800015091896,\n                          0.0008660000166855752,\n                          -0.9999139904975891,\n                          -0.013048999942839146,\n                          -0.047710999846458435,\n                          -0.9953050017356873,\n                          -0.08420699834823608,\n                          -0.39544400572776794,\n                          -0.9133660197257996,\n                          -0.028490999713540077,\n                          -0.38111698627471924,\n                          -0.9210190176963806,\n                          -0.000015999999959603883,\n                          -0.031922999769449234,\n                          -0.9968529939651489,\n                          -0.07255599647760391,\n                          -0.3815299868583679,\n                          -0.9219080209732056,\n                          0.0000019999999949504854,\n                          -0.022261999547481537,\n                          -0.9978039860725403,\n                          -0.06237399950623512,\n                          -0.3821389973163605,\n                          -0.9231889843940735,\n                          0.00001700000029813964,\n                          -0.008317999541759491,\n                          -0.9991790056228638,\n                          -0.03964800015091896,\n                          -0.38228899240493774,\n                          -0.9239469766616821,\n                          -0.004430000204592943,\n                          -0.0008660000166855752,\n                          -0.9999139904975891,\n                          0.013048999942839146,\n                          -0.7150859832763672,\n                          -0.6924030184745789,\n                          -0.02822900004684925,\n                          -0.7048519849777222,\n                          -0.7048519849777222,\n                          0,\n                          -0.7055330276489258,\n                          -0.7055330276489258,\n                          0,\n                          -0.7065179944038391,\n                          -0.7065179944038391,\n                          0,\n                          -0.7068390250205994,\n                          -0.707252025604248,\n                          -0.004379999823868275,\n                          -0.9257190227508545,\n                          -0.3655939996242523,\n                          -0.028463000431656837,\n                          -0.9210180044174194,\n                          -0.38111698627471924,\n                          0.000015999999959603883,\n                          -0.9219080209732056,\n                          -0.3815299868583679,\n                          -0.0000019999999949504854,\n                          -0.9231889843940735,\n                          -0.3821389973163605,\n                          -0.00001700000029813964,\n                          -0.9237229824066162,\n                          -0.38283199071884155,\n                          -0.004399999976158142,\n                          -0.9953050017356873,\n                          -0.04767199978232384,\n                          0.08423800021409988,\n                          -0.9968529939651489,\n                          -0.031922999769449234,\n                          0.07255599647760391,\n                          -0.9978039860725403,\n                          -0.022261999547481537,\n                          0.06237399950623512,\n                          -0.9991790056228638,\n                          -0.008317999541759491,\n                          0.03964800015091896,\n                          -0.9999139904975891,\n                          -0.0008660000166855752,\n                          -0.013048999942839146,\n                          -0.9953050017356873,\n                          0.04767199978232384,\n                          -0.08423800021409988,\n                          -0.9133660197257996,\n                          0.39544400572776794,\n                          -0.028490999713540077,\n                          -0.9210190176963806,\n                          0.38111698627471924,\n                          -0.000015999999959603883,\n                          -0.9968529939651489,\n                          0.031922999769449234,\n                          -0.07255599647760391,\n                          -0.9219080209732056,\n                          0.3815299868583679,\n                          0.0000019999999949504854,\n                          -0.9978039860725403,\n                          0.022261999547481537,\n                          -0.06237399950623512,\n                          -0.9231889843940735,\n                          0.3821389973163605,\n                          0.00001700000029813964,\n                          -0.9991790056228638,\n                          0.008317999541759491,\n                          -0.03964800015091896,\n                          -0.9239469766616821,\n                          0.38228899240493774,\n                          -0.004430000204592943,\n                          -0.9999139904975891,\n                          0.0008660000166855752,\n                          0.013048999942839146,\n                          -0.6924030184745789,\n                          0.7150859832763672,\n                          -0.02822900004684925,\n                          -0.7048519849777222,\n                          0.7048519849777222,\n                          0,\n                          -0.7055330276489258,\n                          0.7055330276489258,\n                          0,\n                          -0.7065179944038391,\n                          0.7065179944038391,\n                          0,\n                          -0.707252025604248,\n                          0.7068390250205994,\n                          -0.004379999823868275,\n                          -0.3655939996242523,\n                          0.9257190227508545,\n                          -0.028463000431656837,\n                          -0.38111698627471924,\n                          0.9210180044174194,\n                          0.000015999999959603883,\n                          -0.3815299868583679,\n                          0.9219080209732056,\n                          -0.0000019999999949504854,\n                          -0.3821389973163605,\n                          0.9231889843940735,\n                          -0.00001700000029813964,\n                          -0.38283199071884155,\n                          0.9237229824066162,\n                          -0.004399999976158142,\n                          -0.04767199978232384,\n                          0.9953050017356873,\n                          0.08423800021409988,\n                          -0.031922999769449234,\n                          0.9968529939651489,\n                          0.07255599647760391,\n                          -0.022261999547481537,\n                          0.9978039860725403,\n                          0.06237399950623512,\n                          -0.008317999541759491,\n                          0.9991790056228638,\n                          0.03964800015091896,\n                          -0.0008660000166855752,\n                          0.9999139904975891,\n                          -0.013048999942839146,\n                          0.0008660000166855752,\n                          0.9999139904975891,\n                          0.013048999942839146,\n                          0.38283199071884155,\n                          0.9237229824066162,\n                          0.004399999976158142,\n                          0.38101500272750854,\n                          0.9204739928245544,\n                          -0.00003899999865097925,\n                          0.03731299936771393,\n                          0.9963229894638062,\n                          0.07712399959564209,\n                          0.37877199053764343,\n                          0.9154880046844482,\n                          0.00008399999933317304,\n                          0.09151100367307663,\n                          0.9910060167312622,\n                          0.097632996737957,\n                          0.378387987613678,\n                          0.9145749807357788,\n                          0.00009999999747378752,\n                          0.10134600102901459,\n                          0.9900450110435486,\n                          0.09767600148916245,\n                          0.356795996427536,\n                          0.9266510009765625,\n                          -0.03188199922442436,\n                          0.07246600091457367,\n                          0.9928709864616394,\n                          0.09463199973106384,\n                          0.707252025604248,\n                          0.7068390250205994,\n                          0.004379999823868275,\n                          0.7044739723205566,\n                          0.7044739723205566,\n                          0,\n                          0.7006790041923523,\n                          0.7006790041923523,\n                          0,\n                          0.6999930143356323,\n                          0.6999930143356323,\n                          0,\n                          0.6847820281982422,\n                          0.7192310094833374,\n                          -0.03167999908328056,\n                          0.9239469766616821,\n                          0.38228899240493774,\n                          0.004430000204592943,\n                          0.9204739928245544,\n                          0.38101500272750854,\n                          0.00003899999865097925,\n                          0.9154880046844482,\n                          0.37877199053764343,\n                          -0.00008399999933317304,\n                          0.9145749807357788,\n                          0.378387987613678,\n                          -0.00009999999747378752,\n                          0.9078760147094727,\n                          0.40216198563575745,\n                          -0.03206299990415573,\n                          0.9999139904975891,\n                          0.0008660000166855752,\n                          -0.013048999942839146,\n                          0.9963229894638062,\n                          0.03731299936771393,\n                          -0.07712399959564209,\n                          0.9910060167312622,\n                          0.09151100367307663,\n                          -0.097632996737957,\n                          0.9900450110435486,\n                          0.10134600102901459,\n                          -0.09767600148916245,\n                          0.9928709864616394,\n                          0.07246600091457367,\n                          -0.09463199973106384,\n                          0.9999139904975891,\n                          -0.0008660000166855752,\n                          0.013048999942839146,\n                          0.9237229824066162,\n                          -0.38283199071884155,\n                          0.004399999976158142,\n                          0.9204739928245544,\n                          -0.38101500272750854,\n                          -0.00003899999865097925,\n                          0.9963229894638062,\n                          -0.03731299936771393,\n                          0.07712399959564209,\n                          0.9154880046844482,\n                          -0.37877199053764343,\n                          0.00008399999933317304,\n                          0.9910060167312622,\n                          -0.09151100367307663,\n                          0.097632996737957,\n                          0.9145749807357788,\n                          -0.378387987613678,\n                          0.00009999999747378752,\n                          0.9900450110435486,\n                          -0.10134600102901459,\n                          0.09767600148916245,\n                          0.9266510009765625,\n                          -0.356795996427536,\n                          -0.03188199922442436,\n                          0.9928709864616394,\n                          -0.07246600091457367,\n                          0.09463199973106384,\n                          0.7068390250205994,\n                          -0.707252025604248,\n                          0.004379999823868275,\n                          0.7044739723205566,\n                          -0.7044739723205566,\n                          0,\n                          0.7006790041923523,\n                          -0.7006790041923523,\n                          0,\n                          0.6999930143356323,\n                          -0.6999930143356323,\n                          0,\n                          0.7192310094833374,\n                          -0.6847820281982422,\n                          -0.03167999908328056,\n                          0.38228899240493774,\n                          -0.9239469766616821,\n                          0.004430000204592943,\n                          0.38101500272750854,\n                          -0.9204739928245544,\n                          0.00003899999865097925,\n                          0.37877199053764343,\n                          -0.9154880046844482,\n                          -0.00008399999933317304,\n                          0.378387987613678,\n                          -0.9145749807357788,\n                          -0.00009999999747378752,\n                          0.40216198563575745,\n                          -0.9078760147094727,\n                          -0.03206299990415573,\n                          0.0008660000166855752,\n                          -0.9999139904975891,\n                          -0.013048999942839146,\n                          0.03731299936771393,\n                          -0.9963229894638062,\n                          -0.07712399959564209,\n                          0.09151100367307663,\n                          -0.9910060167312622,\n                          -0.097632996737957,\n                          0.10134600102901459,\n                          -0.9900450110435486,\n                          -0.09767600148916245,\n                          0.07246600091457367,\n                          -0.9928709864616394,\n                          -0.09463199973106384,\n                          -0.0008660000166855752,\n                          -0.9999139904975891,\n                          0.013048999942839146,\n                          -0.38283199071884155,\n                          -0.9237229824066162,\n                          0.004399999976158142,\n                          -0.38101500272750854,\n                          -0.9204739928245544,\n                          -0.00003899999865097925,\n                          -0.03731299936771393,\n                          -0.9963229894638062,\n                          0.07712399959564209,\n                          -0.37877199053764343,\n                          -0.9154880046844482,\n                          0.00008399999933317304,\n                          -0.09151100367307663,\n                          -0.9910060167312622,\n                          0.097632996737957,\n                          -0.378387987613678,\n                          -0.9145749807357788,\n                          0.00009999999747378752,\n                          -0.10134600102901459,\n                          -0.9900450110435486,\n                          0.09767600148916245,\n                          -0.356795996427536,\n                          -0.9266510009765625,\n                          -0.03188199922442436,\n                          -0.07246600091457367,\n                          -0.9928709864616394,\n                          0.09463199973106384,\n                          -0.707252025604248,\n                          -0.7068390250205994,\n                          0.004379999823868275,\n                          -0.7044739723205566,\n                          -0.7044739723205566,\n                          0,\n                          -0.7006790041923523,\n                          -0.7006790041923523,\n                          0,\n                          -0.6999930143356323,\n                          -0.6999930143356323,\n                          0,\n                          -0.6847820281982422,\n                          -0.7192310094833374,\n                          -0.03167999908328056,\n                          -0.9239469766616821,\n                          -0.38228899240493774,\n                          0.004430000204592943,\n                          -0.9204739928245544,\n                          -0.38101500272750854,\n                          0.00003899999865097925,\n                          -0.9154880046844482,\n                          -0.37877199053764343,\n                          -0.00008399999933317304,\n                          -0.9145749807357788,\n                          -0.378387987613678,\n                          -0.00009999999747378752,\n                          -0.9078760147094727,\n                          -0.40216198563575745,\n                          -0.03206299990415573,\n                          -0.9999139904975891,\n                          -0.0008660000166855752,\n                          -0.013048999942839146,\n                          -0.9963229894638062,\n                          -0.03731299936771393,\n                          -0.07712399959564209,\n                          -0.9910060167312622,\n                          -0.09151100367307663,\n                          -0.097632996737957,\n                          -0.9900450110435486,\n                          -0.10134600102901459,\n                          -0.09767600148916245,\n                          -0.9928709864616394,\n                          -0.07246600091457367,\n                          -0.09463199973106384,\n                          -0.9999139904975891,\n                          0.0008660000166855752,\n                          0.013048999942839146,\n                          -0.9237229824066162,\n                          0.38283199071884155,\n                          0.004399999976158142,\n                          -0.9204739928245544,\n                          0.38101500272750854,\n                          -0.00003899999865097925,\n                          -0.9963229894638062,\n                          0.03731299936771393,\n                          0.07712399959564209,\n                          -0.9154880046844482,\n                          0.37877199053764343,\n                          0.00008399999933317304,\n                          -0.9910060167312622,\n                          0.09151100367307663,\n                          0.097632996737957,\n                          -0.9145749807357788,\n                          0.378387987613678,\n                          0.00009999999747378752,\n                          -0.9900450110435486,\n                          0.10134600102901459,\n                          0.09767600148916245,\n                          -0.9266510009765625,\n                          0.356795996427536,\n                          -0.03188199922442436,\n                          -0.9928709864616394,\n                          0.07246600091457367,\n                          0.09463199973106384,\n                          -0.7068390250205994,\n                          0.707252025604248,\n                          0.004379999823868275,\n                          -0.7044739723205566,\n                          0.7044739723205566,\n                          0,\n                          -0.7006790041923523,\n                          0.7006790041923523,\n                          0,\n                          -0.6999930143356323,\n                          0.6999930143356323,\n                          0,\n                          -0.7192310094833374,\n                          0.6847820281982422,\n                          -0.03167999908328056,\n                          -0.38228899240493774,\n                          0.9239469766616821,\n                          0.004430000204592943,\n                          -0.38101500272750854,\n                          0.9204739928245544,\n                          0.00003899999865097925,\n                          -0.37877199053764343,\n                          0.9154880046844482,\n                          -0.00008399999933317304,\n                          -0.378387987613678,\n                          0.9145749807357788,\n                          -0.00009999999747378752,\n                          -0.40216198563575745,\n                          0.9078760147094727,\n                          -0.03206299990415573,\n                          -0.0008660000166855752,\n                          0.9999139904975891,\n                          -0.013048999942839146,\n                          -0.03731299936771393,\n                          0.9963229894638062,\n                          -0.07712399959564209,\n                          -0.09151100367307663,\n                          0.9910060167312622,\n                          -0.097632996737957,\n                          -0.10134600102901459,\n                          0.9900450110435486,\n                          -0.09767600148916245,\n                          -0.07246600091457367,\n                          0.9928709864616394,\n                          -0.09463199973106384,\n                          0.07246600091457367,\n                          0.9928709864616394,\n                          0.09463199973106384,\n                          0.40216198563575745,\n                          0.9078760147094727,\n                          0.03206299990415573,\n                          0.37766799330711365,\n                          0.912958025932312,\n                          0.00018099999579135329,\n                          0.11919300258159637,\n                          0.9883019924163818,\n                          0.09514500200748444,\n                          0.37516000866889954,\n                          0.906607985496521,\n                          0.00016799999866634607,\n                          0.187733992934227,\n                          0.9816380143165588,\n                          0.03381900116801262,\n                          0.2823430001735687,\n                          0.767549991607666,\n                          -0.1682250052690506,\n                          0.12883399426937103,\n                          0.6540690064430237,\n                          -0.32698601484298706,\n                          0.06457000225782394,\n                          0.32701900601387024,\n                          -0.6666669845581055,\n                          0,\n                          0,\n                          -1,\n                          0.7192320227622986,\n                          0.6847820281982422,\n                          0.03167999908328056,\n                          0.6987630128860474,\n                          0.6987630128860474,\n                          0,\n                          0.694034993648529,\n                          0.694034993648529,\n                          0,\n                          0.5551990270614624,\n                          0.6008960008621216,\n                          -0.16825300455093384,\n                          0.1854030042886734,\n                          0.27701398730278015,\n                          -0.6666669845581055,\n                          0.9266499876976013,\n                          0.3567950129508972,\n                          0.03188199922442436,\n                          0.912958025932312,\n                          0.37766799330711365,\n                          -0.00018099999579135329,\n                          0.906607985496521,\n                          0.37516000866889954,\n                          -0.00016799999866634607,\n                          0.742605984210968,\n                          0.3426159918308258,\n                          -0.1683180034160614,\n                          0.27701398730278015,\n                          0.1854030042886734,\n                          -0.6666669845581055,\n                          0.9928709864616394,\n                          0.07246600091457367,\n                          -0.09463199973106384,\n                          0.9883019924163818,\n                          0.11919300258159637,\n                          -0.09514500200748444,\n                          0.9816370010375977,\n                          0.187733992934227,\n                          -0.03381900116801262,\n                          0.9811030030250549,\n                          0.19325199723243713,\n                          -0.009519999846816063,\n                          0.49052900075912476,\n                          0.0968559980392456,\n                          -0.5,\n                          0.9928709864616394,\n                          -0.07246600091457367,\n                          0.09463199973106384,\n                          0.9078760147094727,\n                          -0.40216198563575745,\n                          0.03206299990415573,\n                          0.912958025932312,\n                          -0.37766799330711365,\n                          0.00018099999579135329,\n                          0.9883019924163818,\n                          -0.11919300258159637,\n                          0.09514500200748444,\n                          0.906607985496521,\n                          -0.37516000866889954,\n                          0.00016799999866634607,\n                          0.9816380143165588,\n                          -0.187733992934227,\n                          0.03381900116801262,\n                          0.767549991607666,\n                          -0.2823430001735687,\n                          -0.1682250052690506,\n                          0.6540690064430237,\n                          -0.12883399426937103,\n                          -0.32698601484298706,\n                          0.32701900601387024,\n                          -0.06457000225782394,\n                          -0.6666669845581055,\n                          0,\n                          0,\n                          -1,\n                          0.6847820281982422,\n                          -0.7192320227622986,\n                          0.03167999908328056,\n                          0.6987630128860474,\n                          -0.6987630128860474,\n                          0,\n                          0.694034993648529,\n                          -0.694034993648529,\n                          0,\n                          0.6008960008621216,\n                          -0.5551990270614624,\n                          -0.16825300455093384,\n                          0.27701398730278015,\n                          -0.1854030042886734,\n                          -0.6666669845581055,\n                          0.3567950129508972,\n                          -0.9266499876976013,\n                          0.03188199922442436,\n                          0.37766799330711365,\n                          -0.912958025932312,\n                          -0.00018099999579135329,\n                          0.37516000866889954,\n                          -0.906607985496521,\n                          -0.00016799999866634607,\n                          0.3426159918308258,\n                          -0.742605984210968,\n                          -0.1683180034160614,\n                          0.1854030042886734,\n                          -0.27701398730278015,\n                          -0.6666669845581055,\n                          0.07246600091457367,\n                          -0.9928709864616394,\n                          -0.09463199973106384,\n                          0.11919300258159637,\n                          -0.9883019924163818,\n                          -0.09514500200748444,\n                          0.187733992934227,\n                          -0.9816370010375977,\n                          -0.03381900116801262,\n                          0.19325199723243713,\n                          -0.9811030030250549,\n                          -0.009519999846816063,\n                          0.0968559980392456,\n                          -0.49052900075912476,\n                          -0.5,\n                          -0.07246600091457367,\n                          -0.9928709864616394,\n                          0.09463199973106384,\n                          -0.40216198563575745,\n                          -0.9078760147094727,\n                          0.03206299990415573,\n                          -0.37766799330711365,\n                          -0.912958025932312,\n                          0.00018099999579135329,\n                          -0.11919300258159637,\n                          -0.9883019924163818,\n                          0.09514500200748444,\n                          -0.37516000866889954,\n                          -0.906607985496521,\n                          0.00016799999866634607,\n                          -0.187733992934227,\n                          -0.9816380143165588,\n                          0.03381900116801262,\n                          -0.2823430001735687,\n                          -0.767549991607666,\n                          -0.1682250052690506,\n                          -0.12883399426937103,\n                          -0.6540690064430237,\n                          -0.32698601484298706,\n                          -0.06457000225782394,\n                          -0.32701900601387024,\n                          -0.6666669845581055,\n                          0,\n                          0,\n                          -1,\n                          -0.7192320227622986,\n                          -0.6847820281982422,\n                          0.03167999908328056,\n                          -0.6987630128860474,\n                          -0.6987630128860474,\n                          0,\n                          -0.694034993648529,\n                          -0.694034993648529,\n                          0,\n                          -0.5551990270614624,\n                          -0.6008960008621216,\n                          -0.16825300455093384,\n                          -0.1854030042886734,\n                          -0.27701398730278015,\n                          -0.6666669845581055,\n                          -0.9266499876976013,\n                          -0.3567950129508972,\n                          0.03188199922442436,\n                          -0.912958025932312,\n                          -0.37766799330711365,\n                          -0.00018099999579135329,\n                          -0.906607985496521,\n                          -0.37516000866889954,\n                          -0.00016799999866634607,\n                          -0.742605984210968,\n                          -0.3426159918308258,\n                          -0.1683180034160614,\n                          -0.27701398730278015,\n                          -0.1854030042886734,\n                          -0.6666669845581055,\n                          -0.9928709864616394,\n                          -0.07246600091457367,\n                          -0.09463199973106384,\n                          -0.9883019924163818,\n                          -0.11919300258159637,\n                          -0.09514500200748444,\n                          -0.9816370010375977,\n                          -0.187733992934227,\n                          -0.03381900116801262,\n                          -0.9811030030250549,\n                          -0.19325199723243713,\n                          -0.009519999846816063,\n                          -0.49052900075912476,\n                          -0.0968559980392456,\n                          -0.5,\n                          -0.9928709864616394,\n                          0.07246600091457367,\n                          0.09463199973106384,\n                          -0.9078760147094727,\n                          0.40216198563575745,\n                          0.03206299990415573,\n                          -0.912958025932312,\n                          0.37766799330711365,\n                          0.00018099999579135329,\n                          -0.9883019924163818,\n                          0.11919300258159637,\n                          0.09514500200748444,\n                          -0.906607985496521,\n                          0.37516000866889954,\n                          0.00016799999866634607,\n                          -0.9816380143165588,\n                          0.187733992934227,\n                          0.03381900116801262,\n                          -0.767549991607666,\n                          0.2823430001735687,\n                          -0.1682250052690506,\n                          -0.6540690064430237,\n                          0.12883399426937103,\n                          -0.32698601484298706,\n                          -0.32701900601387024,\n                          0.06457000225782394,\n                          -0.6666669845581055,\n                          0,\n                          0,\n                          -1,\n                          -0.6847820281982422,\n                          0.7192320227622986,\n                          0.03167999908328056,\n                          -0.6987630128860474,\n                          0.6987630128860474,\n                          0,\n                          -0.694034993648529,\n                          0.694034993648529,\n                          0,\n                          -0.6008960008621216,\n                          0.5551990270614624,\n                          -0.16825300455093384,\n                          -0.27701398730278015,\n                          0.1854030042886734,\n                          -0.6666669845581055,\n                          -0.3567950129508972,\n                          0.9266499876976013,\n                          0.03188199922442436,\n                          -0.37766799330711365,\n                          0.912958025932312,\n                          -0.00018099999579135329,\n                          -0.37516000866889954,\n                          0.906607985496521,\n                          -0.00016799999866634607,\n                          -0.3426159918308258,\n                          0.742605984210968,\n                          -0.1683180034160614,\n                          -0.1854030042886734,\n                          0.27701398730278015,\n                          -0.6666669845581055,\n                          -0.07246600091457367,\n                          0.9928709864616394,\n                          -0.09463199973106384,\n                          -0.11919300258159637,\n                          0.9883019924163818,\n                          -0.09514500200748444,\n                          -0.187733992934227,\n                          0.9816370010375977,\n                          -0.03381900116801262,\n                          -0.19325199723243713,\n                          0.9811030030250549,\n                          -0.009519999846816063,\n                          -0.0968559980392456,\n                          0.49052900075912476,\n                          -0.5,\n                          -0.006597999949008226,\n                          0.9961680173873901,\n                          0.0001630000042496249,\n                          -0.043907999992370605,\n                          0.779125988483429,\n                          -0.55936598777771,\n                          0.23287899792194366,\n                          0.79271000623703,\n                          -0.506534993648529,\n                          0.11139900237321854,\n                          0.9923329949378967,\n                          0.0053449999541044235,\n                          0.4521920084953308,\n                          0.7370989918708801,\n                          -0.42180201411247253,\n                          0.17797799408435822,\n                          0.9827970266342163,\n                          0.036841001361608505,\n                          0.6075379848480225,\n                          0.7066869735717773,\n                          -0.270797997713089,\n                          0.11894699931144714,\n                          0.9864829778671265,\n                          0.10517799854278564,\n                          0.6583719849586487,\n                          0.7438470125198364,\n                          -0.06727500259876251,\n                          0.0010629999451339245,\n                          0.99891597032547,\n                          0.04653400182723999,\n                          -0.1622990071773529,\n                          -0.14869500696659088,\n                          -0.9069569706916809,\n                          0.3020159900188446,\n                          -0.014301000162959099,\n                          -0.8847119808197021,\n                          0.7048640251159668,\n                          -0.042514998465776443,\n                          -0.6788020133972168,\n                          0.8948519825935364,\n                          -0.11078000068664551,\n                          -0.38824599981307983,\n                          0.9622920155525208,\n                          -0.09367900341749191,\n                          -0.14349600672721863,\n                          -0.12511900067329407,\n                          -0.8479049801826477,\n                          -0.4783349931240082,\n                          0.11315400153398514,\n                          -0.8153669834136963,\n                          -0.5167160034179688,\n                          0.3956319987773895,\n                          -0.7910019755363464,\n                          -0.4345270097255707,\n                          0.5244609713554382,\n                          -0.8012329936027527,\n                          -0.2643829882144928,\n                          0.571465015411377,\n                          -0.7902160286903381,\n                          -0.12332800030708313,\n                          -0.0943560004234314,\n                          -0.9955379962921143,\n                          -0.0010989999864250422,\n                          0.012040999718010426,\n                          -0.9965500235557556,\n                          0,\n                          0.09501499682664871,\n                          -0.9936969876289368,\n                          0.02440500073134899,\n                          0.03737499937415123,\n                          -0.9978089928627014,\n                          0.035909999161958694,\n                          -0.0008800000068731606,\n                          -0.9973530173301697,\n                          -0.04031199961900711,\n                          0.007164000067859888,\n                          -0.9961649775505066,\n                          -0.00002700000004551839,\n                          0.043988000601530075,\n                          -0.8330309987068176,\n                          0.4691329896450043,\n                          -0.2334270030260086,\n                          -0.7983189821243286,\n                          0.49840399622917175,\n                          -0.10737399756908417,\n                          -0.9927549958229065,\n                          -0.007029999978840351,\n                          -0.45147499442100525,\n                          -0.7576299905776978,\n                          0.39375001192092896,\n                          -0.15364399552345276,\n                          -0.9863160252571106,\n                          -0.048294998705387115,\n                          -0.5575600266456604,\n                          -0.7753210067749023,\n                          0.2001740038394928,\n                          -0.07242999970912933,\n                          -0.9923030138015747,\n                          -0.08845999836921692,\n                          -0.5877019762992859,\n                          -0.8041930198669434,\n                          0.04768599942326546,\n                          0.0005830000154674053,\n                          -0.9997940063476562,\n                          -0.020301999524235725,\n                          0.13663700222969055,\n                          -0.14665700495243073,\n                          0.8966140151023865,\n                          -0.3045389950275421,\n                          -0.012237999588251114,\n                          0.8833180069923401,\n                          -0.7020289897918701,\n                          -0.033987998962402344,\n                          0.6724730134010315,\n                          -0.8890330195426941,\n                          -0.09636799991130829,\n                          0.37605398893356323,\n                          -0.9668099880218506,\n                          -0.08601800352334976,\n                          0.1358419954776764,\n                          0.12022499740123749,\n                          0.7918559908866882,\n                          0.5693140029907227,\n                          -0.11313500255346298,\n                          0.8111780285835266,\n                          0.5236610174179077,\n                          -0.39790698885917664,\n                          0.7734419703483582,\n                          0.45853298902511597,\n                          -0.5793390274047852,\n                          0.7346490025520325,\n                          0.32973799109458923,\n                          -0.6447499990463257,\n                          0.7340419888496399,\n                          0.12459299713373184,\n                          0.09378799796104431,\n                          0.9955919981002808,\n                          0.000944000028539449,\n                          -0.01607999950647354,\n                          0.9964879751205444,\n                          0.00035600000410340726,\n                          -0.11933200061321259,\n                          0.9912199974060059,\n                          -0.01737299934029579,\n                          -0.08618299663066864,\n                          0.9940080046653748,\n                          -0.053598999977111816,\n                          -0.004110999871045351,\n                          0.9980229735374451,\n                          0.015703000128269196,\n                          0.010142000392079353,\n                          0.9933879971504211,\n                          0.10034400224685669,\n                          0.6597890257835388,\n                          0.7114480137825012,\n                          0.12964099645614624,\n                          0.5634239912033081,\n                          0.7594000101089478,\n                          0.289902001619339,\n                          -0.021227000281214714,\n                          0.9976930022239685,\n                          0.05189099907875061,\n                          0.3972559869289398,\n                          0.7709670066833496,\n                          0.45872700214385986,\n                          -0.05054600164294243,\n                          0.9957669973373413,\n                          0.060869000852108,\n                          0.11805199831724167,\n                          0.7611619830131531,\n                          0.5692800283432007,\n                          -0.11414600163698196,\n                          0.9869359731674194,\n                          0.08862999826669693,\n                          -0.0012870000209659338,\n                          0.7195389866828918,\n                          0.6293820142745972,\n                          -0.18971200287342072,\n                          0.9752820134162903,\n                          0.11328700184822083,\n                          0.9685969948768616,\n                          -0.08966200053691864,\n                          0.13331100344657898,\n                          0.8902140259742737,\n                          -0.051961999386548996,\n                          0.39323100447654724,\n                          0.6728280186653137,\n                          -0.050324998795986176,\n                          0.6965069770812988,\n                          0.25133201479911804,\n                          -0.04306900128722191,\n                          0.9169719815254211,\n                          -0.19813700020313263,\n                          -0.2512879967689514,\n                          0.9046909809112549,\n                          0.5937719941139221,\n                          -0.8024669885635376,\n                          0.03307799994945526,\n                          0.5571249723434448,\n                          -0.7907459735870361,\n                          0.2022089958190918,\n                          0.4313510060310364,\n                          -0.8083119988441467,\n                          0.37996000051498413,\n                          0.19395600259304047,\n                          -0.8197799921035767,\n                          0.5133119821548462,\n                          -0.1517219990491867,\n                          -0.8084930181503296,\n                          0.5055829882621765,\n                          0.0035200000274926424,\n                          -0.9997940063476562,\n                          0.019979000091552734,\n                          0.01159599982202053,\n                          -0.9981369972229004,\n                          -0.02326199971139431,\n                          0.01310999970883131,\n                          -0.9988970160484314,\n                          -0.008480999618768692,\n                          -0.02485400065779686,\n                          -0.9978809952735901,\n                          0.021263999864459038,\n                          -0.11335399746894836,\n                          -0.9881970286369324,\n                          0.06441199779510498,\n                          -0.0035459999926388264,\n                          -0.9954169988632202,\n                          -0.07682599872350693,\n                          -0.5816869735717773,\n                          -0.7760900259017944,\n                          -0.13957500457763672,\n                          -0.5260769724845886,\n                          -0.790789008140564,\n                          -0.2781960070133209,\n                          0.017288999632000923,\n                          -0.9983699917793274,\n                          -0.03728000074625015,\n                          -0.36800798773765564,\n                          -0.7982890009880066,\n                          -0.4405499994754791,\n                          0.03743100166320801,\n                          -0.9973520040512085,\n                          -0.03640099987387657,\n                          -0.09636899828910828,\n                          -0.7829139828681946,\n                          -0.5500450134277344,\n                          0.10426300019025803,\n                          -0.9894949793815613,\n                          -0.06746900081634521,\n                          0.10083399713039398,\n                          -0.8161320090293884,\n                          -0.48112401366233826,\n                          0.18510299921035767,\n                          -0.9776470065116882,\n                          -0.09971100091934204,\n                          -0.9615049958229065,\n                          -0.08203399926424026,\n                          -0.14958199858665466,\n                          -0.8876789808273315,\n                          -0.04622500017285347,\n                          -0.39955899119377136,\n                          -0.6675580143928528,\n                          -0.03723999857902527,\n                          -0.7007560133934021,\n                          -0.245511993765831,\n                          -0.03216199949383736,\n                          -0.9151920080184937,\n                          0.15477199852466583,\n                          -0.24929499626159668,\n                          -0.8975690007209778,\n                          -0.6700729727745056,\n                          0.7402250170707703,\n                          -0.01942499913275242,\n                          -0.5923460125923157,\n                          0.7624830007553101,\n                          -0.21566900610923767,\n                          -0.45611900091171265,\n                          0.7868310213088989,\n                          -0.39906400442123413,\n                          -0.21001900732517242,\n                          0.8031420111656189,\n                          -0.5333020091056824,\n                          0.05119999870657921,\n                          0.7096909880638123,\n                          -0.6591699719429016,\n                          -0.014175999909639359,\n                          0.9989240169525146,\n                          -0.04416000097990036,\n                          -0.0065449997782707214,\n                          0.9983869791030884,\n                          0.008813999593257904,\n                          0.0023960000835359097,\n                          0.9989259839057922,\n                          -0.016711000353097916,\n                          0.03813000023365021,\n                          0.9969249963760376,\n                          -0.04171599820256233,\n                          0.11744900047779083,\n                          0.986670970916748,\n                          -0.0799890011548996,\n                          -0.02072799950838089,\n                          -0.997963011264801,\n                          0.0017740000039339066,\n                          0.10236400365829468,\n                          -0.695684015750885,\n                          -0.6961740255355835,\n                          0.28174999356269836,\n                          -0.7065439820289612,\n                          -0.6379269957542419,\n                          -0.027713999152183533,\n                          -0.9983959794044495,\n                          -0.016395000740885735,\n                          0.4621469974517822,\n                          -0.7501789927482605,\n                          -0.43765199184417725,\n                          -0.014942999929189682,\n                          -0.9960020184516907,\n                          -0.04751100018620491,\n                          0.6121799945831299,\n                          -0.7355859875679016,\n                          -0.1658719927072525,\n                          0.08200599998235703,\n                          -0.9833409786224365,\n                          0.11102399975061417,\n                          0.7232419848442078,\n                          -0.6012910008430481,\n                          -0.14595800638198853,\n                          0.32238098978996277,\n                          -0.9036369919776917,\n                          0.28197699785232544,\n                          0.1188960000872612,\n                          0.09661199897527695,\n                          -0.9692260026931763,\n                          0.3230240046977997,\n                          0.06791900098323822,\n                          -0.9069269895553589,\n                          0.6287810206413269,\n                          0.00962899997830391,\n                          -0.711097002029419,\n                          0.8952469825744629,\n                          -0.060169998556375504,\n                          -0.3366979956626892,\n                          0.9689210057258606,\n                          -0.04508800059556961,\n                          -0.13095800578594208,\n                          0.06500200182199478,\n                          0.7708680033683777,\n                          -0.6083509922027588,\n                          0.1816529929637909,\n                          0.7457069754600525,\n                          -0.593995988368988,\n                          0.37600401043891907,\n                          0.7467949986457825,\n                          -0.4776870012283325,\n                          0.6288849711418152,\n                          0.7020969986915588,\n                          -0.27160701155662537,\n                          0.8230010271072388,\n                          0.5295370221138,\n                          -0.09450399875640869,\n                          -0.12820099294185638,\n                          0.9899809956550598,\n                          -0.05917999893426895,\n                          -0.11097600311040878,\n                          0.9872509837150574,\n                          -0.09937400370836258,\n                          -0.06767299771308899,\n                          0.9865689873695374,\n                          -0.1427209973335266,\n                          -0.0003349999897181988,\n                          0.9967420101165771,\n                          0.025443999096751213,\n                          0.29019099473953247,\n                          0.9243509769439697,\n                          0.1957239955663681,\n                          0.07294999808073044,\n                          0.9949049949645996,\n                          0.03147900104522705,\n                          -0.04948300123214722,\n                          0.7695090174674988,\n                          0.6163870096206665,\n                          -0.24193400144577026,\n                          0.7750219702720642,\n                          0.5679330229759216,\n                          0.05620399862527847,\n                          0.9959489703178406,\n                          0.052143000066280365,\n                          -0.4294399917125702,\n                          0.779321014881134,\n                          0.41615501046180725,\n                          0.023887999355793,\n                          0.9943940043449402,\n                          0.07553800195455551,\n                          -0.6655910015106201,\n                          0.6939520239830017,\n                          0.20106400549411774,\n                          -0.09678799659013748,\n                          0.9791589975357056,\n                          -0.12869000434875488,\n                          -0.7716730237007141,\n                          0.5443729758262634,\n                          0.1793539971113205,\n                          -0.417836993932724,\n                          0.8721759915351868,\n                          -0.2544029951095581,\n                          -0.09499499946832657,\n                          0.08934500068426132,\n                          0.9787889719009399,\n                          -0.3299880027770996,\n                          0.06701900064945221,\n                          0.9273520112037659,\n                          -0.6511250138282776,\n                          0.023523999378085136,\n                          0.7280719876289368,\n                          -0.9116759896278381,\n                          -0.033263999968767166,\n                          0.34162598848342896,\n                          -0.9896330237388611,\n                          -0.013496000319719315,\n                          0.07834099978208542,\n                          -0.07044100016355515,\n                          -0.6954740285873413,\n                          0.7080140113830566,\n                          -0.21969600021839142,\n                          -0.6959800124168396,\n                          0.6642320156097412,\n                          -0.4075010120868683,\n                          -0.7370589971542358,\n                          0.5047789812088013,\n                          -0.5866039991378784,\n                          -0.7473030090332031,\n                          0.24636299908161163,\n                          -0.799036979675293,\n                          -0.5617390275001526,\n                          0.05794600024819374,\n                          0.07605399936437607,\n                          -0.9967970252037048,\n                          0.02472200058400631,\n                          0.08756300061941147,\n                          -0.9926980137825012,\n                          0.05929899960756302,\n                          0.07250799983739853,\n                          -0.9901790022850037,\n                          0.11122000217437744,\n                          0.015556000173091888,\n                          -0.9970260262489319,\n                          -0.011235999874770641,\n                          -0.194814994931221,\n                          -0.9439409971237183,\n                          -0.22127500176429749,\n                          0.3417310118675232,\n                          -0.8896859884262085,\n                          0.3012309968471527,\n                          0.8375009894371033,\n                          -0.4931910037994385,\n                          0.05739299952983856,\n                          0.8273029923439026,\n                          -0.4684619903564453,\n                          -0.05539099872112274,\n                          0.5311300158500671,\n                          -0.8121910095214844,\n                          0.24026300013065338,\n                          0.8069959878921509,\n                          -0.47689300775527954,\n                          0.002638000063598156,\n                          0.644743025302887,\n                          -0.7642210125923157,\n                          -0.015455000102519989,\n                          0.8856800198554993,\n                          -0.4464530050754547,\n                          0.047488000243902206,\n                          -0.011536000296473503,\n                          -0.999845027923584,\n                          -0.0008730000117793679,\n                          0.7597830295562744,\n                          -0.6229599714279175,\n                          0.026636000722646713,\n                          0.321245014667511,\n                          -0.8855000138282776,\n                          0.3356960117816925,\n                          0.998091995716095,\n                          -0.005673000123351812,\n                          0.025262000039219856,\n                          0.9941530227661133,\n                          0.046904999762773514,\n                          -0.00951599981635809,\n                          0.9838590025901794,\n                          -0.00041700000292621553,\n                          0.010572000406682491,\n                          0.990556001663208,\n                          0.01886500045657158,\n                          0.04422200098633766,\n                          0.9921990036964417,\n                          -0.12290599942207336,\n                          0.011202000081539154,\n                          0.828000009059906,\n                          0.5258169770240784,\n                          -0.0846100002527237,\n                          0.8704839944839478,\n                          0.4878079891204834,\n                          0.00635599996894598,\n                          0.7773939967155457,\n                          0.5659670233726501,\n                          -0.09634699672460556,\n                          0.8190580010414124,\n                          0.4740380048751831,\n                          0.01190400030463934,\n                          0.9017590284347534,\n                          0.3486430048942566,\n                          -0.05601400136947632,\n                          0.41038599610328674,\n                          0.870602011680603,\n                          0.27135801315307617,\n                          0.3019320070743561,\n                          0.8897680044174194,\n                          0.34101900458335876,\n                          0.13912299275398254,\n                          0.9423390030860901,\n                          -0.3042120039463043,\n                          0.6167309880256653,\n                          0.7692840099334717,\n                          0.1667650043964386,\n                          0.5558350086212158,\n                          0.8010749816894531,\n                          0.21867799758911133,\n                          -0.4410029947757721,\n                          0.8555399775505066,\n                          -0.2693159878253937,\n                          -0.8639690279960632,\n                          0.464356005191803,\n                          -0.019222000613808632,\n                          -0.8705710172653198,\n                          0.4855479896068573,\n                          -0.005623999983072281,\n                          -0.33969300985336304,\n                          0.8762779831886292,\n                          -0.34097298979759216,\n                          -0.7608209848403931,\n                          0.5840269923210144,\n                          0.11236599832773209,\n                          -0.16763299703598022,\n                          0.9419429898262024,\n                          0.29091599583625793,\n                          -0.8260639905929565,\n                          0.47304999828338623,\n                          -0.0134699996560812,\n                          -0.6006280183792114,\n                          0.7822970151901245,\n                          -0.1611420065164566,\n                          -0.8495870232582092,\n                          0.4440779983997345,\n                          0.17417700588703156,\n                          -0.5251449942588806,\n                          0.8236340284347534,\n                          -0.21412399411201477,\n                          -0.9991480112075806,\n                          0.0017519999528303742,\n                          0.007890000008046627,\n                          -0.9946579933166504,\n                          0.06129400059580803,\n                          0.007796999998390675,\n                          -0.9840919971466064,\n                          0.008732999674975872,\n                          -0.0001289999927394092,\n                          -0.9916059970855713,\n                          0.015207000076770782,\n                          -0.04798699915409088,\n                          -0.9899899959564209,\n                          -0.13816699385643005,\n                          -0.019433999434113503,\n                          -0.7927820086479187,\n                          -0.5669599771499634,\n                          0.06795799732208252,\n                          -0.8363490104675293,\n                          -0.4685719907283783,\n                          0.048955000936985016,\n                          -0.8138830065727234,\n                          -0.4743089973926544,\n                          0.0008379999781027436,\n                          -0.8869869709014893,\n                          -0.4417180120944977,\n                          -0.05625399947166443,\n                          -0.7898640036582947,\n                          -0.5522750020027161,\n                          -0.15016800165176392,\n                          -0.297340989112854,\n                          -0.8998129963874817,\n                          -0.3192580044269562,\n                          -0.49759799242019653,\n                          -0.8317790031433105,\n                          -0.24411599338054657,\n                          -0.6295620203018188,\n                          -0.7765420079231262,\n                          0.01261799968779087,\n                          -0.011338000185787678,\n                          -0.9998990297317505,\n                          -0.008561000227928162,\n                          -0.3547320067882538,\n                          -0.8679590225219727,\n                          -0.3453510105609894,\n                          0.09618999809026718,\n                          0.49066001176834106,\n                          -0.5,\n                          0.1851000040769577,\n                          0.27721700072288513,\n                          -0.6666669845581055,\n                          0.32566601037979126,\n                          0.76139897108078,\n                          -0.18199099600315094,\n                          0.062401000410318375,\n                          0.9939020276069641,\n                          -0.09090700000524521,\n                          0.3803209960460663,\n                          0.9214360117912292,\n                          -0.00007100000220816582,\n                          0.030918000265955925,\n                          0.9969729781150818,\n                          0.07133600115776062,\n                          0.3804109990596771,\n                          0.9220889806747437,\n                          0.0001630000042496249,\n                          0.02471200004220009,\n                          0.9975799918174744,\n                          0.06498300284147263,\n                          0.35510900616645813,\n                          0.926891028881073,\n                          0.03216100111603737,\n                          0.07657899707555771,\n                          0.9924740195274353,\n                          -0.09555599838495255,\n                          0.27721700072288513,\n                          0.1851000040769577,\n                          -0.6666669845581055,\n                          0.5929989814758301,\n                          0.5781109929084778,\n                          -0.18205299973487854,\n                          0.7048519849777222,\n                          0.7048519849777222,\n                          0,\n                          0.7052720189094543,\n                          0.7054179906845093,\n                          -0.00002499999936844688,\n                          0.6835219860076904,\n                          0.7199410200119019,\n                          0.03204600140452385,\n                          0.3271070122718811,\n                          0.06412599980831146,\n                          -0.6666669845581055,\n                          0.7694699764251709,\n                          0.3061000108718872,\n                          -0.18225300312042236,\n                          0.9214379787445068,\n                          0.38033199310302734,\n                          0.0000670000008540228,\n                          0.9220880270004272,\n                          0.3804430067539215,\n                          -0.00016799999866634607,\n                          0.9071130156517029,\n                          0.403003990650177,\n                          0.032437000423669815,\n                          0,\n                          0,\n                          -1,\n                          0.6626030206680298,\n                          0.04157499969005585,\n                          -0.272724986076355,\n                          0.9969789981842041,\n                          0.03082600049674511,\n                          -0.07129299640655518,\n                          0.9975910186767578,\n                          0.024447999894618988,\n                          -0.06492199748754501,\n                          0.9925040006637573,\n                          0.07630900293588638,\n                          0.09545700252056122,\n                          0.49066001176834106,\n                          -0.09618999809026718,\n                          -0.5,\n                          0.27721700072288513,\n                          -0.1851000040769577,\n                          -0.6666669845581055,\n                          0.76139897108078,\n                          -0.32566601037979126,\n                          -0.18199099600315094,\n                          0.9939020276069641,\n                          -0.062401000410318375,\n                          -0.09090700000524521,\n                          0.9214360117912292,\n                          -0.3803209960460663,\n                          -0.00007100000220816582,\n                          0.9969729781150818,\n                          -0.030918000265955925,\n                          0.07133600115776062,\n                          0.9220889806747437,\n                          -0.3804109990596771,\n                          0.0001630000042496249,\n                          0.9975799918174744,\n                          -0.02471200004220009,\n                          0.06498300284147263,\n                          0.926891028881073,\n                          -0.35510900616645813,\n                          0.03216100111603737,\n                          0.9924740195274353,\n                          -0.07657899707555771,\n                          -0.09555599838495255,\n                          0.1851000040769577,\n                          -0.27721700072288513,\n                          -0.6666669845581055,\n                          0.5781109929084778,\n                          -0.5929989814758301,\n                          -0.18205299973487854,\n                          0.7048519849777222,\n                          -0.7048519849777222,\n                          0,\n                          0.7054179906845093,\n                          -0.7052720189094543,\n                          -0.00002499999936844688,\n                          0.7199410200119019,\n                          -0.6835219860076904,\n                          0.03204600140452385,\n                          0.06412599980831146,\n                          -0.3271070122718811,\n                          -0.6666669845581055,\n                          0.3061000108718872,\n                          -0.7694699764251709,\n                          -0.18225300312042236,\n                          0.38033199310302734,\n                          -0.9214379787445068,\n                          0.0000670000008540228,\n                          0.3804430067539215,\n                          -0.9220880270004272,\n                          -0.00016799999866634607,\n                          0.403003990650177,\n                          -0.9071130156517029,\n                          0.032437000423669815,\n                          0,\n                          0,\n                          -1,\n                          0.04157499969005585,\n                          -0.6626030206680298,\n                          -0.272724986076355,\n                          0.03082600049674511,\n                          -0.9969789981842041,\n                          -0.07129299640655518,\n                          0.024447999894618988,\n                          -0.9975910186767578,\n                          -0.06492199748754501,\n                          0.07630900293588638,\n                          -0.9925040006637573,\n                          0.09545700252056122,\n                          -0.09618999809026718,\n                          -0.49066001176834106,\n                          -0.5,\n                          -0.1851000040769577,\n                          -0.27721700072288513,\n                          -0.6666669845581055,\n                          -0.32566601037979126,\n                          -0.76139897108078,\n                          -0.18199099600315094,\n                          -0.062401000410318375,\n                          -0.9939020276069641,\n                          -0.09090700000524521,\n                          -0.3803209960460663,\n                          -0.9214360117912292,\n                          -0.00007100000220816582,\n                          -0.030918000265955925,\n                          -0.9969729781150818,\n                          0.07133600115776062,\n                          -0.3804109990596771,\n                          -0.9220889806747437,\n                          0.0001630000042496249,\n                          -0.02471200004220009,\n                          -0.9975799918174744,\n                          0.06498300284147263,\n                          -0.35510900616645813,\n                          -0.926891028881073,\n                          0.03216100111603737,\n                          -0.07657899707555771,\n                          -0.9924740195274353,\n                          -0.09555599838495255,\n                          -0.27721700072288513,\n                          -0.1851000040769577,\n                          -0.6666669845581055,\n                          -0.5929989814758301,\n                          -0.5781109929084778,\n                          -0.18205299973487854,\n                          -0.7048519849777222,\n                          -0.7048519849777222,\n                          0,\n                          -0.7052720189094543,\n                          -0.7054179906845093,\n                          -0.00002499999936844688,\n                          -0.6835219860076904,\n                          -0.7199410200119019,\n                          0.03204600140452385,\n                          -0.3271070122718811,\n                          -0.06412599980831146,\n                          -0.6666669845581055,\n                          -0.7694699764251709,\n                          -0.3061000108718872,\n                          -0.18225300312042236,\n                          -0.9214379787445068,\n                          -0.38033199310302734,\n                          0.0000670000008540228,\n                          -0.9220880270004272,\n                          -0.3804430067539215,\n                          -0.00016799999866634607,\n                          -0.9071130156517029,\n                          -0.403003990650177,\n                          0.032437000423669815,\n                          0,\n                          0,\n                          -1,\n                          -0.6626030206680298,\n                          -0.04157499969005585,\n                          -0.272724986076355,\n                          -0.9969789981842041,\n                          -0.03082600049674511,\n                          -0.07129299640655518,\n                          -0.9975910186767578,\n                          -0.024447999894618988,\n                          -0.06492199748754501,\n                          -0.9925040006637573,\n                          -0.07630900293588638,\n                          0.09545700252056122,\n                          -0.49066001176834106,\n                          0.09618999809026718,\n                          -0.5,\n                          -0.27721700072288513,\n                          0.1851000040769577,\n                          -0.6666669845581055,\n                          -0.76139897108078,\n                          0.32566601037979126,\n                          -0.18199099600315094,\n                          -0.9939020276069641,\n                          0.062401000410318375,\n                          -0.09090700000524521,\n                          -0.9214360117912292,\n                          0.3803209960460663,\n                          -0.00007100000220816582,\n                          -0.9969729781150818,\n                          0.030918000265955925,\n                          0.07133600115776062,\n                          -0.9220889806747437,\n                          0.3804109990596771,\n                          0.0001630000042496249,\n                          -0.9975799918174744,\n                          0.02471200004220009,\n                          0.06498300284147263,\n                          -0.926891028881073,\n                          0.35510900616645813,\n                          0.03216100111603737,\n                          -0.9924740195274353,\n                          0.07657899707555771,\n                          -0.09555599838495255,\n                          -0.1851000040769577,\n                          0.27721700072288513,\n                          -0.6666669845581055,\n                          -0.5781109929084778,\n                          0.5929989814758301,\n                          -0.18205299973487854,\n                          -0.7048519849777222,\n                          0.7048519849777222,\n                          0,\n                          -0.7054179906845093,\n                          0.7052720189094543,\n                          -0.00002499999936844688,\n                          -0.7199410200119019,\n                          0.6835219860076904,\n                          0.03204600140452385,\n                          -0.06412599980831146,\n                          0.3271070122718811,\n                          -0.6666669845581055,\n                          -0.3061000108718872,\n                          0.7694699764251709,\n                          -0.18225300312042236,\n                          -0.38033199310302734,\n                          0.9214379787445068,\n                          0.0000670000008540228,\n                          -0.3804430067539215,\n                          0.9220880270004272,\n                          -0.00016799999866634607,\n                          -0.403003990650177,\n                          0.9071130156517029,\n                          0.032437000423669815,\n                          0,\n                          0,\n                          -1,\n                          -0.04157499969005585,\n                          0.6626030206680298,\n                          -0.272724986076355,\n                          -0.03082600049674511,\n                          0.9969789981842041,\n                          -0.07129299640655518,\n                          -0.024447999894618988,\n                          0.9975910186767578,\n                          -0.06492199748754501,\n                          -0.07630900293588638,\n                          0.9925040006637573,\n                          0.09545700252056122,\n                          0.07657899707555771,\n                          0.9924740195274353,\n                          -0.09555599838495255,\n                          0.40307098627090454,\n                          0.9070649743080139,\n                          -0.03255299851298332,\n                          0.3753640055656433,\n                          0.9070209860801697,\n                          0.000007000000096013537,\n                          0.18306200206279755,\n                          0.9820899963378906,\n                          -0.04457399994134903,\n                          0.3751649856567383,\n                          0.9065750241279602,\n                          -0.00007400000322377309,\n                          0.18801499903202057,\n                          0.9816100001335144,\n                          -0.03304100036621094,\n                          0.3759070038795471,\n                          0.908607006072998,\n                          -0.00026199998683296144,\n                          0.16623400151729584,\n                          0.983722984790802,\n                          -0.06822899729013443,\n                          0.33324098587036133,\n                          0.9290030002593994,\n                          0.029803000390529633,\n                          0.14071400463581085,\n                          0.9862040281295776,\n                          -0.08718100190162659,\n                          0.7198299765586853,\n                          0.6836559772491455,\n                          -0.032017000019550323,\n                          0.6943539977073669,\n                          0.6943539977073669,\n                          0,\n                          0.694034993648529,\n                          0.694034993648529,\n                          0,\n                          0.6955100297927856,\n                          0.6955100297927856,\n                          0,\n                          0.6639170050621033,\n                          0.7306150197982788,\n                          0.029100999236106873,\n                          0.9268649816513062,\n                          0.35523301362991333,\n                          -0.03203999996185303,\n                          0.9070209860801697,\n                          0.3753649890422821,\n                          -0.000007000000096013537,\n                          0.9065750241279602,\n                          0.3751649856567383,\n                          0.00007300000288523734,\n                          0.908607006072998,\n                          0.3759070038795471,\n                          0.00026199998683296144,\n                          0.8926259875297546,\n                          0.4211460053920746,\n                          0.028991999104619026,\n                          0.9924740195274353,\n                          0.07646500319242477,\n                          0.09565100073814392,\n                          0.9820899963378906,\n                          0.18306200206279755,\n                          0.04457399994134903,\n                          0.9816100001335144,\n                          0.18801499903202057,\n                          0.03304100036621094,\n                          0.983722984790802,\n                          0.16623400151729584,\n                          0.06822899729013443,\n                          0.9862040281295776,\n                          0.14071400463581085,\n                          0.08718100190162659,\n                          0.9924740195274353,\n                          -0.07657899707555771,\n                          -0.09555599838495255,\n                          0.9070649743080139,\n                          -0.40307098627090454,\n                          -0.03255299851298332,\n                          0.9070209860801697,\n                          -0.3753640055656433,\n                          0.000007000000096013537,\n                          0.9820899963378906,\n                          -0.18306200206279755,\n                          -0.04457399994134903,\n                          0.9065750241279602,\n                          -0.3751649856567383,\n                          -0.00007400000322377309,\n                          0.9816100001335144,\n                          -0.18801499903202057,\n                          -0.03304100036621094,\n                          0.908607006072998,\n                          -0.3759070038795471,\n                          -0.00026199998683296144,\n                          0.983722984790802,\n                          -0.16623400151729584,\n                          -0.06822899729013443,\n                          0.9290030002593994,\n                          -0.33324098587036133,\n                          0.029803000390529633,\n                          0.9862040281295776,\n                          -0.14071400463581085,\n                          -0.08718100190162659,\n                          0.6836559772491455,\n                          -0.7198299765586853,\n                          -0.032017000019550323,\n                          0.6943539977073669,\n                          -0.6943539977073669,\n                          0,\n                          0.694034993648529,\n                          -0.694034993648529,\n                          0,\n                          0.6955100297927856,\n                          -0.6955100297927856,\n                          0,\n                          0.7306150197982788,\n                          -0.6639170050621033,\n                          0.029100999236106873,\n                          0.35523301362991333,\n                          -0.9268649816513062,\n                          -0.03203999996185303,\n                          0.3753649890422821,\n                          -0.9070209860801697,\n                          -0.000007000000096013537,\n                          0.3751649856567383,\n                          -0.9065750241279602,\n                          0.00007300000288523734,\n                          0.3759070038795471,\n                          -0.908607006072998,\n                          0.00026199998683296144,\n                          0.4211460053920746,\n                          -0.8926259875297546,\n                          0.028991999104619026,\n                          0.07646500319242477,\n                          -0.9924740195274353,\n                          0.09565100073814392,\n                          0.18306200206279755,\n                          -0.9820899963378906,\n                          0.04457399994134903,\n                          0.18801499903202057,\n                          -0.9816100001335144,\n                          0.03304100036621094,\n                          0.16623400151729584,\n                          -0.983722984790802,\n                          0.06822899729013443,\n                          0.14071400463581085,\n                          -0.9862040281295776,\n                          0.08718100190162659,\n                          -0.07657899707555771,\n                          -0.9924740195274353,\n                          -0.09555599838495255,\n                          -0.40307098627090454,\n                          -0.9070649743080139,\n                          -0.03255299851298332,\n                          -0.3753640055656433,\n                          -0.9070209860801697,\n                          0.000007000000096013537,\n                          -0.18306200206279755,\n                          -0.9820899963378906,\n                          -0.04457399994134903,\n                          -0.3751649856567383,\n                          -0.9065750241279602,\n                          -0.00007400000322377309,\n                          -0.18801499903202057,\n                          -0.9816100001335144,\n                          -0.03304100036621094,\n                          -0.3759070038795471,\n                          -0.908607006072998,\n                          -0.00026199998683296144,\n                          -0.16623400151729584,\n                          -0.983722984790802,\n                          -0.06822899729013443,\n                          -0.33324098587036133,\n                          -0.9290030002593994,\n                          0.029803000390529633,\n                          -0.14071400463581085,\n                          -0.9862040281295776,\n                          -0.08718100190162659,\n                          -0.7198299765586853,\n                          -0.6836559772491455,\n                          -0.032017000019550323,\n                          -0.6943539977073669,\n                          -0.6943539977073669,\n                          0,\n                          -0.694034993648529,\n                          -0.694034993648529,\n                          0,\n                          -0.6955100297927856,\n                          -0.6955100297927856,\n                          0,\n                          -0.6639170050621033,\n                          -0.7306150197982788,\n                          0.029100999236106873,\n                          -0.9268649816513062,\n                          -0.35523301362991333,\n                          -0.03203999996185303,\n                          -0.9070209860801697,\n                          -0.3753649890422821,\n                          -0.000007000000096013537,\n                          -0.9065750241279602,\n                          -0.3751649856567383,\n                          0.00007300000288523734,\n                          -0.908607006072998,\n                          -0.3759070038795471,\n                          0.00026199998683296144,\n                          -0.8926259875297546,\n                          -0.4211460053920746,\n                          0.028991999104619026,\n                          -0.9924740195274353,\n                          -0.07646500319242477,\n                          0.09565100073814392,\n                          -0.9820899963378906,\n                          -0.18306200206279755,\n                          0.04457399994134903,\n                          -0.9816100001335144,\n                          -0.18801499903202057,\n                          0.03304100036621094,\n                          -0.983722984790802,\n                          -0.16623400151729584,\n                          0.06822899729013443,\n                          -0.9862040281295776,\n                          -0.14071400463581085,\n                          0.08718100190162659,\n                          -0.9924740195274353,\n                          0.07657899707555771,\n                          -0.09555599838495255,\n                          -0.9070649743080139,\n                          0.40307098627090454,\n                          -0.03255299851298332,\n                          -0.9070209860801697,\n                          0.3753640055656433,\n                          0.000007000000096013537,\n                          -0.9820899963378906,\n                          0.18306200206279755,\n                          -0.04457399994134903,\n                          -0.9065750241279602,\n                          0.3751649856567383,\n                          -0.00007400000322377309,\n                          -0.9816100001335144,\n                          0.18801499903202057,\n                          -0.03304100036621094,\n                          -0.908607006072998,\n                          0.3759070038795471,\n                          -0.00026199998683296144,\n                          -0.983722984790802,\n                          0.16623400151729584,\n                          -0.06822899729013443,\n                          -0.9290030002593994,\n                          0.33324098587036133,\n                          0.029803000390529633,\n                          -0.9862040281295776,\n                          0.14071400463581085,\n                          -0.08718100190162659,\n                          -0.6836559772491455,\n                          0.7198299765586853,\n                          -0.032017000019550323,\n                          -0.6943539977073669,\n                          0.6943539977073669,\n                          0,\n                          -0.694034993648529,\n                          0.694034993648529,\n                          0,\n                          -0.6955100297927856,\n                          0.6955100297927856,\n                          0,\n                          -0.7306150197982788,\n                          0.6639170050621033,\n                          0.029100999236106873,\n                          -0.35523301362991333,\n                          0.9268649816513062,\n                          -0.03203999996185303,\n                          -0.3753649890422821,\n                          0.9070209860801697,\n                          -0.000007000000096013537,\n                          -0.3751649856567383,\n                          0.9065750241279602,\n                          0.00007300000288523734,\n                          -0.3759070038795471,\n                          0.908607006072998,\n                          0.00026199998683296144,\n                          -0.4211460053920746,\n                          0.8926259875297546,\n                          0.028991999104619026,\n                          -0.07646500319242477,\n                          0.9924740195274353,\n                          0.09565100073814392,\n                          -0.18306200206279755,\n                          0.9820899963378906,\n                          0.04457399994134903,\n                          -0.18801499903202057,\n                          0.9816100001335144,\n                          0.03304100036621094,\n                          -0.16623400151729584,\n                          0.983722984790802,\n                          0.06822899729013443,\n                          -0.14071400463581085,\n                          0.9862040281295776,\n                          0.08718100190162659};\n\nfloat teapotBinormals[] = {0.2554270029067993,\n                           -0.05043400079011917,\n                           -0.9655119776725769,\n                           0.2302899956703186,\n                           -0.11379700154066086,\n                           -0.9664459824562073,\n                           -0.23653900623321533,\n                           0.09789499640464783,\n                           -0.9666780233383179,\n                           -0.2551180124282837,\n                           0.05037299916148186,\n                           -0.9655969738960266,\n                           -0.9201610088348389,\n                           0.38079801201820374,\n                           -0.09108299762010574,\n                           -0.9770479798316956,\n                           0.1929199993610382,\n                           -0.09032399952411652,\n                           -0.6762400269508362,\n                           0.2798590064048767,\n                           0.6814529895782471,\n                           -0.723800003528595,\n                           0.1429159939289093,\n                           0.6750479936599731,\n                           -0.4681990146636963,\n                           0.1581760048866272,\n                           0.869350016117096,\n                           -0.4902079999446869,\n                           0.09679199755191803,\n                           0.8662149906158447,\n                           0.16952399909496307,\n                           -0.1934960037469864,\n                           -0.9663439989089966,\n                           -0.18106800317764282,\n                           0.18106800317764282,\n                           -0.9666590094566345,\n                           -0.7041199803352356,\n                           0.7041199803352356,\n                           -0.09181900322437286,\n                           -0.5179349780082703,\n                           0.5179349780082703,\n                           0.6807990074157715,\n                           -0.37217798829078674,\n                           0.3260670006275177,\n                           0.8690019845962524,\n                           0.08221600204706192,\n                           -0.243368998169899,\n                           -0.9664430022239685,\n                           -0.09789499640464783,\n                           0.23653900623321533,\n                           -0.9666780233383179,\n                           -0.38079801201820374,\n                           0.9201610088348389,\n                           -0.09108199924230576,\n                           -0.2798590064048767,\n                           0.6762400269508362,\n                           0.6814540028572083,\n                           -0.21894000470638275,\n                           0.44305500388145447,\n                           0.8693490028381348,\n                           0.050822000950574875,\n                           -0.2573910057544708,\n                           -0.9649699926376343,\n                           -0.05021600052714348,\n                           0.25432100892066956,\n                           -0.965815007686615,\n                           -0.19291600584983826,\n                           0.9770249724388123,\n                           -0.09059000015258789,\n                           -0.14291299879550934,\n                           0.7237870097160339,\n                           0.6750609874725342,\n                           -0.09679199755191803,\n                           0.4902079999446869,\n                           0.8662149906158447,\n                           -0.048507001250982285,\n                           -0.2576940059661865,\n                           -0.965008020401001,\n                           -0.15833300352096558,\n                           -0.3227809965610504,\n                           -0.933135986328125,\n                           0.05656199902296066,\n                           0.13793900609016418,\n                           -0.9888240098953247,\n                           0.049150001257658005,\n                           0.2545199990272522,\n                           -0.9658179879188538,\n                           0.378387987613678,\n                           0.9173290133476257,\n                           -0.12381099909543991,\n                           0.1917950063943863,\n                           0.9772530198097229,\n                           -0.09050799906253815,\n                           0.2777239978313446,\n                           0.6716070175170898,\n                           0.6868870258331299,\n                           0.14281700551509857,\n                           0.7238019704818726,\n                           0.6750659942626953,\n                           0.15788200497627258,\n                           0.4674209952354431,\n                           0.8698220252990723,\n                           0.09679199755191803,\n                           0.4902079999446869,\n                           0.8662149906158447,\n                           -0.3139069974422455,\n                           -0.2657270133495331,\n                           -0.9115110039710999,\n                           0.05247500166296959,\n                           0.05178600177168846,\n                           -0.9972789883613586,\n                           0.699787974357605,\n                           0.6969379782676697,\n                           -0.15676100552082062,\n                           0.511929988861084,\n                           0.5116159915924072,\n                           0.6900550127029419,\n                           0.32515400648117065,\n                           0.37111398577690125,\n                           0.8697980046272278,\n                           -0.3181929886341095,\n                           -0.09987600147724152,\n                           -0.9427499771118164,\n                           0.1552799940109253,\n                           0.06176299974322319,\n                           -0.9859380125999451,\n                           0.9187250137329102,\n                           0.3751460015773773,\n                           -0.1233299970626831,\n                           0.6724870204925537,\n                           0.2775439918041229,\n                           0.6860979795455933,\n                           0.4424299895763397,\n                           0.21853800117969513,\n                           0.8697689771652222,\n                           -0.255948007106781,\n                           -0.04464200139045715,\n                           -0.9656590223312378,\n                           0.25306200981140137,\n                           0.046362001448869705,\n                           -0.9663389921188354,\n                           0.9778940081596375,\n                           0.18800100684165955,\n                           -0.09153299778699875,\n                           0.7238150238990784,\n                           0.14205799996852875,\n                           0.675212025642395,\n                           0.49017900228500366,\n                           0.0967010036110878,\n                           0.8662409782409668,\n                           -0.25491899251937866,\n                           0.05033399909734726,\n                           -0.9656509757041931,\n                           -0.2302899956703186,\n                           0.11379700154066086,\n                           -0.9664459824562073,\n                           0.23653900623321533,\n                           -0.09789499640464783,\n                           -0.9666780233383179,\n                           0.252265989780426,\n                           -0.04980999976396561,\n                           -0.9663749933242798,\n                           0.9201610088348389,\n                           -0.38079801201820374,\n                           -0.09108299762010574,\n                           0.9769039750099182,\n                           -0.19289200007915497,\n                           -0.09193000197410583,\n                           0.6762400269508362,\n                           -0.2798590064048767,\n                           0.6814529895782471,\n                           0.7236610054969788,\n                           -0.14288799464702606,\n                           0.6752020120620728,\n                           0.4681990146636963,\n                           -0.1581760048866272,\n                           0.869350016117096,\n                           0.4901660084724426,\n                           -0.09678400307893753,\n                           0.8662390112876892,\n                           -0.16952399909496307,\n                           0.1934960037469864,\n                           -0.9663439989089966,\n                           0.18106800317764282,\n                           -0.18106800317764282,\n                           -0.9666590094566345,\n                           0.7041199803352356,\n                           -0.7041199803352356,\n                           -0.09181900322437286,\n                           0.5179349780082703,\n                           -0.5179349780082703,\n                           0.6807990074157715,\n                           0.37217798829078674,\n                           -0.3260670006275177,\n                           0.8690019845962524,\n                           -0.08221600204706192,\n                           0.243368998169899,\n                           -0.9664430022239685,\n                           0.09789499640464783,\n                           -0.23653900623321533,\n                           -0.9666780233383179,\n                           0.38079801201820374,\n                           -0.9201610088348389,\n                           -0.09108199924230576,\n                           0.2798590064048767,\n                           -0.6762400269508362,\n                           0.6814540028572083,\n                           0.21894000470638275,\n                           -0.44305500388145447,\n                           0.8693490028381348,\n                           -0.05043400079011917,\n                           0.2554270029067993,\n                           -0.9655119776725769,\n                           0.05037299916148186,\n                           -0.2551180124282837,\n                           -0.9655969738960266,\n                           0.1929199993610382,\n                           -0.9770479798316956,\n                           -0.09032399952411652,\n                           0.1429159939289093,\n                           -0.723800003528595,\n                           0.6750479936599731,\n                           0.09679199755191803,\n                           -0.4902079999446869,\n                           0.8662149906158447,\n                           0.05043400079011917,\n                           0.2554270029067993,\n                           -0.9655119776725769,\n                           0.11379700154066086,\n                           0.2302899956703186,\n                           -0.9664459824562073,\n                           -0.09789499640464783,\n                           -0.23653900623321533,\n                           -0.9666780233383179,\n                           -0.05037299916148186,\n                           -0.2551180124282837,\n                           -0.9655969738960266,\n                           -0.38079801201820374,\n                           -0.9201610088348389,\n                           -0.09108299762010574,\n                           -0.1929199993610382,\n                           -0.9770479798316956,\n                           -0.09032399952411652,\n                           -0.2798590064048767,\n                           -0.6762400269508362,\n                           0.6814529895782471,\n                           -0.1429159939289093,\n                           -0.723800003528595,\n                           0.6750479936599731,\n                           -0.1581760048866272,\n                           -0.4681990146636963,\n                           0.869350016117096,\n                           -0.09679199755191803,\n                           -0.4902079999446869,\n                           0.8662149906158447,\n                           0.1934960037469864,\n                           0.16952399909496307,\n                           -0.9663439989089966,\n                           -0.18106800317764282,\n                           -0.18106800317764282,\n                           -0.9666590094566345,\n                           -0.7041199803352356,\n                           -0.7041199803352356,\n                           -0.09181900322437286,\n                           -0.5179349780082703,\n                           -0.5179349780082703,\n                           0.6807990074157715,\n                           -0.3260670006275177,\n                           -0.37217798829078674,\n                           0.8690019845962524,\n                           0.243368998169899,\n                           0.08221600204706192,\n                           -0.9664430022239685,\n                           -0.23653900623321533,\n                           -0.09789499640464783,\n                           -0.9666780233383179,\n                           -0.9201610088348389,\n                           -0.38079801201820374,\n                           -0.09108199924230576,\n                           -0.6762400269508362,\n                           -0.2798590064048767,\n                           0.6814540028572083,\n                           -0.44305500388145447,\n                           -0.21894000470638275,\n                           0.8693490028381348,\n                           0.2554270029067993,\n                           0.05043400079011917,\n                           -0.9655119776725769,\n                           -0.2551180124282837,\n                           -0.05037299916148186,\n                           -0.9655969738960266,\n                           -0.9770479798316956,\n                           -0.1929199993610382,\n                           -0.09032399952411652,\n                           -0.723800003528595,\n                           -0.1429159939289093,\n                           0.6750479936599731,\n                           -0.4902079999446869,\n                           -0.09679199755191803,\n                           0.8662149906158447,\n                           -0.4902079999446869,\n                           0.09679199755191803,\n                           0.8662149906158447,\n                           -0.44305500388145447,\n                           0.21893900632858276,\n                           0.8693490028381348,\n                           -0.37287598848342896,\n                           0.15431199967861176,\n                           0.9149600267410278,\n                           -0.4014579951763153,\n                           0.07926800101995468,\n                           0.9124410152435303,\n                           -0.3112579882144928,\n                           0.12881100177764893,\n                           0.9415550231933594,\n                           -0.33541300892829895,\n                           0.0662280023097992,\n                           0.939740002155304,\n                           -0.19015200436115265,\n                           0.07869099825620651,\n                           0.9785959720611572,\n                           -0.20517399907112122,\n                           0.040511999279260635,\n                           0.977886974811554,\n                           0.06301800161600113,\n                           -0.021289000287652016,\n                           0.9977849721908569,\n                           0.06623400002717972,\n                           -0.013078000396490097,\n                           0.9977179765701294,\n                           -0.3260670006275177,\n                           0.37217798829078674,\n                           0.8690019845962524,\n                           -0.285739004611969,\n                           0.285739004611969,\n                           0.9147170186042786,\n                           -0.23854400217533112,\n                           0.23854400217533112,\n                           0.9413790106773376,\n                           -0.14574900269508362,\n                           0.14574900269508362,\n                           0.9785270094871521,\n                           0.05011200159788132,\n                           -0.04390300065279007,\n                           0.9977779984474182,\n                           -0.1581760048866272,\n                           0.4681999981403351,\n                           0.869350016117096,\n                           -0.15431199967861176,\n                           0.37287598848342896,\n                           0.9149600267410278,\n                           -0.12881100177764893,\n                           0.3112579882144928,\n                           0.9415550231933594,\n                           -0.07869099825620651,\n                           0.19015100598335266,\n                           0.9785959720611572,\n                           0.02946699969470501,\n                           -0.05963199958205223,\n                           0.9977849721908569,\n                           -0.09679199755191803,\n                           0.4902079999446869,\n                           0.8662149906158447,\n                           -0.07926800101995468,\n                           0.4014579951763153,\n                           0.9124410152435303,\n                           -0.0662280023097992,\n                           0.33541300892829895,\n                           0.939740002155304,\n                           -0.040511999279260635,\n                           0.20517399907112122,\n                           0.977886974811554,\n                           0.013078000396490097,\n                           -0.06623400002717972,\n                           0.9977179765701294,\n                           0.09679199755191803,\n                           0.4902079999446869,\n                           0.8662149906158447,\n                           0.21858200430870056,\n                           0.4423219859600067,\n                           0.86981201171875,\n                           0.15431199967861176,\n                           0.37287598848342896,\n                           0.9149600267410278,\n                           0.07926800101995468,\n                           0.4014579951763153,\n                           0.9124410152435303,\n                           0.12881100177764893,\n                           0.3112579882144928,\n                           0.9415550231933594,\n                           0.0662280023097992,\n                           0.33541300892829895,\n                           0.939740002155304,\n                           0.07869099825620651,\n                           0.19015200436115265,\n                           0.9785959720611572,\n                           0.040511999279260635,\n                           0.20517399907112122,\n                           0.977886974811554,\n                           -0.021289000287652016,\n                           -0.06301800161600113,\n                           0.9977849721908569,\n                           -0.013078000396490097,\n                           -0.06623400002717972,\n                           0.9977179765701294,\n                           0.3711329996585846,\n                           0.3251489996910095,\n                           0.8697919845581055,\n                           0.285739004611969,\n                           0.285739004611969,\n                           0.9147170186042786,\n                           0.23854400217533112,\n                           0.23854400217533112,\n                           0.9413790106773376,\n                           0.14574900269508362,\n                           0.14574900269508362,\n                           0.9785270094871521,\n                           -0.04390300065279007,\n                           -0.05011200159788132,\n                           0.9977779984474182,\n                           0.46750199794769287,\n                           0.15794099867343903,\n                           0.8697680234909058,\n                           0.37287598848342896,\n                           0.15431199967861176,\n                           0.9149600267410278,\n                           0.3112579882144928,\n                           0.12881100177764893,\n                           0.9415550231933594,\n                           0.19015100598335266,\n                           0.07869099825620651,\n                           0.9785959720611572,\n                           -0.05963199958205223,\n                           -0.02946699969470501,\n                           0.9977849721908569,\n                           0.49017900228500366,\n                           0.0967010036110878,\n                           0.8662409782409668,\n                           0.4014579951763153,\n                           0.07926800101995468,\n                           0.9124410152435303,\n                           0.33541300892829895,\n                           0.0662280023097992,\n                           0.939740002155304,\n                           0.20517399907112122,\n                           0.040511999279260635,\n                           0.977886974811554,\n                           -0.06623400002717972,\n                           -0.013078000396490097,\n                           0.9977179765701294,\n                           0.4901660084724426,\n                           -0.09678400307893753,\n                           0.8662390112876892,\n                           0.44305500388145447,\n                           -0.21893900632858276,\n                           0.8693490028381348,\n                           0.37287598848342896,\n                           -0.15431199967861176,\n                           0.9149600267410278,\n                           0.4014579951763153,\n                           -0.07926800101995468,\n                           0.9124410152435303,\n                           0.3112579882144928,\n                           -0.12881100177764893,\n                           0.9415550231933594,\n                           0.33541300892829895,\n                           -0.0662280023097992,\n                           0.939740002155304,\n                           0.19015200436115265,\n                           -0.07869099825620651,\n                           0.9785959720611572,\n                           0.20517399907112122,\n                           -0.040511999279260635,\n                           0.977886974811554,\n                           -0.06301800161600113,\n                           0.021289000287652016,\n                           0.9977849721908569,\n                           -0.06623400002717972,\n                           0.013078000396490097,\n                           0.9977179765701294,\n                           0.3260670006275177,\n                           -0.37217798829078674,\n                           0.8690019845962524,\n                           0.285739004611969,\n                           -0.285739004611969,\n                           0.9147170186042786,\n                           0.23854400217533112,\n                           -0.23854400217533112,\n                           0.9413790106773376,\n                           0.14574900269508362,\n                           -0.14574900269508362,\n                           0.9785270094871521,\n                           -0.05011200159788132,\n                           0.04390300065279007,\n                           0.9977779984474182,\n                           0.1581760048866272,\n                           -0.4681999981403351,\n                           0.869350016117096,\n                           0.15431199967861176,\n                           -0.37287598848342896,\n                           0.9149600267410278,\n                           0.12881100177764893,\n                           -0.3112579882144928,\n                           0.9415550231933594,\n                           0.07869099825620651,\n                           -0.19015100598335266,\n                           0.9785959720611572,\n                           -0.02946699969470501,\n                           0.05963199958205223,\n                           0.9977849721908569,\n                           0.09679199755191803,\n                           -0.4902079999446869,\n                           0.8662149906158447,\n                           0.07926800101995468,\n                           -0.4014579951763153,\n                           0.9124410152435303,\n                           0.0662280023097992,\n                           -0.33541300892829895,\n                           0.939740002155304,\n                           0.040511999279260635,\n                           -0.20517399907112122,\n                           0.977886974811554,\n                           -0.013078000396490097,\n                           0.06623400002717972,\n                           0.9977179765701294,\n                           -0.09679199755191803,\n                           -0.4902079999446869,\n                           0.8662149906158447,\n                           -0.21893900632858276,\n                           -0.44305500388145447,\n                           0.8693490028381348,\n                           -0.15431199967861176,\n                           -0.37287598848342896,\n                           0.9149600267410278,\n                           -0.07926800101995468,\n                           -0.4014579951763153,\n                           0.9124410152435303,\n                           -0.12881100177764893,\n                           -0.3112579882144928,\n                           0.9415550231933594,\n                           -0.0662280023097992,\n                           -0.33541300892829895,\n                           0.939740002155304,\n                           -0.07869099825620651,\n                           -0.19015200436115265,\n                           0.9785959720611572,\n                           -0.040511999279260635,\n                           -0.20517399907112122,\n                           0.977886974811554,\n                           0.021289000287652016,\n                           0.06301800161600113,\n                           0.9977849721908569,\n                           0.013078000396490097,\n                           0.06623400002717972,\n                           0.9977179765701294,\n                           -0.37217798829078674,\n                           -0.3260670006275177,\n                           0.8690019845962524,\n                           -0.285739004611969,\n                           -0.285739004611969,\n                           0.9147170186042786,\n                           -0.23854400217533112,\n                           -0.23854400217533112,\n                           0.9413790106773376,\n                           -0.14574900269508362,\n                           -0.14574900269508362,\n                           0.9785270094871521,\n                           0.04390300065279007,\n                           0.05011200159788132,\n                           0.9977779984474182,\n                           -0.4681999981403351,\n                           -0.1581760048866272,\n                           0.869350016117096,\n                           -0.37287598848342896,\n                           -0.15431199967861176,\n                           0.9149600267410278,\n                           -0.3112579882144928,\n                           -0.12881100177764893,\n                           0.9415550231933594,\n                           -0.19015100598335266,\n                           -0.07869099825620651,\n                           0.9785959720611572,\n                           0.05963199958205223,\n                           0.02946699969470501,\n                           0.9977849721908569,\n                           -0.4902079999446869,\n                           -0.09679199755191803,\n                           0.8662149906158447,\n                           -0.4014579951763153,\n                           -0.07926800101995468,\n                           0.9124410152435303,\n                           -0.33541300892829895,\n                           -0.0662280023097992,\n                           0.939740002155304,\n                           -0.20517399907112122,\n                           -0.040511999279260635,\n                           0.977886974811554,\n                           0.06623400002717972,\n                           0.013078000396490097,\n                           0.9977179765701294,\n                           0.06623400002717972,\n                           -0.013078000396490097,\n                           0.9977179765701294,\n                           0.05963199958205223,\n                           -0.02946699969470501,\n                           0.9977849721908569,\n                           0.40303200483322144,\n                           -0.1667889952659607,\n                           0.8998590111732483,\n                           0.4339120090007782,\n                           -0.08567699790000916,\n                           0.8968719840049744,\n                           0.6326310038566589,\n                           -0.2618109881877899,\n                           0.7288579940795898,\n                           0.6777120232582092,\n                           -0.13381600379943848,\n                           0.723048985004425,\n                           0.6661339998245239,\n                           -0.27567601203918457,\n                           0.6930140256881714,\n                           0.7128540277481079,\n                           -0.14075499773025513,\n                           0.6870430111885071,\n                           0.5777599811553955,\n                           -0.19519099593162537,\n                           0.792523980140686,\n                           0.6036490201950073,\n                           -0.11919199675321579,\n                           0.7882900238037109,\n                           0.04390300065279007,\n                           -0.05011200159788132,\n                           0.9977779984474182,\n                           0.30884799361228943,\n                           -0.30884799361228943,\n                           0.8995699882507324,\n                           0.48457300662994385,\n                           -0.48457300662994385,\n                           0.7282710075378418,\n                           0.510138988494873,\n                           -0.510138988494873,\n                           0.6924710273742676,\n                           0.4591110050678253,\n                           -0.40222999453544617,\n                           0.7921029925346375,\n                           0.021289000287652016,\n                           -0.06301800161600113,\n                           0.9977849721908569,\n                           0.16678999364376068,\n                           -0.40303200483322144,\n                           0.8998590111732483,\n                           0.2618109881877899,\n                           -0.6326310038566589,\n                           0.7288579940795898,\n                           0.27567601203918457,\n                           -0.6661339998245239,\n                           0.6930140256881714,\n                           0.2701770067214966,\n                           -0.546737015247345,\n                           0.7925170063972473,\n                           0.013078000396490097,\n                           -0.06623400002717972,\n                           0.9977179765701294,\n                           0.08567599952220917,\n                           -0.4339120090007782,\n                           0.8968719840049744,\n                           0.13381600379943848,\n                           -0.6777120232582092,\n                           0.723048985004425,\n                           0.14075499773025513,\n                           -0.7128540277481079,\n                           0.6870430111885071,\n                           0.11919199675321579,\n                           -0.6036490201950073,\n                           0.7882900238037109,\n                           -0.013078000396490097,\n                           -0.06623400002717972,\n                           0.9977179765701294,\n                           -0.02946699969470501,\n                           -0.05963199958205223,\n                           0.9977849721908569,\n                           -0.1667889952659607,\n                           -0.40303200483322144,\n                           0.8998590111732483,\n                           -0.08567699790000916,\n                           -0.4339120090007782,\n                           0.8968719840049744,\n                           -0.2618109881877899,\n                           -0.6326310038566589,\n                           0.7288579940795898,\n                           -0.13381600379943848,\n                           -0.6777120232582092,\n                           0.723048985004425,\n                           -0.27567601203918457,\n                           -0.6661339998245239,\n                           0.6930140256881714,\n                           -0.14075499773025513,\n                           -0.7128540277481079,\n                           0.6870430111885071,\n                           -0.19519099593162537,\n                           -0.5777599811553955,\n                           0.792523980140686,\n                           -0.11919199675321579,\n                           -0.6036490201950073,\n                           0.7882900238037109,\n                           -0.05011200159788132,\n                           -0.04390300065279007,\n                           0.9977779984474182,\n                           -0.30884799361228943,\n                           -0.30884799361228943,\n                           0.8995699882507324,\n                           -0.48457300662994385,\n                           -0.48457300662994385,\n                           0.7282710075378418,\n                           -0.510138988494873,\n                           -0.510138988494873,\n                           0.6924710273742676,\n                           -0.40222999453544617,\n                           -0.4591110050678253,\n                           0.7921029925346375,\n                           -0.06301800161600113,\n                           -0.021289000287652016,\n                           0.9977849721908569,\n                           -0.40303200483322144,\n                           -0.16678999364376068,\n                           0.8998590111732483,\n                           -0.6326310038566589,\n                           -0.2618109881877899,\n                           0.7288579940795898,\n                           -0.6661339998245239,\n                           -0.27567601203918457,\n                           0.6930140256881714,\n                           -0.546737015247345,\n                           -0.2701770067214966,\n                           0.7925170063972473,\n                           -0.06623400002717972,\n                           -0.013078000396490097,\n                           0.9977179765701294,\n                           -0.4339120090007782,\n                           -0.08567599952220917,\n                           0.8968719840049744,\n                           -0.6777120232582092,\n                           -0.13381600379943848,\n                           0.723048985004425,\n                           -0.7128540277481079,\n                           -0.14075499773025513,\n                           0.6870430111885071,\n                           -0.6036490201950073,\n                           -0.11919199675321579,\n                           0.7882900238037109,\n                           -0.06623400002717972,\n                           0.013078000396490097,\n                           0.9977179765701294,\n                           -0.05963199958205223,\n                           0.02946699969470501,\n                           0.9977849721908569,\n                           -0.40303200483322144,\n                           0.1667889952659607,\n                           0.8998590111732483,\n                           -0.4339120090007782,\n                           0.08567699790000916,\n                           0.8968719840049744,\n                           -0.6326310038566589,\n                           0.2618109881877899,\n                           0.7288579940795898,\n                           -0.6777120232582092,\n                           0.13381600379943848,\n                           0.723048985004425,\n                           -0.6661339998245239,\n                           0.27567601203918457,\n                           0.6930140256881714,\n                           -0.7128540277481079,\n                           0.14075499773025513,\n                           0.6870430111885071,\n                           -0.5777599811553955,\n                           0.19519099593162537,\n                           0.792523980140686,\n                           -0.6036490201950073,\n                           0.11919199675321579,\n                           0.7882900238037109,\n                           -0.04390300065279007,\n                           0.05011200159788132,\n                           0.9977779984474182,\n                           -0.30884799361228943,\n                           0.30884799361228943,\n                           0.8995699882507324,\n                           -0.48457300662994385,\n                           0.48457300662994385,\n                           0.7282710075378418,\n                           -0.510138988494873,\n                           0.510138988494873,\n                           0.6924710273742676,\n                           -0.4591110050678253,\n                           0.40222999453544617,\n                           0.7921029925346375,\n                           -0.021289000287652016,\n                           0.06301800161600113,\n                           0.9977849721908569,\n                           -0.16678999364376068,\n                           0.40303200483322144,\n                           0.8998590111732483,\n                           -0.2618109881877899,\n                           0.6326310038566589,\n                           0.7288579940795898,\n                           -0.27567601203918457,\n                           0.6661339998245239,\n                           0.6930140256881714,\n                           -0.2701770067214966,\n                           0.546737015247345,\n                           0.7925170063972473,\n                           -0.013078000396490097,\n                           0.06623400002717972,\n                           0.9977179765701294,\n                           -0.08567599952220917,\n                           0.4339120090007782,\n                           0.8968719840049744,\n                           -0.13381600379943848,\n                           0.6777120232582092,\n                           0.723048985004425,\n                           -0.14075499773025513,\n                           0.7128540277481079,\n                           0.6870430111885071,\n                           -0.11919199675321579,\n                           0.6036490201950073,\n                           0.7882900238037109,\n                           0.013078000396490097,\n                           0.06623400002717972,\n                           0.9977179765701294,\n                           0.02946699969470501,\n                           0.05963199958205223,\n                           0.9977849721908569,\n                           0.1667889952659607,\n                           0.40303200483322144,\n                           0.8998590111732483,\n                           0.08567699790000916,\n                           0.4339120090007782,\n                           0.8968719840049744,\n                           0.2618109881877899,\n                           0.6326310038566589,\n                           0.7288579940795898,\n                           0.13381600379943848,\n                           0.6777120232582092,\n                           0.723048985004425,\n                           0.27567601203918457,\n                           0.6661339998245239,\n                           0.6930140256881714,\n                           0.14075499773025513,\n                           0.7128540277481079,\n                           0.6870430111885071,\n                           0.19519099593162537,\n                           0.5777599811553955,\n                           0.792523980140686,\n                           0.11919199675321579,\n                           0.6036490201950073,\n                           0.7882900238037109,\n                           0.05011200159788132,\n                           0.04390300065279007,\n                           0.9977779984474182,\n                           0.30884799361228943,\n                           0.30884799361228943,\n                           0.8995699882507324,\n                           0.48457300662994385,\n                           0.48457300662994385,\n                           0.7282710075378418,\n                           0.510138988494873,\n                           0.510138988494873,\n                           0.6924710273742676,\n                           0.40222999453544617,\n                           0.4591110050678253,\n                           0.7921029925346375,\n                           0.06301800161600113,\n                           0.021289000287652016,\n                           0.9977849721908569,\n                           0.40303200483322144,\n                           0.16678999364376068,\n                           0.8998590111732483,\n                           0.6326310038566589,\n                           0.2618109881877899,\n                           0.7288579940795898,\n                           0.6661339998245239,\n                           0.27567601203918457,\n                           0.6930140256881714,\n                           0.546737015247345,\n                           0.2701770067214966,\n                           0.7925170063972473,\n                           0.06623400002717972,\n                           0.013078000396490097,\n                           0.9977179765701294,\n                           0.4339120090007782,\n                           0.08567599952220917,\n                           0.8968719840049744,\n                           0.6777120232582092,\n                           0.13381600379943848,\n                           0.723048985004425,\n                           0.7128540277481079,\n                           0.14075499773025513,\n                           0.6870430111885071,\n                           0.6036490201950073,\n                           0.11919199675321579,\n                           0.7882900238037109,\n                           0.6036490201950073,\n                           -0.11919199675321579,\n                           0.7882900238037109,\n                           0.546737015247345,\n                           -0.2701770067214966,\n                           0.7925170063972473,\n                           0.7223830223083496,\n                           -0.2989569902420044,\n                           0.623528003692627,\n                           0.7723940014839172,\n                           -0.15251100063323975,\n                           0.616562008857727,\n                           0.9094089865684509,\n                           -0.3763520121574402,\n                           0.1770150065422058,\n                           0.9660869836807251,\n                           -0.19075599312782288,\n                           0.1740349978208542,\n                           0.9408230185508728,\n                           -0.3353259861469269,\n                           0.04907499998807907,\n                           0.9843119978904724,\n                           -0.16964000463485718,\n                           0.048493001610040665,\n                           0.9810580015182495,\n                           -0.1937119960784912,\n                           0,\n                           0.7071070075035095,\n                           -0.7071070075035095,\n                           0,\n                           0.40222999453544617,\n                           -0.4591110050678253,\n                           0.7921029925346375,\n                           0.5532029867172241,\n                           -0.5532029867172241,\n                           0.622842013835907,\n                           0.6959879994392395,\n                           -0.6959879994392395,\n                           0.17663900554180145,\n                           0.7403979897499084,\n                           -0.6703829765319824,\n                           0.048958998173475266,\n                           0.8310419917106628,\n                           -0.5562090277671814,\n                           0,\n                           0.19519099593162537,\n                           -0.5777599811553955,\n                           0.792523980140686,\n                           0.2989560067653656,\n                           -0.7223830223083496,\n                           0.623528003692627,\n                           0.3763520121574402,\n                           -0.9094089865684509,\n                           0.1770150065422058,\n                           0.4275760054588318,\n                           -0.902646005153656,\n                           0.04906899854540825,\n                           0.5562090277671814,\n                           -0.8310419917106628,\n                           0,\n                           0.11919199675321579,\n                           -0.6036490201950073,\n                           0.7882900238037109,\n                           0.15251100063323975,\n                           -0.7723940014839172,\n                           0.616562008857727,\n                           0.19075599312782288,\n                           -0.9660869836807251,\n                           0.1740349978208542,\n                           0.19348600506782532,\n                           -0.9799140095710754,\n                           0.048277001827955246,\n                           0.1937119960784912,\n                           -0.9810580015182495,\n                           0,\n                           -0.11919199675321579,\n                           -0.6036490201950073,\n                           0.7882900238037109,\n                           -0.2701770067214966,\n                           -0.546737015247345,\n                           0.7925170063972473,\n                           -0.2989569902420044,\n                           -0.7223830223083496,\n                           0.623528003692627,\n                           -0.15251100063323975,\n                           -0.7723940014839172,\n                           0.616562008857727,\n                           -0.3763520121574402,\n                           -0.9094089865684509,\n                           0.1770150065422058,\n                           -0.19075599312782288,\n                           -0.9660869836807251,\n                           0.1740349978208542,\n                           -0.3353259861469269,\n                           -0.9408230185508728,\n                           0.04907499998807907,\n                           -0.16964000463485718,\n                           -0.9843119978904724,\n                           0.04849399998784065,\n                           -0.1937119960784912,\n                           -0.9810580015182495,\n                           0,\n                           0.7071070075035095,\n                           -0.7071070075035095,\n                           0,\n                           -0.4591110050678253,\n                           -0.40222999453544617,\n                           0.7921029925346375,\n                           -0.5532029867172241,\n                           -0.5532029867172241,\n                           0.622842013835907,\n                           -0.6959879994392395,\n                           -0.6959879994392395,\n                           0.17663900554180145,\n                           -0.6703829765319824,\n                           -0.7403979897499084,\n                           0.048958998173475266,\n                           -0.5562090277671814,\n                           -0.8310419917106628,\n                           0,\n                           -0.5777599811553955,\n                           -0.19519099593162537,\n                           0.792523980140686,\n                           -0.7223830223083496,\n                           -0.2989560067653656,\n                           0.623528003692627,\n                           -0.9094089865684509,\n                           -0.3763520121574402,\n                           0.1770150065422058,\n                           -0.902646005153656,\n                           -0.4275760054588318,\n                           0.04906899854540825,\n                           -0.8310419917106628,\n                           -0.5562090277671814,\n                           0,\n                           -0.6036490201950073,\n                           -0.11919199675321579,\n                           0.7882900238037109,\n                           -0.7723940014839172,\n                           -0.15251100063323975,\n                           0.616562008857727,\n                           -0.9660869836807251,\n                           -0.19075599312782288,\n                           0.1740349978208542,\n                           -0.9799140095710754,\n                           -0.19348600506782532,\n                           0.048277001827955246,\n                           -0.9810580015182495,\n                           -0.1937119960784912,\n                           0,\n                           -0.6036490201950073,\n                           0.11919199675321579,\n                           0.7882900238037109,\n                           -0.546737015247345,\n                           0.2701770067214966,\n                           0.7925170063972473,\n                           -0.7223830223083496,\n                           0.2989569902420044,\n                           0.623528003692627,\n                           -0.7723940014839172,\n                           0.15251100063323975,\n                           0.616562008857727,\n                           -0.9094089865684509,\n                           0.3763520121574402,\n                           0.1770150065422058,\n                           -0.9660869836807251,\n                           0.19075599312782288,\n                           0.1740349978208542,\n                           -0.9408230185508728,\n                           0.3353259861469269,\n                           0.04907499998807907,\n                           -0.9843119978904724,\n                           0.16964000463485718,\n                           0.04849399998784065,\n                           -0.9810580015182495,\n                           0.1937119960784912,\n                           0,\n                           0.7071070075035095,\n                           -0.7071070075035095,\n                           0,\n                           -0.40222999453544617,\n                           0.4591110050678253,\n                           0.7921029925346375,\n                           -0.5532029867172241,\n                           0.5532029867172241,\n                           0.622842013835907,\n                           -0.6959879994392395,\n                           0.6959879994392395,\n                           0.17663900554180145,\n                           -0.7403979897499084,\n                           0.6703829765319824,\n                           0.048958998173475266,\n                           -0.8310419917106628,\n                           0.5562090277671814,\n                           0,\n                           -0.19519099593162537,\n                           0.5777599811553955,\n                           0.792523980140686,\n                           -0.2989560067653656,\n                           0.7223830223083496,\n                           0.623528003692627,\n                           -0.3763520121574402,\n                           0.9094089865684509,\n                           0.1770150065422058,\n                           -0.4275760054588318,\n                           0.902646005153656,\n                           0.04906899854540825,\n                           -0.5562090277671814,\n                           0.8310419917106628,\n                           0,\n                           -0.11919199675321579,\n                           0.6036490201950073,\n                           0.7882900238037109,\n                           -0.15251100063323975,\n                           0.7723940014839172,\n                           0.616562008857727,\n                           -0.19075599312782288,\n                           0.9660869836807251,\n                           0.1740349978208542,\n                           -0.19348600506782532,\n                           0.9799140095710754,\n                           0.048277001827955246,\n                           -0.1937119960784912,\n                           0.9810580015182495,\n                           0,\n                           0.11919199675321579,\n                           0.6036490201950073,\n                           0.7882900238037109,\n                           0.2701770067214966,\n                           0.546737015247345,\n                           0.7925170063972473,\n                           0.2989569902420044,\n                           0.7223830223083496,\n                           0.623528003692627,\n                           0.15251100063323975,\n                           0.7723940014839172,\n                           0.616562008857727,\n                           0.3763520121574402,\n                           0.9094089865684509,\n                           0.1770150065422058,\n                           0.19075599312782288,\n                           0.9660869836807251,\n                           0.1740349978208542,\n                           0.3353259861469269,\n                           0.9408230185508728,\n                           0.04907499998807907,\n                           0.16964000463485718,\n                           0.9843119978904724,\n                           0.04849399998784065,\n                           0.1937119960784912,\n                           0.9810580015182495,\n                           0,\n                           0.7071070075035095,\n                           -0.7071070075035095,\n                           0,\n                           0.4591110050678253,\n                           0.40222999453544617,\n                           0.7921029925346375,\n                           0.5532029867172241,\n                           0.5532029867172241,\n                           0.622842013835907,\n                           0.6959879994392395,\n                           0.6959879994392395,\n                           0.17663900554180145,\n                           0.6703829765319824,\n                           0.7403979897499084,\n                           0.048958998173475266,\n                           0.5562090277671814,\n                           0.8310419917106628,\n                           0,\n                           0.5777599811553955,\n                           0.19519099593162537,\n                           0.792523980140686,\n                           0.7223830223083496,\n                           0.2989560067653656,\n                           0.623528003692627,\n                           0.9094089865684509,\n                           0.3763520121574402,\n                           0.1770150065422058,\n                           0.902646005153656,\n                           0.4275760054588318,\n                           0.04906899854540825,\n                           0.8310419917106628,\n                           0.5562090277671814,\n                           0,\n                           0.6036490201950073,\n                           0.11919199675321579,\n                           0.7882900238037109,\n                           0.7723940014839172,\n                           0.15251100063323975,\n                           0.616562008857727,\n                           0.9660869836807251,\n                           0.19075599312782288,\n                           0.1740349978208542,\n                           0.9799150228500366,\n                           0.19348600506782532,\n                           0.048277001827955246,\n                           0.9810580015182495,\n                           0.1937119960784912,\n                           0,\n                           0.9999480247497559,\n                           0.006622000131756067,\n                           0.007786999922245741,\n                           0.9989290237426758,\n                           0.04125700145959854,\n                           -0.020945999771356583,\n                           0.9700260162353516,\n                           -0.18230900168418884,\n                           0.1606609970331192,\n                           0.9929869771003723,\n                           -0.1116809993982315,\n                           0.038782998919487,\n                           0.8677089810371399,\n                           -0.30993399024009705,\n                           0.38861599564552307,\n                           0.9675049781799316,\n                           -0.18179599940776825,\n                           0.17574100196361542,\n                           0.6127229928970337,\n                           -0.23797500133514404,\n                           0.753616988658905,\n                           0.781611979007721,\n                           -0.1585649996995926,\n                           0.6032750010490417,\n                           0.13049399852752686,\n                           -0.02585900016129017,\n                           0.9911119937896729,\n                           0.16583800315856934,\n                           -0.04606600105762482,\n                           0.9850770235061646,\n                           0.9847609996795654,\n                           -0.03004699945449829,\n                           -0.17129500210285187,\n                           0.9463850259780884,\n                           0.008138000033795834,\n                           0.3229379951953888,\n                           0.6942890286445618,\n                           0.06011800095438957,\n                           0.7171810269355774,\n                           0.405923992395401,\n                           0.09244199842214584,\n                           0.9092199802398682,\n                           0.1477230042219162,\n                           0.0024739999789744616,\n                           0.9890260100364685,\n                           0.991798996925354,\n                           -0.11557900160551071,\n                           -0.05454900115728378,\n                           0.9920099973678589,\n                           0.07202500104904175,\n                           0.10358300060033798,\n                           0.8882240056991577,\n                           0.2238840013742447,\n                           0.40116599202156067,\n                           0.6046879887580872,\n                           0.13691100478172302,\n                           0.7846069931983948,\n                           0.12908099591732025,\n                           -0.06111999973654747,\n                           0.989749014377594,\n                           0.9954820275306702,\n                           -0.09436299651861191,\n                           0.010502999648451805,\n                           0.9981970191001892,\n                           0.012060999870300293,\n                           0.05880200117826462,\n                           0.9550639986991882,\n                           0.09819000214338303,\n                           0.27966299653053284,\n                           0.6606940031051636,\n                           0.05169999971985817,\n                           0.7488729953765869,\n                           0.07273799926042557,\n                           -0.04034300148487091,\n                           0.9965350031852722,\n                           0.9999179840087891,\n                           0.007191000040620565,\n                           0.010560999624431133,\n                           0.9989050030708313,\n                           0.04436499997973442,\n                           -0.014883999712765217,\n                           0.9694769978523254,\n                           -0.17860299348831177,\n                           0.1679760068655014,\n                           0.9924619793891907,\n                           -0.10775599628686905,\n                           0.058378998190164566,\n                           0.8567489981651306,\n                           -0.28829601407051086,\n                           0.4276289939880371,\n                           0.9473999738693237,\n                           -0.16112199425697327,\n                           0.27653801441192627,\n                           0.5627779960632324,\n                           -0.19747799634933472,\n                           0.8026729822158813,\n                           0.6577669978141785,\n                           -0.11438000202178955,\n                           0.7444859743118286,\n                           0.07901199907064438,\n                           0.0013689999468624592,\n                           0.9968730211257935,\n                           0.07274100184440613,\n                           -0.02020600065588951,\n                           0.9971460103988647,\n                           0.9888780117034912,\n                           0.025808999314904213,\n                           -0.14647500216960907,\n                           0.9453979730606079,\n                           -0.006663000211119652,\n                           0.3258500099182129,\n                           0.6921399831771851,\n                           -0.04972299933433533,\n                           0.7200480103492737,\n                           0.3957499861717224,\n                           -0.08134900033473969,\n                           0.9147480130195618,\n                           0.13914500176906586,\n                           -0.00007899999764049426,\n                           0.9902719855308533,\n                           0.9924669861793518,\n                           -0.10311000049114227,\n                           -0.06616800278425217,\n                           0.9926300048828125,\n                           0.07926999777555466,\n                           0.09165900200605392,\n                           0.900858998298645,\n                           0.2553130090236664,\n                           0.3510949909687042,\n                           0.6513699889183044,\n                           0.18318000435829163,\n                           0.7363160252571106,\n                           0.15978699922561646,\n                           -0.02714099921286106,\n                           0.9867780208587646,\n                           0.9955620169639587,\n                           -0.09379199892282486,\n                           0.0077309999614953995,\n                           0.9991030097007751,\n                           0.01610800065100193,\n                           0.039149001240730286,\n                           0.9764699935913086,\n                           0.12068899720907211,\n                           0.17871999740600586,\n                           0.7859060168266296,\n                           0.10103499889373779,\n                           0.6100350022315979,\n                           0.16579000651836395,\n                           -0.014832000248134136,\n                           0.986050009727478,\n                           0.1655299961566925,\n                           -0.10078699886798859,\n                           0.9810410141944885,\n                           -0.0046790000051259995,\n                           -0.1750659942626953,\n                           0.9845460057258606,\n                           -0.3859579861164093,\n                           -0.06494200229644775,\n                           0.9202280044555664,\n                           -0.3219670057296753,\n                           -0.05600599944591522,\n                           0.9450929760932922,\n                           -0.6471610069274902,\n                           -0.11495299637317657,\n                           0.7536370158195496,\n                           -0.5616440176963806,\n                           -0.078855000436306,\n                           0.8236119747161865,\n                           -0.8379700183868408,\n                           -0.23749999701976776,\n                           0.4913240075111389,\n                           -0.7512590289115906,\n                           -0.1447169929742813,\n                           0.6439470052719116,\n                           -0.9052090048789978,\n                           -0.2807050049304962,\n                           0.3190630078315735,\n                           -0.8249419927597046,\n                           -0.2209009975194931,\n                           0.5202630162239075,\n                           -0.13363699615001678,\n                           0.0291920006275177,\n                           0.9905999898910522,\n                           -0.4039649963378906,\n                           0.0019519999623298645,\n                           0.9147719740867615,\n                           -0.7191359996795654,\n                           0.002443999983370304,\n                           0.6948649883270264,\n                           -0.9637579917907715,\n                           0.026884999126195908,\n                           0.26541900634765625,\n                           -0.9637719988822937,\n                           0.2207069993019104,\n                           -0.14977200329303741,\n                           0.03522900119423866,\n                           0.06716900318861008,\n                           0.9971190094947815,\n                           -0.3620629906654358,\n                           -0.01676199957728386,\n                           0.9320030212402344,\n                           -0.6534259915351868,\n                           0.007120999973267317,\n                           0.7569569945335388,\n                           -0.8528590202331543,\n                           0.11686599999666214,\n                           0.5088940262794495,\n                           -0.8814889788627625,\n                           0.3579840064048767,\n                           0.3079349994659424,\n                           0.0726580023765564,\n                           0.02018200047314167,\n                           0.9971529841423035,\n                           -0.37608298659324646,\n                           -0.025955000892281532,\n                           0.926222026348114,\n                           -0.6568350195884705,\n                           -0.015021000057458878,\n                           0.7538840174674988,\n                           -0.8238760232925415,\n                           0.03257700055837631,\n                           0.5658339858055115,\n                           -0.8688690066337585,\n                           0.13078700006008148,\n                           0.4774540066719055,\n                           0.07265599817037582,\n                           -0.07700400054454803,\n                           0.994379997253418,\n                           -0.0343950018286705,\n                           -0.151870995759964,\n                           0.9878020286560059,\n                           -0.40362000465393066,\n                           -0.05282000079751015,\n                           0.9134010076522827,\n                           -0.37586501240730286,\n                           -0.041078001260757446,\n                           0.9257640242576599,\n                           -0.6878190040588379,\n                           -0.0810059979557991,\n                           0.721347987651825,\n                           -0.6558970212936401,\n                           -0.052101001143455505,\n                           0.7530509829521179,\n                           -0.8708800077438354,\n                           -0.2062380015850067,\n                           0.44613200426101685,\n                           -0.8175939917564392,\n                           -0.12448199838399887,\n                           0.5621780157089233,\n                           -0.8926960229873657,\n                           -0.3055669963359833,\n                           0.33124300837516785,\n                           -0.8565059900283813,\n                           -0.21024300158023834,\n                           0.4713769853115082,\n                           -0.15155400335788727,\n                           -0.025412000715732574,\n                           0.9881219863891602,\n                           -0.41033700108528137,\n                           -0.0026420000940561295,\n                           0.9119300246238708,\n                           -0.7240620255470276,\n                           0.00047400000039488077,\n                           0.6897349953651428,\n                           -0.9655590057373047,\n                           -0.017078999429941177,\n                           0.2596229910850525,\n                           -0.973825991153717,\n                           -0.19711799919605255,\n                           -0.1131730005145073,\n                           0.06214199960231781,\n                           0.08235500007867813,\n                           0.9946640133857727,\n                           -0.3334290087223053,\n                           0.007625999860465527,\n                           0.9427440166473389,\n                           -0.608610987663269,\n                           0.04885999858379364,\n                           0.7919629812240601,\n                           -0.8253309726715088,\n                           0.14631199836730957,\n                           0.5453640222549438,\n                           -0.9105669856071472,\n                           0.3146660029888153,\n                           0.2680560052394867,\n                           0.16523399949073792,\n                           0.04589800164103508,\n                           0.985185980796814,\n                           -0.32260099053382874,\n                           -0.010471000336110592,\n                           0.9464769959449768,\n                           -0.5639140009880066,\n                           0.015166000463068485,\n                           0.8256940245628357,\n                           -0.758965015411377,\n                           0.05617399886250496,\n                           0.6487039923667908,\n                           -0.8382350206375122,\n                           0.14245299994945526,\n                           0.5263739824295044,\n                           0.9727830290794373,\n                           -0.019794000312685966,\n                           0.2308720052242279,\n                           0.9828159809112549,\n                           -0.036465998739004135,\n                           0.18095199763774872,\n                           0.9050639867782593,\n                           -0.02252200059592724,\n                           0.4246790111064911,\n                           0.8354039788246155,\n                           -0.03220000118017197,\n                           0.5486930012702942,\n                           0.6465700268745422,\n                           -0.045921001583337784,\n                           0.7614709734916687,\n                           0.4826749861240387,\n                           -0.04895399883389473,\n                           0.8744300007820129,\n                           0.4453999996185303,\n                           0.17256900668144226,\n                           0.8785430192947388,\n                           0.47231200337409973,\n                           0.13768500089645386,\n                           0.8706120252609253,\n                           0.4824250042438507,\n                           0.3898639976978302,\n                           0.7843930125236511,\n                           0.641398012638092,\n                           0.4275979995727539,\n                           0.6370000243186951,\n                           0.9863939881324768,\n                           0.0994419977068901,\n                           0.13091400265693665,\n                           0.9154840111732483,\n                           0.2120320051908493,\n                           0.34195101261138916,\n                           0.7246469855308533,\n                           0.245046004652977,\n                           0.6440799832344055,\n                           0.35685500502586365,\n                           0.17885500192642212,\n                           0.9168779850006104,\n                           0.14101800322532654,\n                           0.24263200163841248,\n                           0.9598140120506287,\n                           0.9366779923439026,\n                           0.16484400629997253,\n                           0.3089669942855835,\n                           0.7982620000839233,\n                           0.2441370040178299,\n                           0.5506129860877991,\n                           0.4769439995288849,\n                           0.2904820144176483,\n                           0.8295450210571289,\n                           0.4125959873199463,\n                           -0.017246000468730927,\n                           0.9107509851455688,\n                           0.341374009847641,\n                           -0.37689098715782166,\n                           0.8610560297966003,\n                           0.9026100039482117,\n                           0.14119599759578705,\n                           0.40664398670196533,\n                           0.7326020002365112,\n                           0.1491979956626892,\n                           0.6641039848327637,\n                           0.38115599751472473,\n                           0.15792299807071686,\n                           0.9109230041503906,\n                           0.5317370295524597,\n                           -0.02143399976193905,\n                           0.846638023853302,\n                           0.7915729880332947,\n                           -0.3539769947528839,\n                           0.49810999631881714,\n                           0.9087340235710144,\n                           -0.07959599792957306,\n                           0.40971601009368896,\n                           0.9386569857597351,\n                           -0.17680299282073975,\n                           0.29607900977134705,\n                           0.7781569957733154,\n                           -0.19467000663280487,\n                           0.5971400141716003,\n                           0.738847017288208,\n                           -0.07674700021743774,\n                           0.6694890260696411,\n                           0.43915998935699463,\n                           -0.22276799380779266,\n                           0.870352029800415,\n                           0.3863860070705414,\n                           -0.0790880024433136,\n                           0.918940007686615,\n                           0.3576120138168335,\n                           0.07325199991464615,\n                           0.9309930205345154,\n                           0.5227140188217163,\n                           0.16167999804019928,\n                           0.8370360136032104,\n                           0.4246380031108856,\n                           0.3233239948749542,\n                           0.845661997795105,\n                           0.733618974685669,\n                           0.48907899856567383,\n                           0.4718089997768402,\n                           0.9886019825935364,\n                           -0.10717800259590149,\n                           0.10573200136423111,\n                           0.9131960272789001,\n                           -0.22303399443626404,\n                           0.3410690128803253,\n                           0.7163559794425964,\n                           -0.25636500120162964,\n                           0.6489310264587402,\n                           0.35149699449539185,\n                           -0.15968100726604462,\n                           0.922469973564148,\n                           0.07999800145626068,\n                           -0.2107039988040924,\n                           0.9742709994316101,\n                           0.9883249998092651,\n                           0.04732999950647354,\n                           0.14482200145721436,\n                           0.9210500121116638,\n                           0.07413999736309052,\n                           0.3823229968547821,\n                           0.6804890036582947,\n                           0.11895299702882767,\n                           0.7230389714241028,\n                           0.4935390055179596,\n                           -0.10269299894571304,\n                           0.8636389970779419,\n                           0.3912479877471924,\n                           -0.4752289950847626,\n                           0.7880880236625671,\n                           0.9700270295143127,\n                           0.07970499992370605,\n                           0.2295520007610321,\n                           0.831250011920929,\n                           0.10592100024223328,\n                           0.5457149744033813,\n                           0.4774230122566223,\n                           0.13252699375152588,\n                           0.8686220049858093,\n                           0.47922399640083313,\n                           -0.0024129999801516533,\n                           0.877689003944397,\n                           0.6902980208396912,\n                           -0.29711300134658813,\n                           0.6597059965133667,\n                           0.6312130093574524,\n                           0.4550989866256714,\n                           0.628055989742279,\n                           0.26494699716567993,\n                           0.5426689982414246,\n                           0.797065019607544,\n                           0.4216960072517395,\n                           0.6728450059890747,\n                           0.6078259944915771,\n                           0.7324270009994507,\n                           0.5829970240592957,\n                           0.35166099667549133,\n                           0.5086709856987,\n                           0.8606399893760681,\n                           -0.023507000878453255,\n                           0.7640720009803772,\n                           0.6449369788169861,\n                           -0.015798000618815422,\n                           0.19029100239276886,\n                           0.2773289978504181,\n                           -0.9417420029640198,\n                           0.02588699944317341,\n                           0.0005750000127591193,\n                           -0.9996650218963623,\n                           -0.33045700192451477,\n                           -0.4387669861316681,\n                           -0.8356329798698425,\n                           -0.6271269917488098,\n                           -0.4645389914512634,\n                           -0.6252319812774658,\n                           -0.02311599999666214,\n                           0.2469020038843155,\n                           0.9687650203704834,\n                           -0.012950999662280083,\n                           0.45514100790023804,\n                           0.8903250098228455,\n                           -0.001180000021122396,\n                           0.9888520240783691,\n                           0.14889399707317352,\n                           0.019520999863743782,\n                           0.6841210126876831,\n                           -0.7291070222854614,\n                           0.012253000400960445,\n                           0.007784999907016754,\n                           -0.9998949766159058,\n                           0.3314639925956726,\n                           -0.3832260072231293,\n                           0.8621309995651245,\n                           0.08274699747562408,\n                           -0.16047699749469757,\n                           0.9835649728775024,\n                           -0.381630003452301,\n                           0.638043999671936,\n                           0.6687729954719543,\n                           -0.44988399744033813,\n                           0.787883996963501,\n                           -0.42052799463272095,\n                           -0.2780170142650604,\n                           0.5983560085296631,\n                           -0.7514500021934509,\n                           0.7378140091896057,\n                           -0.4918749928474426,\n                           0.4622659981250763,\n                           0.6153389811515808,\n                           -0.45540300011634827,\n                           0.6434019804000854,\n                           -0.43678900599479675,\n                           0.33411499857902527,\n                           0.8352140188217163,\n                           -0.7429530024528503,\n                           0.6388909816741943,\n                           -0.1995989978313446,\n                           -0.7432950139045715,\n                           0.5977380275726318,\n                           -0.3003700077533722,\n                           0.7197920083999634,\n                           0.5168960094451904,\n                           0.4633769989013672,\n                           0.22183099389076233,\n                           0.4485720098018646,\n                           0.8657789826393127,\n                           0.08203200250864029,\n                           0.15848000347614288,\n                           0.9839479923248291,\n                           0.5953459739685059,\n                           0.4811680018901825,\n                           0.6434599757194519,\n                           -0.37556400895118713,\n                           -0.6215270161628723,\n                           0.6875,\n                           -0.42666301131248474,\n                           -0.33534398674964905,\n                           0.8399419784545898,\n                           -0.44476398825645447,\n                           -0.7887529730796814,\n                           -0.42432600259780884,\n                           -0.7557309865951538,\n                           -0.6222699880599976,\n                           -0.20408600568771362,\n                           -0.4292669892311096,\n                           -0.5361850261688232,\n                           -0.7267979979515076,\n                           -0.7655900120735168,\n                           -0.5671039819717407,\n                           -0.30375200510025024,\n                           0.007348000071942806,\n                           -0.21113499999046326,\n                           0.9774289727210999,\n                           -0.01990099996328354,\n                           -0.4373210072517395,\n                           0.8990849852561951,\n                           -0.008775000460445881,\n                           -0.9864199757575989,\n                           0.16400499641895294,\n                           0.024855999276041985,\n                           -0.6829339861869812,\n                           -0.7300570011138916,\n                           0.014514000155031681,\n                           0.03655200079083443,\n                           -0.9992259740829468,\n                           0.40192899107933044,\n                           -0.4676550030708313,\n                           0.7872430086135864,\n                           0.41696101427078247,\n                           -0.6813820004463196,\n                           0.6015490293502808,\n                           0.5033609867095947,\n                           -0.8637740015983582,\n                           -0.022839000448584557,\n                           0.2058819979429245,\n                           -0.2945750057697296,\n                           -0.9331870079040527,\n                           -0.2351589947938919,\n                           0.5535579919815063,\n                           -0.7989199757575989,\n                           0.6533820033073425,\n                           -0.435588002204895,\n                           0.619156002998352,\n                           0.7555500268936157,\n                           -0.554410994052887,\n                           0.3489600121974945,\n                           0.7765160202980042,\n                           -0.6298360228538513,\n                           -0.01814199984073639,\n                           0.025975000113248825,\n                           0.008264999836683273,\n                           -0.9996280074119568,\n                           -0.6086519956588745,\n                           0.49536699056625366,\n                           -0.6198019981384277,\n                           -0.9813200235366821,\n                           0.19238099455833435,\n                           0,\n                           -0.831650972366333,\n                           0.5552989840507507,\n                           0,\n                           -0.4425640106201172,\n                           0.38308998942375183,\n                           0.8107889890670776,\n                           -0.5623509883880615,\n                           0.11026400327682495,\n                           0.8195139765739441,\n                           0.367917001247406,\n                           -0.15178599953651428,\n                           0.917385995388031,\n                           0.3960669934749603,\n                           -0.07774800062179565,\n                           0.9149240255355835,\n                           0.3283520042896271,\n                           -0.13562799990177155,\n                           0.9347670078277588,\n                           0.3530749976634979,\n                           -0.06952299922704697,\n                           0.9330080151557922,\n                           -0.5935590267181396,\n                           0.20035800337791443,\n                           0.7794510126113892,\n                           -0.6201800107955933,\n                           0.12245599925518036,\n                           0.7748429775238037,\n                           -0.5552989840507507,\n                           0.831650972366333,\n                           0,\n                           -0.2616960108280182,\n                           0.523730993270874,\n                           0.8106920123100281,\n                           0.2819640040397644,\n                           -0.2819199860095978,\n                           0.9170699715614319,\n                           0.25169798731803894,\n                           -0.25161200761795044,\n                           0.9345269799232483,\n                           -0.4710330069065094,\n                           0.41249701380729675,\n                           0.7797269821166992,\n                           -0.19238099455833435,\n                           0.9813200235366821,\n                           0,\n                           -0.04031100124120712,\n                           0.5840420126914978,\n                           0.8107219934463501,\n                           0.1517850011587143,\n                           -0.3678950071334839,\n                           0.9173960089683533,\n                           0.13561999797821045,\n                           -0.3282899856567383,\n                           0.9347900152206421,\n                           -0.27737799286842346,\n                           0.561601996421814,\n                           0.779528021812439,\n                           -1,\n                           0,\n                           0,\n                           0.29074999690055847,\n                           0.5413560271263123,\n                           0.7889220118522644,\n                           0.07767199724912643,\n                           -0.39607399702072144,\n                           0.9149270057678223,\n                           0.0693729966878891,\n                           -0.3530940115451813,\n                           0.9330130219459534,\n                           -0.12221000343561172,\n                           0.6202139854431152,\n                           0.7748550176620483,\n                           0.19238099455833435,\n                           0.9813200235366821,\n                           0,\n                           0.5552989840507507,\n                           0.831650972366333,\n                           0,\n                           0.38308998942375183,\n                           0.4425640106201172,\n                           0.8107889890670776,\n                           0.11026400327682495,\n                           0.5623509883880615,\n                           0.8195139765739441,\n                           -0.15178599953651428,\n                           -0.367917001247406,\n                           0.917385995388031,\n                           -0.07774800062179565,\n                           -0.3960669934749603,\n                           0.9149240255355835,\n                           -0.13562799990177155,\n                           -0.3283520042896271,\n                           0.9347670078277588,\n                           -0.06952299922704697,\n                           -0.3530749976634979,\n                           0.9330080151557922,\n                           0.20035800337791443,\n                           0.5935590267181396,\n                           0.7794510126113892,\n                           0.12245599925518036,\n                           0.6201800107955933,\n                           0.7748429775238037,\n                           0.831650972366333,\n                           0.5552989840507507,\n                           0,\n                           0.523730993270874,\n                           0.2616960108280182,\n                           0.8106920123100281,\n                           -0.2819199860095978,\n                           -0.2819640040397644,\n                           0.9170699715614319,\n                           -0.25161200761795044,\n                           -0.25169798731803894,\n                           0.9345269799232483,\n                           0.41249701380729675,\n                           0.4710330069065094,\n                           0.7797269821166992,\n                           0.9813200235366821,\n                           0.19238099455833435,\n                           0,\n                           0.5840420126914978,\n                           0.04031100124120712,\n                           0.8107219934463501,\n                           -0.3678950071334839,\n                           -0.1517850011587143,\n                           0.9173960089683533,\n                           -0.3282899856567383,\n                           -0.13561999797821045,\n                           0.9347900152206421,\n                           0.561601996421814,\n                           0.27737799286842346,\n                           0.779528021812439,\n                           -1,\n                           0,\n                           0,\n                           0.5413560271263123,\n                           -0.29074999690055847,\n                           0.7889220118522644,\n                           -0.39607399702072144,\n                           -0.07767199724912643,\n                           0.9149270057678223,\n                           -0.3530940115451813,\n                           -0.0693729966878891,\n                           0.9330130219459534,\n                           0.6202139854431152,\n                           0.12221000343561172,\n                           0.7748550176620483,\n                           0.9813200235366821,\n                           -0.19238099455833435,\n                           0,\n                           0.831650972366333,\n                           -0.5552989840507507,\n                           0,\n                           0.4425640106201172,\n                           -0.38308998942375183,\n                           0.8107889890670776,\n                           0.5623509883880615,\n                           -0.11026400327682495,\n                           0.8195139765739441,\n                           -0.367917001247406,\n                           0.15178599953651428,\n                           0.917385995388031,\n                           -0.3960669934749603,\n                           0.07774800062179565,\n                           0.9149240255355835,\n                           -0.3283520042896271,\n                           0.13562799990177155,\n                           0.9347670078277588,\n                           -0.3530749976634979,\n                           0.06952299922704697,\n                           0.9330080151557922,\n                           0.5935590267181396,\n                           -0.20035800337791443,\n                           0.7794510126113892,\n                           0.6201800107955933,\n                           -0.12245599925518036,\n                           0.7748429775238037,\n                           0.5552989840507507,\n                           -0.831650972366333,\n                           0,\n                           0.2616960108280182,\n                           -0.523730993270874,\n                           0.8106920123100281,\n                           -0.2819640040397644,\n                           0.2819199860095978,\n                           0.9170699715614319,\n                           -0.25169798731803894,\n                           0.25161200761795044,\n                           0.9345269799232483,\n                           0.4710330069065094,\n                           -0.41249701380729675,\n                           0.7797269821166992,\n                           0.19238099455833435,\n                           -0.9813200235366821,\n                           0,\n                           0.04031100124120712,\n                           -0.5840420126914978,\n                           0.8107219934463501,\n                           -0.1517850011587143,\n                           0.3678950071334839,\n                           0.9173960089683533,\n                           -0.13561999797821045,\n                           0.3282899856567383,\n                           0.9347900152206421,\n                           0.27737799286842346,\n                           -0.561601996421814,\n                           0.779528021812439,\n                           -1,\n                           0,\n                           0,\n                           -0.29074999690055847,\n                           -0.5413560271263123,\n                           0.7889220118522644,\n                           -0.07767199724912643,\n                           0.39607399702072144,\n                           0.9149270057678223,\n                           -0.0693729966878891,\n                           0.3530940115451813,\n                           0.9330130219459534,\n                           0.12221000343561172,\n                           -0.6202139854431152,\n                           0.7748550176620483,\n                           -0.19238099455833435,\n                           -0.9813200235366821,\n                           0,\n                           -0.5552989840507507,\n                           -0.831650972366333,\n                           0,\n                           -0.38308998942375183,\n                           -0.4425640106201172,\n                           0.8107889890670776,\n                           -0.11026400327682495,\n                           -0.5623509883880615,\n                           0.8195139765739441,\n                           0.15178599953651428,\n                           0.367917001247406,\n                           0.917385995388031,\n                           0.07774800062179565,\n                           0.3960669934749603,\n                           0.9149240255355835,\n                           0.13562799990177155,\n                           0.3283520042896271,\n                           0.9347670078277588,\n                           0.06952299922704697,\n                           0.3530749976634979,\n                           0.9330080151557922,\n                           -0.20035800337791443,\n                           -0.5935590267181396,\n                           0.7794510126113892,\n                           -0.12245599925518036,\n                           -0.6201800107955933,\n                           0.7748429775238037,\n                           -0.831650972366333,\n                           -0.5552989840507507,\n                           0,\n                           -0.523730993270874,\n                           -0.2616960108280182,\n                           0.8106920123100281,\n                           0.2819199860095978,\n                           0.2819640040397644,\n                           0.9170699715614319,\n                           0.25161200761795044,\n                           0.25169798731803894,\n                           0.9345269799232483,\n                           -0.41249701380729675,\n                           -0.4710330069065094,\n                           0.7797269821166992,\n                           -0.9813200235366821,\n                           -0.19238099455833435,\n                           0,\n                           -0.5840420126914978,\n                           -0.04031100124120712,\n                           0.8107219934463501,\n                           0.3678950071334839,\n                           0.1517850011587143,\n                           0.9173960089683533,\n                           0.3282899856567383,\n                           0.13561999797821045,\n                           0.9347900152206421,\n                           -0.561601996421814,\n                           -0.27737799286842346,\n                           0.779528021812439,\n                           -1,\n                           0,\n                           0,\n                           -0.5413560271263123,\n                           0.29074999690055847,\n                           0.7889220118522644,\n                           0.39607399702072144,\n                           0.07767199724912643,\n                           0.9149270057678223,\n                           0.3530940115451813,\n                           0.0693729966878891,\n                           0.9330130219459534,\n                           -0.6202139854431152,\n                           -0.12221000343561172,\n                           0.7748550176620483,\n                           -0.6201800107955933,\n                           0.12245599925518036,\n                           0.7748429775238037,\n                           -0.5616469979286194,\n                           0.27755099534988403,\n                           0.7794349789619446,\n                           -0.8979210257530212,\n                           0.37159600853919983,\n                           0.23590999841690063,\n                           -0.9542099833488464,\n                           0.18841099739074707,\n                           0.23234599828720093,\n                           -0.9101200103759766,\n                           0.3766449987888336,\n                           0.17268399894237518,\n                           -0.966795027256012,\n                           0.19089600443840027,\n                           0.16990099847316742,\n                           -0.8549879789352417,\n                           0.35383298993110657,\n                           0.3792079985141754,\n                           -0.9100499749183655,\n                           0.17969100177288055,\n                           0.3735229969024658,\n                           -0.8064150214195251,\n                           0.2724289894104004,\n                           0.5248600244522095,\n                           -0.8383409976959229,\n                           0.16553199291229248,\n                           0.5194069743156433,\n                           -0.4125959873199463,\n                           0.47094500064849854,\n                           0.7797279953956604,\n                           -0.687192976474762,\n                           0.687192976474762,\n                           0.23565199971199036,\n                           -0.6965190172195435,\n                           0.6965190172195435,\n                           0.17240400612354279,\n                           -0.6544880270957947,\n                           0.6544870138168335,\n                           0.37853899598121643,\n                           -0.6404970288276672,\n                           0.5611429810523987,\n                           0.5242909789085388,\n                           -0.20047900080680847,\n                           0.5933949947357178,\n                           0.7795450091362,\n                           -0.3715969920158386,\n                           0.8979210257530212,\n                           0.23590999841690063,\n                           -0.3766449987888336,\n                           0.9101200103759766,\n                           0.17268399894237518,\n                           -0.35383298993110657,\n                           0.8549879789352417,\n                           0.3792079985141754,\n                           -0.3770729899406433,\n                           0.7630789875984192,\n                           0.5249059796333313,\n                           -0.12245900183916092,\n                           0.6201940178871155,\n                           0.7748309969902039,\n                           -0.18841099739074707,\n                           0.9542099833488464,\n                           0.23234599828720093,\n                           -0.19089600443840027,\n                           0.966795027256012,\n                           0.16990099847316742,\n                           -0.17969200015068054,\n                           0.9100499749183655,\n                           0.3735229969024658,\n                           -0.16553199291229248,\n                           0.8383409976959229,\n                           0.5194069743156433,\n                           0.12245599925518036,\n                           0.6201800107955933,\n                           0.7748429775238037,\n                           0.27755099534988403,\n                           0.5616469979286194,\n                           0.7794349789619446,\n                           0.37159600853919983,\n                           0.8979210257530212,\n                           0.23590999841690063,\n                           0.18841099739074707,\n                           0.9542099833488464,\n                           0.23234599828720093,\n                           0.3766449987888336,\n                           0.9101200103759766,\n                           0.17268399894237518,\n                           0.19089600443840027,\n                           0.966795027256012,\n                           0.16990099847316742,\n                           0.35383298993110657,\n                           0.8549879789352417,\n                           0.3792079985141754,\n                           0.17969100177288055,\n                           0.9100499749183655,\n                           0.3735229969024658,\n                           0.2724289894104004,\n                           0.8064150214195251,\n                           0.5248600244522095,\n                           0.16553199291229248,\n                           0.8383409976959229,\n                           0.5194069743156433,\n                           0.47094500064849854,\n                           0.4125959873199463,\n                           0.7797279953956604,\n                           0.687192976474762,\n                           0.687192976474762,\n                           0.23565199971199036,\n                           0.6965190172195435,\n                           0.6965190172195435,\n                           0.17240400612354279,\n                           0.6544870138168335,\n                           0.6544880270957947,\n                           0.37853899598121643,\n                           0.5611429810523987,\n                           0.6404970288276672,\n                           0.5242909789085388,\n                           0.5933949947357178,\n                           0.20047900080680847,\n                           0.7795450091362,\n                           0.8979210257530212,\n                           0.3715969920158386,\n                           0.23590999841690063,\n                           0.9101200103759766,\n                           0.3766449987888336,\n                           0.17268399894237518,\n                           0.8549879789352417,\n                           0.35383298993110657,\n                           0.3792079985141754,\n                           0.7630789875984192,\n                           0.3770729899406433,\n                           0.5249059796333313,\n                           0.6201940178871155,\n                           0.12245900183916092,\n                           0.7748309969902039,\n                           0.9542099833488464,\n                           0.18841099739074707,\n                           0.23234599828720093,\n                           0.966795027256012,\n                           0.19089600443840027,\n                           0.16990099847316742,\n                           0.9100499749183655,\n                           0.17969200015068054,\n                           0.3735229969024658,\n                           0.8383409976959229,\n                           0.16553199291229248,\n                           0.5194069743156433,\n                           0.6201800107955933,\n                           -0.12245599925518036,\n                           0.7748429775238037,\n                           0.5616469979286194,\n                           -0.27755099534988403,\n                           0.7794349789619446,\n                           0.8979210257530212,\n                           -0.37159600853919983,\n                           0.23590999841690063,\n                           0.9542099833488464,\n                           -0.18841099739074707,\n                           0.23234599828720093,\n                           0.9101200103759766,\n                           -0.3766449987888336,\n                           0.17268399894237518,\n                           0.966795027256012,\n                           -0.19089600443840027,\n                           0.16990099847316742,\n                           0.8549879789352417,\n                           -0.35383298993110657,\n                           0.3792079985141754,\n                           0.9100499749183655,\n                           -0.17969100177288055,\n                           0.3735229969024658,\n                           0.8064150214195251,\n                           -0.2724289894104004,\n                           0.5248600244522095,\n                           0.8383409976959229,\n                           -0.16553199291229248,\n                           0.5194069743156433,\n                           0.4125959873199463,\n                           -0.47094500064849854,\n                           0.7797279953956604,\n                           0.687192976474762,\n                           -0.687192976474762,\n                           0.23565199971199036,\n                           0.6965190172195435,\n                           -0.6965190172195435,\n                           0.17240400612354279,\n                           0.6544880270957947,\n                           -0.6544870138168335,\n                           0.37853899598121643,\n                           0.6404970288276672,\n                           -0.5611429810523987,\n                           0.5242909789085388,\n                           0.20047900080680847,\n                           -0.5933949947357178,\n                           0.7795450091362,\n                           0.3715969920158386,\n                           -0.8979210257530212,\n                           0.23590999841690063,\n                           0.3766449987888336,\n                           -0.9101200103759766,\n                           0.17268399894237518,\n                           0.35383298993110657,\n                           -0.8549879789352417,\n                           0.3792079985141754,\n                           0.3770729899406433,\n                           -0.7630789875984192,\n                           0.5249059796333313,\n                           0.12245900183916092,\n                           -0.6201940178871155,\n                           0.7748309969902039,\n                           0.18841099739074707,\n                           -0.9542099833488464,\n                           0.23234599828720093,\n                           0.19089600443840027,\n                           -0.966795027256012,\n                           0.16990099847316742,\n                           0.17969200015068054,\n                           -0.9100499749183655,\n                           0.3735229969024658,\n                           0.16553199291229248,\n                           -0.8383409976959229,\n                           0.5194069743156433,\n                           -0.12245599925518036,\n                           -0.6201800107955933,\n                           0.7748429775238037,\n                           -0.27755099534988403,\n                           -0.5616469979286194,\n                           0.7794349789619446,\n                           -0.37159600853919983,\n                           -0.8979210257530212,\n                           0.23590999841690063,\n                           -0.18841099739074707,\n                           -0.9542099833488464,\n                           0.23234599828720093,\n                           -0.3766449987888336,\n                           -0.9101200103759766,\n                           0.17268399894237518,\n                           -0.19089600443840027,\n                           -0.966795027256012,\n                           0.16990099847316742,\n                           -0.35383298993110657,\n                           -0.8549879789352417,\n                           0.3792079985141754,\n                           -0.17969100177288055,\n                           -0.9100499749183655,\n                           0.3735229969024658,\n                           -0.2724289894104004,\n                           -0.8064150214195251,\n                           0.5248600244522095,\n                           -0.16553199291229248,\n                           -0.8383409976959229,\n                           0.5194069743156433,\n                           -0.47094500064849854,\n                           -0.4125959873199463,\n                           0.7797279953956604,\n                           -0.687192976474762,\n                           -0.687192976474762,\n                           0.23565199971199036,\n                           -0.6965190172195435,\n                           -0.6965190172195435,\n                           0.17240400612354279,\n                           -0.6544870138168335,\n                           -0.6544880270957947,\n                           0.37853899598121643,\n                           -0.5611429810523987,\n                           -0.6404970288276672,\n                           0.5242909789085388,\n                           -0.5933949947357178,\n                           -0.20047900080680847,\n                           0.7795450091362,\n                           -0.8979210257530212,\n                           -0.3715969920158386,\n                           0.23590999841690063,\n                           -0.9101200103759766,\n                           -0.3766449987888336,\n                           0.17268399894237518,\n                           -0.8549879789352417,\n                           -0.35383298993110657,\n                           0.3792079985141754,\n                           -0.7630789875984192,\n                           -0.3770729899406433,\n                           0.5249059796333313,\n                           -0.6201940178871155,\n                           -0.12245900183916092,\n                           0.7748309969902039,\n                           -0.9542099833488464,\n                           -0.18841099739074707,\n                           0.23234599828720093,\n                           -0.966795027256012,\n                           -0.19089600443840027,\n                           0.16990099847316742,\n                           -0.9100499749183655,\n                           -0.17969200015068054,\n                           0.3735229969024658,\n                           -0.8383409976959229,\n                           -0.16553199291229248,\n                           0.5194069743156433};\n\nfloat teapotTexCoords[] = {2,\n                           2,\n                           0,\n                           1.75,\n                           2,\n                           0,\n                           1.75,\n                           1.975000023841858,\n                           0,\n                           2,\n                           1.975000023841858,\n                           0,\n                           1.75,\n                           1.9500000476837158,\n                           0,\n                           2,\n                           1.9500000476837158,\n                           0,\n                           1.75,\n                           1.9249999523162842,\n                           0,\n                           2,\n                           1.9249999523162842,\n                           0,\n                           1.75,\n                           1.899999976158142,\n                           0,\n                           2,\n                           1.899999976158142,\n                           0,\n                           1.5,\n                           2,\n                           0,\n                           1.5,\n                           1.975000023841858,\n                           0,\n                           1.5,\n                           1.9500000476837158,\n                           0,\n                           1.5,\n                           1.9249999523162842,\n                           0,\n                           1.5,\n                           1.899999976158142,\n                           0,\n                           1.25,\n                           2,\n                           0,\n                           1.25,\n                           1.975000023841858,\n                           0,\n                           1.25,\n                           1.9500000476837158,\n                           0,\n                           1.25,\n                           1.9249999523162842,\n                           0,\n                           1.25,\n                           1.899999976158142,\n                           0,\n                           1,\n                           2,\n                           0,\n                           1,\n                           1.975000023841858,\n                           0,\n                           1,\n                           1.9500000476837158,\n                           0,\n                           1,\n                           1.9249999523162842,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           1,\n                           2,\n                           0,\n                           0.75,\n                           2,\n                           0,\n                           0.75,\n                           1.975000023841858,\n                           0,\n                           1,\n                           1.975000023841858,\n                           0,\n                           0.75,\n                           1.9500000476837158,\n                           0,\n                           1,\n                           1.9500000476837158,\n                           0,\n                           0.75,\n                           1.9249999523162842,\n                           0,\n                           1,\n                           1.9249999523162842,\n                           0,\n                           0.75,\n                           1.899999976158142,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           0.5,\n                           2,\n                           0,\n                           0.5,\n                           1.975000023841858,\n                           0,\n                           0.5,\n                           1.9500000476837158,\n                           0,\n                           0.5,\n                           1.9249999523162842,\n                           0,\n                           0.5,\n                           1.899999976158142,\n                           0,\n                           0.25,\n                           2,\n                           0,\n                           0.25,\n                           1.975000023841858,\n                           0,\n                           0.25,\n                           1.9500000476837158,\n                           0,\n                           0.25,\n                           1.9249999523162842,\n                           0,\n                           0.25,\n                           1.899999976158142,\n                           0,\n                           0,\n                           2,\n                           0,\n                           0,\n                           1.975000023841858,\n                           0,\n                           0,\n                           1.9500000476837158,\n                           0,\n                           0,\n                           1.9249999523162842,\n                           0,\n                           0,\n                           1.899999976158142,\n                           0,\n                           2,\n                           2,\n                           0,\n                           1.75,\n                           2,\n                           0,\n                           1.75,\n                           1.975000023841858,\n                           0,\n                           2,\n                           1.975000023841858,\n                           0,\n                           1.75,\n                           1.9500000476837158,\n                           0,\n                           2,\n                           1.9500000476837158,\n                           0,\n                           1.75,\n                           1.9249999523162842,\n                           0,\n                           2,\n                           1.9249999523162842,\n                           0,\n                           1.75,\n                           1.899999976158142,\n                           0,\n                           2,\n                           1.899999976158142,\n                           0,\n                           1.5,\n                           2,\n                           0,\n                           1.5,\n                           1.975000023841858,\n                           0,\n                           1.5,\n                           1.9500000476837158,\n                           0,\n                           1.5,\n                           1.9249999523162842,\n                           0,\n                           1.5,\n                           1.899999976158142,\n                           0,\n                           1.25,\n                           2,\n                           0,\n                           1.25,\n                           1.975000023841858,\n                           0,\n                           1.25,\n                           1.9500000476837158,\n                           0,\n                           1.25,\n                           1.9249999523162842,\n                           0,\n                           1.25,\n                           1.899999976158142,\n                           0,\n                           1,\n                           2,\n                           0,\n                           1,\n                           1.975000023841858,\n                           0,\n                           1,\n                           1.9500000476837158,\n                           0,\n                           1,\n                           1.9249999523162842,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           1,\n                           2,\n                           0,\n                           0.75,\n                           2,\n                           0,\n                           0.75,\n                           1.975000023841858,\n                           0,\n                           1,\n                           1.975000023841858,\n                           0,\n                           0.75,\n                           1.9500000476837158,\n                           0,\n                           1,\n                           1.9500000476837158,\n                           0,\n                           0.75,\n                           1.9249999523162842,\n                           0,\n                           1,\n                           1.9249999523162842,\n                           0,\n                           0.75,\n                           1.899999976158142,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           0.5,\n                           2,\n                           0,\n                           0.5,\n                           1.975000023841858,\n                           0,\n                           0.5,\n                           1.9500000476837158,\n                           0,\n                           0.5,\n                           1.9249999523162842,\n                           0,\n                           0.5,\n                           1.899999976158142,\n                           0,\n                           0.25,\n                           2,\n                           0,\n                           0.25,\n                           1.975000023841858,\n                           0,\n                           0.25,\n                           1.9500000476837158,\n                           0,\n                           0.25,\n                           1.9249999523162842,\n                           0,\n                           0.25,\n                           1.899999976158142,\n                           0,\n                           0,\n                           2,\n                           0,\n                           0,\n                           1.975000023841858,\n                           0,\n                           0,\n                           1.9500000476837158,\n                           0,\n                           0,\n                           1.9249999523162842,\n                           0,\n                           0,\n                           1.899999976158142,\n                           0,\n                           2,\n                           1.899999976158142,\n                           0,\n                           1.75,\n                           1.899999976158142,\n                           0,\n                           1.75,\n                           1.6749999523162842,\n                           0,\n                           2,\n                           1.6749999523162842,\n                           0,\n                           1.75,\n                           1.4500000476837158,\n                           0,\n                           2,\n                           1.4500000476837158,\n                           0,\n                           1.75,\n                           1.225000023841858,\n                           0,\n                           2,\n                           1.225000023841858,\n                           0,\n                           1.75,\n                           1,\n                           0,\n                           2,\n                           1,\n                           0,\n                           1.5,\n                           1.899999976158142,\n                           0,\n                           1.5,\n                           1.6749999523162842,\n                           0,\n                           1.5,\n                           1.4500000476837158,\n                           0,\n                           1.5,\n                           1.225000023841858,\n                           0,\n                           1.5,\n                           1,\n                           0,\n                           1.25,\n                           1.899999976158142,\n                           0,\n                           1.25,\n                           1.6749999523162842,\n                           0,\n                           1.25,\n                           1.4500000476837158,\n                           0,\n                           1.25,\n                           1.225000023841858,\n                           0,\n                           1.25,\n                           1,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           1,\n                           1.6749999523162842,\n                           0,\n                           1,\n                           1.4500000476837158,\n                           0,\n                           1,\n                           1.225000023841858,\n                           0,\n                           1,\n                           1,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           0.75,\n                           1.899999976158142,\n                           0,\n                           0.75,\n                           1.6749999523162842,\n                           0,\n                           1,\n                           1.6749999523162842,\n                           0,\n                           0.75,\n                           1.4500000476837158,\n                           0,\n                           1,\n                           1.4500000476837158,\n                           0,\n                           0.75,\n                           1.225000023841858,\n                           0,\n                           1,\n                           1.225000023841858,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.5,\n                           1.899999976158142,\n                           0,\n                           0.5,\n                           1.6749999523162842,\n                           0,\n                           0.5,\n                           1.4500000476837158,\n                           0,\n                           0.5,\n                           1.225000023841858,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.25,\n                           1.899999976158142,\n                           0,\n                           0.25,\n                           1.6749999523162842,\n                           0,\n                           0.25,\n                           1.4500000476837158,\n                           0,\n                           0.25,\n                           1.225000023841858,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0,\n                           1.899999976158142,\n                           0,\n                           0,\n                           1.6749999523162842,\n                           0,\n                           0,\n                           1.4500000476837158,\n                           0,\n                           0,\n                           1.225000023841858,\n                           0,\n                           0,\n                           1,\n                           0,\n                           2,\n                           1.899999976158142,\n                           0,\n                           1.75,\n                           1.899999976158142,\n                           0,\n                           1.75,\n                           1.6749999523162842,\n                           0,\n                           2,\n                           1.6749999523162842,\n                           0,\n                           1.75,\n                           1.4500000476837158,\n                           0,\n                           2,\n                           1.4500000476837158,\n                           0,\n                           1.75,\n                           1.225000023841858,\n                           0,\n                           2,\n                           1.225000023841858,\n                           0,\n                           1.75,\n                           1,\n                           0,\n                           2,\n                           1,\n                           0,\n                           1.5,\n                           1.899999976158142,\n                           0,\n                           1.5,\n                           1.6749999523162842,\n                           0,\n                           1.5,\n                           1.4500000476837158,\n                           0,\n                           1.5,\n                           1.225000023841858,\n                           0,\n                           1.5,\n                           1,\n                           0,\n                           1.25,\n                           1.899999976158142,\n                           0,\n                           1.25,\n                           1.6749999523162842,\n                           0,\n                           1.25,\n                           1.4500000476837158,\n                           0,\n                           1.25,\n                           1.225000023841858,\n                           0,\n                           1.25,\n                           1,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           1,\n                           1.6749999523162842,\n                           0,\n                           1,\n                           1.4500000476837158,\n                           0,\n                           1,\n                           1.225000023841858,\n                           0,\n                           1,\n                           1,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           0.75,\n                           1.899999976158142,\n                           0,\n                           0.75,\n                           1.6749999523162842,\n                           0,\n                           1,\n                           1.6749999523162842,\n                           0,\n                           0.75,\n                           1.4500000476837158,\n                           0,\n                           1,\n                           1.4500000476837158,\n                           0,\n                           0.75,\n                           1.225000023841858,\n                           0,\n                           1,\n                           1.225000023841858,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.5,\n                           1.899999976158142,\n                           0,\n                           0.5,\n                           1.6749999523162842,\n                           0,\n                           0.5,\n                           1.4500000476837158,\n                           0,\n                           0.5,\n                           1.225000023841858,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.25,\n                           1.899999976158142,\n                           0,\n                           0.25,\n                           1.6749999523162842,\n                           0,\n                           0.25,\n                           1.4500000476837158,\n                           0,\n                           0.25,\n                           1.225000023841858,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0,\n                           1.899999976158142,\n                           0,\n                           0,\n                           1.6749999523162842,\n                           0,\n                           0,\n                           1.4500000476837158,\n                           0,\n                           0,\n                           1.225000023841858,\n                           0,\n                           0,\n                           1,\n                           0,\n                           2,\n                           1,\n                           0,\n                           1.75,\n                           1,\n                           0,\n                           1.75,\n                           0.8500000238418579,\n                           0,\n                           2,\n                           0.8500000238418579,\n                           0,\n                           1.75,\n                           0.699999988079071,\n                           0,\n                           2,\n                           0.699999988079071,\n                           0,\n                           1.75,\n                           0.550000011920929,\n                           0,\n                           2,\n                           0.550000011920929,\n                           0,\n                           1.75,\n                           0.4000000059604645,\n                           0,\n                           2,\n                           0.4000000059604645,\n                           0,\n                           1.5,\n                           1,\n                           0,\n                           1.5,\n                           0.8500000238418579,\n                           0,\n                           1.5,\n                           0.699999988079071,\n                           0,\n                           1.5,\n                           0.550000011920929,\n                           0,\n                           1.5,\n                           0.4000000059604645,\n                           0,\n                           1.25,\n                           1,\n                           0,\n                           1.25,\n                           0.8500000238418579,\n                           0,\n                           1.25,\n                           0.699999988079071,\n                           0,\n                           1.25,\n                           0.550000011920929,\n                           0,\n                           1.25,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           1,\n                           0,\n                           1,\n                           0.8500000238418579,\n                           0,\n                           1,\n                           0.699999988079071,\n                           0,\n                           1,\n                           0.550000011920929,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.8500000238418579,\n                           0,\n                           1,\n                           0.8500000238418579,\n                           0,\n                           0.75,\n                           0.699999988079071,\n                           0,\n                           1,\n                           0.699999988079071,\n                           0,\n                           0.75,\n                           0.550000011920929,\n                           0,\n                           1,\n                           0.550000011920929,\n                           0,\n                           0.75,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.8500000238418579,\n                           0,\n                           0.5,\n                           0.699999988079071,\n                           0,\n                           0.5,\n                           0.550000011920929,\n                           0,\n                           0.5,\n                           0.4000000059604645,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.8500000238418579,\n                           0,\n                           0.25,\n                           0.699999988079071,\n                           0,\n                           0.25,\n                           0.550000011920929,\n                           0,\n                           0.25,\n                           0.4000000059604645,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.8500000238418579,\n                           0,\n                           0,\n                           0.699999988079071,\n                           0,\n                           0,\n                           0.550000011920929,\n                           0,\n                           0,\n                           0.4000000059604645,\n                           0,\n                           2,\n                           1,\n                           0,\n                           1.75,\n                           1,\n                           0,\n                           1.75,\n                           0.8500000238418579,\n                           0,\n                           2,\n                           0.8500000238418579,\n                           0,\n                           1.75,\n                           0.699999988079071,\n                           0,\n                           2,\n                           0.699999988079071,\n                           0,\n                           1.75,\n                           0.550000011920929,\n                           0,\n                           2,\n                           0.550000011920929,\n                           0,\n                           1.75,\n                           0.4000000059604645,\n                           0,\n                           2,\n                           0.4000000059604645,\n                           0,\n                           1.5,\n                           1,\n                           0,\n                           1.5,\n                           0.8500000238418579,\n                           0,\n                           1.5,\n                           0.699999988079071,\n                           0,\n                           1.5,\n                           0.550000011920929,\n                           0,\n                           1.5,\n                           0.4000000059604645,\n                           0,\n                           1.25,\n                           1,\n                           0,\n                           1.25,\n                           0.8500000238418579,\n                           0,\n                           1.25,\n                           0.699999988079071,\n                           0,\n                           1.25,\n                           0.550000011920929,\n                           0,\n                           1.25,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           1,\n                           0,\n                           1,\n                           0.8500000238418579,\n                           0,\n                           1,\n                           0.699999988079071,\n                           0,\n                           1,\n                           0.550000011920929,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.8500000238418579,\n                           0,\n                           1,\n                           0.8500000238418579,\n                           0,\n                           0.75,\n                           0.699999988079071,\n                           0,\n                           1,\n                           0.699999988079071,\n                           0,\n                           0.75,\n                           0.550000011920929,\n                           0,\n                           1,\n                           0.550000011920929,\n                           0,\n                           0.75,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.8500000238418579,\n                           0,\n                           0.5,\n                           0.699999988079071,\n                           0,\n                           0.5,\n                           0.550000011920929,\n                           0,\n                           0.5,\n                           0.4000000059604645,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.8500000238418579,\n                           0,\n                           0.25,\n                           0.699999988079071,\n                           0,\n                           0.25,\n                           0.550000011920929,\n                           0,\n                           0.25,\n                           0.4000000059604645,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.8500000238418579,\n                           0,\n                           0,\n                           0.699999988079071,\n                           0,\n                           0,\n                           0.550000011920929,\n                           0,\n                           0,\n                           0.4000000059604645,\n                           0,\n                           2,\n                           0.4000000059604645,\n                           0,\n                           1.75,\n                           0.4000000059604645,\n                           0,\n                           1.75,\n                           0.30000001192092896,\n                           0,\n                           2,\n                           0.30000001192092896,\n                           0,\n                           1.75,\n                           0.20000000298023224,\n                           0,\n                           2,\n                           0.20000000298023224,\n                           0,\n                           1.75,\n                           0.10000000149011612,\n                           0,\n                           2,\n                           0.10000000149011612,\n                           0,\n                           1.75,\n                           0,\n                           0,\n                           2,\n                           0,\n                           0,\n                           1.5,\n                           0.4000000059604645,\n                           0,\n                           1.5,\n                           0.30000001192092896,\n                           0,\n                           1.5,\n                           0.20000000298023224,\n                           0,\n                           1.5,\n                           0.10000000149011612,\n                           0,\n                           1.5,\n                           0,\n                           0,\n                           1.25,\n                           0.4000000059604645,\n                           0,\n                           1.25,\n                           0.30000001192092896,\n                           0,\n                           1.25,\n                           0.20000000298023224,\n                           0,\n                           1.25,\n                           0.10000000149011612,\n                           0,\n                           1.25,\n                           0,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           0.30000001192092896,\n                           0,\n                           1,\n                           0.20000000298023224,\n                           0,\n                           1,\n                           0.10000000149011612,\n                           0,\n                           1,\n                           0,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           0.75,\n                           0.4000000059604645,\n                           0,\n                           0.75,\n                           0.30000001192092896,\n                           0,\n                           1,\n                           0.30000001192092896,\n                           0,\n                           0.75,\n                           0.20000000298023224,\n                           0,\n                           1,\n                           0.20000000298023224,\n                           0,\n                           0.75,\n                           0.10000000149011612,\n                           0,\n                           1,\n                           0.10000000149011612,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.5,\n                           0.4000000059604645,\n                           0,\n                           0.5,\n                           0.30000001192092896,\n                           0,\n                           0.5,\n                           0.20000000298023224,\n                           0,\n                           0.5,\n                           0.10000000149011612,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0.4000000059604645,\n                           0,\n                           0.25,\n                           0.30000001192092896,\n                           0,\n                           0.25,\n                           0.20000000298023224,\n                           0,\n                           0.25,\n                           0.10000000149011612,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0,\n                           0.4000000059604645,\n                           0,\n                           0,\n                           0.30000001192092896,\n                           0,\n                           0,\n                           0.20000000298023224,\n                           0,\n                           0,\n                           0.10000000149011612,\n                           0,\n                           0,\n                           0,\n                           0,\n                           2,\n                           0.4000000059604645,\n                           0,\n                           1.75,\n                           0.4000000059604645,\n                           0,\n                           1.75,\n                           0.30000001192092896,\n                           0,\n                           2,\n                           0.30000001192092896,\n                           0,\n                           1.75,\n                           0.20000000298023224,\n                           0,\n                           2,\n                           0.20000000298023224,\n                           0,\n                           1.75,\n                           0.10000000149011612,\n                           0,\n                           2,\n                           0.10000000149011612,\n                           0,\n                           1.75,\n                           0,\n                           0,\n                           2,\n                           0,\n                           0,\n                           1.5,\n                           0.4000000059604645,\n                           0,\n                           1.5,\n                           0.30000001192092896,\n                           0,\n                           1.5,\n                           0.20000000298023224,\n                           0,\n                           1.5,\n                           0.10000000149011612,\n                           0,\n                           1.5,\n                           0,\n                           0,\n                           1.25,\n                           0.4000000059604645,\n                           0,\n                           1.25,\n                           0.30000001192092896,\n                           0,\n                           1.25,\n                           0.20000000298023224,\n                           0,\n                           1.25,\n                           0.10000000149011612,\n                           0,\n                           1.25,\n                           0,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           0.30000001192092896,\n                           0,\n                           1,\n                           0.20000000298023224,\n                           0,\n                           1,\n                           0.10000000149011612,\n                           0,\n                           1,\n                           0,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           0.75,\n                           0.4000000059604645,\n                           0,\n                           0.75,\n                           0.30000001192092896,\n                           0,\n                           1,\n                           0.30000001192092896,\n                           0,\n                           0.75,\n                           0.20000000298023224,\n                           0,\n                           1,\n                           0.20000000298023224,\n                           0,\n                           0.75,\n                           0.10000000149011612,\n                           0,\n                           1,\n                           0.10000000149011612,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.5,\n                           0.4000000059604645,\n                           0,\n                           0.5,\n                           0.30000001192092896,\n                           0,\n                           0.5,\n                           0.20000000298023224,\n                           0,\n                           0.5,\n                           0.10000000149011612,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0.4000000059604645,\n                           0,\n                           0.25,\n                           0.30000001192092896,\n                           0,\n                           0.25,\n                           0.20000000298023224,\n                           0,\n                           0.25,\n                           0.10000000149011612,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0,\n                           0.4000000059604645,\n                           0,\n                           0,\n                           0.30000001192092896,\n                           0,\n                           0,\n                           0.20000000298023224,\n                           0,\n                           0,\n                           0.10000000149011612,\n                           0,\n                           0,\n                           0,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.875,\n                           1,\n                           0,\n                           0.875,\n                           0.875,\n                           0,\n                           1,\n                           0.875,\n                           0,\n                           0.875,\n                           0.75,\n                           0,\n                           1,\n                           0.75,\n                           0,\n                           0.875,\n                           0.625,\n                           0,\n                           1,\n                           0.625,\n                           0,\n                           0.875,\n                           0.5,\n                           0,\n                           1,\n                           0.5,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.875,\n                           0,\n                           0.75,\n                           0.75,\n                           0,\n                           0.75,\n                           0.625,\n                           0,\n                           0.75,\n                           0.5,\n                           0,\n                           0.625,\n                           1,\n                           0,\n                           0.625,\n                           0.875,\n                           0,\n                           0.625,\n                           0.75,\n                           0,\n                           0.625,\n                           0.625,\n                           0,\n                           0.625,\n                           0.5,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.875,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.5,\n                           0.625,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.375,\n                           1,\n                           0,\n                           0.375,\n                           0.875,\n                           0,\n                           0.5,\n                           0.875,\n                           0,\n                           0.375,\n                           0.75,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.375,\n                           0.625,\n                           0,\n                           0.5,\n                           0.625,\n                           0,\n                           0.375,\n                           0.5,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.875,\n                           0,\n                           0.25,\n                           0.75,\n                           0,\n                           0.25,\n                           0.625,\n                           0,\n                           0.25,\n                           0.5,\n                           0,\n                           0.125,\n                           1,\n                           0,\n                           0.125,\n                           0.875,\n                           0,\n                           0.125,\n                           0.75,\n                           0,\n                           0.125,\n                           0.625,\n                           0,\n                           0.125,\n                           0.5,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           1,\n                           0.5,\n                           0,\n                           0.875,\n                           0.5,\n                           0,\n                           0.875,\n                           0.375,\n                           0,\n                           1,\n                           0.375,\n                           0,\n                           0.875,\n                           0.25,\n                           0,\n                           1,\n                           0.25,\n                           0,\n                           0.875,\n                           0.125,\n                           0,\n                           1,\n                           0.125,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           0.5,\n                           0,\n                           0.75,\n                           0.375,\n                           0,\n                           0.75,\n                           0.25,\n                           0,\n                           0.75,\n                           0.125,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.625,\n                           0.5,\n                           0,\n                           0.625,\n                           0.375,\n                           0,\n                           0.625,\n                           0.25,\n                           0,\n                           0.625,\n                           0.125,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.5,\n                           0.375,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.5,\n                           0.125,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.375,\n                           0.5,\n                           0,\n                           0.375,\n                           0.375,\n                           0,\n                           0.5,\n                           0.375,\n                           0,\n                           0.375,\n                           0.25,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.375,\n                           0.125,\n                           0,\n                           0.5,\n                           0.125,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0.5,\n                           0,\n                           0.25,\n                           0.375,\n                           0,\n                           0.25,\n                           0.25,\n                           0,\n                           0.25,\n                           0.125,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.125,\n                           0.5,\n                           0,\n                           0.125,\n                           0.375,\n                           0,\n                           0.125,\n                           0.25,\n                           0,\n                           0.125,\n                           0.125,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.625,\n                           0.22499999403953552,\n                           0,\n                           0.5,\n                           0.22499999403953552,\n                           0,\n                           0.625,\n                           0.44999998807907104,\n                           0,\n                           0.5,\n                           0.44999998807907104,\n                           0,\n                           0.625,\n                           0.675000011920929,\n                           0,\n                           0.5,\n                           0.675000011920929,\n                           0,\n                           0.625,\n                           0.8999999761581421,\n                           0,\n                           0.5,\n                           0.8999999761581421,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.75,\n                           0.22499999403953552,\n                           0,\n                           0.75,\n                           0.44999998807907104,\n                           0,\n                           0.75,\n                           0.675000011920929,\n                           0,\n                           0.75,\n                           0.8999999761581421,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           0.875,\n                           0.22499999403953552,\n                           0,\n                           0.875,\n                           0.44999998807907104,\n                           0,\n                           0.875,\n                           0.675000011920929,\n                           0,\n                           0.875,\n                           0.8999999761581421,\n                           0,\n                           1,\n                           0,\n                           0,\n                           1,\n                           0.22499999403953552,\n                           0,\n                           1,\n                           0.44999998807907104,\n                           0,\n                           1,\n                           0.675000011920929,\n                           0,\n                           1,\n                           0.8999999761581421,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0.125,\n                           0.22499999403953552,\n                           0,\n                           0,\n                           0.22499999403953552,\n                           0,\n                           0.125,\n                           0.44999998807907104,\n                           0,\n                           0,\n                           0.44999998807907104,\n                           0,\n                           0.125,\n                           0.675000011920929,\n                           0,\n                           0,\n                           0.675000011920929,\n                           0,\n                           0.125,\n                           0.8999999761581421,\n                           0,\n                           0,\n                           0.8999999761581421,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.25,\n                           0.22499999403953552,\n                           0,\n                           0.25,\n                           0.44999998807907104,\n                           0,\n                           0.25,\n                           0.675000011920929,\n                           0,\n                           0.25,\n                           0.8999999761581421,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.375,\n                           0.22499999403953552,\n                           0,\n                           0.375,\n                           0.44999998807907104,\n                           0,\n                           0.375,\n                           0.675000011920929,\n                           0,\n                           0.375,\n                           0.8999999761581421,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.5,\n                           0.22499999403953552,\n                           0,\n                           0.5,\n                           0.44999998807907104,\n                           0,\n                           0.5,\n                           0.675000011920929,\n                           0,\n                           0.5,\n                           0.8999999761581421,\n                           0,\n                           0.5,\n                           0.8999999761581421,\n                           0,\n                           0.625,\n                           0.8999999761581421,\n                           0,\n                           0.625,\n                           0.925000011920929,\n                           0,\n                           0.5,\n                           0.925000011920929,\n                           0,\n                           0.625,\n                           0.949999988079071,\n                           0,\n                           0.5,\n                           0.949999988079071,\n                           0,\n                           0.625,\n                           0.9750000238418579,\n                           0,\n                           0.5,\n                           0.9750000238418579,\n                           0,\n                           0.625,\n                           1,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.75,\n                           0.8999999761581421,\n                           0,\n                           0.75,\n                           0.925000011920929,\n                           0,\n                           0.75,\n                           0.949999988079071,\n                           0,\n                           0.75,\n                           0.9750000238418579,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.875,\n                           0.8999999761581421,\n                           0,\n                           0.875,\n                           0.925000011920929,\n                           0,\n                           0.875,\n                           0.949999988079071,\n                           0,\n                           0.875,\n                           0.9750000238418579,\n                           0,\n                           0.875,\n                           1,\n                           0,\n                           1,\n                           0.8999999761581421,\n                           0,\n                           1,\n                           0.925000011920929,\n                           0,\n                           1,\n                           0.949999988079071,\n                           0,\n                           1,\n                           0.9750000238418579,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0,\n                           0.8999999761581421,\n                           0,\n                           0.125,\n                           0.8999999761581421,\n                           0,\n                           0.125,\n                           0.925000011920929,\n                           0,\n                           0,\n                           0.925000011920929,\n                           0,\n                           0.125,\n                           0.949999988079071,\n                           0,\n                           0,\n                           0.949999988079071,\n                           0,\n                           0.125,\n                           0.9750000238418579,\n                           0,\n                           0,\n                           0.9750000238418579,\n                           0,\n                           0.125,\n                           1,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0.25,\n                           0.8999999761581421,\n                           0,\n                           0.25,\n                           0.925000011920929,\n                           0,\n                           0.25,\n                           0.949999988079071,\n                           0,\n                           0.25,\n                           0.9750000238418579,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.375,\n                           0.8999999761581421,\n                           0,\n                           0.375,\n                           0.925000011920929,\n                           0,\n                           0.375,\n                           0.949999988079071,\n                           0,\n                           0.375,\n                           0.9750000238418579,\n                           0,\n                           0.375,\n                           1,\n                           0,\n                           0.5,\n                           0.8999999761581421,\n                           0,\n                           0.5,\n                           0.925000011920929,\n                           0,\n                           0.5,\n                           0.949999988079071,\n                           0,\n                           0.5,\n                           0.9750000238418579,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.875,\n                           1,\n                           0,\n                           0.875,\n                           0.75,\n                           0,\n                           1,\n                           0.75,\n                           0,\n                           0.875,\n                           0.5,\n                           0,\n                           1,\n                           0.5,\n                           0,\n                           0.875,\n                           0.25,\n                           0,\n                           1,\n                           0.25,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.75,\n                           0,\n                           0.75,\n                           0.5,\n                           0,\n                           0.75,\n                           0.25,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.625,\n                           1,\n                           0,\n                           0.625,\n                           0.75,\n                           0,\n                           0.625,\n                           0.5,\n                           0,\n                           0.625,\n                           0.25,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.375,\n                           1,\n                           0,\n                           0.375,\n                           0.75,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.375,\n                           0.5,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.375,\n                           0.25,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.75,\n                           0,\n                           0.25,\n                           0.5,\n                           0,\n                           0.25,\n                           0.25,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.125,\n                           1,\n                           0,\n                           0.125,\n                           0.75,\n                           0,\n                           0.125,\n                           0.5,\n                           0,\n                           0.125,\n                           0.25,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.875,\n                           1,\n                           0,\n                           0.875,\n                           0.75,\n                           0,\n                           1,\n                           0.75,\n                           0,\n                           0.875,\n                           0.5,\n                           0,\n                           1,\n                           0.5,\n                           0,\n                           0.875,\n                           0.25,\n                           0,\n                           1,\n                           0.25,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.75,\n                           0,\n                           0.75,\n                           0.5,\n                           0,\n                           0.75,\n                           0.25,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.625,\n                           1,\n                           0,\n                           0.625,\n                           0.75,\n                           0,\n                           0.625,\n                           0.5,\n                           0,\n                           0.625,\n                           0.25,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.375,\n                           1,\n                           0,\n                           0.375,\n                           0.75,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.375,\n                           0.5,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.375,\n                           0.25,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.75,\n                           0,\n                           0.25,\n                           0.5,\n                           0,\n                           0.25,\n                           0.25,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.125,\n                           1,\n                           0,\n                           0.125,\n                           0.75,\n                           0,\n                           0.125,\n                           0.5,\n                           0,\n                           0.125,\n                           0.25,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.875,\n                           1,\n                           0,\n                           0.875,\n                           0.75,\n                           0,\n                           1,\n                           0.75,\n                           0,\n                           0.875,\n                           0.5,\n                           0,\n                           1,\n                           0.5,\n                           0,\n                           0.875,\n                           0.25,\n                           0,\n                           1,\n                           0.25,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.75,\n                           0,\n                           0.75,\n                           0.5,\n                           0,\n                           0.75,\n                           0.25,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.625,\n                           1,\n                           0,\n                           0.625,\n                           0.75,\n                           0,\n                           0.625,\n                           0.5,\n                           0,\n                           0.625,\n                           0.25,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.375,\n                           1,\n                           0,\n                           0.375,\n                           0.75,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.375,\n                           0.5,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.375,\n                           0.25,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.75,\n                           0,\n                           0.25,\n                           0.5,\n                           0,\n                           0.25,\n                           0.25,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.125,\n                           1,\n                           0,\n                           0.125,\n                           0.75,\n                           0,\n                           0.125,\n                           0.5,\n                           0,\n                           0.125,\n                           0.25,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.875,\n                           1,\n                           0,\n                           0.875,\n                           0.75,\n                           0,\n                           1,\n                           0.75,\n                           0,\n                           0.875,\n                           0.5,\n                           0,\n                           1,\n                           0.5,\n                           0,\n                           0.875,\n                           0.25,\n                           0,\n                           1,\n                           0.25,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.75,\n                           0,\n                           0.75,\n                           0.5,\n                           0,\n                           0.75,\n                           0.25,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.625,\n                           1,\n                           0,\n                           0.625,\n                           0.75,\n                           0,\n                           0.625,\n                           0.5,\n                           0,\n                           0.625,\n                           0.25,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.375,\n                           1,\n                           0,\n                           0.375,\n                           0.75,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.375,\n                           0.5,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.375,\n                           0.25,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.75,\n                           0,\n                           0.25,\n                           0.5,\n                           0,\n                           0.25,\n                           0.25,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.125,\n                           1,\n                           0,\n                           0.125,\n                           0.75,\n                           0,\n                           0.125,\n                           0.5,\n                           0,\n                           0.125,\n                           0.25,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0,\n                           0};\n\nuint16_t teapotIndices[] = {\n    0,   1,   2,   2,   3,   0,   3,   2,   4,   4,   5,   3,   5,   4,   6,\n    6,   7,   5,   7,   6,   8,   8,   9,   7,   1,   10,  11,  11,  2,   1,\n    2,   11,  12,  12,  4,   2,   4,   12,  13,  13,  6,   4,   6,   13,  14,\n    14,  8,   6,   10,  15,  16,  16,  11,  10,  11,  16,  17,  17,  12,  11,\n    12,  17,  18,  18,  13,  12,  13,  18,  19,  19,  14,  13,  15,  20,  21,\n    21,  16,  15,  16,  21,  22,  22,  17,  16,  17,  22,  23,  23,  18,  17,\n    18,  23,  24,  24,  19,  18,  25,  26,  27,  27,  28,  25,  28,  27,  29,\n    29,  30,  28,  30,  29,  31,  31,  32,  30,  32,  31,  33,  33,  34,  32,\n    26,  35,  36,  36,  27,  26,  27,  36,  37,  37,  29,  27,  29,  37,  38,\n    38,  31,  29,  31,  38,  39,  39,  33,  31,  35,  40,  41,  41,  36,  35,\n    36,  41,  42,  42,  37,  36,  37,  42,  43,  43,  38,  37,  38,  43,  44,\n    44,  39,  38,  40,  45,  46,  46,  41,  40,  41,  46,  47,  47,  42,  41,\n    42,  47,  48,  48,  43,  42,  43,  48,  49,  49,  44,  43,  50,  51,  52,\n    52,  53,  50,  53,  52,  54,  54,  55,  53,  55,  54,  56,  56,  57,  55,\n    57,  56,  58,  58,  59,  57,  51,  60,  61,  61,  52,  51,  52,  61,  62,\n    62,  54,  52,  54,  62,  63,  63,  56,  54,  56,  63,  64,  64,  58,  56,\n    60,  65,  66,  66,  61,  60,  61,  66,  67,  67,  62,  61,  62,  67,  68,\n    68,  63,  62,  63,  68,  69,  69,  64,  63,  65,  70,  71,  71,  66,  65,\n    66,  71,  72,  72,  67,  66,  67,  72,  73,  73,  68,  67,  68,  73,  74,\n    74,  69,  68,  75,  76,  77,  77,  78,  75,  78,  77,  79,  79,  80,  78,\n    80,  79,  81,  81,  82,  80,  82,  81,  83,  83,  84,  82,  76,  85,  86,\n    86,  77,  76,  77,  86,  87,  87,  79,  77,  79,  87,  88,  88,  81,  79,\n    81,  88,  89,  89,  83,  81,  85,  90,  91,  91,  86,  85,  86,  91,  92,\n    92,  87,  86,  87,  92,  93,  93,  88,  87,  88,  93,  94,  94,  89,  88,\n    90,  95,  96,  96,  91,  90,  91,  96,  97,  97,  92,  91,  92,  97,  98,\n    98,  93,  92,  93,  98,  99,  99,  94,  93,  100, 101, 102, 102, 103, 100,\n    103, 102, 104, 104, 105, 103, 105, 104, 106, 106, 107, 105, 107, 106, 108,\n    108, 109, 107, 101, 110, 111, 111, 102, 101, 102, 111, 112, 112, 104, 102,\n    104, 112, 113, 113, 106, 104, 106, 113, 114, 114, 108, 106, 110, 115, 116,\n    116, 111, 110, 111, 116, 117, 117, 112, 111, 112, 117, 118, 118, 113, 112,\n    113, 118, 119, 119, 114, 113, 115, 120, 121, 121, 116, 115, 116, 121, 122,\n    122, 117, 116, 117, 122, 123, 123, 118, 117, 118, 123, 124, 124, 119, 118,\n    125, 126, 127, 127, 128, 125, 128, 127, 129, 129, 130, 128, 130, 129, 131,\n    131, 132, 130, 132, 131, 133, 133, 134, 132, 126, 135, 136, 136, 127, 126,\n    127, 136, 137, 137, 129, 127, 129, 137, 138, 138, 131, 129, 131, 138, 139,\n    139, 133, 131, 135, 140, 141, 141, 136, 135, 136, 141, 142, 142, 137, 136,\n    137, 142, 143, 143, 138, 137, 138, 143, 144, 144, 139, 138, 140, 145, 146,\n    146, 141, 140, 141, 146, 147, 147, 142, 141, 142, 147, 148, 148, 143, 142,\n    143, 148, 149, 149, 144, 143, 150, 151, 152, 152, 153, 150, 153, 152, 154,\n    154, 155, 153, 155, 154, 156, 156, 157, 155, 157, 156, 158, 158, 159, 157,\n    151, 160, 161, 161, 152, 151, 152, 161, 162, 162, 154, 152, 154, 162, 163,\n    163, 156, 154, 156, 163, 164, 164, 158, 156, 160, 165, 166, 166, 161, 160,\n    161, 166, 167, 167, 162, 161, 162, 167, 168, 168, 163, 162, 163, 168, 169,\n    169, 164, 163, 165, 170, 171, 171, 166, 165, 166, 171, 172, 172, 167, 166,\n    167, 172, 173, 173, 168, 167, 168, 173, 174, 174, 169, 168, 175, 176, 177,\n    177, 178, 175, 178, 177, 179, 179, 180, 178, 180, 179, 181, 181, 182, 180,\n    182, 181, 183, 183, 184, 182, 176, 185, 186, 186, 177, 176, 177, 186, 187,\n    187, 179, 177, 179, 187, 188, 188, 181, 179, 181, 188, 189, 189, 183, 181,\n    185, 190, 191, 191, 186, 185, 186, 191, 192, 192, 187, 186, 187, 192, 193,\n    193, 188, 187, 188, 193, 194, 194, 189, 188, 190, 195, 196, 196, 191, 190,\n    191, 196, 197, 197, 192, 191, 192, 197, 198, 198, 193, 192, 193, 198, 199,\n    199, 194, 193, 200, 201, 202, 202, 203, 200, 203, 202, 204, 204, 205, 203,\n    205, 204, 206, 206, 207, 205, 207, 206, 208, 208, 209, 207, 201, 210, 211,\n    211, 202, 201, 202, 211, 212, 212, 204, 202, 204, 212, 213, 213, 206, 204,\n    206, 213, 214, 214, 208, 206, 210, 215, 216, 216, 211, 210, 211, 216, 217,\n    217, 212, 211, 212, 217, 218, 218, 213, 212, 213, 218, 219, 219, 214, 213,\n    215, 220, 221, 221, 216, 215, 216, 221, 222, 222, 217, 216, 217, 222, 223,\n    223, 218, 217, 218, 223, 224, 224, 219, 218, 225, 226, 227, 227, 228, 225,\n    228, 227, 229, 229, 230, 228, 230, 229, 231, 231, 232, 230, 232, 231, 233,\n    233, 234, 232, 226, 235, 236, 236, 227, 226, 227, 236, 237, 237, 229, 227,\n    229, 237, 238, 238, 231, 229, 231, 238, 239, 239, 233, 231, 235, 240, 241,\n    241, 236, 235, 236, 241, 242, 242, 237, 236, 237, 242, 243, 243, 238, 237,\n    238, 243, 244, 244, 239, 238, 240, 245, 246, 246, 241, 240, 241, 246, 247,\n    247, 242, 241, 242, 247, 248, 248, 243, 242, 243, 248, 249, 249, 244, 243,\n    250, 251, 252, 252, 253, 250, 253, 252, 254, 254, 255, 253, 255, 254, 256,\n    256, 257, 255, 257, 256, 258, 258, 259, 257, 251, 260, 261, 261, 252, 251,\n    252, 261, 262, 262, 254, 252, 254, 262, 263, 263, 256, 254, 256, 263, 264,\n    264, 258, 256, 260, 265, 266, 266, 261, 260, 261, 266, 267, 267, 262, 261,\n    262, 267, 268, 268, 263, 262, 263, 268, 269, 269, 264, 263, 265, 270, 271,\n    271, 266, 265, 266, 271, 272, 272, 267, 266, 267, 272, 273, 273, 268, 267,\n    268, 273, 274, 274, 269, 268, 275, 276, 277, 277, 278, 275, 278, 277, 279,\n    279, 280, 278, 280, 279, 281, 281, 282, 280, 282, 281, 283, 283, 284, 282,\n    276, 285, 286, 286, 277, 276, 277, 286, 287, 287, 279, 277, 279, 287, 288,\n    288, 281, 279, 281, 288, 289, 289, 283, 281, 285, 290, 291, 291, 286, 285,\n    286, 291, 292, 292, 287, 286, 287, 292, 293, 293, 288, 287, 288, 293, 294,\n    294, 289, 288, 290, 295, 296, 296, 291, 290, 291, 296, 297, 297, 292, 291,\n    292, 297, 298, 298, 293, 292, 293, 298, 299, 299, 294, 293, 300, 301, 302,\n    302, 303, 300, 303, 302, 304, 304, 305, 303, 305, 304, 306, 306, 307, 305,\n    307, 306, 308, 308, 309, 307, 301, 310, 311, 311, 302, 301, 302, 311, 312,\n    312, 304, 302, 304, 312, 313, 313, 306, 304, 306, 313, 314, 314, 308, 306,\n    310, 315, 316, 316, 311, 310, 311, 316, 317, 317, 312, 311, 312, 317, 318,\n    318, 313, 312, 313, 318, 319, 319, 314, 313, 315, 320, 321, 321, 316, 315,\n    316, 321, 322, 322, 317, 316, 317, 322, 323, 323, 318, 317, 318, 323, 324,\n    324, 319, 318, 325, 326, 327, 327, 328, 325, 328, 327, 329, 329, 330, 328,\n    330, 329, 331, 331, 332, 330, 332, 331, 333, 333, 334, 332, 326, 335, 336,\n    336, 327, 326, 327, 336, 337, 337, 329, 327, 329, 337, 338, 338, 331, 329,\n    331, 338, 339, 339, 333, 331, 335, 340, 341, 341, 336, 335, 336, 341, 342,\n    342, 337, 336, 337, 342, 343, 343, 338, 337, 338, 343, 344, 344, 339, 338,\n    340, 345, 346, 346, 341, 340, 341, 346, 347, 347, 342, 341, 342, 347, 348,\n    348, 343, 342, 343, 348, 349, 349, 344, 343, 350, 351, 352, 352, 353, 350,\n    353, 352, 354, 354, 355, 353, 355, 354, 356, 356, 357, 355, 357, 356, 358,\n    358, 359, 357, 351, 360, 361, 361, 352, 351, 352, 361, 362, 362, 354, 352,\n    354, 362, 363, 363, 356, 354, 356, 363, 364, 364, 358, 356, 360, 365, 366,\n    366, 361, 360, 361, 366, 367, 367, 362, 361, 362, 367, 368, 368, 363, 362,\n    363, 368, 369, 369, 364, 363, 365, 370, 371, 371, 366, 365, 366, 371, 372,\n    372, 367, 366, 367, 372, 373, 373, 368, 367, 368, 373, 374, 374, 369, 368,\n    375, 376, 377, 377, 378, 375, 378, 377, 379, 379, 380, 378, 380, 379, 381,\n    381, 382, 380, 382, 381, 383, 383, 384, 382, 376, 385, 386, 386, 377, 376,\n    377, 386, 387, 387, 379, 377, 379, 387, 388, 388, 381, 379, 381, 388, 389,\n    389, 383, 381, 385, 390, 391, 391, 386, 385, 386, 391, 392, 392, 387, 386,\n    387, 392, 393, 393, 388, 387, 388, 393, 394, 394, 389, 388, 390, 395, 396,\n    396, 391, 390, 391, 396, 397, 397, 392, 391, 392, 397, 398, 398, 393, 392,\n    393, 398, 399, 399, 394, 393, 400, 401, 402, 402, 403, 400, 403, 402, 404,\n    404, 405, 403, 405, 404, 406, 406, 407, 405, 407, 406, 408, 408, 409, 407,\n    401, 410, 411, 411, 402, 401, 402, 411, 412, 412, 404, 402, 404, 412, 413,\n    413, 406, 404, 406, 413, 414, 414, 408, 406, 410, 415, 416, 416, 411, 410,\n    411, 416, 417, 417, 412, 411, 412, 417, 418, 418, 413, 412, 413, 418, 419,\n    419, 414, 413, 415, 420, 421, 421, 416, 415, 416, 421, 422, 422, 417, 416,\n    417, 422, 423, 423, 418, 417, 418, 423, 424, 424, 419, 418, 425, 426, 427,\n    427, 428, 425, 428, 427, 429, 429, 430, 428, 430, 429, 431, 431, 432, 430,\n    432, 431, 433, 433, 434, 432, 426, 435, 436, 436, 427, 426, 427, 436, 437,\n    437, 429, 427, 429, 437, 438, 438, 431, 429, 431, 438, 439, 439, 433, 431,\n    435, 440, 441, 441, 436, 435, 436, 441, 442, 442, 437, 436, 437, 442, 443,\n    443, 438, 437, 438, 443, 444, 444, 439, 438, 440, 445, 446, 446, 441, 440,\n    441, 446, 447, 447, 442, 441, 442, 447, 448, 448, 443, 442, 443, 448, 449,\n    449, 444, 443, 450, 451, 452, 452, 453, 450, 453, 452, 454, 454, 455, 453,\n    455, 454, 456, 456, 457, 455, 457, 456, 458, 458, 459, 457, 451, 460, 461,\n    461, 452, 451, 452, 461, 462, 462, 454, 452, 454, 462, 463, 463, 456, 454,\n    456, 463, 464, 464, 458, 456, 460, 465, 466, 466, 461, 460, 461, 466, 467,\n    467, 462, 461, 462, 467, 468, 468, 463, 462, 463, 468, 469, 469, 464, 463,\n    465, 470, 471, 471, 466, 465, 466, 471, 472, 472, 467, 466, 467, 472, 473,\n    473, 468, 467, 468, 473, 474, 474, 469, 468, 475, 476, 477, 477, 478, 475,\n    478, 477, 479, 479, 480, 478, 480, 479, 481, 481, 482, 480, 482, 481, 483,\n    483, 484, 482, 476, 485, 486, 486, 477, 476, 477, 486, 487, 487, 479, 477,\n    479, 487, 488, 488, 481, 479, 481, 488, 489, 489, 483, 481, 485, 490, 491,\n    491, 486, 485, 486, 491, 492, 492, 487, 486, 487, 492, 493, 493, 488, 487,\n    488, 493, 494, 494, 489, 488, 490, 495, 496, 496, 491, 490, 491, 496, 497,\n    497, 492, 491, 492, 497, 498, 498, 493, 492, 493, 498, 499, 499, 494, 493,\n    500, 501, 502, 502, 503, 500, 503, 502, 504, 504, 505, 503, 505, 504, 506,\n    506, 507, 505, 507, 506, 508, 508, 509, 507, 501, 510, 511, 511, 502, 501,\n    502, 511, 512, 512, 504, 502, 504, 512, 513, 513, 506, 504, 506, 513, 514,\n    514, 508, 506, 510, 515, 516, 516, 511, 510, 511, 516, 517, 517, 512, 511,\n    512, 517, 518, 518, 513, 512, 513, 518, 519, 519, 514, 513, 515, 520, 521,\n    521, 516, 515, 516, 521, 522, 522, 517, 516, 517, 522, 523, 523, 518, 517,\n    518, 523, 524, 524, 519, 518, 525, 526, 527, 527, 528, 525, 528, 527, 529,\n    529, 530, 528, 530, 529, 531, 531, 532, 530, 532, 531, 533, 533, 534, 532,\n    526, 535, 536, 536, 527, 526, 527, 536, 537, 537, 529, 527, 529, 537, 538,\n    538, 531, 529, 531, 538, 539, 539, 533, 531, 535, 540, 541, 541, 536, 535,\n    536, 541, 542, 542, 537, 536, 537, 542, 543, 543, 538, 537, 538, 543, 544,\n    544, 539, 538, 540, 545, 546, 546, 541, 540, 541, 546, 547, 547, 542, 541,\n    542, 547, 548, 548, 543, 542, 543, 548, 549, 549, 544, 543, 550, 551, 552,\n    552, 553, 550, 553, 552, 554, 554, 555, 553, 555, 554, 556, 556, 557, 555,\n    557, 556, 558, 558, 559, 557, 551, 560, 561, 561, 552, 551, 552, 561, 562,\n    562, 554, 552, 554, 562, 563, 563, 556, 554, 556, 563, 564, 564, 558, 556,\n    560, 565, 566, 566, 561, 560, 561, 566, 567, 567, 562, 561, 562, 567, 568,\n    568, 563, 562, 563, 568, 569, 569, 564, 563, 565, 570, 571, 571, 566, 565,\n    566, 571, 572, 572, 567, 566, 567, 572, 573, 573, 568, 567, 568, 573, 574,\n    574, 569, 568, 575, 576, 577, 577, 578, 575, 578, 577, 579, 579, 580, 578,\n    580, 579, 581, 581, 582, 580, 582, 581, 583, 583, 584, 582, 576, 585, 586,\n    586, 577, 576, 577, 586, 587, 587, 579, 577, 579, 587, 588, 588, 581, 579,\n    581, 588, 589, 589, 583, 581, 585, 590, 591, 591, 586, 585, 586, 591, 592,\n    592, 587, 586, 587, 592, 593, 593, 588, 587, 588, 593, 594, 594, 589, 588,\n    590, 595, 596, 596, 591, 590, 591, 596, 597, 597, 592, 591, 592, 597, 598,\n    598, 593, 592, 593, 598, 599, 599, 594, 593, 600, 601, 602, 602, 603, 600,\n    603, 602, 604, 604, 605, 603, 605, 604, 606, 606, 607, 605, 607, 606, 608,\n    608, 609, 607, 601, 610, 611, 611, 602, 601, 602, 611, 612, 612, 604, 602,\n    604, 612, 613, 613, 606, 604, 606, 613, 614, 614, 608, 606, 610, 615, 616,\n    616, 611, 610, 611, 616, 617, 617, 612, 611, 612, 617, 618, 618, 613, 612,\n    613, 618, 619, 619, 614, 613, 615, 620, 621, 621, 616, 615, 616, 621, 622,\n    622, 617, 616, 617, 622, 623, 623, 618, 617, 618, 623, 624, 624, 619, 618,\n    625, 626, 627, 627, 628, 625, 628, 627, 629, 629, 630, 628, 630, 629, 631,\n    631, 632, 630, 632, 631, 633, 633, 634, 632, 626, 635, 636, 636, 627, 626,\n    627, 636, 637, 637, 629, 627, 629, 637, 638, 638, 631, 629, 631, 638, 639,\n    639, 633, 631, 635, 640, 641, 641, 636, 635, 636, 641, 642, 642, 637, 636,\n    637, 642, 643, 643, 638, 637, 638, 643, 644, 644, 639, 638, 640, 645, 646,\n    646, 641, 640, 641, 646, 647, 647, 642, 641, 642, 647, 648, 648, 643, 642,\n    643, 648, 649, 649, 644, 643, 650, 651, 652, 652, 653, 650, 653, 652, 654,\n    654, 655, 653, 655, 654, 656, 656, 657, 655, 657, 656, 658, 658, 659, 657,\n    651, 660, 661, 661, 652, 651, 652, 661, 662, 662, 654, 652, 654, 662, 663,\n    663, 656, 654, 656, 663, 664, 664, 658, 656, 660, 665, 666, 666, 661, 660,\n    661, 666, 667, 667, 662, 661, 662, 667, 668, 668, 663, 662, 663, 668, 669,\n    669, 664, 663, 665, 670, 671, 671, 666, 665, 666, 671, 672, 672, 667, 666,\n    667, 672, 673, 673, 668, 667, 668, 673, 674, 674, 669, 668, 675, 676, 677,\n    677, 678, 675, 678, 677, 679, 679, 680, 678, 680, 679, 681, 681, 682, 680,\n    682, 681, 683, 683, 684, 682, 676, 685, 686, 686, 677, 676, 677, 686, 687,\n    687, 679, 677, 679, 687, 688, 688, 681, 679, 681, 688, 689, 689, 683, 681,\n    685, 690, 691, 691, 686, 685, 686, 691, 692, 692, 687, 686, 687, 692, 693,\n    693, 688, 687, 688, 693, 694, 694, 689, 688, 690, 695, 696, 696, 691, 690,\n    691, 696, 697, 697, 692, 691, 692, 697, 698, 698, 693, 692, 693, 698, 699,\n    699, 694, 693, 700, 701, 702, 702, 703, 700, 703, 702, 704, 704, 705, 703,\n    705, 704, 706, 706, 707, 705, 707, 706, 708, 708, 709, 707, 701, 710, 711,\n    711, 702, 701, 702, 711, 712, 712, 704, 702, 704, 712, 713, 713, 706, 704,\n    706, 713, 714, 714, 708, 706, 710, 715, 716, 716, 711, 710, 711, 716, 717,\n    717, 712, 711, 712, 717, 718, 718, 713, 712, 713, 718, 719, 719, 714, 713,\n    715, 720, 721, 721, 716, 715, 716, 721, 722, 722, 717, 716, 717, 722, 723,\n    723, 718, 717, 718, 723, 724, 724, 719, 718, 725, 726, 727, 727, 728, 725,\n    728, 727, 729, 729, 730, 728, 730, 729, 731, 731, 732, 730, 732, 731, 733,\n    733, 734, 732, 726, 735, 736, 736, 727, 726, 727, 736, 737, 737, 729, 727,\n    729, 737, 738, 738, 731, 729, 731, 738, 739, 739, 733, 731, 735, 740, 741,\n    741, 736, 735, 736, 741, 742, 742, 737, 736, 737, 742, 743, 743, 738, 737,\n    738, 743, 744, 744, 739, 738, 740, 745, 746, 746, 741, 740, 741, 746, 747,\n    747, 742, 741, 742, 747, 748, 748, 743, 742, 743, 748, 749, 749, 744, 743,\n    750, 751, 752, 752, 753, 750, 753, 752, 754, 754, 755, 753, 755, 754, 756,\n    756, 757, 755, 757, 756, 758, 758, 759, 757, 751, 760, 761, 761, 752, 751,\n    752, 761, 762, 762, 754, 752, 754, 762, 763, 763, 756, 754, 756, 763, 764,\n    764, 758, 756, 760, 765, 766, 766, 761, 760, 761, 766, 767, 767, 762, 761,\n    762, 767, 768, 768, 763, 762, 763, 768, 769, 769, 764, 763, 765, 770, 771,\n    771, 766, 765, 766, 771, 772, 772, 767, 766, 767, 772, 773, 773, 768, 767,\n    768, 773, 774, 774, 769, 768, 775, 776, 777, 777, 778, 775, 778, 777, 779,\n    779, 780, 778, 780, 779, 781, 781, 782, 780, 782, 781, 783, 783, 784, 782,\n    776, 785, 786, 786, 777, 776, 777, 786, 787, 787, 779, 777, 779, 787, 788,\n    788, 781, 779, 781, 788, 789, 789, 783, 781, 785, 790, 791, 791, 786, 785,\n    786, 791, 792, 792, 787, 786, 787, 792, 793, 793, 788, 787, 788, 793, 794,\n    794, 789, 788, 790, 795, 796, 796, 791, 790, 791, 796, 797, 797, 792, 791,\n    792, 797, 798, 798, 793, 792, 793, 798, 799, 799, 794, 793};\n"
  },
  {
    "path": "teapots/more-teapots/src/main/java/com/sample/helper/NDKHelper.java",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.sample.helper;\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.nio.ByteBuffer;\n\nimport javax.microedition.khronos.opengles.GL10;\n\nimport android.R.bool;\nimport android.opengl.GLES30;\n\nimport android.annotation.TargetApi;\nimport android.app.Activity;\nimport android.app.NativeActivity;\nimport android.content.Context;\nimport android.content.pm.ApplicationInfo;\nimport android.content.pm.PackageManager;\nimport android.content.pm.PackageManager.NameNotFoundException;\nimport android.graphics.Bitmap;\nimport android.graphics.Bitmap.CompressFormat;\nimport android.graphics.BitmapFactory;\nimport android.graphics.Matrix;\nimport android.media.AudioManager;\nimport android.media.AudioTrack;\nimport android.opengl.GLUtils;\nimport android.os.Build;\nimport android.util.Log;\nimport android.view.View;\nimport android.view.View.MeasureSpec;\n\n@TargetApi(Build.VERSION_CODES.GINGERBREAD)\npublic class NDKHelper {\n\n    public NDKHelper(NativeActivity act) {\n        activity = act;\n    }\n\n    public void loadLibrary(String soname) {\n        if (soname.isEmpty() == false) {\n            System.loadLibrary(soname);\n            loadedSO = true;\n        }\n    }\n\n    public static Boolean checkSOLoaded() {\n        if (loadedSO == false) {\n            Log.e(\"NDKHelper\",\n                    \"--------------------------------------------\\n\"\n                            + \".so has not been loaded. To use JUI helper, please initialize with \\n\"\n                            + \"NDKHelper::Init( ANativeActivity* activity, const char* helper_class_name, const char* native_soname);\\n\"\n                            + \"--------------------------------------------\\n\");\n            return false;\n        } else\n            return true;\n    }\n\n    private static boolean loadedSO = false;\n    NativeActivity activity;\n\n\n\n    //\n    // Load Bitmap\n    // Java helper is useful decoding PNG, TIFF etc rather than linking libPng\n    // etc separately\n    //\n    private int nextPOT(int i) {\n        int pot = 1;\n        while (pot < i)\n            pot <<= 1;\n        return pot;\n    }\n\n    private Bitmap scaleBitmap(Bitmap bitmapToScale, float newWidth,\n                               float newHeight) {\n        if (bitmapToScale == null)\n            return null;\n        // get the original width and height\n        int width = bitmapToScale.getWidth();\n        int height = bitmapToScale.getHeight();\n        // create a matrix for the manipulation\n        Matrix matrix = new Matrix();\n\n        // resize the bit map\n        matrix.postScale(newWidth / width, newHeight / height);\n\n        // recreate the new Bitmap and set it back\n        return Bitmap.createBitmap(bitmapToScale, 0, 0,\n                bitmapToScale.getWidth(), bitmapToScale.getHeight(), matrix,\n                true);\n    }\n\n    public class TextureInformation {\n        boolean ret;\n        boolean alphaChannel;\n        int originalWidth;\n        int originalHeight;\n        Object image;\n    }\n\n    public Object loadTexture(String path) {\n        Bitmap bitmap = null;\n        TextureInformation info = new TextureInformation();\n        try {\n            String str = path;\n            if (!path.startsWith(\"/\")) {\n                str = \"/\" + path;\n            }\n\n            File file = new File(activity.getExternalFilesDir(null), str);\n            if (file.canRead()) {\n                bitmap = BitmapFactory.decodeStream(new FileInputStream(file));\n            } else {\n                bitmap = BitmapFactory.decodeStream(activity.getResources()\n                        .getAssets().open(path));\n            }\n            // Matrix matrix = new Matrix();\n            // // resize the bit map\n            // matrix.postScale(-1F, 1F);\n            //\n            // // recreate the new Bitmap and set it back\n            // bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),\n            // bitmap.getHeight(), matrix, true);\n\n        } catch (Exception e) {\n            Log.w(\"NDKHelper\", \"Coundn't load a file:\" + path);\n            info.ret = false;\n            return info;\n        }\n\n        if (bitmap != null) {\n            GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);\n        }\n        info.ret = true;\n        info.alphaChannel = bitmap.hasAlpha();\n        info.originalWidth = getBitmapWidth(bitmap);\n        info.originalHeight = getBitmapHeight(bitmap);\n\n        return info;\n    }\n\n    public Object loadCubemapTexture(String path, int face, int miplevel, boolean sRGB) {\n        Bitmap bitmap = null;\n        TextureInformation info = new TextureInformation();\n        try {\n            String str = path;\n            if (!path.startsWith(\"/\")) {\n                str = \"/\" + path;\n            }\n\n            File file = new File(activity.getExternalFilesDir(null), str);\n            if (file.canRead()) {\n                bitmap = BitmapFactory.decodeStream(new FileInputStream(file));\n            } else {\n                bitmap = BitmapFactory.decodeStream(activity.getResources()\n                        .getAssets().open(path));\n            }\n        } catch (Exception e) {\n            Log.w(\"NDKHelper\", \"Coundn't load a file:\" + path);\n            info.ret = false;\n            return info;\n        }\n\n        if (bitmap != null) {\n            if (sRGB)\n            {\n//        \t\tGLUtils.texImage2D(face, miplevel, bitmap, 0);\n//        \t\tGLUtils.texImage2D(face, miplevel,\n//        \t\t\t\tGLUtils.getInternalFormat(bitmap), bitmap, 0);\n//        \t\tint i = GLUtils.getInternalFormat(bitmap);\n//        \t\tif( i == GL10.GL_RGBA)\n//        \t\t{\n//            \t\tGLUtils.texImage2D(face, miplevel,\n//            \t\t\t\tGLES30.GL_SRGB, bitmap, 0);\n//        \t\t}\n                //Leave them for now\n                GLUtils.texImage2D(face, miplevel, bitmap, 0);\n            }\n            else\n                GLUtils.texImage2D(face, miplevel, bitmap, 0);\n        }\n        info.ret = true;\n        info.alphaChannel = bitmap.hasAlpha();\n        info.originalWidth = getBitmapWidth(bitmap);\n        info.originalHeight = getBitmapHeight(bitmap);\n\n        return info;\n\n    }\n\n    public Object loadImage(String path) {\n        Bitmap bitmap = null;\n        TextureInformation info = new TextureInformation();\n        try {\n            String str = path;\n            if (!path.startsWith(\"/\")) {\n                str = \"/\" + path;\n            }\n\n            File file = new File(activity.getExternalFilesDir(null), str);\n            if (file.canRead()) {\n                bitmap = BitmapFactory.decodeStream(new FileInputStream(file));\n            } else {\n                bitmap = BitmapFactory.decodeStream(activity.getResources()\n                        .getAssets().open(path));\n            }\n        } catch (Exception e) {\n            Log.w(\"NDKHelper\", \"Coundn't load a file:\" + path);\n            info.ret = false;\n            return info;\n        }\n\n        if (bitmap != null) {\n            GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);\n        }\n        info.ret = true;\n        info.alphaChannel = bitmap.hasAlpha();\n        info.originalWidth = getBitmapWidth(bitmap);\n        info.originalHeight = getBitmapHeight(bitmap);\n\n        int iBytes = bitmap.getWidth() * bitmap.getHeight() * 4;\n        ByteBuffer buffer = ByteBuffer.allocateDirect(iBytes);\n\n        bitmap.copyPixelsToBuffer(buffer);\n        info.image = buffer;\n        return info;\n    }\n\n    public Bitmap openBitmap(String path, boolean iScalePOT) {\n        Bitmap bitmap = null;\n        try {\n            bitmap = BitmapFactory.decodeStream(activity.getResources()\n                    .getAssets().open(path));\n            if (iScalePOT) {\n                int originalWidth = getBitmapWidth(bitmap);\n                int originalHeight = getBitmapHeight(bitmap);\n                int width = nextPOT(originalWidth);\n                int height = nextPOT(originalHeight);\n                if (originalWidth != width || originalHeight != height) {\n                    // Scale it\n                    bitmap = scaleBitmap(bitmap, width, height);\n                }\n            }\n\n        } catch (Exception e) {\n            Log.w(\"NDKHelper\", \"Coundn't load a file:\" + path);\n        }\n\n        return bitmap;\n    }\n\n    public int getBitmapWidth(Bitmap bmp) {\n        return bmp.getWidth();\n    }\n\n    public int getBitmapHeight(Bitmap bmp) {\n        return bmp.getHeight();\n    }\n\n    public void getBitmapPixels(Bitmap bmp, int[] pixels) {\n        int w = bmp.getWidth();\n        int h = bmp.getHeight();\n        bmp.getPixels(pixels, 0, w, 0, 0, w, h);\n    }\n\n    public void closeBitmap(Bitmap bmp) {\n        bmp.recycle();\n    }\n\n    public String getNativeLibraryDirectory(Context appContext) {\n        ApplicationInfo ai = activity.getApplicationInfo();\n\n        Log.w(\"NDKHelper\", \"ai.nativeLibraryDir:\" + ai.nativeLibraryDir);\n\n        if ((ai.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0\n                || (ai.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {\n            return ai.nativeLibraryDir;\n        }\n        return \"/system/lib/\";\n    }\n\n    public String getApplicationName() {\n        final PackageManager pm = activity.getPackageManager();\n        ApplicationInfo ai;\n        try {\n            ai = pm.getApplicationInfo(activity.getPackageName(), 0);\n        } catch (final NameNotFoundException e) {\n            ai = null;\n        }\n        String applicationName = (String) (ai != null ? pm\n                .getApplicationLabel(ai) : \"(unknown)\");\n        return applicationName;\n    }\n\n    public String getStringResource(String resourceName)\n    {\n        int id = activity.getResources().getIdentifier(resourceName, \"string\", activity.getPackageName());\n        String value = id == 0 ? \"\" : (String)activity.getResources().getText(id);\n        return value;\n    }\n\n    //\n    // Audio related helpers\n    //\n    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)\n    public int getNativeAudioBufferSize() {\n        int SDK_INT = android.os.Build.VERSION.SDK_INT;\n        if (SDK_INT >= 17) {\n            AudioManager am = (AudioManager) activity\n                    .getSystemService(Context.AUDIO_SERVICE);\n            String framesPerBuffer = am\n                    .getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);\n            return Integer.parseInt(framesPerBuffer);\n        } else {\n            return 0;\n        }\n    }\n\n    public int getNativeAudioSampleRate() {\n        return AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_SYSTEM);\n    }\n\n    /*\n     * Helper to execute function in UIThread\n     */\n    public void runOnUIThread(final long p) {\n        if (checkSOLoaded()) {\n            activity.runOnUiThread(new Runnable() {\n                @Override\n                public void run() {\n                    RunOnUiThreadHandler(p);\n                }\n            });\n        }\n        return;\n    }\n\n    /*\n     * Native code helper for RunOnUiThread\n     */\n    native public void RunOnUiThreadHandler(long pointer);\n}\n"
  },
  {
    "path": "teapots/more-teapots/src/main/java/com/sample/moreteapots/MoreTeapotsApplication.java",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.sample.moreteapots;\n\nimport javax.microedition.khronos.opengles.GL10;\n\nimport com.sample.helper.NDKHelper;\n\nimport android.app.Application;\nimport android.content.Context;\nimport android.content.pm.ApplicationInfo;\nimport android.content.pm.PackageManager;\nimport android.content.pm.PackageManager.NameNotFoundException;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport android.graphics.Matrix;\nimport android.opengl.GLUtils;\nimport android.util.Log;\nimport android.widget.Toast;\n\npublic class MoreTeapotsApplication extends Application {\n    private static Context context;\n    public void onCreate(){\n        super.onCreate();\n\n        context=getApplicationContext();\n        Log.w(\"native-activity\", \"onCreate\");\n\n        final PackageManager pm = getApplicationContext().getPackageManager();\n        ApplicationInfo ai;\n        try {\n            ai = pm.getApplicationInfo( this.getPackageName(), 0);\n        } catch (final NameNotFoundException e) {\n            ai = null;\n        }\n        final String applicationName = (String) (ai != null ? pm.getApplicationLabel(ai) : \"(unknown)\");\n        Toast.makeText(this, applicationName, Toast.LENGTH_SHORT).show();\n    }\n\n}\n"
  },
  {
    "path": "teapots/more-teapots/src/main/java/com/sample/moreteapots/MoreTeapotsNativeActivity.java",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.sample.moreteapots;\n\nimport android.annotation.SuppressLint;\nimport android.annotation.TargetApi;\nimport android.app.NativeActivity;\nimport android.content.res.Configuration;\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.view.Gravity;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup.MarginLayoutParams;\nimport android.view.WindowManager.LayoutParams;\nimport android.widget.LinearLayout;\nimport android.widget.PopupWindow;\nimport android.widget.TextView;\n\npublic class MoreTeapotsNativeActivity extends NativeActivity {\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        //Hide toolbar\n        int SDK_INT = android.os.Build.VERSION.SDK_INT;\n        Log.i(\"OnCreate\", \"OnCreate!!!\");\n        if(SDK_INT >= 19)\n        {\n            setImmersiveSticky();\n            View decorView = getWindow().getDecorView();\n            decorView.setOnSystemUiVisibilityChangeListener\n                    (new View.OnSystemUiVisibilityChangeListener() {\n                @Override\n                public void onSystemUiVisibilityChange(int visibility) {\n                    setImmersiveSticky();\n                }\n            });\n        }\n\n    }\n\n    @TargetApi(19)\n    protected void onResume() {\n        super.onResume();\n\n        //Hide toolbar\n        int SDK_INT = android.os.Build.VERSION.SDK_INT;\n        if(SDK_INT >= 11 && SDK_INT < 14)\n        {\n            getWindow().getDecorView().setSystemUiVisibility(View.STATUS_BAR_HIDDEN);\n        }\n        else if(SDK_INT >= 14 && SDK_INT < 19)\n        {\n            getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LOW_PROFILE);\n        }\n        else if(SDK_INT >= 19)\n        {\n            setImmersiveSticky();\n        }\n    }\n\n    protected void onPause()\n    {\n        super.onPause();\n    }\n    // Our popup window, you will call it from your C/C++ code later\n\n    @TargetApi(19)\n    void setImmersiveSticky() {\n        View decorView = getWindow().getDecorView();\n        decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN\n                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION\n                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY\n                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN\n                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION\n                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);\n    }\n\n    MoreTeapotsNativeActivity _activity;\n    PopupWindow _popupWindow;\n    TextView _label;\n\n    @SuppressLint(\"InflateParams\")\n    public void showUI()\n    {\n        if( _popupWindow != null )\n            return;\n\n        _activity = this;\n\n        this.runOnUiThread(new Runnable()  {\n            @Override\n            public void run()  {\n                LayoutInflater layoutInflater\n                = (LayoutInflater)getBaseContext()\n                .getSystemService(LAYOUT_INFLATER_SERVICE);\n                View popupView = layoutInflater.inflate(R.layout.widgets, null);\n                _popupWindow = new PopupWindow(\n                        popupView,\n                        LayoutParams.WRAP_CONTENT,\n                        LayoutParams.WRAP_CONTENT);\n\n                LinearLayout mainLayout = new LinearLayout(_activity);\n                MarginLayoutParams params = new MarginLayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);\n                params.setMargins(0, 0, 0, 0);\n                _activity.setContentView(mainLayout, params);\n\n                // Show our UI over NativeActivity window\n                _popupWindow.showAtLocation(mainLayout, Gravity.TOP | Gravity.START, 10, 10);\n                _popupWindow.update();\n\n                _label = (TextView)popupView.findViewById(R.id.textViewFPS);\n\n            }});\n    }\n\n    public void updateFPS(final float fFPS)\n    {\n        if( _label == null )\n            return;\n\n        _activity = this;\n        this.runOnUiThread(new Runnable()  {\n            @Override\n            public void run()  {\n                _label.setText(String.format(\"%2.2f FPS\", fFPS));\n            }});\n    }\n}\n\n\n"
  },
  {
    "path": "teapots/more-teapots/src/main/res/layout/widgets.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:gravity=\"top\"\n    android:orientation=\"vertical\" >\n\n    <TextView\n        android:id=\"@+id/textViewFPS\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"end\"\n        android:text=\"@string/fps\"\n        android:textAppearance=\"?android:attr/textAppearanceMedium\"\n        android:textColor=\"@android:color/white\" />\n\n</LinearLayout>"
  },
  {
    "path": "teapots/more-teapots/src/main/res/values/strings.xml",
    "content": "<resources>\n\n    <string name=\"app_name\">More Teapots</string>\n    <string name=\"fps\">0.0 FPS</string>\n\n</resources>"
  },
  {
    "path": "teapots/more-teapots/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!--\n        Base application theme, dependent on API level. This theme is replaced\n        by AppBaseTheme from res/values-vXX/styles.xml on newer devices.\n    -->\n    <style name=\"AppBaseTheme\" parent=\"android:Theme.Light\">\n        <!--\n            Theme customizations available in newer API levels can go in\n            res/values-vXX/styles.xml, while customizations related to\n            backward-compatibility can go here.\n        -->\n    </style>\n\n    <!-- Application theme. -->\n    <style name=\"AppTheme\" parent=\"AppBaseTheme\">\n        <!-- All customizations that are NOT specific to a particular API-level can go here. -->\n    </style>\n\n</resources>"
  },
  {
    "path": "teapots/more-teapots/src/main/res/values-v11/styles.xml",
    "content": "<resources>\n\n    <!--\n        Base application theme for API 11+. This theme completely replaces\n        AppBaseTheme from res/values/styles.xml on API 11+ devices.\n    -->\n    <style name=\"AppBaseTheme\" parent=\"android:Theme.Holo.Light\">\n        <!-- API 11 theme customizations can go here. -->\n    </style>\n\n</resources>"
  },
  {
    "path": "teapots/more-teapots/src/main/res/values-v14/styles.xml",
    "content": "<resources>\n\n    <!--\n        Base application theme for API 14+. This theme completely replaces\n        AppBaseTheme from BOTH res/values/styles.xml and\n        res/values-v11/styles.xml on API 14+ devices.\n    -->\n    <style name=\"AppBaseTheme\" parent=\"android:Theme.Holo.Light.DarkActionBar\">\n        <!-- API 14 theme customizations can go here. -->\n    </style>\n\n</resources>"
  },
  {
    "path": "teapots/textured-teapot/README.md",
    "content": "# textured-teapot\n\nThis sample is a simple enhancement with a texture for classic-teapot\n\n- The teapot vertex coordinators are part of the model files\n- CPU side of the code for texturing is in TexturedTeapotRender class\n- fragment shader simply textures in and blend\n- Texture files are under apk's assets/Textures folder(bmp & tga tested)\n- Renders plain, 2d textured, and cubemap textured teapots, refer to\n  TexturedTeapotRender::GetTextureType()\n\n## Screenshots\n\n![screenshot](screenshot.png)\n"
  },
  {
    "path": "teapots/textured-teapot/build.gradle",
    "content": "plugins {\n    id \"ndksamples.android.application\"\n}\n\nandroid {\n    namespace 'com.sample.texturedteapot'\n\n    defaultConfig {\n        applicationId = 'com.sample.texturedteapot'\n        externalNativeBuild {\n            cmake {\n                arguments '-DANDROID_STL=c++_static'\n            }\n        }\n    }\n\n    externalNativeBuild {\n        cmake {\n            path 'src/main/cpp/CMakeLists.txt'\n        }\n    }\n}\n\ndependencies {\n    implementation libs.appcompat\n    implementation libs.androidx.constraintlayout\n}\n"
  },
  {
    "path": "teapots/textured-teapot/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:versionCode=\"1\"\n          android:versionName=\"1.0\" >\n\n  <uses-feature android:glEsVersion=\"0x00020000\"></uses-feature>\n\n  <application\n      android:allowBackup=\"false\"\n      android:fullBackupContent=\"false\"\n      android:supportsRtl=\"true\"\n      android:icon=\"@mipmap/ic_launcher\"\n      android:label=\"@string/app_name\"\n      android:theme=\"@style/AppTheme\"\n      android:name=\"com.sample.texturedteapot.TeapotApplication\"\n      >\n\n    <!-- Our activity is the built-in NativeActivity framework class.\n         This will take care of integrating with our NDK code. -->\n    <activity android:name=\"com.sample.texturedteapot.TeapotNativeActivity\"\n              android:label=\"@string/app_name\"\n              android:configChanges=\"orientation|keyboardHidden\"\n        android:exported=\"true\">\n      <!-- Tell NativeActivity the name of our .so -->\n      <meta-data android:name=\"android.app.lib_name\"\n                 android:value=\"TexturedTeapotNativeActivity\" />\n      <intent-filter>\n        <action android:name=\"android.intent.action.MAIN\" />\n        <category android:name=\"android.intent.category.LAUNCHER\" />\n      </intent-filter>\n    </activity>\n  </application>\n</manifest>\n"
  },
  {
    "path": "teapots/textured-teapot/src/main/assets/Shaders/2DTexture.fsh",
    "content": "//\n// Copyright (C) 2018 The Android Open Source Project\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n//  ShaderPlain.fsh\n//\n\n#define USE_PHONG (1)\n\nuniform lowp vec3       vMaterialAmbient;\nuniform lowp vec4       vMaterialSpecular;\n\nuniform sampler2D samplerObj;\n\nvarying mediump vec2    texCoord;\nvarying lowp vec4 diffuseLight;\n\n#if USE_PHONG\nuniform highp vec3   vLight0;\nvarying mediump vec3 position;\nvarying mediump vec3 normal;\n#else\nvarying lowp vec4 colorSpecular;\n#endif\n\nvoid main()\n{\n#if USE_PHONG\n    mediump vec3 halfVector = normalize(-vLight0 + position);\n    mediump float NdotH = max(dot(normalize(normal), halfVector), 0.0);\n    mediump float fPower = vMaterialSpecular.w;\n    mediump float specular = pow(NdotH, fPower);\n\n    lowp vec4 colorSpecular = vec4( vMaterialSpecular.xyz * specular, 1 );\n\n    // increase ambient light to brighten the teapot :-)\n    gl_FragColor = diffuseLight * texture2D(samplerObj, texCoord) +\n            2.0f * vec4(vMaterialAmbient.xyz, 1.0f) + colorSpecular;\n#else\n    gl_FragColor = mix(colorDiffuse, texture2D(samplerObj, texCoord), 0.5) + colorSpecular;\n#endif\n}\n"
  },
  {
    "path": "teapots/textured-teapot/src/main/assets/Shaders/2DTexture.vsh",
    "content": "//\n// Copyright (C) 2018 The Android Open Source Project\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n//  ShaderPlain.vsh\n//\n\n#define USE_PHONG (1)\n\nattribute highp vec3    myVertex;\nattribute highp vec3    myNormal;\nattribute mediump vec2  myUV;\nattribute mediump vec4  myBone;\n\nvarying mediump vec2    texCoord;\nvarying lowp    vec4    diffuseLight;\n\n#if USE_PHONG\nvarying mediump vec3 position;\nvarying mediump vec3 normal;\n#else\nvarying lowp    vec4    colorSpecular;\n#endif\n\nuniform highp mat4      uMVMatrix;\nuniform highp mat4      uPMatrix;\n\nuniform highp vec3      vLight0;\n\nuniform lowp vec4       vMaterialDiffuse;\nuniform lowp vec3       vMaterialAmbient;\nuniform lowp vec4       vMaterialSpecular;\n\nvoid main(void)\n{\n    highp vec4 p = vec4(myVertex,1);\n    gl_Position = uPMatrix * p;\n\n    texCoord = myUV;\n\n    highp vec3 worldNormal = vec3(mat3(uMVMatrix[0].xyz, uMVMatrix[1].xyz, uMVMatrix[2].xyz) * myNormal);\n    highp vec3 ecPosition = p.xyz;\n\n    diffuseLight = dot( worldNormal, normalize(-vLight0+ecPosition)) * vec4(1.0, 1.0, 1.0, 1.0);\n\n#if USE_PHONG\n    normal = worldNormal;\n    position = ecPosition;\n#else\n    highp vec3 halfVector = normalize(ecPosition - vLight0);\n\n    highp float NdotH = max(-dot(worldNormal, halfVector), 0.0);\n    float fPower = vMaterialSpecular.w;\n    highp float specular = min( pow(NdotH, fPower), 1.0);\n    colorSpecular = vec4( vMaterialSpecular.xyz * specular, 1 );\n#endif\n}\n"
  },
  {
    "path": "teapots/textured-teapot/src/main/assets/Shaders/Cubemap.fsh",
    "content": "//\n// Copyright (C) 2018 The Android Open Source Project\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n//  ShaderPlain.fsh\n//\n\nuniform lowp vec3       vMaterialAmbient;\nuniform lowp vec4       vMaterialSpecular;\n\nuniform samplerCube samplerObj;\n\nvarying lowp vec4 colorDiffuse;\n\nuniform highp vec3   vLight0;\nvarying mediump vec3 position;\nvarying mediump vec3 normal;\n\nvoid main()\n{\n    mediump vec3 halfVector = normalize(-vLight0 + position);\n    mediump float NdotH = max(dot(normalize(normal), halfVector), 0.0);\n    mediump float fPower = vMaterialSpecular.w;\n    mediump float specular = pow(NdotH, fPower);\n\n    lowp vec4 colorSpecular = vec4( vMaterialSpecular.xyz * specular, 1 );\n    mediump vec3 texCoord = normal;\n    texCoord.y = -normal.y;\n    gl_FragColor = colorDiffuse * textureCube(samplerObj, normalize(texCoord)) +\n                      vec4(vMaterialAmbient.xyz, 1.0);\n}\n"
  },
  {
    "path": "teapots/textured-teapot/src/main/assets/Shaders/Cubemap.vsh",
    "content": "//\n// Copyright (C) 2018 The Android Open Source Project\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n//  ShaderPlain.vsh\n//\n\nattribute highp vec3    myVertex;\nattribute highp vec3    myNormal;\nattribute mediump vec2  myUV;\nattribute mediump vec4  myBone;\n\nvarying lowp    vec4    colorDiffuse;\n\nvarying mediump vec3 position;\nvarying mediump vec3 normal;\n\nuniform highp mat4      uMVMatrix;\nuniform highp mat4      uPMatrix;\n\nuniform highp vec3      vLight0;\n\nuniform lowp vec4       vMaterialDiffuse;\nuniform lowp vec3       vMaterialAmbient;\nuniform lowp vec4       vMaterialSpecular;\n\nvoid main(void)\n{\n    highp vec4 p = vec4(myVertex,1);\n    gl_Position = uPMatrix * p;\n\n    highp vec3 worldNormal = vec3(mat3(uMVMatrix[0].xyz, uMVMatrix[1].xyz, uMVMatrix[2].xyz) * myNormal);\n    highp vec3 ecPosition = p.xyz;\n\n    // brighten the teapot color by 50%\n    colorDiffuse = clamp(vMaterialDiffuse * 1.5,\n                         vec4(0.0, 0.0, 0.0, 0.0),\n                         vec4(1.0, 1.0, 1.0, 1.0));\n\n    normal = worldNormal;\n    position = ecPosition;\n}\n"
  },
  {
    "path": "teapots/textured-teapot/src/main/assets/Shaders/ShaderPlain.fsh",
    "content": "//\n// Copyright (C) 2018 The Android Open Source Project\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n//  ShaderPlain.fsh\n//\n\n#define USE_PHONG (1)\n\nuniform lowp vec3       vMaterialAmbient;\nuniform lowp vec4       vMaterialSpecular;\n\nvarying lowp vec4 colorDiffuse;\n\n#if USE_PHONG\nuniform highp vec3      vLight0;\nvarying mediump vec3 position;\nvarying mediump vec3 normal;\n#else\nvarying lowp vec4 colorSpecular;\n#endif\n\nvoid main()\n{\n#if USE_PHONG\n    mediump vec3 halfVector = normalize(-vLight0 + position);\n    mediump float NdotH = max(dot(normalize(normal), halfVector), 0.0);\n    mediump float fPower = vMaterialSpecular.w;\n    mediump float specular = pow(NdotH, fPower);\n\n    lowp vec4 colorSpecular = vec4( vMaterialSpecular.xyz * specular, 1 );\n    gl_FragColor = colorDiffuse + colorSpecular;\n#else\n    gl_FragColor = colorDiffuse + colorSpecular;\n#endif\n}\n"
  },
  {
    "path": "teapots/textured-teapot/src/main/assets/Shaders/VS_ShaderPlain.vsh",
    "content": "//\n// Copyright (C) 2018 The Android Open Source Project\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n//  ShaderPlain.vsh\n//\n\n#define USE_PHONG (1)\n\nattribute highp vec3    myVertex;\nattribute highp vec3    myNormal;\nattribute mediump vec2  myUV;\nattribute mediump vec4  myBone;\n\nvarying mediump vec2    texCoord;\nvarying lowp    vec4    colorDiffuse;\n\n#if USE_PHONG\nvarying mediump vec3 position;\nvarying mediump vec3 normal;\n#else\nvarying lowp    vec4    colorSpecular;\n#endif\n\nuniform highp mat4      uMVMatrix;\nuniform highp mat4      uPMatrix;\n\nuniform highp vec3      vLight0;\n\nuniform lowp vec4       vMaterialDiffuse;\nuniform lowp vec3       vMaterialAmbient;\nuniform lowp vec4       vMaterialSpecular;\n\nvoid main(void)\n{\n    highp vec4 p = vec4(myVertex,1);\n    gl_Position = uPMatrix * p;\n\n    texCoord = myUV;\n\n    highp vec3 worldNormal = vec3(mat3(uMVMatrix[0].xyz, uMVMatrix[1].xyz, uMVMatrix[2].xyz) * myNormal);\n    highp vec3 ecPosition = p.xyz;\n\n    colorDiffuse = dot( worldNormal, normalize(-vLight0+ecPosition) ) * vMaterialDiffuse  + vec4( vMaterialAmbient, 1 );\n\n#if USE_PHONG\n    normal = worldNormal;\n    position = ecPosition;\n#else\n    highp vec3 halfVector = normalize(ecPosition - vLight0);\n\n    highp float NdotH = max(-dot(worldNormal, halfVector), 0.0);\n    float fPower = vMaterialSpecular.w;\n    highp float specular = min( pow(NdotH, fPower), 1.0);\n    colorSpecular = vec4( vMaterialSpecular.xyz * specular, 1 );\n#endif\n}\n"
  },
  {
    "path": "teapots/textured-teapot/src/main/cpp/AssetUtil.cpp",
    "content": "/*\n * Copyright (C) 2018 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n#include \"AssetUtil.h\"\n\n#include <algorithm>\n#include <cmath>\n\n#include \"android_debug.h\"\n\n#define IS_LOW_CHAR(c) ((c) >= 'a' && (c) <= 'z')\n#define TO_UPPER_CHAR(c) (c + 'A' - 'a')\nvoid StringToUpper(std::string& str) {\n  for (auto& ch : str) {\n    if (IS_LOW_CHAR(ch)) ch = TO_UPPER_CHAR(ch);\n  }\n}\nbool AssetEnumerateFileType(AAssetManager* assetManager, const char* type,\n                            std::vector<std::string>& files) {\n  if (!assetManager || !type || !*type) return false;\n\n  std::string fileType(type);\n  if (fileType[0] != '.') {\n    fileType.insert(0, 1, '.');\n  }\n  StringToUpper(fileType);\n\n  AAssetDir* dir = AAssetManager_openDir(assetManager, \"\");\n\n  const char* name;\n  while ((name = AAssetDir_getNextFileName(dir))) {\n    std::string assetName(name);\n    if (assetName.length() <= fileType.length()) continue;\n    std::string assetType = assetName.substr(\n        assetName.length() - fileType.length(), fileType.length());\n    StringToUpper(assetType);\n\n    if (assetType == fileType) {\n      files.push_back(assetName);\n    }\n  }\n  LOGI(\"Found %d PNG Files\", static_cast<uint32_t>(files.size()));\n\n  AAssetDir_close(dir);\n  return true;\n}\n\nbool AssetReadFile(AAssetManager* assetManager, std::string& assetName,\n                   std::vector<uint8_t>& buf) {\n  if (!assetName.length()) return false;\n  AAsset* assetDescriptor =\n      AAssetManager_open(assetManager, assetName.c_str(), AASSET_MODE_BUFFER);\n  ASSERT(assetDescriptor, \"%s does not exist in %s\", assetName.c_str(),\n         __FUNCTION__);\n  size_t remaining = AAsset_getLength(assetDescriptor);\n\n  buf.resize(remaining);\n  size_t idx = 0;\n\n  while (remaining > 0) {\n    int readSize = AAsset_read(assetDescriptor, &buf[idx], remaining);\n    if (readSize < 0) {\n      LOGE(\"AAsset_read of %s failed\", assetName.c_str());\n      return false;\n    }\n    idx += readSize;\n    remaining -= readSize;\n  }\n\n  AAsset_close(assetDescriptor);\n  return true;\n}\n"
  },
  {
    "path": "teapots/textured-teapot/src/main/cpp/AssetUtil.h",
    "content": "/*\n * Copyright (C) 2018 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n#ifndef __ASSET__UTIL_H__\n#define __ASSET__UTIL_H__\n\n#include <android/asset_manager.h>\n\n#include <string>\n#include <vector>\n\nbool AssetEnumerateFileType(AAssetManager* assetManager, const char* type,\n                            std::vector<std::string>& files);\nbool AssetReadFile(AAssetManager* assetManager, std::string& name,\n                   std::vector<uint8_t>& buf);\n\n#endif  // __ASSET__UTIL_H__\n"
  },
  {
    "path": "teapots/textured-teapot/src/main/cpp/CMakeLists.txt",
    "content": "#\n# Copyright (C) The Android Open Source Project\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\ncmake_minimum_required(VERSION 3.22.1)\nproject(TexturedTeapotNativeActivity LANGUAGES C CXX)\n\ninclude(AppLibrary)\n\nget_filename_component(commonDir ${CMAKE_CURRENT_SOURCE_DIR}/../../../../common ABSOLUTE)\nif((NOT EXISTS ${commonDir}/stb) OR\n(NOT EXISTS ${commonDir}/stb/stb_image.h))\n    execute_process(COMMAND git clone\n        https://github.com/nothings/stb.git\n        stb\n        WORKING_DIRECTORY ${commonDir})\nendif()\n\n# build the ndk-helper library\nget_filename_component(ndkHelperSrc ${commonDir}/ndk_helper ABSOLUTE)\nadd_subdirectory(${ndkHelperSrc}\n    ndkHelperBin/${CMAKE_BUILD_TYPE}/${ANDROID_ABI})\n\n# now build app's shared lib\nadd_app_library(${PROJECT_NAME}\n    SHARED\n    TeapotNativeActivity.cpp\n    TeapotRenderer.cpp\n    TexturedTeapotRender.cpp\n    Texture.cpp\n    AssetUtil.cpp\n)\ntarget_include_directories(${PROJECT_NAME} PRIVATE ${commonDir})\n\ntarget_compile_options(${PROJECT_NAME} PRIVATE -Wno-unused-function)\n\n# Export ANativeActivity_onCreate(),\n# Refer to: https://github.com/android-ndk/ndk/issues/381.\nset_target_properties(${PROJECT_NAME}\n    PROPERTIES LINK_FLAGS \"-u ANativeActivity_onCreate\")\n\n# add lib dependencies\ntarget_link_libraries(${PROJECT_NAME} PRIVATE NdkHelper)\n"
  },
  {
    "path": "teapots/textured-teapot/src/main/cpp/TeapotNativeActivity.cpp",
    "content": "/*\n * Copyright 2018 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//--------------------------------------------------------------------------------\n// Include files\n//--------------------------------------------------------------------------------\n#include <android/log.h>\n#include <android/native_window_jni.h>\n#include <android/sensor.h>\n#include <android_native_app_glue.h>\n#include <errno.h>\n#include <jni.h>\n\n#include \"NDKHelper.h\"\n#include \"TexturedTeapotRender.h\"\n\n//-------------------------------------------------------------------------\n// Preprocessor\n//-------------------------------------------------------------------------\n#define HELPER_CLASS_NAME \\\n  \"com/sample/helper/NDKHelper\"  // Class name of helper function\n//-------------------------------------------------------------------------\n// Shared state for our app.\n//-------------------------------------------------------------------------\nstruct android_app;\nclass Engine {\n  TexturedTeapotRender renderer_;\n\n  ndk_helper::GLContext* gl_context_;\n\n  bool initialized_resources_;\n  bool has_focus_;\n\n  ndk_helper::DoubletapDetector doubletap_detector_;\n  ndk_helper::PinchDetector pinch_detector_;\n  ndk_helper::DragDetector drag_detector_;\n  ndk_helper::PerfMonitor monitor_;\n\n  ndk_helper::TapCamera tap_camera_;\n\n  android_app* app_;\n\n  ASensorManager* sensor_manager_;\n  const ASensor* accelerometer_sensor_;\n  ASensorEventQueue* sensor_event_queue_;\n\n  void UpdateFPS(float fFPS);\n  void ShowUI();\n  void TransformPosition(ndk_helper::Vec2& vec);\n\n public:\n  static void HandleCmd(struct android_app* app, int32_t cmd);\n  static int32_t HandleInput(android_app* app, AInputEvent* event);\n\n  Engine();\n  ~Engine();\n  void SetState(android_app* app);\n  int InitDisplay(android_app* app);\n  void LoadResources();\n  void UnloadResources();\n  void DrawFrame();\n  void TermDisplay();\n  void TrimMemory();\n  bool IsReady();\n\n  void UpdatePosition(AInputEvent* event, int32_t iIndex, float& fX, float& fY);\n\n  void InitSensors();\n  void ProcessSensors(int32_t id);\n  void SuspendSensors();\n  void ResumeSensors();\n};\n\n//-------------------------------------------------------------------------\n// Ctor\n//-------------------------------------------------------------------------\nEngine::Engine()\n    : initialized_resources_(false),\n      has_focus_(false),\n      app_(NULL),\n      sensor_manager_(NULL),\n      accelerometer_sensor_(NULL),\n      sensor_event_queue_(NULL) {\n  gl_context_ = ndk_helper::GLContext::GetInstance();\n}\n\n//-------------------------------------------------------------------------\n// Dtor\n//-------------------------------------------------------------------------\nEngine::~Engine() {}\n\n/**\n * Load resources\n */\nvoid Engine::LoadResources() {\n  renderer_.Init(app_->activity->assetManager);\n  renderer_.Bind(&tap_camera_);\n}\n\n/**\n * Unload resources\n */\nvoid Engine::UnloadResources() { renderer_.Unload(); }\n\n/**\n * Initialize an EGL context for the current display.\n */\nint Engine::InitDisplay(android_app* app) {\n  if (!initialized_resources_) {\n    gl_context_->Init(app_->window);\n    LoadResources();\n    initialized_resources_ = true;\n  } else if (app->window != gl_context_->GetANativeWindow()) {\n    // Re-initialize ANativeWindow.\n    // On some devices, ANativeWindow is re-created when the app is resumed\n    assert(gl_context_->GetANativeWindow());\n    UnloadResources();\n    gl_context_->Invalidate();\n    app_ = app;\n    gl_context_->Init(app->window);\n    LoadResources();\n    initialized_resources_ = true;\n  } else {\n    // initialize OpenGL ES and EGL\n    if (EGL_SUCCESS == gl_context_->Resume(app_->window)) {\n      UnloadResources();\n      LoadResources();\n    } else {\n      assert(0);\n    }\n  }\n\n  ShowUI();\n\n  // Initialize GL state.\n  glEnable(GL_CULL_FACE);\n  glEnable(GL_DEPTH_TEST);\n  glDepthFunc(GL_LEQUAL);\n\n  // Note that screen size might have been changed\n  glViewport(0, 0, gl_context_->GetScreenWidth(),\n             gl_context_->GetScreenHeight());\n  renderer_.UpdateViewport();\n\n  tap_camera_.SetFlip(1.f, -1.f, -1.f);\n  tap_camera_.SetPinchTransformFactor(2.f, 2.f, 8.f);\n\n  return 0;\n}\n\n/**\n * Just the current frame in the display.\n */\nvoid Engine::DrawFrame() {\n  float fps;\n  if (monitor_.Update(fps)) {\n    UpdateFPS(fps);\n  }\n  renderer_.Update(monitor_.GetCurrentTime());\n\n  // Just fill the screen with a color.\n  glClearColor(0.5f, 0.5f, 0.5f, 1.f);\n  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n  renderer_.Render();\n\n  // Swap\n  if (EGL_SUCCESS != gl_context_->Swap()) {\n    UnloadResources();\n    LoadResources();\n  }\n}\n\n/**\n * Tear down the EGL context currently associated with the display.\n */\nvoid Engine::TermDisplay() { gl_context_->Suspend(); }\n\nvoid Engine::TrimMemory() {\n  LOGI(\"Trimming memory\");\n  gl_context_->Invalidate();\n}\n/**\n * Process the next input event.\n */\nint32_t Engine::HandleInput(android_app* app, AInputEvent* event) {\n  Engine* eng = (Engine*)app->userData;\n  if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION) {\n    ndk_helper::GESTURE_STATE doubleTapState =\n        eng->doubletap_detector_.Detect(event);\n    ndk_helper::GESTURE_STATE dragState = eng->drag_detector_.Detect(event);\n    ndk_helper::GESTURE_STATE pinchState = eng->pinch_detector_.Detect(event);\n\n    // Double tap detector has a priority over other detectors\n    if (doubleTapState == ndk_helper::GESTURE_STATE_ACTION) {\n      // Detect double tap\n      eng->tap_camera_.Reset(true);\n    } else {\n      // Handle drag state\n      if (dragState & ndk_helper::GESTURE_STATE_START) {\n        // Otherwise, start dragging\n        ndk_helper::Vec2 v;\n        eng->drag_detector_.GetPointer(v);\n        eng->TransformPosition(v);\n        eng->tap_camera_.BeginDrag(v);\n      } else if (dragState & ndk_helper::GESTURE_STATE_MOVE) {\n        ndk_helper::Vec2 v;\n        eng->drag_detector_.GetPointer(v);\n        eng->TransformPosition(v);\n        eng->tap_camera_.Drag(v);\n      } else if (dragState & ndk_helper::GESTURE_STATE_END) {\n        eng->tap_camera_.EndDrag();\n      }\n\n      // Handle pinch state\n      if (pinchState & ndk_helper::GESTURE_STATE_START) {\n        // Start new pinch\n        ndk_helper::Vec2 v1;\n        ndk_helper::Vec2 v2;\n        eng->pinch_detector_.GetPointers(v1, v2);\n        eng->TransformPosition(v1);\n        eng->TransformPosition(v2);\n        eng->tap_camera_.BeginPinch(v1, v2);\n      } else if (pinchState & ndk_helper::GESTURE_STATE_MOVE) {\n        // Multi touch\n        // Start new pinch\n        ndk_helper::Vec2 v1;\n        ndk_helper::Vec2 v2;\n        eng->pinch_detector_.GetPointers(v1, v2);\n        eng->TransformPosition(v1);\n        eng->TransformPosition(v2);\n        eng->tap_camera_.Pinch(v1, v2);\n      }\n    }\n    return 1;\n  }\n  return 0;\n}\n\n/**\n * Process the next main command.\n */\nvoid Engine::HandleCmd(struct android_app* app, int32_t cmd) {\n  Engine* eng = (Engine*)app->userData;\n  switch (cmd) {\n    case APP_CMD_SAVE_STATE:\n      break;\n    case APP_CMD_INIT_WINDOW:\n      // The window is being shown, get it ready.\n      if (app->window != NULL) {\n        eng->InitDisplay(app);\n        eng->has_focus_ = true;\n        eng->DrawFrame();\n      }\n      break;\n    case APP_CMD_TERM_WINDOW:\n      // The window is being hidden or closed, clean it up.\n      eng->TermDisplay();\n      eng->has_focus_ = false;\n      break;\n    case APP_CMD_STOP:\n      break;\n    case APP_CMD_GAINED_FOCUS:\n      eng->ResumeSensors();\n      // Start animation\n      eng->has_focus_ = true;\n      break;\n    case APP_CMD_LOST_FOCUS:\n      eng->SuspendSensors();\n      // Also stop animating.\n      eng->has_focus_ = false;\n      eng->DrawFrame();\n      break;\n    case APP_CMD_LOW_MEMORY:\n      // Free up GL resources\n      eng->TrimMemory();\n      break;\n  }\n}\n\n//-------------------------------------------------------------------------\n// Sensor handlers\n//-------------------------------------------------------------------------\nvoid Engine::InitSensors() {\n  sensor_manager_ = ndk_helper::AcquireASensorManagerInstance(app_);\n  accelerometer_sensor_ = ASensorManager_getDefaultSensor(\n      sensor_manager_, ASENSOR_TYPE_ACCELEROMETER);\n  sensor_event_queue_ = ASensorManager_createEventQueue(\n      sensor_manager_, app_->looper, LOOPER_ID_USER, NULL, NULL);\n}\n\nvoid Engine::ProcessSensors(int32_t id) {\n  // If a sensor has data, process it now.\n  if (id == LOOPER_ID_USER) {\n    if (accelerometer_sensor_ != NULL) {\n      ASensorEvent event;\n      while (ASensorEventQueue_getEvents(sensor_event_queue_, &event, 1) > 0) {\n      }\n    }\n  }\n}\n\nvoid Engine::ResumeSensors() {\n  // When our app gains focus, we start monitoring the accelerometer.\n  if (accelerometer_sensor_ != NULL) {\n    ASensorEventQueue_enableSensor(sensor_event_queue_, accelerometer_sensor_);\n    // We'd like to get 60 events per second (in us).\n    ASensorEventQueue_setEventRate(sensor_event_queue_, accelerometer_sensor_,\n                                   (1000L / 60) * 1000);\n  }\n}\n\nvoid Engine::SuspendSensors() {\n  // When our app loses focus, we stop monitoring the accelerometer.\n  // This is to avoid consuming battery while not being used.\n  if (accelerometer_sensor_ != NULL) {\n    ASensorEventQueue_disableSensor(sensor_event_queue_, accelerometer_sensor_);\n  }\n}\n\n//-------------------------------------------------------------------------\n// Misc\n//-------------------------------------------------------------------------\nvoid Engine::SetState(android_app* state) {\n  app_ = state;\n  doubletap_detector_.SetConfiguration(app_->config);\n  drag_detector_.SetConfiguration(app_->config);\n  pinch_detector_.SetConfiguration(app_->config);\n}\n\nbool Engine::IsReady() {\n  if (has_focus_) return true;\n\n  return false;\n}\n\nvoid Engine::TransformPosition(ndk_helper::Vec2& vec) {\n  vec = ndk_helper::Vec2(2.0f, 2.0f) * vec /\n            ndk_helper::Vec2(gl_context_->GetScreenWidth(),\n                             gl_context_->GetScreenHeight()) -\n        ndk_helper::Vec2(1.f, 1.f);\n}\n\nvoid Engine::ShowUI() {\n  JNIEnv* jni;\n  app_->activity->vm->AttachCurrentThread(&jni, NULL);\n\n  // Default class retrieval\n  jclass clazz = jni->GetObjectClass(app_->activity->clazz);\n  jmethodID methodID = jni->GetMethodID(clazz, \"showUI\", \"()V\");\n  jni->CallVoidMethod(app_->activity->clazz, methodID);\n\n  app_->activity->vm->DetachCurrentThread();\n  return;\n}\n\nvoid Engine::UpdateFPS(float fFPS) {\n  JNIEnv* jni;\n  app_->activity->vm->AttachCurrentThread(&jni, NULL);\n\n  // Default class retrieval\n  jclass clazz = jni->GetObjectClass(app_->activity->clazz);\n  jmethodID methodID = jni->GetMethodID(clazz, \"updateFPS\", \"(F)V\");\n  jni->CallVoidMethod(app_->activity->clazz, methodID, fFPS);\n\n  app_->activity->vm->DetachCurrentThread();\n  return;\n}\n\nEngine g_engine;\n\n/**\n * This is the main entry point of a native application that is using\n * android_native_app_glue.  It runs in its own thread, with its own\n * event loop for receiving input events and doing other things.\n */\nvoid android_main(android_app* state) {\n  g_engine.SetState(state);\n\n  // Init helper functions\n  ndk_helper::JNIHelper::Init(state->activity, HELPER_CLASS_NAME);\n\n  state->userData = &g_engine;\n  state->onAppCmd = Engine::HandleCmd;\n  state->onInputEvent = Engine::HandleInput;\n\n#ifdef USE_NDK_PROFILER\n  monstartup(\"libTeapotNativeActivity.so\");\n#endif\n\n  // Prepare to monitor accelerometer\n  g_engine.InitSensors();\n\n  // loop waiting for stuff to do.\n  while (!state->destroyRequested) {\n    // If not animating, we will block forever waiting for events.\n    // If animating, we loop until all events are read, then continue\n    // to draw the next frame of animation.\n    android_poll_source* source = nullptr;\n    auto result = ALooper_pollOnce(g_engine.IsReady() ? 0 : -1, nullptr,\n                                   nullptr, (void**)&source);\n    if (result == ALOOPER_POLL_ERROR) {\n      LOGE(\"ALooper_pollOnce returned an error\");\n      std::abort();\n    }\n\n    // Process this event.\n    if (source != NULL) source->process(state, source);\n\n    g_engine.ProcessSensors(result);\n\n    if (g_engine.IsReady()) {\n      // Drawing is throttled to the screen update rate, so there\n      // is no need to do timing here.\n      g_engine.DrawFrame();\n    }\n  }\n\n  g_engine.TermDisplay();\n}\n"
  },
  {
    "path": "teapots/textured-teapot/src/main/cpp/TeapotRenderer.cpp",
    "content": "/*\n * Copyright 2018 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//--------------------------------------------------------------------------------\n// TeapotRenderer.cpp\n// Render a teapot\n//--------------------------------------------------------------------------------\n//--------------------------------------------------------------------------------\n// Include files\n//--------------------------------------------------------------------------------\n#include \"TeapotRenderer.h\"\n\n//--------------------------------------------------------------------------------\n// Teapot model data\n//--------------------------------------------------------------------------------\n#include \"teapot.inl\"\n\n//--------------------------------------------------------------------------------\n// Ctor\n//--------------------------------------------------------------------------------\nTeapotRenderer::TeapotRenderer() {}\n\n//--------------------------------------------------------------------------------\n// Dtor\n//--------------------------------------------------------------------------------\nTeapotRenderer::~TeapotRenderer() { Unload(); }\n\nvoid TeapotRenderer::Init() {\n  // Settings\n  glFrontFace(GL_CCW);\n\n  // Load shader\n  LoadShaders(&shader_param_, \"Shaders/Cubemap.vsh\", \"Shaders/Cubemap.fsh\");\n\n  // Create Index buffer\n  num_indices_ = sizeof(teapotIndices) / sizeof(teapotIndices[0]);\n  glGenBuffers(1, &ibo_);\n  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo_);\n  glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(teapotIndices), teapotIndices,\n               GL_STATIC_DRAW);\n  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);\n\n  // Create VBO\n  num_vertices_ = sizeof(teapotPositions) / sizeof(teapotPositions[0]) / 3;\n  int32_t stride = sizeof(TEAPOT_VERTEX);\n  int32_t index = 0;\n  TEAPOT_VERTEX* p = new TEAPOT_VERTEX[num_vertices_];\n  for (int32_t i = 0; i < num_vertices_; ++i) {\n    p[i].pos[0] = teapotPositions[index];\n    p[i].pos[1] = teapotPositions[index + 1];\n    p[i].pos[2] = teapotPositions[index + 2];\n\n    p[i].normal[0] = teapotNormals[index];\n    p[i].normal[1] = teapotNormals[index + 1];\n    p[i].normal[2] = teapotNormals[index + 2];\n    index += 3;\n  }\n  glGenBuffers(1, &vbo_);\n  glBindBuffer(GL_ARRAY_BUFFER, vbo_);\n  glBufferData(GL_ARRAY_BUFFER, stride * num_vertices_, p, GL_STATIC_DRAW);\n  glBindBuffer(GL_ARRAY_BUFFER, 0);\n\n  delete[] p;\n\n  UpdateViewport();\n  mat_model_ = ndk_helper::Mat4::Translation(0, 0, -15.f);\n\n  ndk_helper::Mat4 mat = ndk_helper::Mat4::RotationX(M_PI / 3);\n  mat_model_ = mat * mat_model_;\n}\n\nvoid TeapotRenderer::UpdateViewport() {\n  // Init Projection matrices\n  int32_t viewport[4];\n  glGetIntegerv(GL_VIEWPORT, viewport);\n\n  const float CAM_NEAR = 5.f;\n  const float CAM_FAR = 10000.f;\n  if (viewport[2] < viewport[3]) {\n    float aspect =\n        static_cast<float>(viewport[2]) / static_cast<float>(viewport[3]);\n    mat_projection_ =\n        ndk_helper::Mat4::Perspective(aspect, 1.0f, CAM_NEAR, CAM_FAR);\n  } else {\n    float aspect =\n        static_cast<float>(viewport[3]) / static_cast<float>(viewport[2]);\n    mat_projection_ =\n        ndk_helper::Mat4::Perspective(1.0f, aspect, CAM_NEAR, CAM_FAR);\n  }\n}\n\nvoid TeapotRenderer::Unload() {\n  if (vbo_) {\n    glDeleteBuffers(1, &vbo_);\n    vbo_ = 0;\n  }\n\n  if (ibo_) {\n    glDeleteBuffers(1, &ibo_);\n    ibo_ = 0;\n  }\n\n  if (shader_param_.program_) {\n    glDeleteProgram(shader_param_.program_);\n    shader_param_.program_ = 0;\n  }\n}\n\nvoid TeapotRenderer::Update(float) {\n  const float CAM_X = 0.f;\n  const float CAM_Y = 0.f;\n  const float CAM_Z = 700.f;\n\n  mat_view_ = ndk_helper::Mat4::LookAt(ndk_helper::Vec3(CAM_X, CAM_Y, CAM_Z),\n                                       ndk_helper::Vec3(0.f, 0.f, 0.f),\n                                       ndk_helper::Vec3(0.f, 1.f, 0.f));\n\n  if (camera_) {\n    camera_->Update();\n    mat_view_ = camera_->GetTransformMatrix() * mat_view_ *\n                camera_->GetRotationMatrix() * mat_model_;\n  } else {\n    mat_view_ = mat_view_ * mat_model_;\n  }\n}\n\nvoid TeapotRenderer::Render() {\n  //\n  // Feed Projection and Model View matrices to the shaders\n  ndk_helper::Mat4 mat_vp = mat_projection_ * mat_view_;\n\n  // Bind the VBO\n  glBindBuffer(GL_ARRAY_BUFFER, vbo_);\n\n  int32_t iStride = sizeof(TEAPOT_VERTEX);\n  // Pass the vertex data\n  glVertexAttribPointer(ATTRIB_VERTEX, 3, GL_FLOAT, GL_FALSE, iStride, nullptr);\n  glEnableVertexAttribArray(ATTRIB_VERTEX);\n\n  glVertexAttribPointer(ATTRIB_NORMAL, 3, GL_FLOAT, GL_FALSE, iStride,\n                        reinterpret_cast<void*>(3 * sizeof(GLfloat)));\n  glEnableVertexAttribArray(ATTRIB_NORMAL);\n\n  // Bind the IB\n  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo_);\n\n  glUseProgram(shader_param_.program_);\n\n  TEAPOT_MATERIALS material = {\n      {1.0f, 0.5f, 0.5f},\n      {1.0f, 1.0f, 1.0f, 10.f},\n      {0.1f, 0.1f, 0.1f},\n  };\n\n  // Update uniforms\n  glUniform4f(shader_param_.material_diffuse_, material.diffuse_color[0],\n              material.diffuse_color[1], material.diffuse_color[2], 1.f);\n\n  glUniform4f(shader_param_.material_specular_, material.specular_color[0],\n              material.specular_color[1], material.specular_color[2],\n              material.specular_color[3]);\n  //\n  // using glUniform3fv here was troublesome\n  //\n  glUniform3f(shader_param_.material_ambient_, material.ambient_color[0],\n              material.ambient_color[1], material.ambient_color[2]);\n\n  glUniformMatrix4fv(shader_param_.matrix_projection_, 1, GL_FALSE,\n                     mat_vp.Ptr());\n  glUniformMatrix4fv(shader_param_.matrix_view_, 1, GL_FALSE, mat_view_.Ptr());\n  glUniform3f(shader_param_.light0_, 100.f, -200.f, -600.f);\n\n  glDrawElements(GL_TRIANGLES, num_indices_, GL_UNSIGNED_SHORT, nullptr);\n\n  glBindBuffer(GL_ARRAY_BUFFER, 0);\n  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);\n}\n\nbool TeapotRenderer::LoadShaders(SHADER_PARAMS* params, const char* strVsh,\n                                 const char* strFsh) {\n  GLuint program;\n  GLuint vert_shader, frag_shader;\n\n  // Create shader program\n  program = glCreateProgram();\n  LOGI(\"Created Shader %d\", program);\n\n  // Create and compile vertex shader\n  if (!ndk_helper::shader::CompileShader(&vert_shader, GL_VERTEX_SHADER,\n                                         strVsh)) {\n    LOGI(\"Failed to compile vertex shader\");\n    glDeleteProgram(program);\n    assert(false);\n    return false;\n  }\n\n  // Create and compile fragment shader\n  if (!ndk_helper::shader::CompileShader(&frag_shader, GL_FRAGMENT_SHADER,\n                                         strFsh)) {\n    LOGI(\"Failed to compile fragment shader\");\n    glDeleteProgram(program);\n    assert(false);\n    return false;\n  }\n\n  // Attach vertex shader to program\n  glAttachShader(program, vert_shader);\n\n  // Attach fragment shader to program\n  glAttachShader(program, frag_shader);\n\n  // Bind attribute locations\n  // this needs to be done prior to linking\n  glBindAttribLocation(program, ATTRIB_VERTEX, \"myVertex\");\n  glBindAttribLocation(program, ATTRIB_NORMAL, \"myNormal\");\n  glBindAttribLocation(program, ATTRIB_UV, \"myUV\");\n\n  // Link program\n  if (!ndk_helper::shader::LinkProgram(program)) {\n    LOGI(\"Failed to link program: %d\", program);\n\n    if (vert_shader) {\n      glDeleteShader(vert_shader);\n      vert_shader = 0;\n    }\n    if (frag_shader) {\n      glDeleteShader(frag_shader);\n      frag_shader = 0;\n    }\n    if (program) {\n      glDeleteProgram(program);\n    }\n\n    return false;\n  }\n\n  // Get uniform locations\n  params->matrix_projection_ = glGetUniformLocation(program, \"uPMatrix\");\n  params->matrix_view_ = glGetUniformLocation(program, \"uMVMatrix\");\n\n  params->light0_ = glGetUniformLocation(program, \"vLight0\");\n  params->material_diffuse_ = glGetUniformLocation(program, \"vMaterialDiffuse\");\n  params->material_ambient_ = glGetUniformLocation(program, \"vMaterialAmbient\");\n  params->material_specular_ =\n      glGetUniformLocation(program, \"vMaterialSpecular\");\n\n  // Release vertex and fragment shaders\n  if (vert_shader) glDeleteShader(vert_shader);\n  if (frag_shader) glDeleteShader(frag_shader);\n\n  params->program_ = program;\n  return true;\n}\n\nbool TeapotRenderer::Bind(ndk_helper::TapCamera* camera) {\n  camera_ = camera;\n  return true;\n}\n"
  },
  {
    "path": "teapots/textured-teapot/src/main/cpp/TeapotRenderer.h",
    "content": "/*\n * Copyright 2018 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//--------------------------------------------------------------------------------\n// Teapot Renderer.h\n// Renderer for teapots\n//--------------------------------------------------------------------------------\n#ifndef _TEAPOTRENDERER_H\n#define _TEAPOTRENDERER_H\n\n//--------------------------------------------------------------------------------\n// Include files\n//--------------------------------------------------------------------------------\n#include <EGL/egl.h>\n#include <GLES/gl.h>\n#include <android/log.h>\n#include <android/native_window_jni.h>\n#include <android/sensor.h>\n#include <android_native_app_glue.h>\n#include <errno.h>\n#include <jni.h>\n\n#include <vector>\n\n#define CLASS_NAME \"android/app/NativeActivity\"\n#define APPLICATION_CLASS_NAME \"com/sample/teapot/TeapotApplication\"\n\n#include \"NDKHelper.h\"\n\nstruct TEAPOT_VERTEX {\n  float pos[3];\n  float normal[3];\n};\n\nenum SHADER_ATTRIBUTES {\n  ATTRIB_VERTEX,\n  ATTRIB_NORMAL,\n  ATTRIB_UV,\n};\n\nstruct SHADER_PARAMS {\n  GLuint program_;\n  GLuint light0_;\n  GLuint material_diffuse_;\n  GLuint material_ambient_;\n  GLuint material_specular_;\n\n  GLuint matrix_projection_;\n  GLuint matrix_view_;\n};\n\nstruct TEAPOT_MATERIALS {\n  float diffuse_color[3];\n  float specular_color[4];\n  float ambient_color[3];\n};\n\nclass TeapotRenderer {\n protected:\n  int32_t num_indices_;\n  int32_t num_vertices_;\n  GLuint ibo_;\n  GLuint vbo_;\n\n  SHADER_PARAMS shader_param_;\n  bool LoadShaders(SHADER_PARAMS* params, const char* strVsh,\n                   const char* strFsh);\n\n  ndk_helper::Mat4 mat_projection_;\n  ndk_helper::Mat4 mat_view_;\n  ndk_helper::Mat4 mat_model_;\n\n  ndk_helper::TapCamera* camera_;\n  void Init();\n\n public:\n  TeapotRenderer();\n  virtual ~TeapotRenderer();\n  virtual void Init(AAssetManager* amgr) = 0;\n  virtual void Render();\n  void Update(float dTime);\n  bool Bind(ndk_helper::TapCamera* camera);\n  virtual void Unload();\n  void UpdateViewport();\n};\n\n#endif\n"
  },
  {
    "path": "teapots/textured-teapot/src/main/cpp/Texture.cpp",
    "content": "/*\n * Copyright 2018 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"Texture.h\"\n\n#include <GLES3/gl32.h>\n\n#define STB_IMAGE_IMPLEMENTATION\n#include <stb/stb_image.h>\n\n#include \"AssetUtil.h\"\n\n#define MODULE_NAME \"Teapot::Texture\"\n#include \"android_debug.h\"\n\n/**\n * Interface implementations\n */\nTexture::Texture(std::vector<std::string>& asset_paths,\n                 AAssetManager* asset_manager) {\n  // For Cubemap, we use world normal to sample the textures\n  // so no texture vbo necessary\n\n  int32_t imgWidth, imgHeight, channelCount;\n  std::vector<uint8_t> fileBits;\n\n  if (!asset_manager || asset_paths.size() != 6) {\n    assert(false);\n    return;\n  }\n\n  glGenTextures(1, &texId_);\n  glBindTexture(GL_TEXTURE_CUBE_MAP, texId_);\n\n  if (texId_ == GL_INVALID_VALUE) {\n    assert(false);\n    return;\n  }\n\n  for (GLuint i = 0; i < 6; i++) {\n    fileBits.clear();\n    AssetReadFile(asset_manager, asset_paths[i], fileBits);\n\n    // tga/bmp asset_paths are saved as vertical mirror images ( at least more\n    // than half ).\n    stbi_set_flip_vertically_on_load(1);\n\n    uint8_t* imageBits =\n        stbi_load_from_memory(fileBits.data(), fileBits.size(), &imgWidth,\n                              &imgHeight, &channelCount, 4);\n\n    glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGBA, imgWidth,\n                 imgHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageBits);\n    stbi_image_free(imageBits);\n  }\n\n  glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n  glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\n  glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_REPEAT);\n  glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_REPEAT);\n  glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_REPEAT);\n\n  glActiveTexture(GL_TEXTURE0);\n}\n\nTexture::~Texture() {\n  if (texId_ != GL_INVALID_VALUE) {\n    glDeleteTextures(1, &texId_);\n    texId_ = GL_INVALID_VALUE;\n  }\n}\n\n/**\n * TextureCubemap implementations\n */\nbool Texture::Activate(void) {\n  assert(texId_ != GL_INVALID_VALUE);\n\n  glBindTexture(texId_, GL_TEXTURE0);\n  glActiveTexture(GL_TEXTURE0 + 0);\n  return true;\n}\n\n/**\n  Return used sampler names and units\n      so application could configure shader's sampler uniform(s).\n  Cubemap just used one sampler at unit 0 with \"samplerObj\" as its name.\n */\nvoid Texture::GetActiveSamplerInfo(std::vector<std::string>& names,\n                                   std::vector<GLint>& units) {\n  names.clear();\n  names.push_back(std::string(\"samplerObj\"));\n  units.clear();\n  units.push_back(0);\n}\n"
  },
  {
    "path": "teapots/textured-teapot/src/main/cpp/Texture.h",
    "content": "/*\n * Copyright 2018 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#pragma once\n\n#include <EGL/egl.h>\n#include <GLES/gl.h>\n#include <android/asset_manager.h>\n\n#include <string>\n#include <vector>\n\n/**\n *  class Texture\n *    adding texture into teapot\n *     - oad image in assets/Textures\n *     - enable texture units\n *     - report samplers needed inside shader\n *  Functionality wise:\n *     - one texture\n *     - one sampler\n *     - texture unit 0, sampler unit 0\n */\nclass Texture {\n public:\n  /**\n   * Create a texture object\n   *\n   * @param asset_paths holds image file names under APK/assets.\n   *     cube map needs 6 (direction of +x, -x, +y, -y, +z, -z)\n   * @param asset_manager Java side asset_manager object\n   * @return newly created texture object, or nullptr in case of errors\n   */\n  Texture(std::vector<std::string>& asset_paths, AAssetManager* asset_manager);\n  Texture(const Texture&) = delete;\n  ~Texture();\n\n  Texture& operator=(const Texture&) = delete;\n\n  void GetActiveSamplerInfo(std::vector<std::string>& names,\n                            std::vector<GLint>& units);\n  bool Activate(void);\n\n private:\n  GLuint texId_;\n};\n"
  },
  {
    "path": "teapots/textured-teapot/src/main/cpp/TexturedTeapotRender.cpp",
    "content": "/*\n * Copyright 2018 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"TexturedTeapotRender.h\"\n\n/**\n * Texture Coordinators for 2D texture:\n *    they are declared in file model file teapot.inl with tiles\n *    for front and back teapot faces. If you do not want see\n *    the tiles but would like to see the stretched version, simply\n *    divide the texCoord by 2. Macro TILED_TEXTURE is for this purpose.\n *\n * teapot.inl file already included in TeapotRenderer.cpp, we directly\n * use! -- nice\n */\n#define TILED_TEXTURE 0\n\nextern float teapotTexCoords[];\n\n/**\n * Constructor: all work is done inside Init() function.\n *              nothing to do here\n */\nTexturedTeapotRender::TexturedTeapotRender() {}\n\n/**\n * Destructor:\n *     let Unload() do the work, which should also trigger\n *     TeapotRenderer's Unload() function\n */\nTexturedTeapotRender::~TexturedTeapotRender() { Unload(); };\n\n/**\n * Init: Initialize the GL with needed data. We add on the things\n * needed for textures\n *  - load image data into generated glBuffers\n *  - configure samplerObj in fragment shader\n * @param assetMgr android assetManager from java side\n */\nvoid TexturedTeapotRender::Init(AAssetManager* assetMgr) {\n  // initialize the basic things from TeapotRenderer, no change\n  TeapotRenderer::Init();\n\n  // Need flip Y, so as top/bottom image\n  std::vector<std::string> textures{\n      std::string(\"Textures/right.tga\"),   // GL_TEXTURE_CUBE_MAP_POSITIVE_X\n      std::string(\"Textures/left.tga\"),    // GL_TEXTURE_CUBE_MAP_NEGATIVE_X\n      std::string(\"Textures/bottom.tga\"),  // GL_TEXTURE_CUBE_MAP_NEGATIVE_Y\n      std::string(\"Textures/top.tga\"),     // GL_TEXTURE_CUBE_MAP_POSITIVE_Y\n      std::string(\"Textures/front.tga\"),   // GL_TEXTURE_CUBE_MAP_POSITIVE_Z\n      std::string(\"Textures/back.tga\")     // GL_TEXTURE_CUBE_MAP_NEGATIVE_Z\n  };\n\n  texObj_ = new Texture(textures, assetMgr);\n  assert(texObj_);\n\n  std::vector<std::string> samplers;\n  std::vector<GLint> units;\n  texObj_->GetActiveSamplerInfo(samplers, units);\n  for (size_t idx = 0; idx < samplers.size(); idx++) {\n    GLint sampler =\n        glGetUniformLocation(shader_param_.program_, samplers[idx].c_str());\n    glUniform1i(sampler, units[idx]);\n  }\n\n  texObj_->Activate();\n}\n\n/**\n * Render() function:\n *   enable states for rendering and reader a frame.\n *   For Texture, simply inform GL to stream texture coord from _texVbo\n */\nvoid TexturedTeapotRender::Render() { TeapotRenderer::Render(); }\n\n/**\n * Unload()\n *    clean-up function. May get called from destructor too\n */\nvoid TexturedTeapotRender::Unload() {\n  TeapotRenderer::Unload();\n  if (texVbo_ != GL_INVALID_VALUE) {\n    glDeleteBuffers(1, &texVbo_);\n    texVbo_ = GL_INVALID_VALUE;\n  }\n  if (texObj_) {\n    delete texObj_;\n    texObj_ = nullptr;\n  }\n}\n"
  },
  {
    "path": "teapots/textured-teapot/src/main/cpp/TexturedTeapotRender.h",
    "content": "/*\n * Copyright 2018 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef TEAPOTS_TEXTUREDTEAPOTRENDER_H\n#define TEAPOTS_TEXTUREDTEAPOTRENDER_H\n#include \"TeapotRenderer.h\"\n#include \"Texture.h\"\n/**\n *  class TextureTeapotRender\n *    adding texture into teapot\n *     - create texture buffer and load image in assets/Textures\n *     - enable texture units\n *     - enable texturing inside shaders\n */\nclass TexturedTeapotRender : public TeapotRenderer {\n  GLuint texVbo_ = GL_INVALID_VALUE;\n  Texture* texObj_ = nullptr;\n\n public:\n  TexturedTeapotRender();\n  virtual ~TexturedTeapotRender();\n  virtual void Init(AAssetManager* amgr);\n  virtual void Render();\n  virtual void Unload();\n};\n\n#endif  // TEAPOTS_TEXTUREDTEAPOTRENDER_H\n"
  },
  {
    "path": "teapots/textured-teapot/src/main/cpp/android_debug.h",
    "content": "/*\n * Copyright (C) 2018 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n#ifndef __SAMPLE_ANDROID_DEBUG_H__\n#define __SAMPLE_ANDROID_DEBUG_H__\n#include <android/log.h>\n\n#if 1\n#ifndef MODULE_NAME\n#define MODULE_NAME \"NDK_Sample\"\n#endif\n\n#define LOGV(...) \\\n  __android_log_print(ANDROID_LOG_VERBOSE, MODULE_NAME, __VA_ARGS__)\n#define LOGD(...) \\\n  __android_log_print(ANDROID_LOG_DEBUG, MODULE_NAME, __VA_ARGS__)\n#define LOGI(...) \\\n  __android_log_print(ANDROID_LOG_INFO, MODULE_NAME, __VA_ARGS__)\n#define LOGW(...) \\\n  __android_log_print(ANDROID_LOG_WARN, MODULE_NAME, __VA_ARGS__)\n#define LOGE(...) \\\n  __android_log_print(ANDROID_LOG_ERROR, MODULE_NAME, __VA_ARGS__)\n#define LOGF(...) \\\n  __android_log_print(ANDROID_LOG_FATAL, MODULE_NAME, __VA_ARGS__)\n\n#define ASSERT(cond, ...)                                  \\\n  if (!(cond)) {                                           \\\n    __android_log_assert(#cond, MODULE_NAME, __VA_ARGS__); \\\n  }\n#else\n\n#define LOGV(...)\n#define LOGD(...)\n#define LOGI(...)\n#define LOGW(...)\n#define LOGE(...)\n#define LOGF(...)\n#define ASSERT(cond, ...)\n\n#endif\n\n#endif  // __SAMPLE_ANDROID_DEBUG_H__\n"
  },
  {
    "path": "teapots/textured-teapot/src/main/cpp/libTexturedTeapotNativeActivity.map.txt",
    "content": "LIBNDK_CAMERA {\n  global:\n    ANativeActivity_onCreate;\n  local:\n    *;\n};\n"
  },
  {
    "path": "teapots/textured-teapot/src/main/cpp/teapot.inl",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n//\n// Teapot.inl\n// Derived from WebGL sample\n// https://github.com/KhronosGroup/WebGL/blob/master/sdk/demos/google/shiny-teapot/teapot-streams.js\n//\n\nfloat teapotPositions[] = {17.83489990234375,\n                           0,\n                           30.573999404907227,\n                           16.452699661254883,\n                           -7.000179767608643,\n                           30.573999404907227,\n                           16.223100662231445,\n                           -6.902520179748535,\n                           31.51460075378418,\n                           17.586000442504883,\n                           0,\n                           31.51460075378418,\n                           16.48940086364746,\n                           -7.015810012817383,\n                           31.828100204467773,\n                           17.87470054626465,\n                           0,\n                           31.828100204467773,\n                           17.031099319458008,\n                           -7.246280193328857,\n                           31.51460075378418,\n                           18.46190071105957,\n                           0,\n                           31.51460075378418,\n                           17.62779998779297,\n                           -7.500199794769287,\n                           30.573999404907227,\n                           19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           12.662699699401855,\n                           -12.662699699401855,\n                           30.573999404907227,\n                           12.486100196838379,\n                           -12.486100196838379,\n                           31.51460075378418,\n                           12.690999984741211,\n                           -12.690999984741211,\n                           31.828100204467773,\n                           13.10789966583252,\n                           -13.10789966583252,\n                           31.51460075378418,\n                           13.56719970703125,\n                           -13.56719970703125,\n                           30.573999404907227,\n                           7.000179767608643,\n                           -16.452699661254883,\n                           30.573999404907227,\n                           6.902520179748535,\n                           -16.223100662231445,\n                           31.51460075378418,\n                           7.015810012817383,\n                           -16.48940086364746,\n                           31.828100204467773,\n                           7.246280193328857,\n                           -17.031099319458008,\n                           31.51460075378418,\n                           7.500199794769287,\n                           -17.62779998779297,\n                           30.573999404907227,\n                           0,\n                           -17.83489990234375,\n                           30.573999404907227,\n                           0,\n                           -17.586000442504883,\n                           31.51460075378418,\n                           0,\n                           -17.87470054626465,\n                           31.828100204467773,\n                           0,\n                           -18.46190071105957,\n                           31.51460075378418,\n                           0,\n                           -19.108800888061523,\n                           30.573999404907227,\n                           0,\n                           -17.83489990234375,\n                           30.573999404907227,\n                           -7.483870029449463,\n                           -16.452699661254883,\n                           30.573999404907227,\n                           -7.106579780578613,\n                           -16.223100662231445,\n                           31.51460075378418,\n                           0,\n                           -17.586000442504883,\n                           31.51460075378418,\n                           -7.07627010345459,\n                           -16.48940086364746,\n                           31.828100204467773,\n                           0,\n                           -17.87470054626465,\n                           31.828100204467773,\n                           -7.25383996963501,\n                           -17.031099319458008,\n                           31.51460075378418,\n                           0,\n                           -18.46190071105957,\n                           31.51460075378418,\n                           -7.500199794769287,\n                           -17.62779998779297,\n                           30.573999404907227,\n                           0,\n                           -19.108800888061523,\n                           30.573999404907227,\n                           -13.092700004577637,\n                           -12.662699699401855,\n                           30.573999404907227,\n                           -12.667499542236328,\n                           -12.486100196838379,\n                           31.51460075378418,\n                           -12.744799613952637,\n                           -12.690999984741211,\n                           31.828100204467773,\n                           -13.11460018157959,\n                           -13.10789966583252,\n                           31.51460075378418,\n                           -13.56719970703125,\n                           -13.56719970703125,\n                           30.573999404907227,\n                           -16.61389923095703,\n                           -7.000179767608643,\n                           30.573999404907227,\n                           -16.291099548339844,\n                           -6.902520179748535,\n                           31.51460075378418,\n                           -16.50950050354004,\n                           -7.015810012817383,\n                           31.828100204467773,\n                           -17.033599853515625,\n                           -7.246280193328857,\n                           31.51460075378418,\n                           -17.62779998779297,\n                           -7.500199794769287,\n                           30.573999404907227,\n                           -17.83489990234375,\n                           0,\n                           30.573999404907227,\n                           -17.586000442504883,\n                           0,\n                           31.51460075378418,\n                           -17.87470054626465,\n                           0,\n                           31.828100204467773,\n                           -18.46190071105957,\n                           0,\n                           31.51460075378418,\n                           -19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           -17.83489990234375,\n                           0,\n                           30.573999404907227,\n                           -16.452699661254883,\n                           7.000179767608643,\n                           30.573999404907227,\n                           -16.223100662231445,\n                           6.902520179748535,\n                           31.51460075378418,\n                           -17.586000442504883,\n                           0,\n                           31.51460075378418,\n                           -16.48940086364746,\n                           7.015810012817383,\n                           31.828100204467773,\n                           -17.87470054626465,\n                           0,\n                           31.828100204467773,\n                           -17.031099319458008,\n                           7.246280193328857,\n                           31.51460075378418,\n                           -18.46190071105957,\n                           0,\n                           31.51460075378418,\n                           -17.62779998779297,\n                           7.500199794769287,\n                           30.573999404907227,\n                           -19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           -12.662699699401855,\n                           12.662699699401855,\n                           30.573999404907227,\n                           -12.486100196838379,\n                           12.486100196838379,\n                           31.51460075378418,\n                           -12.690999984741211,\n                           12.690999984741211,\n                           31.828100204467773,\n                           -13.10789966583252,\n                           13.10789966583252,\n                           31.51460075378418,\n                           -13.56719970703125,\n                           13.56719970703125,\n                           30.573999404907227,\n                           -7.000179767608643,\n                           16.452699661254883,\n                           30.573999404907227,\n                           -6.902520179748535,\n                           16.223100662231445,\n                           31.51460075378418,\n                           -7.015810012817383,\n                           16.48940086364746,\n                           31.828100204467773,\n                           -7.246280193328857,\n                           17.031099319458008,\n                           31.51460075378418,\n                           -7.500199794769287,\n                           17.62779998779297,\n                           30.573999404907227,\n                           0,\n                           17.83489990234375,\n                           30.573999404907227,\n                           0,\n                           17.586000442504883,\n                           31.51460075378418,\n                           0,\n                           17.87470054626465,\n                           31.828100204467773,\n                           0,\n                           18.46190071105957,\n                           31.51460075378418,\n                           0,\n                           19.108800888061523,\n                           30.573999404907227,\n                           0,\n                           17.83489990234375,\n                           30.573999404907227,\n                           7.000179767608643,\n                           16.452699661254883,\n                           30.573999404907227,\n                           6.902520179748535,\n                           16.223100662231445,\n                           31.51460075378418,\n                           0,\n                           17.586000442504883,\n                           31.51460075378418,\n                           7.015810012817383,\n                           16.48940086364746,\n                           31.828100204467773,\n                           0,\n                           17.87470054626465,\n                           31.828100204467773,\n                           7.246280193328857,\n                           17.031099319458008,\n                           31.51460075378418,\n                           0,\n                           18.46190071105957,\n                           31.51460075378418,\n                           7.500199794769287,\n                           17.62779998779297,\n                           30.573999404907227,\n                           0,\n                           19.108800888061523,\n                           30.573999404907227,\n                           12.662699699401855,\n                           12.662699699401855,\n                           30.573999404907227,\n                           12.486100196838379,\n                           12.486100196838379,\n                           31.51460075378418,\n                           12.690999984741211,\n                           12.690999984741211,\n                           31.828100204467773,\n                           13.10789966583252,\n                           13.10789966583252,\n                           31.51460075378418,\n                           13.56719970703125,\n                           13.56719970703125,\n                           30.573999404907227,\n                           16.452699661254883,\n                           7.000179767608643,\n                           30.573999404907227,\n                           16.223100662231445,\n                           6.902520179748535,\n                           31.51460075378418,\n                           16.48940086364746,\n                           7.015810012817383,\n                           31.828100204467773,\n                           17.031099319458008,\n                           7.246280193328857,\n                           31.51460075378418,\n                           17.62779998779297,\n                           7.500199794769287,\n                           30.573999404907227,\n                           17.83489990234375,\n                           0,\n                           30.573999404907227,\n                           17.586000442504883,\n                           0,\n                           31.51460075378418,\n                           17.87470054626465,\n                           0,\n                           31.828100204467773,\n                           18.46190071105957,\n                           0,\n                           31.51460075378418,\n                           19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           17.62779998779297,\n                           -7.500199794769287,\n                           30.573999404907227,\n                           19.785400390625,\n                           -8.418190002441406,\n                           25.572900772094727,\n                           21.447599411010742,\n                           0,\n                           25.572900772094727,\n                           21.667600631713867,\n                           -9.218990325927734,\n                           20.661399841308594,\n                           23.487899780273438,\n                           0,\n                           20.661399841308594,\n                           22.99880027770996,\n                           -9.785409927368164,\n                           15.928999900817871,\n                           24.930999755859375,\n                           0,\n                           15.928999900817871,\n                           23.503799438476562,\n                           -10.000300407409668,\n                           11.465299606323242,\n                           25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           13.56719970703125,\n                           -13.56719970703125,\n                           30.573999404907227,\n                           15.227800369262695,\n                           -15.227800369262695,\n                           25.572900772094727,\n                           16.67639923095703,\n                           -16.67639923095703,\n                           20.661399841308594,\n                           17.701000213623047,\n                           -17.701000213623047,\n                           15.928999900817871,\n                           18.089599609375,\n                           -18.089599609375,\n                           11.465299606323242,\n                           7.500199794769287,\n                           -17.62779998779297,\n                           30.573999404907227,\n                           8.418190002441406,\n                           -19.785400390625,\n                           25.572900772094727,\n                           9.218990325927734,\n                           -21.667600631713867,\n                           20.661399841308594,\n                           9.785409927368164,\n                           -22.99880027770996,\n                           15.928999900817871,\n                           10.000300407409668,\n                           -23.503799438476562,\n                           11.465299606323242,\n                           0,\n                           -19.108800888061523,\n                           30.573999404907227,\n                           0,\n                           -21.447599411010742,\n                           25.572900772094727,\n                           0,\n                           -23.487899780273438,\n                           20.661399841308594,\n                           0,\n                           -24.930999755859375,\n                           15.928999900817871,\n                           0,\n                           -25.4783992767334,\n                           11.465299606323242,\n                           0,\n                           -19.108800888061523,\n                           30.573999404907227,\n                           -7.500199794769287,\n                           -17.62779998779297,\n                           30.573999404907227,\n                           -8.418190002441406,\n                           -19.785400390625,\n                           25.572900772094727,\n                           0,\n                           -21.447599411010742,\n                           25.572900772094727,\n                           -9.218990325927734,\n                           -21.667600631713867,\n                           20.661399841308594,\n                           0,\n                           -23.487899780273438,\n                           20.661399841308594,\n                           -9.785409927368164,\n                           -22.99880027770996,\n                           15.928999900817871,\n                           0,\n                           -24.930999755859375,\n                           15.928999900817871,\n                           -10.000300407409668,\n                           -23.503799438476562,\n                           11.465299606323242,\n                           0,\n                           -25.4783992767334,\n                           11.465299606323242,\n                           -13.56719970703125,\n                           -13.56719970703125,\n                           30.573999404907227,\n                           -15.227800369262695,\n                           -15.227800369262695,\n                           25.572900772094727,\n                           -16.67639923095703,\n                           -16.67639923095703,\n                           20.661399841308594,\n                           -17.701000213623047,\n                           -17.701000213623047,\n                           15.928999900817871,\n                           -18.089599609375,\n                           -18.089599609375,\n                           11.465299606323242,\n                           -17.62779998779297,\n                           -7.500199794769287,\n                           30.573999404907227,\n                           -19.785400390625,\n                           -8.418190002441406,\n                           25.572900772094727,\n                           -21.667600631713867,\n                           -9.218990325927734,\n                           20.661399841308594,\n                           -22.99880027770996,\n                           -9.785409927368164,\n                           15.928999900817871,\n                           -23.503799438476562,\n                           -10.000300407409668,\n                           11.465299606323242,\n                           -19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           -21.447599411010742,\n                           0,\n                           25.572900772094727,\n                           -23.487899780273438,\n                           0,\n                           20.661399841308594,\n                           -24.930999755859375,\n                           0,\n                           15.928999900817871,\n                           -25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           -19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           -17.62779998779297,\n                           7.500199794769287,\n                           30.573999404907227,\n                           -19.785400390625,\n                           8.418190002441406,\n                           25.572900772094727,\n                           -21.447599411010742,\n                           0,\n                           25.572900772094727,\n                           -21.667600631713867,\n                           9.218990325927734,\n                           20.661399841308594,\n                           -23.487899780273438,\n                           0,\n                           20.661399841308594,\n                           -22.99880027770996,\n                           9.785409927368164,\n                           15.928999900817871,\n                           -24.930999755859375,\n                           0,\n                           15.928999900817871,\n                           -23.503799438476562,\n                           10.000300407409668,\n                           11.465299606323242,\n                           -25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           -13.56719970703125,\n                           13.56719970703125,\n                           30.573999404907227,\n                           -15.227800369262695,\n                           15.227800369262695,\n                           25.572900772094727,\n                           -16.67639923095703,\n                           16.67639923095703,\n                           20.661399841308594,\n                           -17.701000213623047,\n                           17.701000213623047,\n                           15.928999900817871,\n                           -18.089599609375,\n                           18.089599609375,\n                           11.465299606323242,\n                           -7.500199794769287,\n                           17.62779998779297,\n                           30.573999404907227,\n                           -8.418190002441406,\n                           19.785400390625,\n                           25.572900772094727,\n                           -9.218990325927734,\n                           21.667600631713867,\n                           20.661399841308594,\n                           -9.785409927368164,\n                           22.99880027770996,\n                           15.928999900817871,\n                           -10.000300407409668,\n                           23.503799438476562,\n                           11.465299606323242,\n                           0,\n                           19.108800888061523,\n                           30.573999404907227,\n                           0,\n                           21.447599411010742,\n                           25.572900772094727,\n                           0,\n                           23.487899780273438,\n                           20.661399841308594,\n                           0,\n                           24.930999755859375,\n                           15.928999900817871,\n                           0,\n                           25.4783992767334,\n                           11.465299606323242,\n                           0,\n                           19.108800888061523,\n                           30.573999404907227,\n                           7.500199794769287,\n                           17.62779998779297,\n                           30.573999404907227,\n                           8.418190002441406,\n                           19.785400390625,\n                           25.572900772094727,\n                           0,\n                           21.447599411010742,\n                           25.572900772094727,\n                           9.218990325927734,\n                           21.667600631713867,\n                           20.661399841308594,\n                           0,\n                           23.487899780273438,\n                           20.661399841308594,\n                           9.785409927368164,\n                           22.99880027770996,\n                           15.928999900817871,\n                           0,\n                           24.930999755859375,\n                           15.928999900817871,\n                           10.000300407409668,\n                           23.503799438476562,\n                           11.465299606323242,\n                           0,\n                           25.4783992767334,\n                           11.465299606323242,\n                           13.56719970703125,\n                           13.56719970703125,\n                           30.573999404907227,\n                           15.227800369262695,\n                           15.227800369262695,\n                           25.572900772094727,\n                           16.67639923095703,\n                           16.67639923095703,\n                           20.661399841308594,\n                           17.701000213623047,\n                           17.701000213623047,\n                           15.928999900817871,\n                           18.089599609375,\n                           18.089599609375,\n                           11.465299606323242,\n                           17.62779998779297,\n                           7.500199794769287,\n                           30.573999404907227,\n                           19.785400390625,\n                           8.418190002441406,\n                           25.572900772094727,\n                           21.667600631713867,\n                           9.218990325927734,\n                           20.661399841308594,\n                           22.99880027770996,\n                           9.785409927368164,\n                           15.928999900817871,\n                           23.503799438476562,\n                           10.000300407409668,\n                           11.465299606323242,\n                           19.108800888061523,\n                           0,\n                           30.573999404907227,\n                           21.447599411010742,\n                           0,\n                           25.572900772094727,\n                           23.487899780273438,\n                           0,\n                           20.661399841308594,\n                           24.930999755859375,\n                           0,\n                           15.928999900817871,\n                           25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           23.503799438476562,\n                           -10.000300407409668,\n                           11.465299606323242,\n                           22.5856990814209,\n                           -9.609620094299316,\n                           7.688300132751465,\n                           24.48310089111328,\n                           0,\n                           7.688300132751465,\n                           20.565799713134766,\n                           -8.750229835510254,\n                           4.89661979675293,\n                           22.29360008239746,\n                           0,\n                           4.89661979675293,\n                           18.54599952697754,\n                           -7.890830039978027,\n                           3.0006699562072754,\n                           20.104000091552734,\n                           0,\n                           3.0006699562072754,\n                           17.62779998779297,\n                           -7.500199794769287,\n                           1.9108799695968628,\n                           19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           18.089599609375,\n                           -18.089599609375,\n                           11.465299606323242,\n                           17.382999420166016,\n                           -17.382999420166016,\n                           7.688300132751465,\n                           15.828399658203125,\n                           -15.828399658203125,\n                           4.89661979675293,\n                           14.273900032043457,\n                           -14.273900032043457,\n                           3.0006699562072754,\n                           13.56719970703125,\n                           -13.56719970703125,\n                           1.9108799695968628,\n                           10.000300407409668,\n                           -23.503799438476562,\n                           11.465299606323242,\n                           9.609620094299316,\n                           -22.5856990814209,\n                           7.688300132751465,\n                           8.750229835510254,\n                           -20.565799713134766,\n                           4.89661979675293,\n                           7.890830039978027,\n                           -18.54599952697754,\n                           3.0006699562072754,\n                           7.500199794769287,\n                           -17.62779998779297,\n                           1.9108799695968628,\n                           0,\n                           -25.4783992767334,\n                           11.465299606323242,\n                           0,\n                           -24.48310089111328,\n                           7.688300132751465,\n                           0,\n                           -22.29360008239746,\n                           4.89661979675293,\n                           0,\n                           -20.104000091552734,\n                           3.0006699562072754,\n                           0,\n                           -19.108800888061523,\n                           1.9108799695968628,\n                           0,\n                           -25.4783992767334,\n                           11.465299606323242,\n                           -10.000300407409668,\n                           -23.503799438476562,\n                           11.465299606323242,\n                           -9.609620094299316,\n                           -22.5856990814209,\n                           7.688300132751465,\n                           0,\n                           -24.48310089111328,\n                           7.688300132751465,\n                           -8.750229835510254,\n                           -20.565799713134766,\n                           4.89661979675293,\n                           0,\n                           -22.29360008239746,\n                           4.89661979675293,\n                           -7.890830039978027,\n                           -18.54599952697754,\n                           3.0006699562072754,\n                           0,\n                           -20.104000091552734,\n                           3.0006699562072754,\n                           -7.500199794769287,\n                           -17.62779998779297,\n                           1.9108799695968628,\n                           0,\n                           -19.108800888061523,\n                           1.9108799695968628,\n                           -18.089599609375,\n                           -18.089599609375,\n                           11.465299606323242,\n                           -17.382999420166016,\n                           -17.382999420166016,\n                           7.688300132751465,\n                           -15.828399658203125,\n                           -15.828399658203125,\n                           4.89661979675293,\n                           -14.273900032043457,\n                           -14.273900032043457,\n                           3.0006699562072754,\n                           -13.56719970703125,\n                           -13.56719970703125,\n                           1.9108799695968628,\n                           -23.503799438476562,\n                           -10.000300407409668,\n                           11.465299606323242,\n                           -22.5856990814209,\n                           -9.609620094299316,\n                           7.688300132751465,\n                           -20.565799713134766,\n                           -8.750229835510254,\n                           4.89661979675293,\n                           -18.54599952697754,\n                           -7.890830039978027,\n                           3.0006699562072754,\n                           -17.62779998779297,\n                           -7.500199794769287,\n                           1.9108799695968628,\n                           -25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           -24.48310089111328,\n                           0,\n                           7.688300132751465,\n                           -22.29360008239746,\n                           0,\n                           4.89661979675293,\n                           -20.104000091552734,\n                           0,\n                           3.0006699562072754,\n                           -19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           -25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           -23.503799438476562,\n                           10.000300407409668,\n                           11.465299606323242,\n                           -22.5856990814209,\n                           9.609620094299316,\n                           7.688300132751465,\n                           -24.48310089111328,\n                           0,\n                           7.688300132751465,\n                           -20.565799713134766,\n                           8.750229835510254,\n                           4.89661979675293,\n                           -22.29360008239746,\n                           0,\n                           4.89661979675293,\n                           -18.54599952697754,\n                           7.890830039978027,\n                           3.0006699562072754,\n                           -20.104000091552734,\n                           0,\n                           3.0006699562072754,\n                           -17.62779998779297,\n                           7.500199794769287,\n                           1.9108799695968628,\n                           -19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           -18.089599609375,\n                           18.089599609375,\n                           11.465299606323242,\n                           -17.382999420166016,\n                           17.382999420166016,\n                           7.688300132751465,\n                           -15.828399658203125,\n                           15.828399658203125,\n                           4.89661979675293,\n                           -14.273900032043457,\n                           14.273900032043457,\n                           3.0006699562072754,\n                           -13.56719970703125,\n                           13.56719970703125,\n                           1.9108799695968628,\n                           -10.000300407409668,\n                           23.503799438476562,\n                           11.465299606323242,\n                           -9.609620094299316,\n                           22.5856990814209,\n                           7.688300132751465,\n                           -8.750229835510254,\n                           20.565799713134766,\n                           4.89661979675293,\n                           -7.890830039978027,\n                           18.54599952697754,\n                           3.0006699562072754,\n                           -7.500199794769287,\n                           17.62779998779297,\n                           1.9108799695968628,\n                           0,\n                           25.4783992767334,\n                           11.465299606323242,\n                           0,\n                           24.48310089111328,\n                           7.688300132751465,\n                           0,\n                           22.29360008239746,\n                           4.89661979675293,\n                           0,\n                           20.104000091552734,\n                           3.0006699562072754,\n                           0,\n                           19.108800888061523,\n                           1.9108799695968628,\n                           0,\n                           25.4783992767334,\n                           11.465299606323242,\n                           10.000300407409668,\n                           23.503799438476562,\n                           11.465299606323242,\n                           9.609620094299316,\n                           22.5856990814209,\n                           7.688300132751465,\n                           0,\n                           24.48310089111328,\n                           7.688300132751465,\n                           8.750229835510254,\n                           20.565799713134766,\n                           4.89661979675293,\n                           0,\n                           22.29360008239746,\n                           4.89661979675293,\n                           7.890830039978027,\n                           18.54599952697754,\n                           3.0006699562072754,\n                           0,\n                           20.104000091552734,\n                           3.0006699562072754,\n                           7.500199794769287,\n                           17.62779998779297,\n                           1.9108799695968628,\n                           0,\n                           19.108800888061523,\n                           1.9108799695968628,\n                           18.089599609375,\n                           18.089599609375,\n                           11.465299606323242,\n                           17.382999420166016,\n                           17.382999420166016,\n                           7.688300132751465,\n                           15.828399658203125,\n                           15.828399658203125,\n                           4.89661979675293,\n                           14.273900032043457,\n                           14.273900032043457,\n                           3.0006699562072754,\n                           13.56719970703125,\n                           13.56719970703125,\n                           1.9108799695968628,\n                           23.503799438476562,\n                           10.000300407409668,\n                           11.465299606323242,\n                           22.5856990814209,\n                           9.609620094299316,\n                           7.688300132751465,\n                           20.565799713134766,\n                           8.750229835510254,\n                           4.89661979675293,\n                           18.54599952697754,\n                           7.890830039978027,\n                           3.0006699562072754,\n                           17.62779998779297,\n                           7.500199794769287,\n                           1.9108799695968628,\n                           25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           24.48310089111328,\n                           0,\n                           7.688300132751465,\n                           22.29360008239746,\n                           0,\n                           4.89661979675293,\n                           20.104000091552734,\n                           0,\n                           3.0006699562072754,\n                           19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           17.62779998779297,\n                           -7.500199794769287,\n                           1.9108799695968628,\n                           17.228500366210938,\n                           -7.330269813537598,\n                           1.2092299461364746,\n                           18.675800323486328,\n                           0,\n                           1.2092299461364746,\n                           15.093799591064453,\n                           -6.422039985656738,\n                           0.5971490144729614,\n                           16.361900329589844,\n                           0,\n                           0.5971490144729614,\n                           9.819259643554688,\n                           -4.177840232849121,\n                           0.16421599686145782,\n                           10.644200325012207,\n                           0,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           13.56719970703125,\n                           -13.56719970703125,\n                           1.9108799695968628,\n                           13.25979995727539,\n                           -13.25979995727539,\n                           1.2092299461364746,\n                           11.616900444030762,\n                           -11.616900444030762,\n                           0.5971490144729614,\n                           7.557370185852051,\n                           -7.557370185852051,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           7.500199794769287,\n                           -17.62779998779297,\n                           1.9108799695968628,\n                           7.330269813537598,\n                           -17.228500366210938,\n                           1.2092299461364746,\n                           6.422039985656738,\n                           -15.093799591064453,\n                           0.5971490144729614,\n                           4.177840232849121,\n                           -9.819259643554688,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           -19.108800888061523,\n                           1.9108799695968628,\n                           0,\n                           -18.675800323486328,\n                           1.2092299461364746,\n                           0,\n                           -16.361900329589844,\n                           0.5971490144729614,\n                           0,\n                           -10.644200325012207,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           -19.108800888061523,\n                           1.9108799695968628,\n                           -7.500199794769287,\n                           -17.62779998779297,\n                           1.9108799695968628,\n                           -7.330269813537598,\n                           -17.228500366210938,\n                           1.2092299461364746,\n                           0,\n                           -18.675800323486328,\n                           1.2092299461364746,\n                           -6.422039985656738,\n                           -15.093799591064453,\n                           0.5971490144729614,\n                           0,\n                           -16.361900329589844,\n                           0.5971490144729614,\n                           -4.177840232849121,\n                           -9.819259643554688,\n                           0.16421599686145782,\n                           0,\n                           -10.644200325012207,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           -13.56719970703125,\n                           -13.56719970703125,\n                           1.9108799695968628,\n                           -13.25979995727539,\n                           -13.25979995727539,\n                           1.2092299461364746,\n                           -11.616900444030762,\n                           -11.616900444030762,\n                           0.5971490144729614,\n                           -7.557370185852051,\n                           -7.557370185852051,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           -17.62779998779297,\n                           -7.500199794769287,\n                           1.9108799695968628,\n                           -17.228500366210938,\n                           -7.330269813537598,\n                           1.2092299461364746,\n                           -15.093799591064453,\n                           -6.422039985656738,\n                           0.5971490144729614,\n                           -9.819259643554688,\n                           -4.177840232849121,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           -19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           -18.675800323486328,\n                           0,\n                           1.2092299461364746,\n                           -16.361900329589844,\n                           0,\n                           0.5971490144729614,\n                           -10.644200325012207,\n                           0,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           -19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           -17.62779998779297,\n                           7.500199794769287,\n                           1.9108799695968628,\n                           -17.228500366210938,\n                           7.330269813537598,\n                           1.2092299461364746,\n                           -18.675800323486328,\n                           0,\n                           1.2092299461364746,\n                           -15.093799591064453,\n                           6.422039985656738,\n                           0.5971490144729614,\n                           -16.361900329589844,\n                           0,\n                           0.5971490144729614,\n                           -9.819259643554688,\n                           4.177840232849121,\n                           0.16421599686145782,\n                           -10.644200325012207,\n                           0,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           -13.56719970703125,\n                           13.56719970703125,\n                           1.9108799695968628,\n                           -13.25979995727539,\n                           13.25979995727539,\n                           1.2092299461364746,\n                           -11.616900444030762,\n                           11.616900444030762,\n                           0.5971490144729614,\n                           -7.557370185852051,\n                           7.557370185852051,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           -7.500199794769287,\n                           17.62779998779297,\n                           1.9108799695968628,\n                           -7.330269813537598,\n                           17.228500366210938,\n                           1.2092299461364746,\n                           -6.422039985656738,\n                           15.093799591064453,\n                           0.5971490144729614,\n                           -4.177840232849121,\n                           9.819259643554688,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           19.108800888061523,\n                           1.9108799695968628,\n                           0,\n                           18.675800323486328,\n                           1.2092299461364746,\n                           0,\n                           16.361900329589844,\n                           0.5971490144729614,\n                           0,\n                           10.644200325012207,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           19.108800888061523,\n                           1.9108799695968628,\n                           7.500199794769287,\n                           17.62779998779297,\n                           1.9108799695968628,\n                           7.330269813537598,\n                           17.228500366210938,\n                           1.2092299461364746,\n                           0,\n                           18.675800323486328,\n                           1.2092299461364746,\n                           6.422039985656738,\n                           15.093799591064453,\n                           0.5971490144729614,\n                           0,\n                           16.361900329589844,\n                           0.5971490144729614,\n                           4.177840232849121,\n                           9.819259643554688,\n                           0.16421599686145782,\n                           0,\n                           10.644200325012207,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0,\n                           13.56719970703125,\n                           13.56719970703125,\n                           1.9108799695968628,\n                           13.25979995727539,\n                           13.25979995727539,\n                           1.2092299461364746,\n                           11.616900444030762,\n                           11.616900444030762,\n                           0.5971490144729614,\n                           7.557370185852051,\n                           7.557370185852051,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           17.62779998779297,\n                           7.500199794769287,\n                           1.9108799695968628,\n                           17.228500366210938,\n                           7.330269813537598,\n                           1.2092299461364746,\n                           15.093799591064453,\n                           6.422039985656738,\n                           0.5971490144729614,\n                           9.819259643554688,\n                           4.177840232849121,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           19.108800888061523,\n                           0,\n                           1.9108799695968628,\n                           18.675800323486328,\n                           0,\n                           1.2092299461364746,\n                           16.361900329589844,\n                           0,\n                           0.5971490144729614,\n                           10.644200325012207,\n                           0,\n                           0.16421599686145782,\n                           0,\n                           0,\n                           0,\n                           -20.382699966430664,\n                           0,\n                           25.796899795532227,\n                           -20.1835994720459,\n                           -2.149739980697632,\n                           26.244699478149414,\n                           -26.511600494384766,\n                           -2.149739980697632,\n                           26.192899703979492,\n                           -26.334299087524414,\n                           0,\n                           25.752099990844727,\n                           -31.156299591064453,\n                           -2.149739980697632,\n                           25.830400466918945,\n                           -30.733299255371094,\n                           0,\n                           25.438600540161133,\n                           -34.016998291015625,\n                           -2.149739980697632,\n                           24.846500396728516,\n                           -33.46030044555664,\n                           0,\n                           24.587600708007812,\n                           -34.99290084838867,\n                           -2.149739980697632,\n                           22.930500030517578,\n                           -34.39580154418945,\n                           0,\n                           22.930500030517578,\n                           -19.74570083618164,\n                           -2.8663198947906494,\n                           27.229999542236328,\n                           -26.901599884033203,\n                           -2.8663198947906494,\n                           27.162799835205078,\n                           -32.08679962158203,\n                           -2.8663198947906494,\n                           26.69260025024414,\n                           -35.241798400878906,\n                           -2.8663198947906494,\n                           25.416200637817383,\n                           -36.30670166015625,\n                           -2.8663198947906494,\n                           22.930500030517578,\n                           -19.30780029296875,\n                           -2.149739980697632,\n                           28.215299606323242,\n                           -27.29159927368164,\n                           -2.149739980697632,\n                           28.132699966430664,\n                           -33.017398834228516,\n                           -2.149739980697632,\n                           27.55470085144043,\n                           -36.46649932861328,\n                           -2.149739980697632,\n                           25.98579978942871,\n                           -37.620399475097656,\n                           -2.149739980697632,\n                           22.930500030517578,\n                           -19.108800888061523,\n                           0,\n                           28.66320037841797,\n                           -27.468900680541992,\n                           0,\n                           28.57360076904297,\n                           -33.440399169921875,\n                           0,\n                           27.94659996032715,\n                           -37.02330017089844,\n                           0,\n                           26.244699478149414,\n                           -38.21760177612305,\n                           0,\n                           22.930500030517578,\n                           -19.108800888061523,\n                           0,\n                           28.66320037841797,\n                           -19.30780029296875,\n                           2.149739980697632,\n                           28.215299606323242,\n                           -27.29159927368164,\n                           2.149739980697632,\n                           28.132699966430664,\n                           -27.468900680541992,\n                           0,\n                           28.57360076904297,\n                           -33.017398834228516,\n                           2.149739980697632,\n                           27.55470085144043,\n                           -33.440399169921875,\n                           0,\n                           27.94659996032715,\n                           -36.46649932861328,\n                           2.149739980697632,\n                           25.98579978942871,\n                           -37.02330017089844,\n                           0,\n                           26.244699478149414,\n                           -37.620399475097656,\n                           2.149739980697632,\n                           22.930500030517578,\n                           -38.21760177612305,\n                           0,\n                           22.930500030517578,\n                           -19.74570083618164,\n                           2.8663198947906494,\n                           27.229999542236328,\n                           -26.901599884033203,\n                           2.8663198947906494,\n                           27.162799835205078,\n                           -32.08679962158203,\n                           2.8663198947906494,\n                           26.69260025024414,\n                           -35.241798400878906,\n                           2.8663198947906494,\n                           25.416200637817383,\n                           -36.30670166015625,\n                           2.8663198947906494,\n                           22.930500030517578,\n                           -20.1835994720459,\n                           2.149739980697632,\n                           26.244699478149414,\n                           -26.511600494384766,\n                           2.149739980697632,\n                           26.192899703979492,\n                           -31.156299591064453,\n                           2.149739980697632,\n                           25.830400466918945,\n                           -34.016998291015625,\n                           2.149739980697632,\n                           24.846500396728516,\n                           -34.99290084838867,\n                           2.149739980697632,\n                           22.930500030517578,\n                           -20.382699966430664,\n                           0,\n                           25.796899795532227,\n                           -26.334299087524414,\n                           0,\n                           25.752099990844727,\n                           -30.733299255371094,\n                           0,\n                           25.438600540161133,\n                           -33.46030044555664,\n                           0,\n                           24.587600708007812,\n                           -34.39580154418945,\n                           0,\n                           22.930500030517578,\n                           -34.39580154418945,\n                           0,\n                           22.930500030517578,\n                           -34.99290084838867,\n                           -2.149739980697632,\n                           22.930500030517578,\n                           -34.44089889526367,\n                           -2.149739980697632,\n                           20.082199096679688,\n                           -33.89820098876953,\n                           0,\n                           20.33289909362793,\n                           -32.711299896240234,\n                           -2.149739980697632,\n                           16.81529998779297,\n                           -32.32569885253906,\n                           0,\n                           17.197900772094727,\n                           -29.69420051574707,\n                           -2.149739980697632,\n                           13.590499877929688,\n                           -29.558900833129883,\n                           0,\n                           14.062899589538574,\n                           -25.279300689697266,\n                           -2.149739980697632,\n                           10.8681001663208,\n                           -25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           -36.30670166015625,\n                           -2.8663198947906494,\n                           22.930500030517578,\n                           -35.6348991394043,\n                           -2.8663198947906494,\n                           19.530500411987305,\n                           -33.55979919433594,\n                           -2.8663198947906494,\n                           15.973699569702148,\n                           -29.99180030822754,\n                           -2.8663198947906494,\n                           12.551300048828125,\n                           -24.841400146484375,\n                           -2.8663198947906494,\n                           9.554389953613281,\n                           -37.620399475097656,\n                           -2.149739980697632,\n                           22.930500030517578,\n                           -36.82889938354492,\n                           -2.149739980697632,\n                           18.97879981994629,\n                           -34.408199310302734,\n                           -2.149739980697632,\n                           15.132100105285645,\n                           -30.289499282836914,\n                           -2.149739980697632,\n                           11.512200355529785,\n                           -24.403499603271484,\n                           -2.149739980697632,\n                           8.240659713745117,\n                           -38.21760177612305,\n                           0,\n                           22.930500030517578,\n                           -37.37160110473633,\n                           0,\n                           18.728099822998047,\n                           -34.79389953613281,\n                           0,\n                           14.749600410461426,\n                           -30.424800872802734,\n                           0,\n                           11.039799690246582,\n                           -24.204500198364258,\n                           0,\n                           7.643509864807129,\n                           -38.21760177612305,\n                           0,\n                           22.930500030517578,\n                           -37.620399475097656,\n                           2.149739980697632,\n                           22.930500030517578,\n                           -36.82889938354492,\n                           2.149739980697632,\n                           18.97879981994629,\n                           -37.37160110473633,\n                           0,\n                           18.728099822998047,\n                           -34.408199310302734,\n                           2.149739980697632,\n                           15.132100105285645,\n                           -34.79389953613281,\n                           0,\n                           14.749600410461426,\n                           -30.289499282836914,\n                           2.149739980697632,\n                           11.512200355529785,\n                           -30.424800872802734,\n                           0,\n                           11.039799690246582,\n                           -24.403499603271484,\n                           2.149739980697632,\n                           8.240659713745117,\n                           -24.204500198364258,\n                           0,\n                           7.643509864807129,\n                           -36.30670166015625,\n                           2.8663198947906494,\n                           22.930500030517578,\n                           -35.6348991394043,\n                           2.8663198947906494,\n                           19.530500411987305,\n                           -33.55979919433594,\n                           2.8663198947906494,\n                           15.973699569702148,\n                           -29.99180030822754,\n                           2.8663198947906494,\n                           12.551300048828125,\n                           -24.841400146484375,\n                           2.8663198947906494,\n                           9.554389953613281,\n                           -34.99290084838867,\n                           2.149739980697632,\n                           22.930500030517578,\n                           -34.44089889526367,\n                           2.149739980697632,\n                           20.082199096679688,\n                           -32.711299896240234,\n                           2.149739980697632,\n                           16.81529998779297,\n                           -29.69420051574707,\n                           2.149739980697632,\n                           13.590499877929688,\n                           -25.279300689697266,\n                           2.149739980697632,\n                           10.8681001663208,\n                           -34.39580154418945,\n                           0,\n                           22.930500030517578,\n                           -33.89820098876953,\n                           0,\n                           20.33289909362793,\n                           -32.32569885253906,\n                           0,\n                           17.197900772094727,\n                           -29.558900833129883,\n                           0,\n                           14.062899589538574,\n                           -25.4783992767334,\n                           0,\n                           11.465299606323242,\n                           21.656600952148438,\n                           0,\n                           18.15329933166504,\n                           21.656600952148438,\n                           -4.729420185089111,\n                           16.511199951171875,\n                           28.233999252319336,\n                           -4.270359992980957,\n                           18.339000701904297,\n                           27.76740074157715,\n                           0,\n                           19.55660057067871,\n                           31.011899948120117,\n                           -3.2604401111602783,\n                           22.221399307250977,\n                           30.4148006439209,\n                           0,\n                           22.930500030517578,\n                           32.59560012817383,\n                           -2.2505099773406982,\n                           26.764400482177734,\n                           31.867900848388672,\n                           0,\n                           27.020999908447266,\n                           35.5900993347168,\n                           -1.791450023651123,\n                           30.573999404907227,\n                           34.39580154418945,\n                           0,\n                           30.573999404907227,\n                           21.656600952148438,\n                           -6.3059000968933105,\n                           12.89840030670166,\n                           29.260299682617188,\n                           -5.693819999694824,\n                           15.660200119018555,\n                           32.32569885253906,\n                           -4.347249984741211,\n                           20.661399841308594,\n                           34.19670104980469,\n                           -3.0006699562072754,\n                           26.199899673461914,\n                           38.21760177612305,\n                           -2.3886001110076904,\n                           30.573999404907227,\n                           21.656600952148438,\n                           -4.729420185089111,\n                           9.285670280456543,\n                           30.286699295043945,\n                           -4.270359992980957,\n                           12.981499671936035,\n                           33.639400482177734,\n                           -3.2604401111602783,\n                           19.101299285888672,\n                           35.79790115356445,\n                           -2.2505099773406982,\n                           25.635400772094727,\n                           40.845001220703125,\n                           -1.791450023651123,\n                           30.573999404907227,\n                           21.656600952148438,\n                           0,\n                           7.643509864807129,\n                           30.75320053100586,\n                           0,\n                           11.763799667358398,\n                           34.23659896850586,\n                           0,\n                           18.392200469970703,\n                           36.52560043334961,\n                           0,\n                           25.378799438476562,\n                           42.03929901123047,\n                           0,\n                           30.573999404907227,\n                           21.656600952148438,\n                           0,\n                           7.643509864807129,\n                           21.656600952148438,\n                           4.729420185089111,\n                           9.285670280456543,\n                           30.286699295043945,\n                           4.270359992980957,\n                           12.981499671936035,\n                           30.75320053100586,\n                           0,\n                           11.763799667358398,\n                           33.639400482177734,\n                           3.2604401111602783,\n                           19.101299285888672,\n                           34.23659896850586,\n                           0,\n                           18.392200469970703,\n                           35.79790115356445,\n                           2.2505099773406982,\n                           25.635400772094727,\n                           36.52560043334961,\n                           0,\n                           25.378799438476562,\n                           40.845001220703125,\n                           1.791450023651123,\n                           30.573999404907227,\n                           42.03929901123047,\n                           0,\n                           30.573999404907227,\n                           21.656600952148438,\n                           6.3059000968933105,\n                           12.89840030670166,\n                           29.260299682617188,\n                           5.693819999694824,\n                           15.660200119018555,\n                           32.32569885253906,\n                           4.347249984741211,\n                           20.661399841308594,\n                           34.19670104980469,\n                           3.0006699562072754,\n                           26.199899673461914,\n                           38.21760177612305,\n                           2.3886001110076904,\n                           30.573999404907227,\n                           21.656600952148438,\n                           4.729420185089111,\n                           16.511199951171875,\n                           28.233999252319336,\n                           4.270359992980957,\n                           18.339000701904297,\n                           31.011899948120117,\n                           3.2604401111602783,\n                           22.221399307250977,\n                           32.59560012817383,\n                           2.2505099773406982,\n                           26.764400482177734,\n                           35.5900993347168,\n                           1.791450023651123,\n                           30.573999404907227,\n                           21.656600952148438,\n                           0,\n                           18.15329933166504,\n                           27.76740074157715,\n                           0,\n                           19.55660057067871,\n                           30.4148006439209,\n                           0,\n                           22.930500030517578,\n                           31.867900848388672,\n                           0,\n                           27.020999908447266,\n                           34.39580154418945,\n                           0,\n                           30.573999404907227,\n                           34.39580154418945,\n                           0,\n                           30.573999404907227,\n                           35.5900993347168,\n                           -1.791450023651123,\n                           30.573999404907227,\n                           36.59049987792969,\n                           -1.679479956626892,\n                           31.137699127197266,\n                           35.3114013671875,\n                           0,\n                           31.111499786376953,\n                           37.18870162963867,\n                           -1.4331599473953247,\n                           31.332599639892578,\n                           35.98820114135742,\n                           0,\n                           31.290599822998047,\n                           37.206600189208984,\n                           -1.1868300437927246,\n                           31.1481990814209,\n                           36.187198638916016,\n                           0,\n                           31.111499786376953,\n                           36.46590042114258,\n                           -1.074869990348816,\n                           30.573999404907227,\n                           35.669700622558594,\n                           0,\n                           30.573999404907227,\n                           38.21760177612305,\n                           -2.3886001110076904,\n                           30.573999404907227,\n                           39.40439987182617,\n                           -2.2393100261688232,\n                           31.195499420166016,\n                           39.829898834228516,\n                           -1.9108799695968628,\n                           31.424999237060547,\n                           39.44919967651367,\n                           -1.582450032234192,\n                           31.229000091552734,\n                           38.21760177612305,\n                           -1.4331599473953247,\n                           30.573999404907227,\n                           40.845001220703125,\n                           -1.791450023651123,\n                           30.573999404907227,\n                           42.218299865722656,\n                           -1.679479956626892,\n                           31.25320053100586,\n                           42.47100067138672,\n                           -1.4331599473953247,\n                           31.51740074157715,\n                           41.69169998168945,\n                           -1.1868300437927246,\n                           31.309900283813477,\n                           39.969200134277344,\n                           -1.074869990348816,\n                           30.573999404907227,\n                           42.03929901123047,\n                           0,\n                           30.573999404907227,\n                           43.49729919433594,\n                           0,\n                           31.279399871826172,\n                           43.67150115966797,\n                           0,\n                           31.55929946899414,\n                           42.71110153198242,\n                           0,\n                           31.346599578857422,\n                           40.76539993286133,\n                           0,\n                           30.573999404907227,\n                           42.03929901123047,\n                           0,\n                           30.573999404907227,\n                           40.845001220703125,\n                           1.791450023651123,\n                           30.573999404907227,\n                           42.218299865722656,\n                           1.679479956626892,\n                           31.25320053100586,\n                           43.49729919433594,\n                           0,\n                           31.279399871826172,\n                           42.47100067138672,\n                           1.4331599473953247,\n                           31.51740074157715,\n                           43.67150115966797,\n                           0,\n                           31.55929946899414,\n                           41.69169998168945,\n                           1.1868300437927246,\n                           31.309900283813477,\n                           42.71110153198242,\n                           0,\n                           31.346599578857422,\n                           39.969200134277344,\n                           1.074869990348816,\n                           30.573999404907227,\n                           40.76539993286133,\n                           0,\n                           30.573999404907227,\n                           38.21760177612305,\n                           2.3886001110076904,\n                           30.573999404907227,\n                           39.40439987182617,\n                           2.2393100261688232,\n                           31.195499420166016,\n                           39.829898834228516,\n                           1.9108799695968628,\n                           31.424999237060547,\n                           39.44919967651367,\n                           1.582450032234192,\n                           31.229000091552734,\n                           38.21760177612305,\n                           1.4331599473953247,\n                           30.573999404907227,\n                           35.5900993347168,\n                           1.791450023651123,\n                           30.573999404907227,\n                           36.59049987792969,\n                           1.679479956626892,\n                           31.137699127197266,\n                           37.18870162963867,\n                           1.4331599473953247,\n                           31.332599639892578,\n                           37.206600189208984,\n                           1.1868300437927246,\n                           31.1481990814209,\n                           36.46590042114258,\n                           1.074869990348816,\n                           30.573999404907227,\n                           34.39580154418945,\n                           0,\n                           30.573999404907227,\n                           35.3114013671875,\n                           0,\n                           31.111499786376953,\n                           35.98820114135742,\n                           0,\n                           31.290599822998047,\n                           36.187198638916016,\n                           0,\n                           31.111499786376953,\n                           35.669700622558594,\n                           0,\n                           30.573999404907227,\n                           0,\n                           0,\n                           40.12839889526367,\n                           0,\n                           0,\n                           40.12839889526367,\n                           4.004499912261963,\n                           -1.7077000141143799,\n                           39.501399993896484,\n                           4.339280128479004,\n                           0,\n                           39.501399993896484,\n                           3.8207099437713623,\n                           -1.6290700435638428,\n                           37.97869873046875,\n                           4.140230178833008,\n                           0,\n                           37.97869873046875,\n                           2.314160108566284,\n                           -0.985912024974823,\n                           36.09769821166992,\n                           2.5080299377441406,\n                           0,\n                           36.09769821166992,\n                           2.3503799438476562,\n                           -1.0000300407409668,\n                           34.39580154418945,\n                           2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           3.0849199295043945,\n                           -3.0849199295043945,\n                           39.501399993896484,\n                           2.943150043487549,\n                           -2.943150043487549,\n                           37.97869873046875,\n                           1.782039999961853,\n                           -1.782039999961853,\n                           36.09769821166992,\n                           1.8089599609375,\n                           -1.8089599609375,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           1.7077000141143799,\n                           -4.004499912261963,\n                           39.501399993896484,\n                           1.6290700435638428,\n                           -3.8207099437713623,\n                           37.97869873046875,\n                           0.985912024974823,\n                           -2.314160108566284,\n                           36.09769821166992,\n                           1.0000300407409668,\n                           -2.3503799438476562,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           0,\n                           -4.339280128479004,\n                           39.501399993896484,\n                           0,\n                           -4.140230178833008,\n                           37.97869873046875,\n                           0,\n                           -2.5080299377441406,\n                           36.09769821166992,\n                           0,\n                           -2.547840118408203,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -1.7077000141143799,\n                           -4.004499912261963,\n                           39.501399993896484,\n                           0,\n                           -4.339280128479004,\n                           39.501399993896484,\n                           -1.6290700435638428,\n                           -3.8207099437713623,\n                           37.97869873046875,\n                           0,\n                           -4.140230178833008,\n                           37.97869873046875,\n                           -0.985912024974823,\n                           -2.314160108566284,\n                           36.09769821166992,\n                           0,\n                           -2.5080299377441406,\n                           36.09769821166992,\n                           -1.0000300407409668,\n                           -2.3503799438476562,\n                           34.39580154418945,\n                           0,\n                           -2.547840118408203,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -3.0849199295043945,\n                           -3.0849199295043945,\n                           39.501399993896484,\n                           -2.943150043487549,\n                           -2.943150043487549,\n                           37.97869873046875,\n                           -1.782039999961853,\n                           -1.782039999961853,\n                           36.09769821166992,\n                           -1.8089599609375,\n                           -1.8089599609375,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -4.004499912261963,\n                           -1.7077000141143799,\n                           39.501399993896484,\n                           -3.8207099437713623,\n                           -1.6290700435638428,\n                           37.97869873046875,\n                           -2.314160108566284,\n                           -0.985912024974823,\n                           36.09769821166992,\n                           -2.3503799438476562,\n                           -1.0000300407409668,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -4.339280128479004,\n                           0,\n                           39.501399993896484,\n                           -4.140230178833008,\n                           0,\n                           37.97869873046875,\n                           -2.5080299377441406,\n                           0,\n                           36.09769821166992,\n                           -2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -4.004499912261963,\n                           1.7077000141143799,\n                           39.501399993896484,\n                           -4.339280128479004,\n                           0,\n                           39.501399993896484,\n                           -3.8207099437713623,\n                           1.6290700435638428,\n                           37.97869873046875,\n                           -4.140230178833008,\n                           0,\n                           37.97869873046875,\n                           -2.314160108566284,\n                           0.985912024974823,\n                           36.09769821166992,\n                           -2.5080299377441406,\n                           0,\n                           36.09769821166992,\n                           -2.3503799438476562,\n                           1.0000300407409668,\n                           34.39580154418945,\n                           -2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -3.0849199295043945,\n                           3.0849199295043945,\n                           39.501399993896484,\n                           -2.943150043487549,\n                           2.943150043487549,\n                           37.97869873046875,\n                           -1.782039999961853,\n                           1.782039999961853,\n                           36.09769821166992,\n                           -1.8089599609375,\n                           1.8089599609375,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           -1.7077000141143799,\n                           4.004499912261963,\n                           39.501399993896484,\n                           -1.6290700435638428,\n                           3.8207099437713623,\n                           37.97869873046875,\n                           -0.985912024974823,\n                           2.314160108566284,\n                           36.09769821166992,\n                           -1.0000300407409668,\n                           2.3503799438476562,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           0,\n                           4.339280128479004,\n                           39.501399993896484,\n                           0,\n                           4.140230178833008,\n                           37.97869873046875,\n                           0,\n                           2.5080299377441406,\n                           36.09769821166992,\n                           0,\n                           2.547840118408203,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           0,\n                           0,\n                           40.12839889526367,\n                           1.7077000141143799,\n                           4.004499912261963,\n                           39.501399993896484,\n                           0,\n                           4.339280128479004,\n                           39.501399993896484,\n                           1.6290700435638428,\n                           3.8207099437713623,\n                           37.97869873046875,\n                           0,\n                           4.140230178833008,\n                           37.97869873046875,\n                           0.985912024974823,\n                           2.314160108566284,\n                           36.09769821166992,\n                           0,\n                           2.5080299377441406,\n                           36.09769821166992,\n                           1.0000300407409668,\n                           2.3503799438476562,\n                           34.39580154418945,\n                           0,\n                           2.547840118408203,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           3.0849199295043945,\n                           3.0849199295043945,\n                           39.501399993896484,\n                           2.943150043487549,\n                           2.943150043487549,\n                           37.97869873046875,\n                           1.782039999961853,\n                           1.782039999961853,\n                           36.09769821166992,\n                           1.8089599609375,\n                           1.8089599609375,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           4.004499912261963,\n                           1.7077000141143799,\n                           39.501399993896484,\n                           3.8207099437713623,\n                           1.6290700435638428,\n                           37.97869873046875,\n                           2.314160108566284,\n                           0.985912024974823,\n                           36.09769821166992,\n                           2.3503799438476562,\n                           1.0000300407409668,\n                           34.39580154418945,\n                           0,\n                           0,\n                           40.12839889526367,\n                           4.339280128479004,\n                           0,\n                           39.501399993896484,\n                           4.140230178833008,\n                           0,\n                           37.97869873046875,\n                           2.5080299377441406,\n                           0,\n                           36.09769821166992,\n                           2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           2.3503799438476562,\n                           -1.0000300407409668,\n                           34.39580154418945,\n                           5.361800193786621,\n                           -2.2813100814819336,\n                           33.261199951171875,\n                           5.812250137329102,\n                           0,\n                           33.261199951171875,\n                           9.695320129394531,\n                           -4.125110149383545,\n                           32.484901428222656,\n                           10.50979995727539,\n                           0,\n                           32.484901428222656,\n                           13.58810043334961,\n                           -5.781400203704834,\n                           31.708599090576172,\n                           14.729700088500977,\n                           0,\n                           31.708599090576172,\n                           15.27750015258789,\n                           -6.5001702308654785,\n                           30.573999404907227,\n                           16.56089973449707,\n                           0,\n                           30.573999404907227,\n                           1.8089599609375,\n                           -1.8089599609375,\n                           34.39580154418945,\n                           4.126699924468994,\n                           -4.126699924468994,\n                           33.261199951171875,\n                           7.461979866027832,\n                           -7.461979866027832,\n                           32.484901428222656,\n                           10.458100318908691,\n                           -10.458100318908691,\n                           31.708599090576172,\n                           11.758299827575684,\n                           -11.758299827575684,\n                           30.573999404907227,\n                           1.0000300407409668,\n                           -2.3503799438476562,\n                           34.39580154418945,\n                           2.2813100814819336,\n                           -5.361800193786621,\n                           33.261199951171875,\n                           4.125110149383545,\n                           -9.695320129394531,\n                           32.484901428222656,\n                           5.781400203704834,\n                           -13.58810043334961,\n                           31.708599090576172,\n                           6.5001702308654785,\n                           -15.27750015258789,\n                           30.573999404907227,\n                           0,\n                           -2.547840118408203,\n                           34.39580154418945,\n                           0,\n                           -5.812250137329102,\n                           33.261199951171875,\n                           0,\n                           -10.50979995727539,\n                           32.484901428222656,\n                           0,\n                           -14.729700088500977,\n                           31.708599090576172,\n                           0,\n                           -16.56089973449707,\n                           30.573999404907227,\n                           0,\n                           -2.547840118408203,\n                           34.39580154418945,\n                           -1.0000300407409668,\n                           -2.3503799438476562,\n                           34.39580154418945,\n                           -2.2813100814819336,\n                           -5.361800193786621,\n                           33.261199951171875,\n                           0,\n                           -5.812250137329102,\n                           33.261199951171875,\n                           -4.125110149383545,\n                           -9.695320129394531,\n                           32.484901428222656,\n                           0,\n                           -10.50979995727539,\n                           32.484901428222656,\n                           -5.781400203704834,\n                           -13.58810043334961,\n                           31.708599090576172,\n                           0,\n                           -14.729700088500977,\n                           31.708599090576172,\n                           -6.5001702308654785,\n                           -15.27750015258789,\n                           30.573999404907227,\n                           0,\n                           -16.56089973449707,\n                           30.573999404907227,\n                           -1.8089599609375,\n                           -1.8089599609375,\n                           34.39580154418945,\n                           -4.126699924468994,\n                           -4.126699924468994,\n                           33.261199951171875,\n                           -7.461979866027832,\n                           -7.461979866027832,\n                           32.484901428222656,\n                           -10.458100318908691,\n                           -10.458100318908691,\n                           31.708599090576172,\n                           -11.758299827575684,\n                           -11.758299827575684,\n                           30.573999404907227,\n                           -2.3503799438476562,\n                           -1.0000300407409668,\n                           34.39580154418945,\n                           -5.361800193786621,\n                           -2.2813100814819336,\n                           33.261199951171875,\n                           -9.695320129394531,\n                           -4.125110149383545,\n                           32.484901428222656,\n                           -13.58810043334961,\n                           -5.781400203704834,\n                           31.708599090576172,\n                           -15.27750015258789,\n                           -6.5001702308654785,\n                           30.573999404907227,\n                           -2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           -5.812250137329102,\n                           0,\n                           33.261199951171875,\n                           -10.50979995727539,\n                           0,\n                           32.484901428222656,\n                           -14.729700088500977,\n                           0,\n                           31.708599090576172,\n                           -16.56089973449707,\n                           0,\n                           30.573999404907227,\n                           -2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           -2.3503799438476562,\n                           1.0000300407409668,\n                           34.39580154418945,\n                           -5.361800193786621,\n                           2.2813100814819336,\n                           33.261199951171875,\n                           -5.812250137329102,\n                           0,\n                           33.261199951171875,\n                           -9.695320129394531,\n                           4.125110149383545,\n                           32.484901428222656,\n                           -10.50979995727539,\n                           0,\n                           32.484901428222656,\n                           -13.58810043334961,\n                           5.781400203704834,\n                           31.708599090576172,\n                           -14.729700088500977,\n                           0,\n                           31.708599090576172,\n                           -15.27750015258789,\n                           6.5001702308654785,\n                           30.573999404907227,\n                           -16.56089973449707,\n                           0,\n                           30.573999404907227,\n                           -1.8089599609375,\n                           1.8089599609375,\n                           34.39580154418945,\n                           -4.126699924468994,\n                           4.126699924468994,\n                           33.261199951171875,\n                           -7.461979866027832,\n                           7.461979866027832,\n                           32.484901428222656,\n                           -10.458100318908691,\n                           10.458100318908691,\n                           31.708599090576172,\n                           -11.758299827575684,\n                           11.758299827575684,\n                           30.573999404907227,\n                           -1.0000300407409668,\n                           2.3503799438476562,\n                           34.39580154418945,\n                           -2.2813100814819336,\n                           5.361800193786621,\n                           33.261199951171875,\n                           -4.125110149383545,\n                           9.695320129394531,\n                           32.484901428222656,\n                           -5.781400203704834,\n                           13.58810043334961,\n                           31.708599090576172,\n                           -6.5001702308654785,\n                           15.27750015258789,\n                           30.573999404907227,\n                           0,\n                           2.547840118408203,\n                           34.39580154418945,\n                           0,\n                           5.812250137329102,\n                           33.261199951171875,\n                           0,\n                           10.50979995727539,\n                           32.484901428222656,\n                           0,\n                           14.729700088500977,\n                           31.708599090576172,\n                           0,\n                           16.56089973449707,\n                           30.573999404907227,\n                           0,\n                           2.547840118408203,\n                           34.39580154418945,\n                           1.0000300407409668,\n                           2.3503799438476562,\n                           34.39580154418945,\n                           2.2813100814819336,\n                           5.361800193786621,\n                           33.261199951171875,\n                           0,\n                           5.812250137329102,\n                           33.261199951171875,\n                           4.125110149383545,\n                           9.695320129394531,\n                           32.484901428222656,\n                           0,\n                           10.50979995727539,\n                           32.484901428222656,\n                           5.781400203704834,\n                           13.58810043334961,\n                           31.708599090576172,\n                           0,\n                           14.729700088500977,\n                           31.708599090576172,\n                           6.5001702308654785,\n                           15.27750015258789,\n                           30.573999404907227,\n                           0,\n                           16.56089973449707,\n                           30.573999404907227,\n                           1.8089599609375,\n                           1.8089599609375,\n                           34.39580154418945,\n                           4.126699924468994,\n                           4.126699924468994,\n                           33.261199951171875,\n                           7.461979866027832,\n                           7.461979866027832,\n                           32.484901428222656,\n                           10.458100318908691,\n                           10.458100318908691,\n                           31.708599090576172,\n                           11.758299827575684,\n                           11.758299827575684,\n                           30.573999404907227,\n                           2.3503799438476562,\n                           1.0000300407409668,\n                           34.39580154418945,\n                           5.361800193786621,\n                           2.2813100814819336,\n                           33.261199951171875,\n                           9.695320129394531,\n                           4.125110149383545,\n                           32.484901428222656,\n                           13.58810043334961,\n                           5.781400203704834,\n                           31.708599090576172,\n                           15.27750015258789,\n                           6.5001702308654785,\n                           30.573999404907227,\n                           2.547840118408203,\n                           0,\n                           34.39580154418945,\n                           5.812250137329102,\n                           0,\n                           33.261199951171875,\n                           10.50979995727539,\n                           0,\n                           32.484901428222656,\n                           14.729700088500977,\n                           0,\n                           31.708599090576172,\n                           16.56089973449707,\n                           0,\n                           30.573999404907227};\n\nfloat teapotNormals[] = {-0.9667419791221619,\n                         0,\n                         -0.25575199723243713,\n                         -0.8930140137672424,\n                         0.3698819875717163,\n                         -0.2563450038433075,\n                         -0.8934370279312134,\n                         0.36910200119018555,\n                         0.2559970021247864,\n                         -0.9668239951133728,\n                         0,\n                         0.2554430067539215,\n                         -0.0838799998164177,\n                         0.03550700098276138,\n                         0.9958429932594299,\n                         -0.09205400198698044,\n                         0,\n                         0.9957540035247803,\n                         0.629721999168396,\n                         -0.2604379951953888,\n                         0.7318620085716248,\n                         0.6820489764213562,\n                         0,\n                         0.7313070297241211,\n                         0.803725004196167,\n                         -0.3325839936733246,\n                         0.4933690130710602,\n                         0.8703010082244873,\n                         0,\n                         0.4925200045108795,\n                         -0.6834070086479187,\n                         0.6834070086479187,\n                         -0.2567310035228729,\n                         -0.6835309863090515,\n                         0.6835309863090515,\n                         0.25606799125671387,\n                         -0.06492599844932556,\n                         0.06492500007152557,\n                         0.9957759976387024,\n                         0.48139700293540955,\n                         -0.48139700293540955,\n                         0.7324709892272949,\n                         0.6148040294647217,\n                         -0.6148040294647217,\n                         0.4939970076084137,\n                         -0.3698819875717163,\n                         0.8930140137672424,\n                         -0.2563450038433075,\n                         -0.36910200119018555,\n                         0.8934370279312134,\n                         0.2559959888458252,\n                         -0.03550700098276138,\n                         0.0838790014386177,\n                         0.9958429932594299,\n                         0.26043900847435,\n                         -0.6297230124473572,\n                         0.7318609952926636,\n                         0.3325839936733246,\n                         -0.803725004196167,\n                         0.4933690130710602,\n                         -0.002848000032827258,\n                         0.9661769866943359,\n                         -0.25786298513412476,\n                         -0.001921999966725707,\n                         0.9670090079307556,\n                         0.2547360062599182,\n                         -0.00026500000967644155,\n                         0.09227199852466583,\n                         0.9957339763641357,\n                         0.00002300000051036477,\n                         -0.6820600032806396,\n                         0.7312960028648376,\n                         0,\n                         -0.8703010082244873,\n                         0.4925200045108795,\n                         -0.002848000032827258,\n                         0.9661769866943359,\n                         -0.25786298513412476,\n                         0.37905800342559814,\n                         0.852770984172821,\n                         -0.35929998755455017,\n                         0.37711000442504883,\n                         0.9140909910202026,\n                         0.14908500015735626,\n                         -0.001921999966725707,\n                         0.9670090079307556,\n                         0.2547360062599182,\n                         0.0275030005723238,\n                         0.12255500257015228,\n                         0.9920809864997864,\n                         -0.00026500000967644155,\n                         0.09227199852466583,\n                         0.9957339763641357,\n                         -0.26100900769233704,\n                         -0.6353650093078613,\n                         0.7267630100250244,\n                         0.00002300000051036477,\n                         -0.6820600032806396,\n                         0.7312960028648376,\n                         -0.33248499035835266,\n                         -0.8042709827423096,\n                         0.4925459921360016,\n                         0,\n                         -0.8703010082244873,\n                         0.4925200045108795,\n                         0.6635469794273376,\n                         0.6252639889717102,\n                         -0.4107919931411743,\n                         0.712664008140564,\n                         0.6976209878921509,\n                         0.07372400164604187,\n                         0.09972699731588364,\n                         0.12198299914598465,\n                         0.98750901222229,\n                         -0.4873189926147461,\n                         -0.4885669946670532,\n                         0.7237560153007507,\n                         -0.6152420043945312,\n                         -0.6154839992523193,\n                         0.4926010072231293,\n                         0.8800280094146729,\n                         0.3387089967727661,\n                         -0.3329069912433624,\n                         0.9172769784927368,\n                         0.36149299144744873,\n                         0.16711199283599854,\n                         0.11358699947595596,\n                         0.04806999862194061,\n                         0.9923650026321411,\n                         -0.6341490149497986,\n                         -0.2618879973888397,\n                         0.7275090217590332,\n                         -0.8041260242462158,\n                         -0.33270499110221863,\n                         0.49263399839401245,\n                         0.9666900038719177,\n                         -0.010453999973833561,\n                         -0.2557379901409149,\n                         0.967441976070404,\n                         -0.00810300000011921,\n                         0.25296199321746826,\n                         0.0934389978647232,\n                         -0.0012799999676644802,\n                         0.9956240057945251,\n                         -0.6821659803390503,\n                         0.0003429999924264848,\n                         0.7311969995498657,\n                         -0.8703219890594482,\n                         0.00005400000009103678,\n                         0.492482990026474,\n                         0.9666900038719177,\n                         -0.010453999973833561,\n                         -0.2557379901409149,\n                         0.8930140137672424,\n                         -0.3698819875717163,\n                         -0.2563450038433075,\n                         0.8934370279312134,\n                         -0.36910200119018555,\n                         0.2559970021247864,\n                         0.967441976070404,\n                         -0.00810300000011921,\n                         0.25296199321746826,\n                         0.0838799998164177,\n                         -0.03550700098276138,\n                         0.9958429932594299,\n                         0.0934389978647232,\n                         -0.0012799999676644802,\n                         0.9956240057945251,\n                         -0.629721999168396,\n                         0.2604379951953888,\n                         0.7318620085716248,\n                         -0.6821659803390503,\n                         0.0003429999924264848,\n                         0.7311969995498657,\n                         -0.803725004196167,\n                         0.3325839936733246,\n                         0.4933690130710602,\n                         -0.8703219890594482,\n                         0.00005400000009103678,\n                         0.492482990026474,\n                         0.6834070086479187,\n                         -0.6834070086479187,\n                         -0.2567310035228729,\n                         0.6835309863090515,\n                         -0.6835309863090515,\n                         0.25606799125671387,\n                         0.06492599844932556,\n                         -0.06492500007152557,\n                         0.9957759976387024,\n                         -0.48139700293540955,\n                         0.48139700293540955,\n                         0.7324709892272949,\n                         -0.6148040294647217,\n                         0.6148040294647217,\n                         0.4939970076084137,\n                         0.3698819875717163,\n                         -0.8930140137672424,\n                         -0.2563450038433075,\n                         0.36910200119018555,\n                         -0.8934370279312134,\n                         0.2559959888458252,\n                         0.03550700098276138,\n                         -0.0838790014386177,\n                         0.9958429932594299,\n                         -0.26043900847435,\n                         0.6297230124473572,\n                         0.7318609952926636,\n                         -0.3325839936733246,\n                         0.803725004196167,\n                         0.4933690130710602,\n                         0,\n                         -0.9667419791221619,\n                         -0.25575199723243713,\n                         0,\n                         -0.9668239951133728,\n                         0.2554430067539215,\n                         0,\n                         -0.09205400198698044,\n                         0.9957540035247803,\n                         0,\n                         0.6820489764213562,\n                         0.7313070297241211,\n                         0,\n                         0.8703010082244873,\n                         0.4925200045108795,\n                         0,\n                         -0.9667419791221619,\n                         -0.25575199723243713,\n                         -0.3698819875717163,\n                         -0.8930140137672424,\n                         -0.2563450038433075,\n                         -0.36910200119018555,\n                         -0.8934370279312134,\n                         0.2559970021247864,\n                         0,\n                         -0.9668239951133728,\n                         0.2554430067539215,\n                         -0.03550700098276138,\n                         -0.0838799998164177,\n                         0.9958429932594299,\n                         0,\n                         -0.09205400198698044,\n                         0.9957540035247803,\n                         0.2604379951953888,\n                         0.629721999168396,\n                         0.7318620085716248,\n                         0,\n                         0.6820489764213562,\n                         0.7313070297241211,\n                         0.3325839936733246,\n                         0.803725004196167,\n                         0.4933690130710602,\n                         0,\n                         0.8703010082244873,\n                         0.4925200045108795,\n                         -0.6834070086479187,\n                         -0.6834070086479187,\n                         -0.2567310035228729,\n                         -0.6835309863090515,\n                         -0.6835309863090515,\n                         0.25606799125671387,\n                         -0.06492500007152557,\n                         -0.06492599844932556,\n                         0.9957759976387024,\n                         0.48139700293540955,\n                         0.48139700293540955,\n                         0.7324709892272949,\n                         0.6148040294647217,\n                         0.6148040294647217,\n                         0.4939970076084137,\n                         -0.8930140137672424,\n                         -0.3698819875717163,\n                         -0.2563450038433075,\n                         -0.8934370279312134,\n                         -0.36910200119018555,\n                         0.2559959888458252,\n                         -0.0838790014386177,\n                         -0.03550700098276138,\n                         0.9958429932594299,\n                         0.6297230124473572,\n                         0.26043900847435,\n                         0.7318609952926636,\n                         0.803725004196167,\n                         0.3325839936733246,\n                         0.4933690130710602,\n                         -0.9667419791221619,\n                         0,\n                         -0.25575199723243713,\n                         -0.9668239951133728,\n                         0,\n                         0.2554430067539215,\n                         -0.09205400198698044,\n                         0,\n                         0.9957540035247803,\n                         0.6820489764213562,\n                         0,\n                         0.7313070297241211,\n                         0.8703010082244873,\n                         0,\n                         0.4925200045108795,\n                         0.8703010082244873,\n                         0,\n                         0.4925200045108795,\n                         0.803725004196167,\n                         -0.3325839936733246,\n                         0.4933690130710602,\n                         0.8454390168190002,\n                         -0.34983500838279724,\n                         0.40354499220848083,\n                         0.9153209924697876,\n                         0,\n                         0.4027250111103058,\n                         0.8699960112571716,\n                         -0.36004599928855896,\n                         0.33685898780822754,\n                         0.9418079853057861,\n                         0,\n                         0.33615100383758545,\n                         0.9041929841041565,\n                         -0.37428000569343567,\n                         0.20579099655151367,\n                         0.9786900281906128,\n                         0,\n                         0.20534199476242065,\n                         0.9218789935112,\n                         -0.38175201416015625,\n                         -0.06636899709701538,\n                         0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         0.6148040294647217,\n                         -0.6148040294647217,\n                         0.4939970076084137,\n                         0.6468020081520081,\n                         -0.6468020081520081,\n                         0.40409600734710693,\n                         0.6656550168991089,\n                         -0.6656550168991089,\n                         0.3373520076274872,\n                         0.6919230222702026,\n                         -0.6919230222702026,\n                         0.20611999928951263,\n                         0.7055429816246033,\n                         -0.7055429816246033,\n                         -0.06647899746894836,\n                         0.3325839936733246,\n                         -0.803725004196167,\n                         0.4933690130710602,\n                         0.34983500838279724,\n                         -0.8454390168190002,\n                         0.40354499220848083,\n                         0.36004701256752014,\n                         -0.8699960112571716,\n                         0.33685800433158875,\n                         0.37428000569343567,\n                         -0.9041929841041565,\n                         0.20579099655151367,\n                         0.38175201416015625,\n                         -0.9218789935112,\n                         -0.06636899709701538,\n                         0,\n                         -0.8703010082244873,\n                         0.4925200045108795,\n                         0,\n                         -0.9153209924697876,\n                         0.4027250111103058,\n                         0,\n                         -0.9418079853057861,\n                         0.33615100383758545,\n                         0,\n                         -0.9786900281906128,\n                         0.20534199476242065,\n                         0,\n                         -0.9978039860725403,\n                         -0.06623899936676025,\n                         0,\n                         -0.8703010082244873,\n                         0.4925200045108795,\n                         -0.33248499035835266,\n                         -0.8042709827423096,\n                         0.4925459921360016,\n                         -0.34983500838279724,\n                         -0.8454390168190002,\n                         0.40354499220848083,\n                         0,\n                         -0.9153209924697876,\n                         0.4027250111103058,\n                         -0.36004599928855896,\n                         -0.8699960112571716,\n                         0.33685898780822754,\n                         0,\n                         -0.9418079853057861,\n                         0.33615100383758545,\n                         -0.37428000569343567,\n                         -0.9041929841041565,\n                         0.20579099655151367,\n                         0,\n                         -0.9786900281906128,\n                         0.20534199476242065,\n                         -0.38175201416015625,\n                         -0.9218789935112,\n                         -0.06636899709701538,\n                         0,\n                         -0.9978039860725403,\n                         -0.06623899936676025,\n                         -0.6152420043945312,\n                         -0.6154839992523193,\n                         0.4926010072231293,\n                         -0.6468020081520081,\n                         -0.6468020081520081,\n                         0.40409600734710693,\n                         -0.6656550168991089,\n                         -0.6656550168991089,\n                         0.3373520076274872,\n                         -0.6919230222702026,\n                         -0.6919230222702026,\n                         0.20611999928951263,\n                         -0.7055429816246033,\n                         -0.7055429816246033,\n                         -0.06647899746894836,\n                         -0.8041260242462158,\n                         -0.33270499110221863,\n                         0.49263399839401245,\n                         -0.8454390168190002,\n                         -0.34983500838279724,\n                         0.40354499220848083,\n                         -0.8699960112571716,\n                         -0.36004701256752014,\n                         0.33685800433158875,\n                         -0.9041929841041565,\n                         -0.37428000569343567,\n                         0.20579099655151367,\n                         -0.9218789935112,\n                         -0.38175201416015625,\n                         -0.06636899709701538,\n                         -0.8703219890594482,\n                         0.00005400000009103678,\n                         0.492482990026474,\n                         -0.9153209924697876,\n                         0,\n                         0.4027250111103058,\n                         -0.9418079853057861,\n                         0,\n                         0.33615100383758545,\n                         -0.9786900281906128,\n                         0,\n                         0.20534199476242065,\n                         -0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         -0.8703219890594482,\n                         0.00005400000009103678,\n                         0.492482990026474,\n                         -0.803725004196167,\n                         0.3325839936733246,\n                         0.4933690130710602,\n                         -0.8454390168190002,\n                         0.34983500838279724,\n                         0.40354499220848083,\n                         -0.9153209924697876,\n                         0,\n                         0.4027250111103058,\n                         -0.8699960112571716,\n                         0.36004599928855896,\n                         0.33685898780822754,\n                         -0.9418079853057861,\n                         0,\n                         0.33615100383758545,\n                         -0.9041929841041565,\n                         0.37428000569343567,\n                         0.20579099655151367,\n                         -0.9786900281906128,\n                         0,\n                         0.20534199476242065,\n                         -0.9218789935112,\n                         0.38175201416015625,\n                         -0.06636899709701538,\n                         -0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         -0.6148040294647217,\n                         0.6148040294647217,\n                         0.4939970076084137,\n                         -0.6468020081520081,\n                         0.6468020081520081,\n                         0.40409600734710693,\n                         -0.6656550168991089,\n                         0.6656550168991089,\n                         0.3373520076274872,\n                         -0.6919230222702026,\n                         0.6919230222702026,\n                         0.20611999928951263,\n                         -0.7055429816246033,\n                         0.7055429816246033,\n                         -0.06647899746894836,\n                         -0.3325839936733246,\n                         0.803725004196167,\n                         0.4933690130710602,\n                         -0.34983500838279724,\n                         0.8454390168190002,\n                         0.40354499220848083,\n                         -0.36004701256752014,\n                         0.8699960112571716,\n                         0.33685800433158875,\n                         -0.37428000569343567,\n                         0.9041929841041565,\n                         0.20579099655151367,\n                         -0.38175201416015625,\n                         0.9218789935112,\n                         -0.06636899709701538,\n                         0,\n                         0.8703010082244873,\n                         0.4925200045108795,\n                         0,\n                         0.9153209924697876,\n                         0.4027250111103058,\n                         0,\n                         0.9418079853057861,\n                         0.33615100383758545,\n                         0,\n                         0.9786900281906128,\n                         0.20534199476242065,\n                         0,\n                         0.9978039860725403,\n                         -0.06623899936676025,\n                         0,\n                         0.8703010082244873,\n                         0.4925200045108795,\n                         0.3325839936733246,\n                         0.803725004196167,\n                         0.4933690130710602,\n                         0.34983500838279724,\n                         0.8454390168190002,\n                         0.40354499220848083,\n                         0,\n                         0.9153209924697876,\n                         0.4027250111103058,\n                         0.36004599928855896,\n                         0.8699960112571716,\n                         0.33685898780822754,\n                         0,\n                         0.9418079853057861,\n                         0.33615100383758545,\n                         0.37428000569343567,\n                         0.9041929841041565,\n                         0.20579099655151367,\n                         0,\n                         0.9786900281906128,\n                         0.20534199476242065,\n                         0.38175201416015625,\n                         0.9218789935112,\n                         -0.06636899709701538,\n                         0,\n                         0.9978039860725403,\n                         -0.06623899936676025,\n                         0.6148040294647217,\n                         0.6148040294647217,\n                         0.4939970076084137,\n                         0.6468020081520081,\n                         0.6468020081520081,\n                         0.40409600734710693,\n                         0.6656550168991089,\n                         0.6656550168991089,\n                         0.3373520076274872,\n                         0.6919230222702026,\n                         0.6919230222702026,\n                         0.20611999928951263,\n                         0.7055429816246033,\n                         0.7055429816246033,\n                         -0.06647899746894836,\n                         0.803725004196167,\n                         0.3325839936733246,\n                         0.4933690130710602,\n                         0.8454390168190002,\n                         0.34983500838279724,\n                         0.40354499220848083,\n                         0.8699960112571716,\n                         0.36004701256752014,\n                         0.33685800433158875,\n                         0.9041929841041565,\n                         0.37428000569343567,\n                         0.20579099655151367,\n                         0.9218789935112,\n                         0.38175201416015625,\n                         -0.06636899709701538,\n                         0.8703010082244873,\n                         0,\n                         0.4925200045108795,\n                         0.9153209924697876,\n                         0,\n                         0.4027250111103058,\n                         0.9418079853057861,\n                         0,\n                         0.33615100383758545,\n                         0.9786900281906128,\n                         0,\n                         0.20534199476242065,\n                         0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         0.9218789935112,\n                         -0.38175201416015625,\n                         -0.06636899709701538,\n                         0.8314369916915894,\n                         -0.3441790044307709,\n                         -0.4361799955368042,\n                         0.9001820087432861,\n                         0,\n                         -0.4355129897594452,\n                         0.6735119819641113,\n                         -0.2785939872264862,\n                         -0.6846650242805481,\n                         0.7296109795570374,\n                         0,\n                         -0.6838629841804504,\n                         0.6403989791870117,\n                         -0.26487401127815247,\n                         -0.7209240198135376,\n                         0.6939510107040405,\n                         0,\n                         -0.7200220227241516,\n                         0.7329490184783936,\n                         -0.303166002035141,\n                         -0.6089959740638733,\n                         0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         0.7055429816246033,\n                         -0.7055429816246033,\n                         -0.06647899746894836,\n                         0.6360920071601868,\n                         -0.6360920071601868,\n                         -0.4367780089378357,\n                         0.5149649977684021,\n                         -0.5149649977684021,\n                         -0.6852890253067017,\n                         0.48965099453926086,\n                         -0.48965099453926086,\n                         -0.7214459776878357,\n                         0.5605549812316895,\n                         -0.5605549812316895,\n                         -0.6095539927482605,\n                         0.38175201416015625,\n                         -0.9218789935112,\n                         -0.06636899709701538,\n                         0.3441790044307709,\n                         -0.8314369916915894,\n                         -0.4361799955368042,\n                         0.2785939872264862,\n                         -0.6735119819641113,\n                         -0.6846650242805481,\n                         0.26487401127815247,\n                         -0.6403989791870117,\n                         -0.7209240198135376,\n                         0.303166002035141,\n                         -0.7329490184783936,\n                         -0.6089959740638733,\n                         0,\n                         -0.9978039860725403,\n                         -0.06623899936676025,\n                         0,\n                         -0.9001820087432861,\n                         -0.4355129897594452,\n                         0,\n                         -0.7296109795570374,\n                         -0.6838629841804504,\n                         0,\n                         -0.6939510107040405,\n                         -0.7200220227241516,\n                         0,\n                         -0.7939500212669373,\n                         -0.6079840064048767,\n                         0,\n                         -0.9978039860725403,\n                         -0.06623899936676025,\n                         -0.38175201416015625,\n                         -0.9218789935112,\n                         -0.06636899709701538,\n                         -0.3441790044307709,\n                         -0.8314369916915894,\n                         -0.4361799955368042,\n                         0,\n                         -0.9001820087432861,\n                         -0.4355129897594452,\n                         -0.2785939872264862,\n                         -0.6735119819641113,\n                         -0.6846650242805481,\n                         0,\n                         -0.7296109795570374,\n                         -0.6838629841804504,\n                         -0.26487401127815247,\n                         -0.6403989791870117,\n                         -0.7209240198135376,\n                         0,\n                         -0.6939510107040405,\n                         -0.7200220227241516,\n                         -0.303166002035141,\n                         -0.7329490184783936,\n                         -0.6089959740638733,\n                         0,\n                         -0.7939500212669373,\n                         -0.6079840064048767,\n                         -0.7055429816246033,\n                         -0.7055429816246033,\n                         -0.06647899746894836,\n                         -0.6360920071601868,\n                         -0.6360920071601868,\n                         -0.4367780089378357,\n                         -0.5149649977684021,\n                         -0.5149649977684021,\n                         -0.6852890253067017,\n                         -0.48965099453926086,\n                         -0.48965099453926086,\n                         -0.7214459776878357,\n                         -0.5605549812316895,\n                         -0.5605549812316895,\n                         -0.6095539927482605,\n                         -0.9218789935112,\n                         -0.38175201416015625,\n                         -0.06636899709701538,\n                         -0.8314369916915894,\n                         -0.3441790044307709,\n                         -0.4361799955368042,\n                         -0.6735119819641113,\n                         -0.2785939872264862,\n                         -0.6846650242805481,\n                         -0.6403989791870117,\n                         -0.26487401127815247,\n                         -0.7209240198135376,\n                         -0.7329490184783936,\n                         -0.303166002035141,\n                         -0.6089959740638733,\n                         -0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         -0.9001820087432861,\n                         0,\n                         -0.4355129897594452,\n                         -0.7296109795570374,\n                         0,\n                         -0.6838629841804504,\n                         -0.6939510107040405,\n                         0,\n                         -0.7200220227241516,\n                         -0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         -0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         -0.9218789935112,\n                         0.38175201416015625,\n                         -0.06636899709701538,\n                         -0.8314369916915894,\n                         0.3441790044307709,\n                         -0.4361799955368042,\n                         -0.9001820087432861,\n                         0,\n                         -0.4355129897594452,\n                         -0.6735119819641113,\n                         0.2785939872264862,\n                         -0.6846650242805481,\n                         -0.7296109795570374,\n                         0,\n                         -0.6838629841804504,\n                         -0.6403989791870117,\n                         0.26487401127815247,\n                         -0.7209240198135376,\n                         -0.6939510107040405,\n                         0,\n                         -0.7200220227241516,\n                         -0.7329490184783936,\n                         0.303166002035141,\n                         -0.6089959740638733,\n                         -0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         -0.7055429816246033,\n                         0.7055429816246033,\n                         -0.06647899746894836,\n                         -0.6360920071601868,\n                         0.6360920071601868,\n                         -0.4367780089378357,\n                         -0.5149649977684021,\n                         0.5149649977684021,\n                         -0.6852890253067017,\n                         -0.48965099453926086,\n                         0.48965099453926086,\n                         -0.7214459776878357,\n                         -0.5605549812316895,\n                         0.5605549812316895,\n                         -0.6095539927482605,\n                         -0.38175201416015625,\n                         0.9218789935112,\n                         -0.06636899709701538,\n                         -0.3441790044307709,\n                         0.8314369916915894,\n                         -0.4361799955368042,\n                         -0.2785939872264862,\n                         0.6735119819641113,\n                         -0.6846650242805481,\n                         -0.26487401127815247,\n                         0.6403989791870117,\n                         -0.7209240198135376,\n                         -0.303166002035141,\n                         0.7329490184783936,\n                         -0.6089959740638733,\n                         0,\n                         0.9978039860725403,\n                         -0.06623899936676025,\n                         0,\n                         0.9001820087432861,\n                         -0.4355129897594452,\n                         0,\n                         0.7296109795570374,\n                         -0.6838629841804504,\n                         0,\n                         0.6939510107040405,\n                         -0.7200220227241516,\n                         0,\n                         0.7939500212669373,\n                         -0.6079840064048767,\n                         0,\n                         0.9978039860725403,\n                         -0.06623899936676025,\n                         0.38175201416015625,\n                         0.9218789935112,\n                         -0.06636899709701538,\n                         0.3441790044307709,\n                         0.8314369916915894,\n                         -0.4361799955368042,\n                         0,\n                         0.9001820087432861,\n                         -0.4355129897594452,\n                         0.2785939872264862,\n                         0.6735119819641113,\n                         -0.6846650242805481,\n                         0,\n                         0.7296109795570374,\n                         -0.6838629841804504,\n                         0.26487401127815247,\n                         0.6403989791870117,\n                         -0.7209240198135376,\n                         0,\n                         0.6939510107040405,\n                         -0.7200220227241516,\n                         0.303166002035141,\n                         0.7329490184783936,\n                         -0.6089959740638733,\n                         0,\n                         0.7939500212669373,\n                         -0.6079840064048767,\n                         0.7055429816246033,\n                         0.7055429816246033,\n                         -0.06647899746894836,\n                         0.6360920071601868,\n                         0.6360920071601868,\n                         -0.4367780089378357,\n                         0.5149649977684021,\n                         0.5149649977684021,\n                         -0.6852890253067017,\n                         0.48965099453926086,\n                         0.48965099453926086,\n                         -0.7214459776878357,\n                         0.5605549812316895,\n                         0.5605549812316895,\n                         -0.6095539927482605,\n                         0.9218789935112,\n                         0.38175201416015625,\n                         -0.06636899709701538,\n                         0.8314369916915894,\n                         0.3441790044307709,\n                         -0.4361799955368042,\n                         0.6735119819641113,\n                         0.2785939872264862,\n                         -0.6846650242805481,\n                         0.6403989791870117,\n                         0.26487401127815247,\n                         -0.7209240198135376,\n                         0.7329490184783936,\n                         0.303166002035141,\n                         -0.6089959740638733,\n                         0.9978039860725403,\n                         0,\n                         -0.06623899936676025,\n                         0.9001820087432861,\n                         0,\n                         -0.4355129897594452,\n                         0.7296109795570374,\n                         0,\n                         -0.6838629841804504,\n                         0.6939510107040405,\n                         0,\n                         -0.7200220227241516,\n                         0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         0.7329490184783936,\n                         -0.303166002035141,\n                         -0.6089959740638733,\n                         0.576229989528656,\n                         -0.23821599781513214,\n                         -0.7818009853363037,\n                         0.6238600015640259,\n                         0,\n                         -0.7815359830856323,\n                         0.16362899541854858,\n                         -0.06752700358629227,\n                         -0.9842079877853394,\n                         0.17729100584983826,\n                         0,\n                         -0.984158992767334,\n                         0.04542100057005882,\n                         -0.018735000863671303,\n                         -0.9987919926643372,\n                         0.04920699819922447,\n                         0,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         0,\n                         -1,\n                         0.5605549812316895,\n                         -0.5605549812316895,\n                         -0.6095539927482605,\n                         0.44041600823402405,\n                         -0.44041600823402405,\n                         -0.7823479771614075,\n                         0.12490200251340866,\n                         -0.12490200251340866,\n                         -0.9842759966850281,\n                         0.034662000834941864,\n                         -0.034662000834941864,\n                         -0.9987980127334595,\n                         0,\n                         0,\n                         -1,\n                         0.303166002035141,\n                         -0.7329490184783936,\n                         -0.6089959740638733,\n                         0.23821599781513214,\n                         -0.576229989528656,\n                         -0.7818009853363037,\n                         0.06752700358629227,\n                         -0.16362899541854858,\n                         -0.9842079877853394,\n                         0.018735000863671303,\n                         -0.04542100057005882,\n                         -0.9987919926643372,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         -0.7939500212669373,\n                         -0.6079840064048767,\n                         0,\n                         -0.6238600015640259,\n                         -0.7815359830856323,\n                         0,\n                         -0.17729100584983826,\n                         -0.984158992767334,\n                         0,\n                         -0.04920699819922447,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         -0.7939500212669373,\n                         -0.6079840064048767,\n                         -0.303166002035141,\n                         -0.7329490184783936,\n                         -0.6089959740638733,\n                         -0.23821599781513214,\n                         -0.576229989528656,\n                         -0.7818009853363037,\n                         0,\n                         -0.6238600015640259,\n                         -0.7815359830856323,\n                         -0.06752700358629227,\n                         -0.16362899541854858,\n                         -0.9842079877853394,\n                         0,\n                         -0.17729100584983826,\n                         -0.984158992767334,\n                         -0.018735000863671303,\n                         -0.04542100057005882,\n                         -0.9987919926643372,\n                         0,\n                         -0.04920699819922447,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         0,\n                         -1,\n                         -0.5605549812316895,\n                         -0.5605549812316895,\n                         -0.6095539927482605,\n                         -0.44041600823402405,\n                         -0.44041600823402405,\n                         -0.7823479771614075,\n                         -0.12490200251340866,\n                         -0.12490200251340866,\n                         -0.9842759966850281,\n                         -0.034662000834941864,\n                         -0.034662000834941864,\n                         -0.9987980127334595,\n                         0,\n                         0,\n                         -1,\n                         -0.7329490184783936,\n                         -0.303166002035141,\n                         -0.6089959740638733,\n                         -0.576229989528656,\n                         -0.23821599781513214,\n                         -0.7818009853363037,\n                         -0.16362899541854858,\n                         -0.06752700358629227,\n                         -0.9842079877853394,\n                         -0.04542100057005882,\n                         -0.018735000863671303,\n                         -0.9987919926643372,\n                         0,\n                         0,\n                         -1,\n                         -0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         -0.6238600015640259,\n                         0,\n                         -0.7815359830856323,\n                         -0.17729100584983826,\n                         0,\n                         -0.984158992767334,\n                         -0.04920699819922447,\n                         0,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         -0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         -0.7329490184783936,\n                         0.303166002035141,\n                         -0.6089959740638733,\n                         -0.576229989528656,\n                         0.23821599781513214,\n                         -0.7818009853363037,\n                         -0.6238600015640259,\n                         0,\n                         -0.7815359830856323,\n                         -0.16362899541854858,\n                         0.06752700358629227,\n                         -0.9842079877853394,\n                         -0.17729100584983826,\n                         0,\n                         -0.984158992767334,\n                         -0.04542100057005882,\n                         0.018735000863671303,\n                         -0.9987919926643372,\n                         -0.04920699819922447,\n                         0,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         0,\n                         -1,\n                         -0.5605549812316895,\n                         0.5605549812316895,\n                         -0.6095539927482605,\n                         -0.44041600823402405,\n                         0.44041600823402405,\n                         -0.7823479771614075,\n                         -0.12490200251340866,\n                         0.12490200251340866,\n                         -0.9842759966850281,\n                         -0.034662000834941864,\n                         0.034662000834941864,\n                         -0.9987980127334595,\n                         0,\n                         0,\n                         -1,\n                         -0.303166002035141,\n                         0.7329490184783936,\n                         -0.6089959740638733,\n                         -0.23821599781513214,\n                         0.576229989528656,\n                         -0.7818009853363037,\n                         -0.06752700358629227,\n                         0.16362899541854858,\n                         -0.9842079877853394,\n                         -0.018735000863671303,\n                         0.04542100057005882,\n                         -0.9987919926643372,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         0.7939500212669373,\n                         -0.6079840064048767,\n                         0,\n                         0.6238600015640259,\n                         -0.7815359830856323,\n                         0,\n                         0.17729100584983826,\n                         -0.984158992767334,\n                         0,\n                         0.04920699819922447,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         0.7939500212669373,\n                         -0.6079840064048767,\n                         0.303166002035141,\n                         0.7329490184783936,\n                         -0.6089959740638733,\n                         0.23821599781513214,\n                         0.576229989528656,\n                         -0.7818009853363037,\n                         0,\n                         0.6238600015640259,\n                         -0.7815359830856323,\n                         0.06752700358629227,\n                         0.16362899541854858,\n                         -0.9842079877853394,\n                         0,\n                         0.17729100584983826,\n                         -0.984158992767334,\n                         0.018735000863671303,\n                         0.04542100057005882,\n                         -0.9987919926643372,\n                         0,\n                         0.04920699819922447,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0,\n                         0,\n                         -1,\n                         0.5605549812316895,\n                         0.5605549812316895,\n                         -0.6095539927482605,\n                         0.44041600823402405,\n                         0.44041600823402405,\n                         -0.7823479771614075,\n                         0.12490200251340866,\n                         0.12490200251340866,\n                         -0.9842759966850281,\n                         0.034662000834941864,\n                         0.034662000834941864,\n                         -0.9987980127334595,\n                         0,\n                         0,\n                         -1,\n                         0.7329490184783936,\n                         0.303166002035141,\n                         -0.6089959740638733,\n                         0.576229989528656,\n                         0.23821599781513214,\n                         -0.7818009853363037,\n                         0.16362899541854858,\n                         0.06752700358629227,\n                         -0.9842079877853394,\n                         0.04542100057005882,\n                         0.018735000863671303,\n                         -0.9987919926643372,\n                         0,\n                         0,\n                         -1,\n                         0.7939500212669373,\n                         0,\n                         -0.6079840064048767,\n                         0.6238600015640259,\n                         0,\n                         -0.7815359830856323,\n                         0.17729100584983826,\n                         0,\n                         -0.984158992767334,\n                         0.04920699819922447,\n                         0,\n                         -0.9987890124320984,\n                         0,\n                         0,\n                         -1,\n                         0.007784999907016754,\n                         0.00021499999274965376,\n                         -0.999970018863678,\n                         0.007038000039756298,\n                         -0.5829259753227234,\n                         -0.8124949932098389,\n                         0.0361270010471344,\n                         -0.5456140041351318,\n                         -0.837257981300354,\n                         0.03913800045847893,\n                         0.0009879999561235309,\n                         -0.9992330074310303,\n                         0.16184599697589874,\n                         -0.5630490183830261,\n                         -0.8104209899902344,\n                         0.17951199412345886,\n                         0.0043680001981556416,\n                         -0.9837459921836853,\n                         0.4823650121688843,\n                         -0.6427459716796875,\n                         -0.5951480269432068,\n                         0.6122999787330627,\n                         0.010459000244736671,\n                         -0.790556013584137,\n                         0.7387199997901917,\n                         -0.6641989946365356,\n                         -0.11459299921989441,\n                         0.9861519932746887,\n                         0.006668999791145325,\n                         -0.16570700705051422,\n                         -0.0019079999765381217,\n                         -0.9867690205574036,\n                         0.1621209979057312,\n                         0.002761000068858266,\n                         -0.9998499751091003,\n                         0.017105000093579292,\n                         0.010532000102102757,\n                         -0.9972469806671143,\n                         0.07339800149202347,\n                         -0.06604000180959702,\n                         -0.9893029928207397,\n                         0.13006900250911713,\n                         -0.09442699700593948,\n                         -0.9953929781913757,\n                         0.016594000160694122,\n                         -0.009201999753713608,\n                         -0.4902929961681366,\n                         0.8715090155601501,\n                         -0.04860600084066391,\n                         -0.5394579768180847,\n                         0.8406090140342712,\n                         -0.22329799830913544,\n                         -0.5527390241622925,\n                         0.8028810024261475,\n                         -0.5963649749755859,\n                         -0.5751349925994873,\n                         0.5599709749221802,\n                         -0.8033369779586792,\n                         -0.5916029810905457,\n                         0.06823500245809555,\n                         -0.01056000031530857,\n                         -0.00010299999848939478,\n                         0.9999439716339111,\n                         -0.05879800021648407,\n                         -0.0007089999853633344,\n                         0.9982699751853943,\n                         -0.28071001172065735,\n                         -0.0032679999712854624,\n                         0.9597870111465454,\n                         -0.7497230172157288,\n                         -0.004267000127583742,\n                         0.6617379784584045,\n                         -0.9973509907722473,\n                         -0.0020580000709742308,\n                         0.07271400094032288,\n                         -0.01056000031530857,\n                         -0.00010299999848939478,\n                         0.9999439716339111,\n                         -0.008791999891400337,\n                         0.49032899737358093,\n                         0.8714929819107056,\n                         -0.04649300128221512,\n                         0.5387560129165649,\n                         0.8411779999732971,\n                         -0.05879800021648407,\n                         -0.0007089999853633344,\n                         0.9982699751853943,\n                         -0.21790899336338043,\n                         0.5491610169410706,\n                         0.8068069815635681,\n                         -0.28071001172065735,\n                         -0.0032679999712854624,\n                         0.9597870111465454,\n                         -0.5972909927368164,\n                         0.5741199851036072,\n                         0.560027003288269,\n                         -0.7497230172157288,\n                         -0.004267000127583742,\n                         0.6617379784584045,\n                         -0.8040000200271606,\n                         0.5912910103797913,\n                         0.0629120022058487,\n                         -0.9973509907722473,\n                         -0.0020580000709742308,\n                         0.07271400094032288,\n                         -0.0018050000071525574,\n                         0.986840009689331,\n                         0.16169099509716034,\n                         0.0020310000982135534,\n                         0.999891996383667,\n                         0.014553000219166279,\n                         0.009215000085532665,\n                         0.9981520175933838,\n                         0.060068998485803604,\n                         -0.059335000813007355,\n                         0.9917230010032654,\n                         0.11386600136756897,\n                         -0.08690100163221359,\n                         0.9961410164833069,\n                         0.01228999998420477,\n                         0.006417000200599432,\n                         0.5830950140953064,\n                         -0.812379002571106,\n                         0.03378299996256828,\n                         0.5453730225563049,\n                         -0.8375130295753479,\n                         0.1571130007505417,\n                         0.562188982963562,\n                         -0.8119469881057739,\n                         0.4844059944152832,\n                         0.6465290188789368,\n                         -0.5893650054931641,\n                         0.7388700246810913,\n                         0.6661880016326904,\n                         -0.10131999850273132,\n                         0.007784999907016754,\n                         0.00021499999274965376,\n                         -0.999970018863678,\n                         0.03913800045847893,\n                         0.0009879999561235309,\n                         -0.9992330074310303,\n                         0.17951199412345886,\n                         0.0043680001981556416,\n                         -0.9837459921836853,\n                         0.6122999787330627,\n                         0.010459000244736671,\n                         -0.790556013584137,\n                         0.9861519932746887,\n                         0.006668999791145325,\n                         -0.16570700705051422,\n                         0.9861519932746887,\n                         0.006668999791145325,\n                         -0.16570700705051422,\n                         0.7387199997901917,\n                         -0.6641989946365356,\n                         -0.11459299921989441,\n                         0.7256090044975281,\n                         -0.6373609900474548,\n                         0.25935098528862,\n                         0.94651198387146,\n                         0.0033569999504834414,\n                         0.3226499855518341,\n                         0.6459450125694275,\n                         -0.6077200174331665,\n                         0.46198800206184387,\n                         0.8258299827575684,\n                         0.007451999932527542,\n                         0.5638700127601624,\n                         0.5316150188446045,\n                         -0.5586140155792236,\n                         0.6366599798202515,\n                         0.6500110030174255,\n                         0.006936000194400549,\n                         0.759893000125885,\n                         0.4249640107154846,\n                         -0.5955389738082886,\n                         0.6817179918289185,\n                         0.5324289798736572,\n                         0.005243999883532524,\n                         0.8464580178260803,\n                         -0.09442699700593948,\n                         -0.9953929781913757,\n                         0.016594000160694122,\n                         -0.04956100136041641,\n                         -0.9985759854316711,\n                         -0.01975500024855137,\n                         -0.03781700134277344,\n                         -0.998649001121521,\n                         -0.035624999552965164,\n                         -0.0379129983484745,\n                         -0.9986140131950378,\n                         -0.03651199862360954,\n                         -0.1688539981842041,\n                         -0.9395300149917603,\n                         -0.2979460060596466,\n                         -0.8033369779586792,\n                         -0.5916029810905457,\n                         0.06823500245809555,\n                         -0.7423409819602966,\n                         -0.5995240211486816,\n                         -0.2991659939289093,\n                         -0.6196020245552063,\n                         -0.5795029997825623,\n                         -0.5294060111045837,\n                         -0.483707994222641,\n                         -0.5438370108604431,\n                         -0.6857600212097168,\n                         -0.44529199600219727,\n                         -0.4131770133972168,\n                         -0.7943549752235413,\n                         -0.9973509907722473,\n                         -0.0020580000709742308,\n                         0.07271400094032288,\n                         -0.9265130162239075,\n                         -0.0019950000569224358,\n                         -0.3762570023536682,\n                         -0.7539200186729431,\n                         -0.004317000042647123,\n                         -0.6569520235061646,\n                         -0.5662239789962769,\n                         -0.003461000043898821,\n                         -0.8242440223693848,\n                         -0.4818040132522583,\n                         -0.0018500000005587935,\n                         -0.8762770295143127,\n                         -0.9973509907722473,\n                         -0.0020580000709742308,\n                         0.07271400094032288,\n                         -0.8040000200271606,\n                         0.5912910103797913,\n                         0.0629120022058487,\n                         -0.7446749806404114,\n                         0.5989770293235779,\n                         -0.29442399740219116,\n                         -0.9265130162239075,\n                         -0.0019950000569224358,\n                         -0.3762570023536682,\n                         -0.6219490170478821,\n                         0.5781649947166443,\n                         -0.5281140208244324,\n                         -0.7539200186729431,\n                         -0.004317000042647123,\n                         -0.6569520235061646,\n                         -0.48117101192474365,\n                         0.5428280234336853,\n                         -0.6883400082588196,\n                         -0.5662239789962769,\n                         -0.003461000043898821,\n                         -0.8242440223693848,\n                         -0.43805500864982605,\n                         0.41574400663375854,\n                         -0.7970349788665771,\n                         -0.4818040132522583,\n                         -0.0018500000005587935,\n                         -0.8762770295143127,\n                         -0.08690100163221359,\n                         0.9961410164833069,\n                         0.01228999998420477,\n                         -0.04433799907565117,\n                         0.9988710284233093,\n                         -0.017055999487638474,\n                         -0.026177000254392624,\n                         0.9992600083351135,\n                         -0.02816700004041195,\n                         -0.025293000042438507,\n                         0.9992780089378357,\n                         -0.028332000598311424,\n                         -0.15748199820518494,\n                         0.9441670179367065,\n                         -0.28939300775527954,\n                         0.7388700246810913,\n                         0.6661880016326904,\n                         -0.10131999850273132,\n                         0.7282440066337585,\n                         0.63714200258255,\n                         0.25240999460220337,\n                         0.6470540165901184,\n                         0.6082550287246704,\n                         0.4597249925136566,\n                         0.5229939818382263,\n                         0.5621700286865234,\n                         0.6406570076942444,\n                         0.4099780023097992,\n                         0.6046689748764038,\n                         0.6828569769859314,\n                         0.9861519932746887,\n                         0.006668999791145325,\n                         -0.16570700705051422,\n                         0.94651198387146,\n                         0.0033569999504834414,\n                         0.3226499855518341,\n                         0.8258299827575684,\n                         0.007451999932527542,\n                         0.5638700127601624,\n                         0.6500110030174255,\n                         0.006936000194400549,\n                         0.759893000125885,\n                         0.5324289798736572,\n                         0.005243999883532524,\n                         0.8464580178260803,\n                         -0.230786994099617,\n                         0.006523000076413155,\n                         0.9729819893836975,\n                         -0.15287800133228302,\n                         -0.7101899981498718,\n                         0.6872109770774841,\n                         -0.31672099232673645,\n                         -0.7021129727363586,\n                         0.6377500295639038,\n                         -0.5489360094070435,\n                         0.0015109999803826213,\n                         0.8358629941940308,\n                         -0.6010670065879822,\n                         -0.645330011844635,\n                         0.471451997756958,\n                         -0.8756710290908813,\n                         -0.009891999885439873,\n                         0.4828070104122162,\n                         -0.635890007019043,\n                         -0.629800021648407,\n                         0.4460900127887726,\n                         -0.8775539994239807,\n                         -0.01909100078046322,\n                         0.47909700870513916,\n                         -0.4357450008392334,\n                         -0.670009970664978,\n                         0.6010090112686157,\n                         -0.6961889863014221,\n                         -0.02449600026011467,\n                         0.7174400091171265,\n                         0.11111299693584442,\n                         -0.9901599884033203,\n                         -0.08506900072097778,\n                         0.22330999374389648,\n                         -0.9747260212898254,\n                         0.006539999973028898,\n                         0.19009700417518616,\n                         -0.9694579839706421,\n                         0.15496399998664856,\n                         0.005270000081509352,\n                         -0.9818699955940247,\n                         0.18948200345039368,\n                         -0.011750999838113785,\n                         -0.9690240025520325,\n                         0.24668699502944946,\n                         0.3439059853553772,\n                         -0.5994120240211487,\n                         -0.7227950096130371,\n                         0.5724899768829346,\n                         -0.5916270017623901,\n                         -0.5676559805870056,\n                         0.7874360084533691,\n                         -0.5605109930038452,\n                         -0.2564600110054016,\n                         0.6470969915390015,\n                         -0.6981409788131714,\n                         -0.3063740134239197,\n                         0.4275279939174652,\n                         -0.7535750269889832,\n                         -0.49934399127960205,\n                         0.4109260141849518,\n                         -0.0012839999981224537,\n                         -0.9116680026054382,\n                         0.6715199947357178,\n                         0.0008989999769255519,\n                         -0.7409859895706177,\n                         0.9220259785652161,\n                         0.00725199980661273,\n                         -0.3870599865913391,\n                         0.8469099998474121,\n                         0.01385399978607893,\n                         -0.5315560102462769,\n                         0.5359240174293518,\n                         0.010503999888896942,\n                         -0.8442010283470154,\n                         0.4109260141849518,\n                         -0.0012839999981224537,\n                         -0.9116680026054382,\n                         0.3411880135536194,\n                         0.6009309887886047,\n                         -0.7228230237960815,\n                         0.5786640048027039,\n                         0.591838002204895,\n                         -0.5611389875411987,\n                         0.6715199947357178,\n                         0.0008989999769255519,\n                         -0.7409859895706177,\n                         0.7848690152168274,\n                         0.5665420293807983,\n                         -0.25102001428604126,\n                         0.9220259785652161,\n                         0.00725199980661273,\n                         -0.3870599865913391,\n                         0.6426810026168823,\n                         0.7039899826049805,\n                         -0.3022570013999939,\n                         0.8469099998474121,\n                         0.01385399978607893,\n                         -0.5315560102462769,\n                         0.4185889959335327,\n                         0.7581170201301575,\n                         -0.5000420212745667,\n                         0.5359240174293518,\n                         0.010503999888896942,\n                         -0.8442010283470154,\n                         0.11580599844455719,\n                         0.9901139736175537,\n                         -0.07913900166749954,\n                         0.23281100392341614,\n                         0.9724410176277161,\n                         0.012564999982714653,\n                         0.20666299760341644,\n                         0.9662799835205078,\n                         0.15360000729560852,\n                         0.02449899911880493,\n                         0.9865779876708984,\n                         0.16144299507141113,\n                         0.0033809999004006386,\n                         0.9774550199508667,\n                         0.2111150026321411,\n                         -0.13491199910640717,\n                         0.7135509848594666,\n                         0.6874909996986389,\n                         -0.31953999400138855,\n                         0.7050619721412659,\n                         0.6330729722976685,\n                         -0.6039019823074341,\n                         0.6499029994010925,\n                         0.4614419937133789,\n                         -0.6318150162696838,\n                         0.6400719881057739,\n                         0.43716898560523987,\n                         -0.4243049919605255,\n                         0.6667500138282776,\n                         0.6127070188522339,\n                         -0.230786994099617,\n                         0.006523000076413155,\n                         0.9729819893836975,\n                         -0.5489360094070435,\n                         0.0015109999803826213,\n                         0.8358629941940308,\n                         -0.8756710290908813,\n                         -0.009891999885439873,\n                         0.4828070104122162,\n                         -0.8775539994239807,\n                         -0.01909100078046322,\n                         0.47909700870513916,\n                         -0.6961889863014221,\n                         -0.02449600026011467,\n                         0.7174400091171265,\n                         -0.6961889863014221,\n                         -0.02449600026011467,\n                         0.7174400091171265,\n                         -0.4357450008392334,\n                         -0.670009970664978,\n                         0.6010090112686157,\n                         -0.25985801219940186,\n                         -0.5525479912757874,\n                         0.7919380068778992,\n                         -0.42579901218414307,\n                         -0.010804999619722366,\n                         0.9047530293464661,\n                         0.009537000209093094,\n                         0.021669000387191772,\n                         0.9997199773788452,\n                         0.022041000425815582,\n                         -0.001623000018298626,\n                         0.9997559785842896,\n                         0.4101540148258209,\n                         0.8490809798240662,\n                         0.3329179883003235,\n                         0.9995980262756348,\n                         -0.01155600044876337,\n                         0.02587899938225746,\n                         0.5415220260620117,\n                         0.6370009779930115,\n                         -0.5486199855804443,\n                         0.7095860242843628,\n                         -0.009670999832451344,\n                         -0.7045519948005676,\n                         -0.011750999838113785,\n                         -0.9690240025520325,\n                         0.24668699502944946,\n                         0.046310000121593475,\n                         -0.8891720175743103,\n                         0.45522499084472656,\n                         -0.010688000358641148,\n                         -0.14889900386333466,\n                         0.9887949824333191,\n                         -0.04437499865889549,\n                         0.7291200160980225,\n                         0.6829460263252258,\n                         0.12282499670982361,\n                         0.9923850297927856,\n                         0.009232000447809696,\n                         0.4275279939174652,\n                         -0.7535750269889832,\n                         -0.49934399127960205,\n                         0.48183900117874146,\n                         -0.857479989528656,\n                         -0.18044300377368927,\n                         0.45527198910713196,\n                         -0.49992498755455017,\n                         0.7367510199546814,\n                         -0.22054199874401093,\n                         0.3582780063152313,\n                         0.9071930050849915,\n                         -0.23591899871826172,\n                         0.7157959938049316,\n                         0.6572499871253967,\n                         0.5359240174293518,\n                         0.010503999888896942,\n                         -0.8442010283470154,\n                         0.7280910015106201,\n                         0.015584999695420265,\n                         -0.6853029727935791,\n                         0.8887389898300171,\n                         0.016679000109434128,\n                         0.4581089913845062,\n                         -0.26009801030158997,\n                         -0.0007999999797903001,\n                         0.965582013130188,\n                         -0.37161099910736084,\n                         0.004416999872773886,\n                         0.9283779859542847,\n                         0.5359240174293518,\n                         0.010503999888896942,\n                         -0.8442010283470154,\n                         0.4185889959335327,\n                         0.7581170201301575,\n                         -0.5000420212745667,\n                         0.4801650047302246,\n                         0.8588529825210571,\n                         -0.17836299538612366,\n                         0.7280910015106201,\n                         0.015584999695420265,\n                         -0.6853029727935791,\n                         0.4881030023097992,\n                         0.49794700741767883,\n                         0.7168020009994507,\n                         0.8887389898300171,\n                         0.016679000109434128,\n                         0.4581089913845062,\n                         -0.2220049947500229,\n                         -0.36189401149749756,\n                         0.9053990244865417,\n                         -0.26009801030158997,\n                         -0.0007999999797903001,\n                         0.965582013130188,\n                         -0.23540399968624115,\n                         -0.7104769945144653,\n                         0.6631799936294556,\n                         -0.37161099910736084,\n                         0.004416999872773886,\n                         0.9283779859542847,\n                         0.0033809999004006386,\n                         0.9774550199508667,\n                         0.2111150026321411,\n                         0.058719001710414886,\n                         0.8971999883651733,\n                         0.437703013420105,\n                         0.0013249999610707164,\n                         0.164000004529953,\n                         0.9864590167999268,\n                         -0.04418899863958359,\n                         -0.7303190231323242,\n                         0.6816750168800354,\n                         0.13880200684070587,\n                         -0.9897300004959106,\n                         -0.034189000725746155,\n                         -0.4243049919605255,\n                         0.6667500138282776,\n                         0.6127070188522339,\n                         -0.25888898968696594,\n                         0.5453789830207825,\n                         0.7972059845924377,\n                         0.012268000282347202,\n                         -0.01928500086069107,\n                         0.9997389912605286,\n                         0.3986299932003021,\n                         -0.8456630110740662,\n                         0.3548929989337921,\n                         0.5375639796257019,\n                         -0.6107370257377625,\n                         -0.5813990235328674,\n                         -0.6961889863014221,\n                         -0.02449600026011467,\n                         0.7174400091171265,\n                         -0.42579901218414307,\n                         -0.010804999619722366,\n                         0.9047530293464661,\n                         0.022041000425815582,\n                         -0.001623000018298626,\n                         0.9997559785842896,\n                         0.9995980262756348,\n                         -0.01155600044876337,\n                         0.02587899938225746,\n                         0.7095860242843628,\n                         -0.009670999832451344,\n                         -0.7045519948005676,\n                         0,\n                         0,\n                         1,\n                         0,\n                         0,\n                         1,\n                         0.7626410126686096,\n                         -0.31482499837875366,\n                         0.5650339722633362,\n                         0.8245400190353394,\n                         -0.00001700000029813964,\n                         0.5658029913902283,\n                         0.8479819893836975,\n                         -0.3500339984893799,\n                         -0.39799800515174866,\n                         0.917701005935669,\n                         -0.00003300000025774352,\n                         -0.397271990776062,\n                         0.8641409873962402,\n                         -0.35644200444221497,\n                         -0.3552600145339966,\n                         0.9352689981460571,\n                         -0.00011200000153621659,\n                         -0.3539389967918396,\n                         0.7209920287132263,\n                         -0.29793301224708557,\n                         0.6256250143051147,\n                         0.7807120084762573,\n                         -0.00007500000356230885,\n                         0.6248909831047058,\n                         0,\n                         0,\n                         1,\n                         0.5833569765090942,\n                         -0.5833380222320557,\n                         0.5651649832725525,\n                         0.648485004901886,\n                         -0.6484479904174805,\n                         -0.3987259864807129,\n                         0.6608719825744629,\n                         -0.6607480049133301,\n                         -0.35589399933815,\n                         0.5518630146980286,\n                         -0.5517799854278564,\n                         0.6252880096435547,\n                         0,\n                         0,\n                         1,\n                         0.31482499837875366,\n                         -0.762628972530365,\n                         0.5650510191917419,\n                         0.35004499554634094,\n                         -0.8479880094528198,\n                         -0.39797601103782654,\n                         0.35647401213645935,\n                         -0.8641520142555237,\n                         -0.35519900918006897,\n                         0.29798200726509094,\n                         -0.7210670113563538,\n                         0.6255149841308594,\n                         0,\n                         0,\n                         1,\n                         -0.00001700000029813964,\n                         -0.8245400190353394,\n                         0.5658029913902283,\n                         -0.00003300000025774352,\n                         -0.917701005935669,\n                         -0.397271990776062,\n                         -0.00011200000153621659,\n                         -0.9352689981460571,\n                         -0.3539389967918396,\n                         -0.00007500000356230885,\n                         -0.7807120084762573,\n                         0.6248900294303894,\n                         0,\n                         0,\n                         1,\n                         0,\n                         0,\n                         1,\n                         -0.31482499837875366,\n                         -0.7626410126686096,\n                         0.5650339722633362,\n                         -0.00001700000029813964,\n                         -0.8245400190353394,\n                         0.5658029913902283,\n                         -0.3500339984893799,\n                         -0.8479819893836975,\n                         -0.39799800515174866,\n                         -0.00003300000025774352,\n                         -0.917701005935669,\n                         -0.397271990776062,\n                         -0.35644200444221497,\n                         -0.8641409873962402,\n                         -0.3552600145339966,\n                         -0.00011200000153621659,\n                         -0.9352689981460571,\n                         -0.3539389967918396,\n                         -0.29793301224708557,\n                         -0.7209920287132263,\n                         0.6256250143051147,\n                         -0.00007500000356230885,\n                         -0.7807120084762573,\n                         0.6248900294303894,\n                         0,\n                         0,\n                         1,\n                         -0.5833380222320557,\n                         -0.5833569765090942,\n                         0.5651649832725525,\n                         -0.6484479904174805,\n                         -0.648485004901886,\n                         -0.3987259864807129,\n                         -0.6607480049133301,\n                         -0.6608719825744629,\n                         -0.35589399933815,\n                         -0.5517799854278564,\n                         -0.5518630146980286,\n                         0.6252880096435547,\n                         0,\n                         0,\n                         1,\n                         -0.762628972530365,\n                         -0.31482499837875366,\n                         0.5650510191917419,\n                         -0.8479880094528198,\n                         -0.35004499554634094,\n                         -0.39797601103782654,\n                         -0.8641520142555237,\n                         -0.35647401213645935,\n                         -0.35519900918006897,\n                         -0.7210670113563538,\n                         -0.29798200726509094,\n                         0.6255149841308594,\n                         0,\n                         0,\n                         1,\n                         -0.8245400190353394,\n                         0.00001700000029813964,\n                         0.5658029913902283,\n                         -0.917701005935669,\n                         0.00003300000025774352,\n                         -0.397271990776062,\n                         -0.9352689981460571,\n                         0.00011200000153621659,\n                         -0.3539389967918396,\n                         -0.7807120084762573,\n                         0.00007500000356230885,\n                         0.6248900294303894,\n                         0,\n                         0,\n                         1,\n                         0,\n                         0,\n                         1,\n                         -0.7626410126686096,\n                         0.31482499837875366,\n                         0.5650339722633362,\n                         -0.8245400190353394,\n                         0.00001700000029813964,\n                         0.5658029913902283,\n                         -0.8479819893836975,\n                         0.3500339984893799,\n                         -0.39799800515174866,\n                         -0.917701005935669,\n                         0.00003300000025774352,\n                         -0.397271990776062,\n                         -0.8641409873962402,\n                         0.35644200444221497,\n                         -0.3552600145339966,\n                         -0.9352689981460571,\n                         0.00011200000153621659,\n                         -0.3539389967918396,\n                         -0.7209920287132263,\n                         0.29793301224708557,\n                         0.6256250143051147,\n                         -0.7807120084762573,\n                         0.00007500000356230885,\n                         0.6248900294303894,\n                         0,\n                         0,\n                         1,\n                         -0.5833569765090942,\n                         0.5833380222320557,\n                         0.5651649832725525,\n                         -0.648485004901886,\n                         0.6484479904174805,\n                         -0.3987259864807129,\n                         -0.6608719825744629,\n                         0.6607480049133301,\n                         -0.35589399933815,\n                         -0.5518630146980286,\n                         0.5517799854278564,\n                         0.6252880096435547,\n                         0,\n                         0,\n                         1,\n                         -0.31482499837875366,\n                         0.762628972530365,\n                         0.5650510191917419,\n                         -0.35004499554634094,\n                         0.8479880094528198,\n                         -0.39797601103782654,\n                         -0.35647401213645935,\n                         0.8641520142555237,\n                         -0.35519900918006897,\n                         -0.29798200726509094,\n                         0.7210670113563538,\n                         0.6255149841308594,\n                         0,\n                         0,\n                         1,\n                         0.00001700000029813964,\n                         0.8245400190353394,\n                         0.5658029913902283,\n                         0.00003300000025774352,\n                         0.917701005935669,\n                         -0.397271990776062,\n                         0.00011200000153621659,\n                         0.9352689981460571,\n                         -0.3539389967918396,\n                         0.00007500000356230885,\n                         0.7807120084762573,\n                         0.6248900294303894,\n                         0,\n                         0,\n                         1,\n                         0,\n                         0,\n                         1,\n                         0.31482499837875366,\n                         0.7626410126686096,\n                         0.5650339722633362,\n                         0.00001700000029813964,\n                         0.8245400190353394,\n                         0.5658029913902283,\n                         0.3500339984893799,\n                         0.8479819893836975,\n                         -0.39799800515174866,\n                         0.00003300000025774352,\n                         0.917701005935669,\n                         -0.397271990776062,\n                         0.35644200444221497,\n                         0.8641409873962402,\n                         -0.3552600145339966,\n                         0.00011200000153621659,\n                         0.9352689981460571,\n                         -0.3539389967918396,\n                         0.29793301224708557,\n                         0.7209920287132263,\n                         0.6256250143051147,\n                         0.00007500000356230885,\n                         0.7807120084762573,\n                         0.6248900294303894,\n                         0,\n                         0,\n                         1,\n                         0.5833380222320557,\n                         0.5833569765090942,\n                         0.5651649832725525,\n                         0.6484479904174805,\n                         0.648485004901886,\n                         -0.3987259864807129,\n                         0.6607480049133301,\n                         0.6608719825744629,\n                         -0.35589399933815,\n                         0.5517799854278564,\n                         0.5518630146980286,\n                         0.6252880096435547,\n                         0,\n                         0,\n                         1,\n                         0.762628972530365,\n                         0.31482499837875366,\n                         0.5650510191917419,\n                         0.8479880094528198,\n                         0.35004499554634094,\n                         -0.39797601103782654,\n                         0.8641520142555237,\n                         0.35647401213645935,\n                         -0.35519900918006897,\n                         0.7210670113563538,\n                         0.29798200726509094,\n                         0.6255149841308594,\n                         0,\n                         0,\n                         1,\n                         0.8245400190353394,\n                         -0.00001700000029813964,\n                         0.5658029913902283,\n                         0.917701005935669,\n                         -0.00003300000025774352,\n                         -0.397271990776062,\n                         0.9352689981460571,\n                         -0.00011200000153621659,\n                         -0.3539389967918396,\n                         0.7807120084762573,\n                         -0.00007500000356230885,\n                         0.6248909831047058,\n                         0.7807120084762573,\n                         -0.00007500000356230885,\n                         0.6248909831047058,\n                         0.7209920287132263,\n                         -0.29793301224708557,\n                         0.6256250143051147,\n                         0.21797800064086914,\n                         -0.0902160033583641,\n                         0.9717749953269958,\n                         0.23658299446105957,\n                         0,\n                         0.9716110229492188,\n                         0.1595889925956726,\n                         -0.06596100330352783,\n                         0.9849770069122314,\n                         0.17308400571346283,\n                         0,\n                         0.9849069714546204,\n                         0.3504979908466339,\n                         -0.1447400003671646,\n                         0.9253119826316833,\n                         0.37970298528671265,\n                         0,\n                         0.925108015537262,\n                         0.48558899760246277,\n                         -0.20147399604320526,\n                         0.8506529927253723,\n                         0.5266720056533813,\n                         0,\n                         0.8500679731369019,\n                         0.5518630146980286,\n                         -0.5517799854278564,\n                         0.6252880096435547,\n                         0.16663099825382233,\n                         -0.16663099825382233,\n                         0.9718379974365234,\n                         0.12190800160169601,\n                         -0.12190800160169601,\n                         0.9850260019302368,\n                         0.2676680088043213,\n                         -0.2676680088043213,\n                         0.9255849719047546,\n                         0.37131500244140625,\n                         -0.37131500244140625,\n                         0.8510289788246155,\n                         0.29798200726509094,\n                         -0.7210670113563538,\n                         0.6255149841308594,\n                         0.0902160033583641,\n                         -0.21797800064086914,\n                         0.9717749953269958,\n                         0.06596100330352783,\n                         -0.1595889925956726,\n                         0.9849770069122314,\n                         0.1447400003671646,\n                         -0.3504979908466339,\n                         0.9253119826316833,\n                         0.20147399604320526,\n                         -0.48558899760246277,\n                         0.8506529927253723,\n                         -0.00007500000356230885,\n                         -0.7807120084762573,\n                         0.6248900294303894,\n                         0,\n                         -0.23658299446105957,\n                         0.9716110229492188,\n                         0,\n                         -0.17308400571346283,\n                         0.9849069714546204,\n                         0,\n                         -0.37970298528671265,\n                         0.925108015537262,\n                         0,\n                         -0.5266720056533813,\n                         0.8500679731369019,\n                         -0.00007500000356230885,\n                         -0.7807120084762573,\n                         0.6248900294303894,\n                         -0.29793301224708557,\n                         -0.7209920287132263,\n                         0.6256250143051147,\n                         -0.0902160033583641,\n                         -0.21797800064086914,\n                         0.9717749953269958,\n                         0,\n                         -0.23658299446105957,\n                         0.9716110229492188,\n                         -0.06596100330352783,\n                         -0.1595889925956726,\n                         0.9849770069122314,\n                         0,\n                         -0.17308400571346283,\n                         0.9849069714546204,\n                         -0.1447400003671646,\n                         -0.3504979908466339,\n                         0.9253119826316833,\n                         0,\n                         -0.37970298528671265,\n                         0.925108015537262,\n                         -0.20147399604320526,\n                         -0.48558899760246277,\n                         0.8506529927253723,\n                         0,\n                         -0.5266720056533813,\n                         0.8500679731369019,\n                         -0.5517799854278564,\n                         -0.5518630146980286,\n                         0.6252880096435547,\n                         -0.16663099825382233,\n                         -0.16663099825382233,\n                         0.9718379974365234,\n                         -0.12190800160169601,\n                         -0.12190800160169601,\n                         0.9850260019302368,\n                         -0.2676680088043213,\n                         -0.2676680088043213,\n                         0.9255849719047546,\n                         -0.37131500244140625,\n                         -0.37131500244140625,\n                         0.8510289788246155,\n                         -0.7210670113563538,\n                         -0.29798200726509094,\n                         0.6255149841308594,\n                         -0.21797800064086914,\n                         -0.0902160033583641,\n                         0.9717749953269958,\n                         -0.1595889925956726,\n                         -0.06596100330352783,\n                         0.9849770069122314,\n                         -0.3504979908466339,\n                         -0.1447400003671646,\n                         0.9253119826316833,\n                         -0.48558899760246277,\n                         -0.20147399604320526,\n                         0.8506529927253723,\n                         -0.7807120084762573,\n                         0.00007500000356230885,\n                         0.6248900294303894,\n                         -0.23658299446105957,\n                         0,\n                         0.9716110229492188,\n                         -0.17308400571346283,\n                         0,\n                         0.9849069714546204,\n                         -0.37970298528671265,\n                         0,\n                         0.925108015537262,\n                         -0.5266720056533813,\n                         0,\n                         0.8500679731369019,\n                         -0.7807120084762573,\n                         0.00007500000356230885,\n                         0.6248900294303894,\n                         -0.7209920287132263,\n                         0.29793301224708557,\n                         0.6256250143051147,\n                         -0.21797800064086914,\n                         0.0902160033583641,\n                         0.9717749953269958,\n                         -0.23658299446105957,\n                         0,\n                         0.9716110229492188,\n                         -0.1595889925956726,\n                         0.06596100330352783,\n                         0.9849770069122314,\n                         -0.17308400571346283,\n                         0,\n                         0.9849069714546204,\n                         -0.3504979908466339,\n                         0.1447400003671646,\n                         0.9253119826316833,\n                         -0.37970298528671265,\n                         0,\n                         0.925108015537262,\n                         -0.48558899760246277,\n                         0.20147399604320526,\n                         0.8506529927253723,\n                         -0.5266720056533813,\n                         0,\n                         0.8500679731369019,\n                         -0.5518630146980286,\n                         0.5517799854278564,\n                         0.6252880096435547,\n                         -0.16663099825382233,\n                         0.16663099825382233,\n                         0.9718379974365234,\n                         -0.12190800160169601,\n                         0.12190800160169601,\n                         0.9850260019302368,\n                         -0.2676680088043213,\n                         0.2676680088043213,\n                         0.9255849719047546,\n                         -0.37131500244140625,\n                         0.37131500244140625,\n                         0.8510289788246155,\n                         -0.29798200726509094,\n                         0.7210670113563538,\n                         0.6255149841308594,\n                         -0.0902160033583641,\n                         0.21797800064086914,\n                         0.9717749953269958,\n                         -0.06596100330352783,\n                         0.1595889925956726,\n                         0.9849770069122314,\n                         -0.1447400003671646,\n                         0.3504979908466339,\n                         0.9253119826316833,\n                         -0.20147399604320526,\n                         0.48558899760246277,\n                         0.8506529927253723,\n                         0.00007500000356230885,\n                         0.7807120084762573,\n                         0.6248900294303894,\n                         0,\n                         0.23658299446105957,\n                         0.9716110229492188,\n                         0,\n                         0.17308400571346283,\n                         0.9849069714546204,\n                         0,\n                         0.37970298528671265,\n                         0.925108015537262,\n                         0,\n                         0.5266720056533813,\n                         0.8500679731369019,\n                         0.00007500000356230885,\n                         0.7807120084762573,\n                         0.6248900294303894,\n                         0.29793301224708557,\n                         0.7209920287132263,\n                         0.6256250143051147,\n                         0.0902160033583641,\n                         0.21797800064086914,\n                         0.9717749953269958,\n                         0,\n                         0.23658299446105957,\n                         0.9716110229492188,\n                         0.06596100330352783,\n                         0.1595889925956726,\n                         0.9849770069122314,\n                         0,\n                         0.17308400571346283,\n                         0.9849069714546204,\n                         0.1447400003671646,\n                         0.3504979908466339,\n                         0.9253119826316833,\n                         0,\n                         0.37970298528671265,\n                         0.925108015537262,\n                         0.20147399604320526,\n                         0.48558899760246277,\n                         0.8506529927253723,\n                         0,\n                         0.5266720056533813,\n                         0.8500679731369019,\n                         0.5517799854278564,\n                         0.5518630146980286,\n                         0.6252880096435547,\n                         0.16663099825382233,\n                         0.16663099825382233,\n                         0.9718379974365234,\n                         0.12190800160169601,\n                         0.12190800160169601,\n                         0.9850260019302368,\n                         0.2676680088043213,\n                         0.2676680088043213,\n                         0.9255849719047546,\n                         0.37131500244140625,\n                         0.37131500244140625,\n                         0.8510289788246155,\n                         0.7210670113563538,\n                         0.29798200726509094,\n                         0.6255149841308594,\n                         0.21797800064086914,\n                         0.0902160033583641,\n                         0.9717749953269958,\n                         0.1595889925956726,\n                         0.06596100330352783,\n                         0.9849770069122314,\n                         0.3504979908466339,\n                         0.1447400003671646,\n                         0.9253119826316833,\n                         0.48558899760246277,\n                         0.20147399604320526,\n                         0.8506529927253723,\n                         0.7807120084762573,\n                         -0.00007500000356230885,\n                         0.6248909831047058,\n                         0.23658299446105957,\n                         0,\n                         0.9716110229492188,\n                         0.17308400571346283,\n                         0,\n                         0.9849069714546204,\n                         0.37970298528671265,\n                         0,\n                         0.925108015537262,\n                         0.5266720056533813,\n                         0,\n                         0.8500679731369019};\n\nfloat teapotTangents[] = {0.012897999957203865,\n                          0.998727023601532,\n                          -0.048757001757621765,\n                          0.3861910104751587,\n                          0.9210079908370972,\n                          -0.016421999782323837,\n                          0.38136398792266846,\n                          0.9230089783668518,\n                          0.000155999994603917,\n                          0.012866999953985214,\n                          0.9987300038337708,\n                          0.04870200157165527,\n                          0.3750790059566498,\n                          0.9061710238456726,\n                          -0.0007169999880716205,\n                          0.19210100173950195,\n                          0.9812139868736267,\n                          0.01775900088250637,\n                          0.3782620131969452,\n                          0.9142940044403076,\n                          -0.00011300000187475234,\n                          0.10451500117778778,\n                          0.9897350072860718,\n                          -0.09747499972581863,\n                          0.3655939996242523,\n                          0.9257190227508545,\n                          0.028463000431656837,\n                          0.04767199978232384,\n                          0.9953050017356873,\n                          -0.08423800021409988,\n                          0.7092679738998413,\n                          0.7031199932098389,\n                          -0.016364000737667084,\n                          0.7061989903450012,\n                          0.7061989903450012,\n                          0,\n                          0.6937360167503357,\n                          0.6937360167503357,\n                          0,\n                          0.6997770071029663,\n                          0.6997770071029663,\n                          0,\n                          0.6924030184745789,\n                          0.7150859832763672,\n                          0.02822900004684925,\n                          0.9243540167808533,\n                          0.37810400128364563,\n                          -0.01657800003886223,\n                          0.9230089783668518,\n                          0.38136398792266846,\n                          -0.000155999994603917,\n                          0.9061710238456726,\n                          0.3750790059566498,\n                          0.0007169999880716205,\n                          0.9142940044403076,\n                          0.3782620131969452,\n                          0.00011300000187475234,\n                          0.9133660197257996,\n                          0.39544400572776794,\n                          0.028490999713540077,\n                          0.9987040162086487,\n                          0.015853000804781914,\n                          0.04836999997496605,\n                          0.9987369775772095,\n                          0.014649000018835068,\n                          -0.04806999862194061,\n                          0.9812150001525879,\n                          0.19211700558662415,\n                          -0.01754000037908554,\n                          0.9897350072860718,\n                          0.10452800244092941,\n                          0.09745799750089645,\n                          0.9953050017356873,\n                          0.04767199978232384,\n                          0.08423800021409988,\n                          0.9988179802894592,\n                          -0.009758999571204185,\n                          -0.047600001096725464,\n                          0.9094679951667786,\n                          -0.4095839858055115,\n                          -0.012636999599635601,\n                          0.9240090250968933,\n                          -0.3811509907245636,\n                          -0.0003150000120513141,\n                          0.9987890124320984,\n                          -0.01066299993544817,\n                          0.04801800101995468,\n                          0.9072269797325134,\n                          -0.37142300605773926,\n                          0.0207310002297163,\n                          0.9814350008964539,\n                          -0.19095200300216675,\n                          0.01795700006186962,\n                          0.914870023727417,\n                          -0.3771440088748932,\n                          -0.0011480000102892518,\n                          0.989749014377594,\n                          -0.10442499816417694,\n                          -0.09742700308561325,\n                          0.925815999507904,\n                          -0.3653950095176697,\n                          0.028308000415563583,\n                          0.9953050017356873,\n                          -0.04767199978232384,\n                          -0.08423800021409988,\n                          0.6768929958343506,\n                          -0.7314029932022095,\n                          -0.01988700032234192,\n                          0.6994619965553284,\n                          -0.7145140171051025,\n                          -0.00029799999902024865,\n                          0.6940590143203735,\n                          -0.6933979988098145,\n                          0.015560000203549862,\n                          0.7002580165863037,\n                          -0.6996300220489502,\n                          -0.000783999974373728,\n                          0.715142011642456,\n                          -0.6923869848251343,\n                          0.028078999370336533,\n                          0.351936012506485,\n                          -0.933899998664856,\n                          -0.019843999296426773,\n                          0.36654001474380493,\n                          -0.9298419952392578,\n                          -0.0005210000090301037,\n                          0.37116900086402893,\n                          -0.9084830284118652,\n                          0.00152299995534122,\n                          0.3776479959487915,\n                          -0.9147650003433228,\n                          -0.00011000000085914508,\n                          0.39533698558807373,\n                          -0.9134349822998047,\n                          0.028410999104380608,\n                          0.0013210000470280647,\n                          -0.9989479780197144,\n                          0.045830998569726944,\n                          0.003897000104188919,\n                          -0.9988909959793091,\n                          -0.04690299928188324,\n                          0.18705999851226807,\n                          -0.9821630120277405,\n                          -0.018818000331521034,\n                          0.10363999754190445,\n                          -0.9898579716682434,\n                          0.09715499728918076,\n                          0.04757700115442276,\n                          -0.9953129887580872,\n                          0.08418799936771393,\n                          -0.02296699956059456,\n                          -0.9986780285835266,\n                          -0.04599199816584587,\n                          -0.3861910104751587,\n                          -0.9210079908370972,\n                          -0.016421999782323837,\n                          -0.38136398792266846,\n                          -0.9230089783668518,\n                          0.000155999994603917,\n                          -0.020431000739336014,\n                          -0.9987260103225708,\n                          0.04614400118589401,\n                          -0.3750790059566498,\n                          -0.9061710238456726,\n                          -0.0007169999880716205,\n                          -0.19216600060462952,\n                          -0.9812189936637878,\n                          0.01677200011909008,\n                          -0.3782620131969452,\n                          -0.9142940044403076,\n                          -0.00011300000187475234,\n                          -0.10471200197935104,\n                          -0.9897390007972717,\n                          -0.09722500294446945,\n                          -0.3655939996242523,\n                          -0.9257190227508545,\n                          0.028463000431656837,\n                          -0.047710999846458435,\n                          -0.9953050017356873,\n                          -0.08420699834823608,\n                          -0.7092679738998413,\n                          -0.7031199932098389,\n                          -0.016364000737667084,\n                          -0.7061989903450012,\n                          -0.7061989903450012,\n                          0,\n                          -0.6937360167503357,\n                          -0.6937360167503357,\n                          0,\n                          -0.6997770071029663,\n                          -0.6997770071029663,\n                          0,\n                          -0.6924030184745789,\n                          -0.7150859832763672,\n                          0.02822900004684925,\n                          -0.9243540167808533,\n                          -0.37810400128364563,\n                          -0.01657800003886223,\n                          -0.9230089783668518,\n                          -0.38136398792266846,\n                          -0.000155999994603917,\n                          -0.9061710238456726,\n                          -0.3750790059566498,\n                          0.0007169999880716205,\n                          -0.9142940044403076,\n                          -0.3782620131969452,\n                          0.00011300000187475234,\n                          -0.9133660197257996,\n                          -0.39544400572776794,\n                          0.028490999713540077,\n                          -0.998727023601532,\n                          -0.012897999957203865,\n                          0.048757001757621765,\n                          -0.9987300038337708,\n                          -0.012866999953985214,\n                          -0.04870200157165527,\n                          -0.9812139868736267,\n                          -0.19210100173950195,\n                          -0.01775900088250637,\n                          -0.9897350072860718,\n                          -0.10451500117778778,\n                          0.09747499972581863,\n                          -0.9953050017356873,\n                          -0.04767199978232384,\n                          0.08423800021409988,\n                          -0.998727023601532,\n                          0.012897999957203865,\n                          -0.048757001757621765,\n                          -0.9210079908370972,\n                          0.3861910104751587,\n                          -0.016421999782323837,\n                          -0.9230089783668518,\n                          0.38136398792266846,\n                          0.000155999994603917,\n                          -0.9987300038337708,\n                          0.012866999953985214,\n                          0.04870200157165527,\n                          -0.9061710238456726,\n                          0.3750790059566498,\n                          -0.0007169999880716205,\n                          -0.9812139868736267,\n                          0.19210100173950195,\n                          0.01775900088250637,\n                          -0.9142940044403076,\n                          0.3782620131969452,\n                          -0.00011300000187475234,\n                          -0.9897350072860718,\n                          0.10451500117778778,\n                          -0.09747499972581863,\n                          -0.9257190227508545,\n                          0.3655939996242523,\n                          0.028463000431656837,\n                          -0.9953050017356873,\n                          0.04767199978232384,\n                          -0.08423800021409988,\n                          -0.7031199932098389,\n                          0.7092679738998413,\n                          -0.016364000737667084,\n                          -0.7061989903450012,\n                          0.7061989903450012,\n                          0,\n                          -0.6937360167503357,\n                          0.6937360167503357,\n                          0,\n                          -0.6997770071029663,\n                          0.6997770071029663,\n                          0,\n                          -0.7150859832763672,\n                          0.6924030184745789,\n                          0.02822900004684925,\n                          -0.37810400128364563,\n                          0.9243540167808533,\n                          -0.01657800003886223,\n                          -0.38136398792266846,\n                          0.9230089783668518,\n                          -0.000155999994603917,\n                          -0.3750790059566498,\n                          0.9061710238456726,\n                          0.0007169999880716205,\n                          -0.3782620131969452,\n                          0.9142940044403076,\n                          0.00011300000187475234,\n                          -0.39544400572776794,\n                          0.9133660197257996,\n                          0.028490999713540077,\n                          -0.012897999957203865,\n                          0.998727023601532,\n                          0.048757001757621765,\n                          -0.012866999953985214,\n                          0.9987300038337708,\n                          -0.04870200157165527,\n                          -0.19210100173950195,\n                          0.9812139868736267,\n                          -0.01775900088250637,\n                          -0.10451500117778778,\n                          0.9897350072860718,\n                          0.09747499972581863,\n                          -0.04767199978232384,\n                          0.9953050017356873,\n                          0.08423800021409988,\n                          0.04767199978232384,\n                          0.9953050017356873,\n                          -0.08423800021409988,\n                          0.39544400572776794,\n                          0.9133660197257996,\n                          -0.028490999713540077,\n                          0.38111698627471924,\n                          0.9210190176963806,\n                          -0.000015999999959603883,\n                          0.031922999769449234,\n                          0.9968529939651489,\n                          -0.07255599647760391,\n                          0.3815299868583679,\n                          0.9219080209732056,\n                          0.0000019999999949504854,\n                          0.022261999547481537,\n                          0.9978039860725403,\n                          -0.06237399950623512,\n                          0.3821389973163605,\n                          0.9231889843940735,\n                          0.00001700000029813964,\n                          0.008317999541759491,\n                          0.9991790056228638,\n                          -0.03964800015091896,\n                          0.38228899240493774,\n                          0.9239469766616821,\n                          -0.004430000204592943,\n                          0.0008660000166855752,\n                          0.9999139904975891,\n                          0.013048999942839146,\n                          0.7150859832763672,\n                          0.6924030184745789,\n                          -0.02822900004684925,\n                          0.7048519849777222,\n                          0.7048519849777222,\n                          0,\n                          0.7055330276489258,\n                          0.7055330276489258,\n                          0,\n                          0.7065179944038391,\n                          0.7065179944038391,\n                          0,\n                          0.7068390250205994,\n                          0.707252025604248,\n                          -0.004379999823868275,\n                          0.9257190227508545,\n                          0.3655939996242523,\n                          -0.028463000431656837,\n                          0.9210180044174194,\n                          0.38111698627471924,\n                          0.000015999999959603883,\n                          0.9219080209732056,\n                          0.3815299868583679,\n                          -0.0000019999999949504854,\n                          0.9231889843940735,\n                          0.3821389973163605,\n                          -0.00001700000029813964,\n                          0.9237229824066162,\n                          0.38283199071884155,\n                          -0.004399999976158142,\n                          0.9953050017356873,\n                          0.04767199978232384,\n                          0.08423800021409988,\n                          0.9968529939651489,\n                          0.031922999769449234,\n                          0.07255599647760391,\n                          0.9978039860725403,\n                          0.022261999547481537,\n                          0.06237399950623512,\n                          0.9991790056228638,\n                          0.008317999541759491,\n                          0.03964800015091896,\n                          0.9999139904975891,\n                          0.0008660000166855752,\n                          -0.013048999942839146,\n                          0.9953050017356873,\n                          -0.04767199978232384,\n                          -0.08423800021409988,\n                          0.9135000109672546,\n                          -0.3951619863510132,\n                          -0.02861100062727928,\n                          0.9210190176963806,\n                          -0.38111698627471924,\n                          -0.000015999999959603883,\n                          0.9968529939651489,\n                          -0.031922999769449234,\n                          -0.07255599647760391,\n                          0.9219080209732056,\n                          -0.3815299868583679,\n                          0.0000019999999949504854,\n                          0.9978039860725403,\n                          -0.022261999547481537,\n                          -0.06237399950623512,\n                          0.9231889843940735,\n                          -0.3821389973163605,\n                          0.00001700000029813964,\n                          0.9991790056228638,\n                          -0.008317999541759491,\n                          -0.03964800015091896,\n                          0.9239469766616821,\n                          -0.38228899240493774,\n                          -0.004430000204592943,\n                          0.9999139904975891,\n                          -0.0008660000166855752,\n                          0.013048999942839146,\n                          0.6925899982452393,\n                          -0.7149369716644287,\n                          -0.028262000530958176,\n                          0.7048519849777222,\n                          -0.7048519849777222,\n                          0,\n                          0.7055330276489258,\n                          -0.7055330276489258,\n                          0,\n                          0.7065179944038391,\n                          -0.7065179944038391,\n                          0,\n                          0.707252025604248,\n                          -0.7068390250205994,\n                          -0.004379999823868275,\n                          0.3656100034713745,\n                          -0.9257280230522156,\n                          -0.02841299958527088,\n                          0.38111698627471924,\n                          -0.9210180044174194,\n                          0.000015999999959603883,\n                          0.3815299868583679,\n                          -0.9219080209732056,\n                          -0.0000019999999949504854,\n                          0.3821389973163605,\n                          -0.9231889843940735,\n                          -0.00001700000029813964,\n                          0.38283199071884155,\n                          -0.9237229824066162,\n                          -0.004399999976158142,\n                          0.04757700115442276,\n                          -0.9953129887580872,\n                          0.08418799936771393,\n                          0.031922999769449234,\n                          -0.9968529939651489,\n                          0.07255599647760391,\n                          0.022261999547481537,\n                          -0.9978039860725403,\n                          0.06237399950623512,\n                          0.008317999541759491,\n                          -0.9991790056228638,\n                          0.03964800015091896,\n                          0.0008660000166855752,\n                          -0.9999139904975891,\n                          -0.013048999942839146,\n                          -0.047710999846458435,\n                          -0.9953050017356873,\n                          -0.08420699834823608,\n                          -0.39544400572776794,\n                          -0.9133660197257996,\n                          -0.028490999713540077,\n                          -0.38111698627471924,\n                          -0.9210190176963806,\n                          -0.000015999999959603883,\n                          -0.031922999769449234,\n                          -0.9968529939651489,\n                          -0.07255599647760391,\n                          -0.3815299868583679,\n                          -0.9219080209732056,\n                          0.0000019999999949504854,\n                          -0.022261999547481537,\n                          -0.9978039860725403,\n                          -0.06237399950623512,\n                          -0.3821389973163605,\n                          -0.9231889843940735,\n                          0.00001700000029813964,\n                          -0.008317999541759491,\n                          -0.9991790056228638,\n                          -0.03964800015091896,\n                          -0.38228899240493774,\n                          -0.9239469766616821,\n                          -0.004430000204592943,\n                          -0.0008660000166855752,\n                          -0.9999139904975891,\n                          0.013048999942839146,\n                          -0.7150859832763672,\n                          -0.6924030184745789,\n                          -0.02822900004684925,\n                          -0.7048519849777222,\n                          -0.7048519849777222,\n                          0,\n                          -0.7055330276489258,\n                          -0.7055330276489258,\n                          0,\n                          -0.7065179944038391,\n                          -0.7065179944038391,\n                          0,\n                          -0.7068390250205994,\n                          -0.707252025604248,\n                          -0.004379999823868275,\n                          -0.9257190227508545,\n                          -0.3655939996242523,\n                          -0.028463000431656837,\n                          -0.9210180044174194,\n                          -0.38111698627471924,\n                          0.000015999999959603883,\n                          -0.9219080209732056,\n                          -0.3815299868583679,\n                          -0.0000019999999949504854,\n                          -0.9231889843940735,\n                          -0.3821389973163605,\n                          -0.00001700000029813964,\n                          -0.9237229824066162,\n                          -0.38283199071884155,\n                          -0.004399999976158142,\n                          -0.9953050017356873,\n                          -0.04767199978232384,\n                          0.08423800021409988,\n                          -0.9968529939651489,\n                          -0.031922999769449234,\n                          0.07255599647760391,\n                          -0.9978039860725403,\n                          -0.022261999547481537,\n                          0.06237399950623512,\n                          -0.9991790056228638,\n                          -0.008317999541759491,\n                          0.03964800015091896,\n                          -0.9999139904975891,\n                          -0.0008660000166855752,\n                          -0.013048999942839146,\n                          -0.9953050017356873,\n                          0.04767199978232384,\n                          -0.08423800021409988,\n                          -0.9133660197257996,\n                          0.39544400572776794,\n                          -0.028490999713540077,\n                          -0.9210190176963806,\n                          0.38111698627471924,\n                          -0.000015999999959603883,\n                          -0.9968529939651489,\n                          0.031922999769449234,\n                          -0.07255599647760391,\n                          -0.9219080209732056,\n                          0.3815299868583679,\n                          0.0000019999999949504854,\n                          -0.9978039860725403,\n                          0.022261999547481537,\n                          -0.06237399950623512,\n                          -0.9231889843940735,\n                          0.3821389973163605,\n                          0.00001700000029813964,\n                          -0.9991790056228638,\n                          0.008317999541759491,\n                          -0.03964800015091896,\n                          -0.9239469766616821,\n                          0.38228899240493774,\n                          -0.004430000204592943,\n                          -0.9999139904975891,\n                          0.0008660000166855752,\n                          0.013048999942839146,\n                          -0.6924030184745789,\n                          0.7150859832763672,\n                          -0.02822900004684925,\n                          -0.7048519849777222,\n                          0.7048519849777222,\n                          0,\n                          -0.7055330276489258,\n                          0.7055330276489258,\n                          0,\n                          -0.7065179944038391,\n                          0.7065179944038391,\n                          0,\n                          -0.707252025604248,\n                          0.7068390250205994,\n                          -0.004379999823868275,\n                          -0.3655939996242523,\n                          0.9257190227508545,\n                          -0.028463000431656837,\n                          -0.38111698627471924,\n                          0.9210180044174194,\n                          0.000015999999959603883,\n                          -0.3815299868583679,\n                          0.9219080209732056,\n                          -0.0000019999999949504854,\n                          -0.3821389973163605,\n                          0.9231889843940735,\n                          -0.00001700000029813964,\n                          -0.38283199071884155,\n                          0.9237229824066162,\n                          -0.004399999976158142,\n                          -0.04767199978232384,\n                          0.9953050017356873,\n                          0.08423800021409988,\n                          -0.031922999769449234,\n                          0.9968529939651489,\n                          0.07255599647760391,\n                          -0.022261999547481537,\n                          0.9978039860725403,\n                          0.06237399950623512,\n                          -0.008317999541759491,\n                          0.9991790056228638,\n                          0.03964800015091896,\n                          -0.0008660000166855752,\n                          0.9999139904975891,\n                          -0.013048999942839146,\n                          0.0008660000166855752,\n                          0.9999139904975891,\n                          0.013048999942839146,\n                          0.38283199071884155,\n                          0.9237229824066162,\n                          0.004399999976158142,\n                          0.38101500272750854,\n                          0.9204739928245544,\n                          -0.00003899999865097925,\n                          0.03731299936771393,\n                          0.9963229894638062,\n                          0.07712399959564209,\n                          0.37877199053764343,\n                          0.9154880046844482,\n                          0.00008399999933317304,\n                          0.09151100367307663,\n                          0.9910060167312622,\n                          0.097632996737957,\n                          0.378387987613678,\n                          0.9145749807357788,\n                          0.00009999999747378752,\n                          0.10134600102901459,\n                          0.9900450110435486,\n                          0.09767600148916245,\n                          0.356795996427536,\n                          0.9266510009765625,\n                          -0.03188199922442436,\n                          0.07246600091457367,\n                          0.9928709864616394,\n                          0.09463199973106384,\n                          0.707252025604248,\n                          0.7068390250205994,\n                          0.004379999823868275,\n                          0.7044739723205566,\n                          0.7044739723205566,\n                          0,\n                          0.7006790041923523,\n                          0.7006790041923523,\n                          0,\n                          0.6999930143356323,\n                          0.6999930143356323,\n                          0,\n                          0.6847820281982422,\n                          0.7192310094833374,\n                          -0.03167999908328056,\n                          0.9239469766616821,\n                          0.38228899240493774,\n                          0.004430000204592943,\n                          0.9204739928245544,\n                          0.38101500272750854,\n                          0.00003899999865097925,\n                          0.9154880046844482,\n                          0.37877199053764343,\n                          -0.00008399999933317304,\n                          0.9145749807357788,\n                          0.378387987613678,\n                          -0.00009999999747378752,\n                          0.9078760147094727,\n                          0.40216198563575745,\n                          -0.03206299990415573,\n                          0.9999139904975891,\n                          0.0008660000166855752,\n                          -0.013048999942839146,\n                          0.9963229894638062,\n                          0.03731299936771393,\n                          -0.07712399959564209,\n                          0.9910060167312622,\n                          0.09151100367307663,\n                          -0.097632996737957,\n                          0.9900450110435486,\n                          0.10134600102901459,\n                          -0.09767600148916245,\n                          0.9928709864616394,\n                          0.07246600091457367,\n                          -0.09463199973106384,\n                          0.9999139904975891,\n                          -0.0008660000166855752,\n                          0.013048999942839146,\n                          0.9237229824066162,\n                          -0.38283199071884155,\n                          0.004399999976158142,\n                          0.9204739928245544,\n                          -0.38101500272750854,\n                          -0.00003899999865097925,\n                          0.9963229894638062,\n                          -0.03731299936771393,\n                          0.07712399959564209,\n                          0.9154880046844482,\n                          -0.37877199053764343,\n                          0.00008399999933317304,\n                          0.9910060167312622,\n                          -0.09151100367307663,\n                          0.097632996737957,\n                          0.9145749807357788,\n                          -0.378387987613678,\n                          0.00009999999747378752,\n                          0.9900450110435486,\n                          -0.10134600102901459,\n                          0.09767600148916245,\n                          0.9266510009765625,\n                          -0.356795996427536,\n                          -0.03188199922442436,\n                          0.9928709864616394,\n                          -0.07246600091457367,\n                          0.09463199973106384,\n                          0.7068390250205994,\n                          -0.707252025604248,\n                          0.004379999823868275,\n                          0.7044739723205566,\n                          -0.7044739723205566,\n                          0,\n                          0.7006790041923523,\n                          -0.7006790041923523,\n                          0,\n                          0.6999930143356323,\n                          -0.6999930143356323,\n                          0,\n                          0.7192310094833374,\n                          -0.6847820281982422,\n                          -0.03167999908328056,\n                          0.38228899240493774,\n                          -0.9239469766616821,\n                          0.004430000204592943,\n                          0.38101500272750854,\n                          -0.9204739928245544,\n                          0.00003899999865097925,\n                          0.37877199053764343,\n                          -0.9154880046844482,\n                          -0.00008399999933317304,\n                          0.378387987613678,\n                          -0.9145749807357788,\n                          -0.00009999999747378752,\n                          0.40216198563575745,\n                          -0.9078760147094727,\n                          -0.03206299990415573,\n                          0.0008660000166855752,\n                          -0.9999139904975891,\n                          -0.013048999942839146,\n                          0.03731299936771393,\n                          -0.9963229894638062,\n                          -0.07712399959564209,\n                          0.09151100367307663,\n                          -0.9910060167312622,\n                          -0.097632996737957,\n                          0.10134600102901459,\n                          -0.9900450110435486,\n                          -0.09767600148916245,\n                          0.07246600091457367,\n                          -0.9928709864616394,\n                          -0.09463199973106384,\n                          -0.0008660000166855752,\n                          -0.9999139904975891,\n                          0.013048999942839146,\n                          -0.38283199071884155,\n                          -0.9237229824066162,\n                          0.004399999976158142,\n                          -0.38101500272750854,\n                          -0.9204739928245544,\n                          -0.00003899999865097925,\n                          -0.03731299936771393,\n                          -0.9963229894638062,\n                          0.07712399959564209,\n                          -0.37877199053764343,\n                          -0.9154880046844482,\n                          0.00008399999933317304,\n                          -0.09151100367307663,\n                          -0.9910060167312622,\n                          0.097632996737957,\n                          -0.378387987613678,\n                          -0.9145749807357788,\n                          0.00009999999747378752,\n                          -0.10134600102901459,\n                          -0.9900450110435486,\n                          0.09767600148916245,\n                          -0.356795996427536,\n                          -0.9266510009765625,\n                          -0.03188199922442436,\n                          -0.07246600091457367,\n                          -0.9928709864616394,\n                          0.09463199973106384,\n                          -0.707252025604248,\n                          -0.7068390250205994,\n                          0.004379999823868275,\n                          -0.7044739723205566,\n                          -0.7044739723205566,\n                          0,\n                          -0.7006790041923523,\n                          -0.7006790041923523,\n                          0,\n                          -0.6999930143356323,\n                          -0.6999930143356323,\n                          0,\n                          -0.6847820281982422,\n                          -0.7192310094833374,\n                          -0.03167999908328056,\n                          -0.9239469766616821,\n                          -0.38228899240493774,\n                          0.004430000204592943,\n                          -0.9204739928245544,\n                          -0.38101500272750854,\n                          0.00003899999865097925,\n                          -0.9154880046844482,\n                          -0.37877199053764343,\n                          -0.00008399999933317304,\n                          -0.9145749807357788,\n                          -0.378387987613678,\n                          -0.00009999999747378752,\n                          -0.9078760147094727,\n                          -0.40216198563575745,\n                          -0.03206299990415573,\n                          -0.9999139904975891,\n                          -0.0008660000166855752,\n                          -0.013048999942839146,\n                          -0.9963229894638062,\n                          -0.03731299936771393,\n                          -0.07712399959564209,\n                          -0.9910060167312622,\n                          -0.09151100367307663,\n                          -0.097632996737957,\n                          -0.9900450110435486,\n                          -0.10134600102901459,\n                          -0.09767600148916245,\n                          -0.9928709864616394,\n                          -0.07246600091457367,\n                          -0.09463199973106384,\n                          -0.9999139904975891,\n                          0.0008660000166855752,\n                          0.013048999942839146,\n                          -0.9237229824066162,\n                          0.38283199071884155,\n                          0.004399999976158142,\n                          -0.9204739928245544,\n                          0.38101500272750854,\n                          -0.00003899999865097925,\n                          -0.9963229894638062,\n                          0.03731299936771393,\n                          0.07712399959564209,\n                          -0.9154880046844482,\n                          0.37877199053764343,\n                          0.00008399999933317304,\n                          -0.9910060167312622,\n                          0.09151100367307663,\n                          0.097632996737957,\n                          -0.9145749807357788,\n                          0.378387987613678,\n                          0.00009999999747378752,\n                          -0.9900450110435486,\n                          0.10134600102901459,\n                          0.09767600148916245,\n                          -0.9266510009765625,\n                          0.356795996427536,\n                          -0.03188199922442436,\n                          -0.9928709864616394,\n                          0.07246600091457367,\n                          0.09463199973106384,\n                          -0.7068390250205994,\n                          0.707252025604248,\n                          0.004379999823868275,\n                          -0.7044739723205566,\n                          0.7044739723205566,\n                          0,\n                          -0.7006790041923523,\n                          0.7006790041923523,\n                          0,\n                          -0.6999930143356323,\n                          0.6999930143356323,\n                          0,\n                          -0.7192310094833374,\n                          0.6847820281982422,\n                          -0.03167999908328056,\n                          -0.38228899240493774,\n                          0.9239469766616821,\n                          0.004430000204592943,\n                          -0.38101500272750854,\n                          0.9204739928245544,\n                          0.00003899999865097925,\n                          -0.37877199053764343,\n                          0.9154880046844482,\n                          -0.00008399999933317304,\n                          -0.378387987613678,\n                          0.9145749807357788,\n                          -0.00009999999747378752,\n                          -0.40216198563575745,\n                          0.9078760147094727,\n                          -0.03206299990415573,\n                          -0.0008660000166855752,\n                          0.9999139904975891,\n                          -0.013048999942839146,\n                          -0.03731299936771393,\n                          0.9963229894638062,\n                          -0.07712399959564209,\n                          -0.09151100367307663,\n                          0.9910060167312622,\n                          -0.097632996737957,\n                          -0.10134600102901459,\n                          0.9900450110435486,\n                          -0.09767600148916245,\n                          -0.07246600091457367,\n                          0.9928709864616394,\n                          -0.09463199973106384,\n                          0.07246600091457367,\n                          0.9928709864616394,\n                          0.09463199973106384,\n                          0.40216198563575745,\n                          0.9078760147094727,\n                          0.03206299990415573,\n                          0.37766799330711365,\n                          0.912958025932312,\n                          0.00018099999579135329,\n                          0.11919300258159637,\n                          0.9883019924163818,\n                          0.09514500200748444,\n                          0.37516000866889954,\n                          0.906607985496521,\n                          0.00016799999866634607,\n                          0.187733992934227,\n                          0.9816380143165588,\n                          0.03381900116801262,\n                          0.2823430001735687,\n                          0.767549991607666,\n                          -0.1682250052690506,\n                          0.12883399426937103,\n                          0.6540690064430237,\n                          -0.32698601484298706,\n                          0.06457000225782394,\n                          0.32701900601387024,\n                          -0.6666669845581055,\n                          0,\n                          0,\n                          -1,\n                          0.7192320227622986,\n                          0.6847820281982422,\n                          0.03167999908328056,\n                          0.6987630128860474,\n                          0.6987630128860474,\n                          0,\n                          0.694034993648529,\n                          0.694034993648529,\n                          0,\n                          0.5551990270614624,\n                          0.6008960008621216,\n                          -0.16825300455093384,\n                          0.1854030042886734,\n                          0.27701398730278015,\n                          -0.6666669845581055,\n                          0.9266499876976013,\n                          0.3567950129508972,\n                          0.03188199922442436,\n                          0.912958025932312,\n                          0.37766799330711365,\n                          -0.00018099999579135329,\n                          0.906607985496521,\n                          0.37516000866889954,\n                          -0.00016799999866634607,\n                          0.742605984210968,\n                          0.3426159918308258,\n                          -0.1683180034160614,\n                          0.27701398730278015,\n                          0.1854030042886734,\n                          -0.6666669845581055,\n                          0.9928709864616394,\n                          0.07246600091457367,\n                          -0.09463199973106384,\n                          0.9883019924163818,\n                          0.11919300258159637,\n                          -0.09514500200748444,\n                          0.9816370010375977,\n                          0.187733992934227,\n                          -0.03381900116801262,\n                          0.9811030030250549,\n                          0.19325199723243713,\n                          -0.009519999846816063,\n                          0.49052900075912476,\n                          0.0968559980392456,\n                          -0.5,\n                          0.9928709864616394,\n                          -0.07246600091457367,\n                          0.09463199973106384,\n                          0.9078760147094727,\n                          -0.40216198563575745,\n                          0.03206299990415573,\n                          0.912958025932312,\n                          -0.37766799330711365,\n                          0.00018099999579135329,\n                          0.9883019924163818,\n                          -0.11919300258159637,\n                          0.09514500200748444,\n                          0.906607985496521,\n                          -0.37516000866889954,\n                          0.00016799999866634607,\n                          0.9816380143165588,\n                          -0.187733992934227,\n                          0.03381900116801262,\n                          0.767549991607666,\n                          -0.2823430001735687,\n                          -0.1682250052690506,\n                          0.6540690064430237,\n                          -0.12883399426937103,\n                          -0.32698601484298706,\n                          0.32701900601387024,\n                          -0.06457000225782394,\n                          -0.6666669845581055,\n                          0,\n                          0,\n                          -1,\n                          0.6847820281982422,\n                          -0.7192320227622986,\n                          0.03167999908328056,\n                          0.6987630128860474,\n                          -0.6987630128860474,\n                          0,\n                          0.694034993648529,\n                          -0.694034993648529,\n                          0,\n                          0.6008960008621216,\n                          -0.5551990270614624,\n                          -0.16825300455093384,\n                          0.27701398730278015,\n                          -0.1854030042886734,\n                          -0.6666669845581055,\n                          0.3567950129508972,\n                          -0.9266499876976013,\n                          0.03188199922442436,\n                          0.37766799330711365,\n                          -0.912958025932312,\n                          -0.00018099999579135329,\n                          0.37516000866889954,\n                          -0.906607985496521,\n                          -0.00016799999866634607,\n                          0.3426159918308258,\n                          -0.742605984210968,\n                          -0.1683180034160614,\n                          0.1854030042886734,\n                          -0.27701398730278015,\n                          -0.6666669845581055,\n                          0.07246600091457367,\n                          -0.9928709864616394,\n                          -0.09463199973106384,\n                          0.11919300258159637,\n                          -0.9883019924163818,\n                          -0.09514500200748444,\n                          0.187733992934227,\n                          -0.9816370010375977,\n                          -0.03381900116801262,\n                          0.19325199723243713,\n                          -0.9811030030250549,\n                          -0.009519999846816063,\n                          0.0968559980392456,\n                          -0.49052900075912476,\n                          -0.5,\n                          -0.07246600091457367,\n                          -0.9928709864616394,\n                          0.09463199973106384,\n                          -0.40216198563575745,\n                          -0.9078760147094727,\n                          0.03206299990415573,\n                          -0.37766799330711365,\n                          -0.912958025932312,\n                          0.00018099999579135329,\n                          -0.11919300258159637,\n                          -0.9883019924163818,\n                          0.09514500200748444,\n                          -0.37516000866889954,\n                          -0.906607985496521,\n                          0.00016799999866634607,\n                          -0.187733992934227,\n                          -0.9816380143165588,\n                          0.03381900116801262,\n                          -0.2823430001735687,\n                          -0.767549991607666,\n                          -0.1682250052690506,\n                          -0.12883399426937103,\n                          -0.6540690064430237,\n                          -0.32698601484298706,\n                          -0.06457000225782394,\n                          -0.32701900601387024,\n                          -0.6666669845581055,\n                          0,\n                          0,\n                          -1,\n                          -0.7192320227622986,\n                          -0.6847820281982422,\n                          0.03167999908328056,\n                          -0.6987630128860474,\n                          -0.6987630128860474,\n                          0,\n                          -0.694034993648529,\n                          -0.694034993648529,\n                          0,\n                          -0.5551990270614624,\n                          -0.6008960008621216,\n                          -0.16825300455093384,\n                          -0.1854030042886734,\n                          -0.27701398730278015,\n                          -0.6666669845581055,\n                          -0.9266499876976013,\n                          -0.3567950129508972,\n                          0.03188199922442436,\n                          -0.912958025932312,\n                          -0.37766799330711365,\n                          -0.00018099999579135329,\n                          -0.906607985496521,\n                          -0.37516000866889954,\n                          -0.00016799999866634607,\n                          -0.742605984210968,\n                          -0.3426159918308258,\n                          -0.1683180034160614,\n                          -0.27701398730278015,\n                          -0.1854030042886734,\n                          -0.6666669845581055,\n                          -0.9928709864616394,\n                          -0.07246600091457367,\n                          -0.09463199973106384,\n                          -0.9883019924163818,\n                          -0.11919300258159637,\n                          -0.09514500200748444,\n                          -0.9816370010375977,\n                          -0.187733992934227,\n                          -0.03381900116801262,\n                          -0.9811030030250549,\n                          -0.19325199723243713,\n                          -0.009519999846816063,\n                          -0.49052900075912476,\n                          -0.0968559980392456,\n                          -0.5,\n                          -0.9928709864616394,\n                          0.07246600091457367,\n                          0.09463199973106384,\n                          -0.9078760147094727,\n                          0.40216198563575745,\n                          0.03206299990415573,\n                          -0.912958025932312,\n                          0.37766799330711365,\n                          0.00018099999579135329,\n                          -0.9883019924163818,\n                          0.11919300258159637,\n                          0.09514500200748444,\n                          -0.906607985496521,\n                          0.37516000866889954,\n                          0.00016799999866634607,\n                          -0.9816380143165588,\n                          0.187733992934227,\n                          0.03381900116801262,\n                          -0.767549991607666,\n                          0.2823430001735687,\n                          -0.1682250052690506,\n                          -0.6540690064430237,\n                          0.12883399426937103,\n                          -0.32698601484298706,\n                          -0.32701900601387024,\n                          0.06457000225782394,\n                          -0.6666669845581055,\n                          0,\n                          0,\n                          -1,\n                          -0.6847820281982422,\n                          0.7192320227622986,\n                          0.03167999908328056,\n                          -0.6987630128860474,\n                          0.6987630128860474,\n                          0,\n                          -0.694034993648529,\n                          0.694034993648529,\n                          0,\n                          -0.6008960008621216,\n                          0.5551990270614624,\n                          -0.16825300455093384,\n                          -0.27701398730278015,\n                          0.1854030042886734,\n                          -0.6666669845581055,\n                          -0.3567950129508972,\n                          0.9266499876976013,\n                          0.03188199922442436,\n                          -0.37766799330711365,\n                          0.912958025932312,\n                          -0.00018099999579135329,\n                          -0.37516000866889954,\n                          0.906607985496521,\n                          -0.00016799999866634607,\n                          -0.3426159918308258,\n                          0.742605984210968,\n                          -0.1683180034160614,\n                          -0.1854030042886734,\n                          0.27701398730278015,\n                          -0.6666669845581055,\n                          -0.07246600091457367,\n                          0.9928709864616394,\n                          -0.09463199973106384,\n                          -0.11919300258159637,\n                          0.9883019924163818,\n                          -0.09514500200748444,\n                          -0.187733992934227,\n                          0.9816370010375977,\n                          -0.03381900116801262,\n                          -0.19325199723243713,\n                          0.9811030030250549,\n                          -0.009519999846816063,\n                          -0.0968559980392456,\n                          0.49052900075912476,\n                          -0.5,\n                          -0.006597999949008226,\n                          0.9961680173873901,\n                          0.0001630000042496249,\n                          -0.043907999992370605,\n                          0.779125988483429,\n                          -0.55936598777771,\n                          0.23287899792194366,\n                          0.79271000623703,\n                          -0.506534993648529,\n                          0.11139900237321854,\n                          0.9923329949378967,\n                          0.0053449999541044235,\n                          0.4521920084953308,\n                          0.7370989918708801,\n                          -0.42180201411247253,\n                          0.17797799408435822,\n                          0.9827970266342163,\n                          0.036841001361608505,\n                          0.6075379848480225,\n                          0.7066869735717773,\n                          -0.270797997713089,\n                          0.11894699931144714,\n                          0.9864829778671265,\n                          0.10517799854278564,\n                          0.6583719849586487,\n                          0.7438470125198364,\n                          -0.06727500259876251,\n                          0.0010629999451339245,\n                          0.99891597032547,\n                          0.04653400182723999,\n                          -0.1622990071773529,\n                          -0.14869500696659088,\n                          -0.9069569706916809,\n                          0.3020159900188446,\n                          -0.014301000162959099,\n                          -0.8847119808197021,\n                          0.7048640251159668,\n                          -0.042514998465776443,\n                          -0.6788020133972168,\n                          0.8948519825935364,\n                          -0.11078000068664551,\n                          -0.38824599981307983,\n                          0.9622920155525208,\n                          -0.09367900341749191,\n                          -0.14349600672721863,\n                          -0.12511900067329407,\n                          -0.8479049801826477,\n                          -0.4783349931240082,\n                          0.11315400153398514,\n                          -0.8153669834136963,\n                          -0.5167160034179688,\n                          0.3956319987773895,\n                          -0.7910019755363464,\n                          -0.4345270097255707,\n                          0.5244609713554382,\n                          -0.8012329936027527,\n                          -0.2643829882144928,\n                          0.571465015411377,\n                          -0.7902160286903381,\n                          -0.12332800030708313,\n                          -0.0943560004234314,\n                          -0.9955379962921143,\n                          -0.0010989999864250422,\n                          0.012040999718010426,\n                          -0.9965500235557556,\n                          0,\n                          0.09501499682664871,\n                          -0.9936969876289368,\n                          0.02440500073134899,\n                          0.03737499937415123,\n                          -0.9978089928627014,\n                          0.035909999161958694,\n                          -0.0008800000068731606,\n                          -0.9973530173301697,\n                          -0.04031199961900711,\n                          0.007164000067859888,\n                          -0.9961649775505066,\n                          -0.00002700000004551839,\n                          0.043988000601530075,\n                          -0.8330309987068176,\n                          0.4691329896450043,\n                          -0.2334270030260086,\n                          -0.7983189821243286,\n                          0.49840399622917175,\n                          -0.10737399756908417,\n                          -0.9927549958229065,\n                          -0.007029999978840351,\n                          -0.45147499442100525,\n                          -0.7576299905776978,\n                          0.39375001192092896,\n                          -0.15364399552345276,\n                          -0.9863160252571106,\n                          -0.048294998705387115,\n                          -0.5575600266456604,\n                          -0.7753210067749023,\n                          0.2001740038394928,\n                          -0.07242999970912933,\n                          -0.9923030138015747,\n                          -0.08845999836921692,\n                          -0.5877019762992859,\n                          -0.8041930198669434,\n                          0.04768599942326546,\n                          0.0005830000154674053,\n                          -0.9997940063476562,\n                          -0.020301999524235725,\n                          0.13663700222969055,\n                          -0.14665700495243073,\n                          0.8966140151023865,\n                          -0.3045389950275421,\n                          -0.012237999588251114,\n                          0.8833180069923401,\n                          -0.7020289897918701,\n                          -0.033987998962402344,\n                          0.6724730134010315,\n                          -0.8890330195426941,\n                          -0.09636799991130829,\n                          0.37605398893356323,\n                          -0.9668099880218506,\n                          -0.08601800352334976,\n                          0.1358419954776764,\n                          0.12022499740123749,\n                          0.7918559908866882,\n                          0.5693140029907227,\n                          -0.11313500255346298,\n                          0.8111780285835266,\n                          0.5236610174179077,\n                          -0.39790698885917664,\n                          0.7734419703483582,\n                          0.45853298902511597,\n                          -0.5793390274047852,\n                          0.7346490025520325,\n                          0.32973799109458923,\n                          -0.6447499990463257,\n                          0.7340419888496399,\n                          0.12459299713373184,\n                          0.09378799796104431,\n                          0.9955919981002808,\n                          0.000944000028539449,\n                          -0.01607999950647354,\n                          0.9964879751205444,\n                          0.00035600000410340726,\n                          -0.11933200061321259,\n                          0.9912199974060059,\n                          -0.01737299934029579,\n                          -0.08618299663066864,\n                          0.9940080046653748,\n                          -0.053598999977111816,\n                          -0.004110999871045351,\n                          0.9980229735374451,\n                          0.015703000128269196,\n                          0.010142000392079353,\n                          0.9933879971504211,\n                          0.10034400224685669,\n                          0.6597890257835388,\n                          0.7114480137825012,\n                          0.12964099645614624,\n                          0.5634239912033081,\n                          0.7594000101089478,\n                          0.289902001619339,\n                          -0.021227000281214714,\n                          0.9976930022239685,\n                          0.05189099907875061,\n                          0.3972559869289398,\n                          0.7709670066833496,\n                          0.45872700214385986,\n                          -0.05054600164294243,\n                          0.9957669973373413,\n                          0.060869000852108,\n                          0.11805199831724167,\n                          0.7611619830131531,\n                          0.5692800283432007,\n                          -0.11414600163698196,\n                          0.9869359731674194,\n                          0.08862999826669693,\n                          -0.0012870000209659338,\n                          0.7195389866828918,\n                          0.6293820142745972,\n                          -0.18971200287342072,\n                          0.9752820134162903,\n                          0.11328700184822083,\n                          0.9685969948768616,\n                          -0.08966200053691864,\n                          0.13331100344657898,\n                          0.8902140259742737,\n                          -0.051961999386548996,\n                          0.39323100447654724,\n                          0.6728280186653137,\n                          -0.050324998795986176,\n                          0.6965069770812988,\n                          0.25133201479911804,\n                          -0.04306900128722191,\n                          0.9169719815254211,\n                          -0.19813700020313263,\n                          -0.2512879967689514,\n                          0.9046909809112549,\n                          0.5937719941139221,\n                          -0.8024669885635376,\n                          0.03307799994945526,\n                          0.5571249723434448,\n                          -0.7907459735870361,\n                          0.2022089958190918,\n                          0.4313510060310364,\n                          -0.8083119988441467,\n                          0.37996000051498413,\n                          0.19395600259304047,\n                          -0.8197799921035767,\n                          0.5133119821548462,\n                          -0.1517219990491867,\n                          -0.8084930181503296,\n                          0.5055829882621765,\n                          0.0035200000274926424,\n                          -0.9997940063476562,\n                          0.019979000091552734,\n                          0.01159599982202053,\n                          -0.9981369972229004,\n                          -0.02326199971139431,\n                          0.01310999970883131,\n                          -0.9988970160484314,\n                          -0.008480999618768692,\n                          -0.02485400065779686,\n                          -0.9978809952735901,\n                          0.021263999864459038,\n                          -0.11335399746894836,\n                          -0.9881970286369324,\n                          0.06441199779510498,\n                          -0.0035459999926388264,\n                          -0.9954169988632202,\n                          -0.07682599872350693,\n                          -0.5816869735717773,\n                          -0.7760900259017944,\n                          -0.13957500457763672,\n                          -0.5260769724845886,\n                          -0.790789008140564,\n                          -0.2781960070133209,\n                          0.017288999632000923,\n                          -0.9983699917793274,\n                          -0.03728000074625015,\n                          -0.36800798773765564,\n                          -0.7982890009880066,\n                          -0.4405499994754791,\n                          0.03743100166320801,\n                          -0.9973520040512085,\n                          -0.03640099987387657,\n                          -0.09636899828910828,\n                          -0.7829139828681946,\n                          -0.5500450134277344,\n                          0.10426300019025803,\n                          -0.9894949793815613,\n                          -0.06746900081634521,\n                          0.10083399713039398,\n                          -0.8161320090293884,\n                          -0.48112401366233826,\n                          0.18510299921035767,\n                          -0.9776470065116882,\n                          -0.09971100091934204,\n                          -0.9615049958229065,\n                          -0.08203399926424026,\n                          -0.14958199858665466,\n                          -0.8876789808273315,\n                          -0.04622500017285347,\n                          -0.39955899119377136,\n                          -0.6675580143928528,\n                          -0.03723999857902527,\n                          -0.7007560133934021,\n                          -0.245511993765831,\n                          -0.03216199949383736,\n                          -0.9151920080184937,\n                          0.15477199852466583,\n                          -0.24929499626159668,\n                          -0.8975690007209778,\n                          -0.6700729727745056,\n                          0.7402250170707703,\n                          -0.01942499913275242,\n                          -0.5923460125923157,\n                          0.7624830007553101,\n                          -0.21566900610923767,\n                          -0.45611900091171265,\n                          0.7868310213088989,\n                          -0.39906400442123413,\n                          -0.21001900732517242,\n                          0.8031420111656189,\n                          -0.5333020091056824,\n                          0.05119999870657921,\n                          0.7096909880638123,\n                          -0.6591699719429016,\n                          -0.014175999909639359,\n                          0.9989240169525146,\n                          -0.04416000097990036,\n                          -0.0065449997782707214,\n                          0.9983869791030884,\n                          0.008813999593257904,\n                          0.0023960000835359097,\n                          0.9989259839057922,\n                          -0.016711000353097916,\n                          0.03813000023365021,\n                          0.9969249963760376,\n                          -0.04171599820256233,\n                          0.11744900047779083,\n                          0.986670970916748,\n                          -0.0799890011548996,\n                          -0.02072799950838089,\n                          -0.997963011264801,\n                          0.0017740000039339066,\n                          0.10236400365829468,\n                          -0.695684015750885,\n                          -0.6961740255355835,\n                          0.28174999356269836,\n                          -0.7065439820289612,\n                          -0.6379269957542419,\n                          -0.027713999152183533,\n                          -0.9983959794044495,\n                          -0.016395000740885735,\n                          0.4621469974517822,\n                          -0.7501789927482605,\n                          -0.43765199184417725,\n                          -0.014942999929189682,\n                          -0.9960020184516907,\n                          -0.04751100018620491,\n                          0.6121799945831299,\n                          -0.7355859875679016,\n                          -0.1658719927072525,\n                          0.08200599998235703,\n                          -0.9833409786224365,\n                          0.11102399975061417,\n                          0.7232419848442078,\n                          -0.6012910008430481,\n                          -0.14595800638198853,\n                          0.32238098978996277,\n                          -0.9036369919776917,\n                          0.28197699785232544,\n                          0.1188960000872612,\n                          0.09661199897527695,\n                          -0.9692260026931763,\n                          0.3230240046977997,\n                          0.06791900098323822,\n                          -0.9069269895553589,\n                          0.6287810206413269,\n                          0.00962899997830391,\n                          -0.711097002029419,\n                          0.8952469825744629,\n                          -0.060169998556375504,\n                          -0.3366979956626892,\n                          0.9689210057258606,\n                          -0.04508800059556961,\n                          -0.13095800578594208,\n                          0.06500200182199478,\n                          0.7708680033683777,\n                          -0.6083509922027588,\n                          0.1816529929637909,\n                          0.7457069754600525,\n                          -0.593995988368988,\n                          0.37600401043891907,\n                          0.7467949986457825,\n                          -0.4776870012283325,\n                          0.6288849711418152,\n                          0.7020969986915588,\n                          -0.27160701155662537,\n                          0.8230010271072388,\n                          0.5295370221138,\n                          -0.09450399875640869,\n                          -0.12820099294185638,\n                          0.9899809956550598,\n                          -0.05917999893426895,\n                          -0.11097600311040878,\n                          0.9872509837150574,\n                          -0.09937400370836258,\n                          -0.06767299771308899,\n                          0.9865689873695374,\n                          -0.1427209973335266,\n                          -0.0003349999897181988,\n                          0.9967420101165771,\n                          0.025443999096751213,\n                          0.29019099473953247,\n                          0.9243509769439697,\n                          0.1957239955663681,\n                          0.07294999808073044,\n                          0.9949049949645996,\n                          0.03147900104522705,\n                          -0.04948300123214722,\n                          0.7695090174674988,\n                          0.6163870096206665,\n                          -0.24193400144577026,\n                          0.7750219702720642,\n                          0.5679330229759216,\n                          0.05620399862527847,\n                          0.9959489703178406,\n                          0.052143000066280365,\n                          -0.4294399917125702,\n                          0.779321014881134,\n                          0.41615501046180725,\n                          0.023887999355793,\n                          0.9943940043449402,\n                          0.07553800195455551,\n                          -0.6655910015106201,\n                          0.6939520239830017,\n                          0.20106400549411774,\n                          -0.09678799659013748,\n                          0.9791589975357056,\n                          -0.12869000434875488,\n                          -0.7716730237007141,\n                          0.5443729758262634,\n                          0.1793539971113205,\n                          -0.417836993932724,\n                          0.8721759915351868,\n                          -0.2544029951095581,\n                          -0.09499499946832657,\n                          0.08934500068426132,\n                          0.9787889719009399,\n                          -0.3299880027770996,\n                          0.06701900064945221,\n                          0.9273520112037659,\n                          -0.6511250138282776,\n                          0.023523999378085136,\n                          0.7280719876289368,\n                          -0.9116759896278381,\n                          -0.033263999968767166,\n                          0.34162598848342896,\n                          -0.9896330237388611,\n                          -0.013496000319719315,\n                          0.07834099978208542,\n                          -0.07044100016355515,\n                          -0.6954740285873413,\n                          0.7080140113830566,\n                          -0.21969600021839142,\n                          -0.6959800124168396,\n                          0.6642320156097412,\n                          -0.4075010120868683,\n                          -0.7370589971542358,\n                          0.5047789812088013,\n                          -0.5866039991378784,\n                          -0.7473030090332031,\n                          0.24636299908161163,\n                          -0.799036979675293,\n                          -0.5617390275001526,\n                          0.05794600024819374,\n                          0.07605399936437607,\n                          -0.9967970252037048,\n                          0.02472200058400631,\n                          0.08756300061941147,\n                          -0.9926980137825012,\n                          0.05929899960756302,\n                          0.07250799983739853,\n                          -0.9901790022850037,\n                          0.11122000217437744,\n                          0.015556000173091888,\n                          -0.9970260262489319,\n                          -0.011235999874770641,\n                          -0.194814994931221,\n                          -0.9439409971237183,\n                          -0.22127500176429749,\n                          0.3417310118675232,\n                          -0.8896859884262085,\n                          0.3012309968471527,\n                          0.8375009894371033,\n                          -0.4931910037994385,\n                          0.05739299952983856,\n                          0.8273029923439026,\n                          -0.4684619903564453,\n                          -0.05539099872112274,\n                          0.5311300158500671,\n                          -0.8121910095214844,\n                          0.24026300013065338,\n                          0.8069959878921509,\n                          -0.47689300775527954,\n                          0.002638000063598156,\n                          0.644743025302887,\n                          -0.7642210125923157,\n                          -0.015455000102519989,\n                          0.8856800198554993,\n                          -0.4464530050754547,\n                          0.047488000243902206,\n                          -0.011536000296473503,\n                          -0.999845027923584,\n                          -0.0008730000117793679,\n                          0.7597830295562744,\n                          -0.6229599714279175,\n                          0.026636000722646713,\n                          0.321245014667511,\n                          -0.8855000138282776,\n                          0.3356960117816925,\n                          0.998091995716095,\n                          -0.005673000123351812,\n                          0.025262000039219856,\n                          0.9941530227661133,\n                          0.046904999762773514,\n                          -0.00951599981635809,\n                          0.9838590025901794,\n                          -0.00041700000292621553,\n                          0.010572000406682491,\n                          0.990556001663208,\n                          0.01886500045657158,\n                          0.04422200098633766,\n                          0.9921990036964417,\n                          -0.12290599942207336,\n                          0.011202000081539154,\n                          0.828000009059906,\n                          0.5258169770240784,\n                          -0.0846100002527237,\n                          0.8704839944839478,\n                          0.4878079891204834,\n                          0.00635599996894598,\n                          0.7773939967155457,\n                          0.5659670233726501,\n                          -0.09634699672460556,\n                          0.8190580010414124,\n                          0.4740380048751831,\n                          0.01190400030463934,\n                          0.9017590284347534,\n                          0.3486430048942566,\n                          -0.05601400136947632,\n                          0.41038599610328674,\n                          0.870602011680603,\n                          0.27135801315307617,\n                          0.3019320070743561,\n                          0.8897680044174194,\n                          0.34101900458335876,\n                          0.13912299275398254,\n                          0.9423390030860901,\n                          -0.3042120039463043,\n                          0.6167309880256653,\n                          0.7692840099334717,\n                          0.1667650043964386,\n                          0.5558350086212158,\n                          0.8010749816894531,\n                          0.21867799758911133,\n                          -0.4410029947757721,\n                          0.8555399775505066,\n                          -0.2693159878253937,\n                          -0.8639690279960632,\n                          0.464356005191803,\n                          -0.019222000613808632,\n                          -0.8705710172653198,\n                          0.4855479896068573,\n                          -0.005623999983072281,\n                          -0.33969300985336304,\n                          0.8762779831886292,\n                          -0.34097298979759216,\n                          -0.7608209848403931,\n                          0.5840269923210144,\n                          0.11236599832773209,\n                          -0.16763299703598022,\n                          0.9419429898262024,\n                          0.29091599583625793,\n                          -0.8260639905929565,\n                          0.47304999828338623,\n                          -0.0134699996560812,\n                          -0.6006280183792114,\n                          0.7822970151901245,\n                          -0.1611420065164566,\n                          -0.8495870232582092,\n                          0.4440779983997345,\n                          0.17417700588703156,\n                          -0.5251449942588806,\n                          0.8236340284347534,\n                          -0.21412399411201477,\n                          -0.9991480112075806,\n                          0.0017519999528303742,\n                          0.007890000008046627,\n                          -0.9946579933166504,\n                          0.06129400059580803,\n                          0.007796999998390675,\n                          -0.9840919971466064,\n                          0.008732999674975872,\n                          -0.0001289999927394092,\n                          -0.9916059970855713,\n                          0.015207000076770782,\n                          -0.04798699915409088,\n                          -0.9899899959564209,\n                          -0.13816699385643005,\n                          -0.019433999434113503,\n                          -0.7927820086479187,\n                          -0.5669599771499634,\n                          0.06795799732208252,\n                          -0.8363490104675293,\n                          -0.4685719907283783,\n                          0.048955000936985016,\n                          -0.8138830065727234,\n                          -0.4743089973926544,\n                          0.0008379999781027436,\n                          -0.8869869709014893,\n                          -0.4417180120944977,\n                          -0.05625399947166443,\n                          -0.7898640036582947,\n                          -0.5522750020027161,\n                          -0.15016800165176392,\n                          -0.297340989112854,\n                          -0.8998129963874817,\n                          -0.3192580044269562,\n                          -0.49759799242019653,\n                          -0.8317790031433105,\n                          -0.24411599338054657,\n                          -0.6295620203018188,\n                          -0.7765420079231262,\n                          0.01261799968779087,\n                          -0.011338000185787678,\n                          -0.9998990297317505,\n                          -0.008561000227928162,\n                          -0.3547320067882538,\n                          -0.8679590225219727,\n                          -0.3453510105609894,\n                          0.09618999809026718,\n                          0.49066001176834106,\n                          -0.5,\n                          0.1851000040769577,\n                          0.27721700072288513,\n                          -0.6666669845581055,\n                          0.32566601037979126,\n                          0.76139897108078,\n                          -0.18199099600315094,\n                          0.062401000410318375,\n                          0.9939020276069641,\n                          -0.09090700000524521,\n                          0.3803209960460663,\n                          0.9214360117912292,\n                          -0.00007100000220816582,\n                          0.030918000265955925,\n                          0.9969729781150818,\n                          0.07133600115776062,\n                          0.3804109990596771,\n                          0.9220889806747437,\n                          0.0001630000042496249,\n                          0.02471200004220009,\n                          0.9975799918174744,\n                          0.06498300284147263,\n                          0.35510900616645813,\n                          0.926891028881073,\n                          0.03216100111603737,\n                          0.07657899707555771,\n                          0.9924740195274353,\n                          -0.09555599838495255,\n                          0.27721700072288513,\n                          0.1851000040769577,\n                          -0.6666669845581055,\n                          0.5929989814758301,\n                          0.5781109929084778,\n                          -0.18205299973487854,\n                          0.7048519849777222,\n                          0.7048519849777222,\n                          0,\n                          0.7052720189094543,\n                          0.7054179906845093,\n                          -0.00002499999936844688,\n                          0.6835219860076904,\n                          0.7199410200119019,\n                          0.03204600140452385,\n                          0.3271070122718811,\n                          0.06412599980831146,\n                          -0.6666669845581055,\n                          0.7694699764251709,\n                          0.3061000108718872,\n                          -0.18225300312042236,\n                          0.9214379787445068,\n                          0.38033199310302734,\n                          0.0000670000008540228,\n                          0.9220880270004272,\n                          0.3804430067539215,\n                          -0.00016799999866634607,\n                          0.9071130156517029,\n                          0.403003990650177,\n                          0.032437000423669815,\n                          0,\n                          0,\n                          -1,\n                          0.6626030206680298,\n                          0.04157499969005585,\n                          -0.272724986076355,\n                          0.9969789981842041,\n                          0.03082600049674511,\n                          -0.07129299640655518,\n                          0.9975910186767578,\n                          0.024447999894618988,\n                          -0.06492199748754501,\n                          0.9925040006637573,\n                          0.07630900293588638,\n                          0.09545700252056122,\n                          0.49066001176834106,\n                          -0.09618999809026718,\n                          -0.5,\n                          0.27721700072288513,\n                          -0.1851000040769577,\n                          -0.6666669845581055,\n                          0.76139897108078,\n                          -0.32566601037979126,\n                          -0.18199099600315094,\n                          0.9939020276069641,\n                          -0.062401000410318375,\n                          -0.09090700000524521,\n                          0.9214360117912292,\n                          -0.3803209960460663,\n                          -0.00007100000220816582,\n                          0.9969729781150818,\n                          -0.030918000265955925,\n                          0.07133600115776062,\n                          0.9220889806747437,\n                          -0.3804109990596771,\n                          0.0001630000042496249,\n                          0.9975799918174744,\n                          -0.02471200004220009,\n                          0.06498300284147263,\n                          0.926891028881073,\n                          -0.35510900616645813,\n                          0.03216100111603737,\n                          0.9924740195274353,\n                          -0.07657899707555771,\n                          -0.09555599838495255,\n                          0.1851000040769577,\n                          -0.27721700072288513,\n                          -0.6666669845581055,\n                          0.5781109929084778,\n                          -0.5929989814758301,\n                          -0.18205299973487854,\n                          0.7048519849777222,\n                          -0.7048519849777222,\n                          0,\n                          0.7054179906845093,\n                          -0.7052720189094543,\n                          -0.00002499999936844688,\n                          0.7199410200119019,\n                          -0.6835219860076904,\n                          0.03204600140452385,\n                          0.06412599980831146,\n                          -0.3271070122718811,\n                          -0.6666669845581055,\n                          0.3061000108718872,\n                          -0.7694699764251709,\n                          -0.18225300312042236,\n                          0.38033199310302734,\n                          -0.9214379787445068,\n                          0.0000670000008540228,\n                          0.3804430067539215,\n                          -0.9220880270004272,\n                          -0.00016799999866634607,\n                          0.403003990650177,\n                          -0.9071130156517029,\n                          0.032437000423669815,\n                          0,\n                          0,\n                          -1,\n                          0.04157499969005585,\n                          -0.6626030206680298,\n                          -0.272724986076355,\n                          0.03082600049674511,\n                          -0.9969789981842041,\n                          -0.07129299640655518,\n                          0.024447999894618988,\n                          -0.9975910186767578,\n                          -0.06492199748754501,\n                          0.07630900293588638,\n                          -0.9925040006637573,\n                          0.09545700252056122,\n                          -0.09618999809026718,\n                          -0.49066001176834106,\n                          -0.5,\n                          -0.1851000040769577,\n                          -0.27721700072288513,\n                          -0.6666669845581055,\n                          -0.32566601037979126,\n                          -0.76139897108078,\n                          -0.18199099600315094,\n                          -0.062401000410318375,\n                          -0.9939020276069641,\n                          -0.09090700000524521,\n                          -0.3803209960460663,\n                          -0.9214360117912292,\n                          -0.00007100000220816582,\n                          -0.030918000265955925,\n                          -0.9969729781150818,\n                          0.07133600115776062,\n                          -0.3804109990596771,\n                          -0.9220889806747437,\n                          0.0001630000042496249,\n                          -0.02471200004220009,\n                          -0.9975799918174744,\n                          0.06498300284147263,\n                          -0.35510900616645813,\n                          -0.926891028881073,\n                          0.03216100111603737,\n                          -0.07657899707555771,\n                          -0.9924740195274353,\n                          -0.09555599838495255,\n                          -0.27721700072288513,\n                          -0.1851000040769577,\n                          -0.6666669845581055,\n                          -0.5929989814758301,\n                          -0.5781109929084778,\n                          -0.18205299973487854,\n                          -0.7048519849777222,\n                          -0.7048519849777222,\n                          0,\n                          -0.7052720189094543,\n                          -0.7054179906845093,\n                          -0.00002499999936844688,\n                          -0.6835219860076904,\n                          -0.7199410200119019,\n                          0.03204600140452385,\n                          -0.3271070122718811,\n                          -0.06412599980831146,\n                          -0.6666669845581055,\n                          -0.7694699764251709,\n                          -0.3061000108718872,\n                          -0.18225300312042236,\n                          -0.9214379787445068,\n                          -0.38033199310302734,\n                          0.0000670000008540228,\n                          -0.9220880270004272,\n                          -0.3804430067539215,\n                          -0.00016799999866634607,\n                          -0.9071130156517029,\n                          -0.403003990650177,\n                          0.032437000423669815,\n                          0,\n                          0,\n                          -1,\n                          -0.6626030206680298,\n                          -0.04157499969005585,\n                          -0.272724986076355,\n                          -0.9969789981842041,\n                          -0.03082600049674511,\n                          -0.07129299640655518,\n                          -0.9975910186767578,\n                          -0.024447999894618988,\n                          -0.06492199748754501,\n                          -0.9925040006637573,\n                          -0.07630900293588638,\n                          0.09545700252056122,\n                          -0.49066001176834106,\n                          0.09618999809026718,\n                          -0.5,\n                          -0.27721700072288513,\n                          0.1851000040769577,\n                          -0.6666669845581055,\n                          -0.76139897108078,\n                          0.32566601037979126,\n                          -0.18199099600315094,\n                          -0.9939020276069641,\n                          0.062401000410318375,\n                          -0.09090700000524521,\n                          -0.9214360117912292,\n                          0.3803209960460663,\n                          -0.00007100000220816582,\n                          -0.9969729781150818,\n                          0.030918000265955925,\n                          0.07133600115776062,\n                          -0.9220889806747437,\n                          0.3804109990596771,\n                          0.0001630000042496249,\n                          -0.9975799918174744,\n                          0.02471200004220009,\n                          0.06498300284147263,\n                          -0.926891028881073,\n                          0.35510900616645813,\n                          0.03216100111603737,\n                          -0.9924740195274353,\n                          0.07657899707555771,\n                          -0.09555599838495255,\n                          -0.1851000040769577,\n                          0.27721700072288513,\n                          -0.6666669845581055,\n                          -0.5781109929084778,\n                          0.5929989814758301,\n                          -0.18205299973487854,\n                          -0.7048519849777222,\n                          0.7048519849777222,\n                          0,\n                          -0.7054179906845093,\n                          0.7052720189094543,\n                          -0.00002499999936844688,\n                          -0.7199410200119019,\n                          0.6835219860076904,\n                          0.03204600140452385,\n                          -0.06412599980831146,\n                          0.3271070122718811,\n                          -0.6666669845581055,\n                          -0.3061000108718872,\n                          0.7694699764251709,\n                          -0.18225300312042236,\n                          -0.38033199310302734,\n                          0.9214379787445068,\n                          0.0000670000008540228,\n                          -0.3804430067539215,\n                          0.9220880270004272,\n                          -0.00016799999866634607,\n                          -0.403003990650177,\n                          0.9071130156517029,\n                          0.032437000423669815,\n                          0,\n                          0,\n                          -1,\n                          -0.04157499969005585,\n                          0.6626030206680298,\n                          -0.272724986076355,\n                          -0.03082600049674511,\n                          0.9969789981842041,\n                          -0.07129299640655518,\n                          -0.024447999894618988,\n                          0.9975910186767578,\n                          -0.06492199748754501,\n                          -0.07630900293588638,\n                          0.9925040006637573,\n                          0.09545700252056122,\n                          0.07657899707555771,\n                          0.9924740195274353,\n                          -0.09555599838495255,\n                          0.40307098627090454,\n                          0.9070649743080139,\n                          -0.03255299851298332,\n                          0.3753640055656433,\n                          0.9070209860801697,\n                          0.000007000000096013537,\n                          0.18306200206279755,\n                          0.9820899963378906,\n                          -0.04457399994134903,\n                          0.3751649856567383,\n                          0.9065750241279602,\n                          -0.00007400000322377309,\n                          0.18801499903202057,\n                          0.9816100001335144,\n                          -0.03304100036621094,\n                          0.3759070038795471,\n                          0.908607006072998,\n                          -0.00026199998683296144,\n                          0.16623400151729584,\n                          0.983722984790802,\n                          -0.06822899729013443,\n                          0.33324098587036133,\n                          0.9290030002593994,\n                          0.029803000390529633,\n                          0.14071400463581085,\n                          0.9862040281295776,\n                          -0.08718100190162659,\n                          0.7198299765586853,\n                          0.6836559772491455,\n                          -0.032017000019550323,\n                          0.6943539977073669,\n                          0.6943539977073669,\n                          0,\n                          0.694034993648529,\n                          0.694034993648529,\n                          0,\n                          0.6955100297927856,\n                          0.6955100297927856,\n                          0,\n                          0.6639170050621033,\n                          0.7306150197982788,\n                          0.029100999236106873,\n                          0.9268649816513062,\n                          0.35523301362991333,\n                          -0.03203999996185303,\n                          0.9070209860801697,\n                          0.3753649890422821,\n                          -0.000007000000096013537,\n                          0.9065750241279602,\n                          0.3751649856567383,\n                          0.00007300000288523734,\n                          0.908607006072998,\n                          0.3759070038795471,\n                          0.00026199998683296144,\n                          0.8926259875297546,\n                          0.4211460053920746,\n                          0.028991999104619026,\n                          0.9924740195274353,\n                          0.07646500319242477,\n                          0.09565100073814392,\n                          0.9820899963378906,\n                          0.18306200206279755,\n                          0.04457399994134903,\n                          0.9816100001335144,\n                          0.18801499903202057,\n                          0.03304100036621094,\n                          0.983722984790802,\n                          0.16623400151729584,\n                          0.06822899729013443,\n                          0.9862040281295776,\n                          0.14071400463581085,\n                          0.08718100190162659,\n                          0.9924740195274353,\n                          -0.07657899707555771,\n                          -0.09555599838495255,\n                          0.9070649743080139,\n                          -0.40307098627090454,\n                          -0.03255299851298332,\n                          0.9070209860801697,\n                          -0.3753640055656433,\n                          0.000007000000096013537,\n                          0.9820899963378906,\n                          -0.18306200206279755,\n                          -0.04457399994134903,\n                          0.9065750241279602,\n                          -0.3751649856567383,\n                          -0.00007400000322377309,\n                          0.9816100001335144,\n                          -0.18801499903202057,\n                          -0.03304100036621094,\n                          0.908607006072998,\n                          -0.3759070038795471,\n                          -0.00026199998683296144,\n                          0.983722984790802,\n                          -0.16623400151729584,\n                          -0.06822899729013443,\n                          0.9290030002593994,\n                          -0.33324098587036133,\n                          0.029803000390529633,\n                          0.9862040281295776,\n                          -0.14071400463581085,\n                          -0.08718100190162659,\n                          0.6836559772491455,\n                          -0.7198299765586853,\n                          -0.032017000019550323,\n                          0.6943539977073669,\n                          -0.6943539977073669,\n                          0,\n                          0.694034993648529,\n                          -0.694034993648529,\n                          0,\n                          0.6955100297927856,\n                          -0.6955100297927856,\n                          0,\n                          0.7306150197982788,\n                          -0.6639170050621033,\n                          0.029100999236106873,\n                          0.35523301362991333,\n                          -0.9268649816513062,\n                          -0.03203999996185303,\n                          0.3753649890422821,\n                          -0.9070209860801697,\n                          -0.000007000000096013537,\n                          0.3751649856567383,\n                          -0.9065750241279602,\n                          0.00007300000288523734,\n                          0.3759070038795471,\n                          -0.908607006072998,\n                          0.00026199998683296144,\n                          0.4211460053920746,\n                          -0.8926259875297546,\n                          0.028991999104619026,\n                          0.07646500319242477,\n                          -0.9924740195274353,\n                          0.09565100073814392,\n                          0.18306200206279755,\n                          -0.9820899963378906,\n                          0.04457399994134903,\n                          0.18801499903202057,\n                          -0.9816100001335144,\n                          0.03304100036621094,\n                          0.16623400151729584,\n                          -0.983722984790802,\n                          0.06822899729013443,\n                          0.14071400463581085,\n                          -0.9862040281295776,\n                          0.08718100190162659,\n                          -0.07657899707555771,\n                          -0.9924740195274353,\n                          -0.09555599838495255,\n                          -0.40307098627090454,\n                          -0.9070649743080139,\n                          -0.03255299851298332,\n                          -0.3753640055656433,\n                          -0.9070209860801697,\n                          0.000007000000096013537,\n                          -0.18306200206279755,\n                          -0.9820899963378906,\n                          -0.04457399994134903,\n                          -0.3751649856567383,\n                          -0.9065750241279602,\n                          -0.00007400000322377309,\n                          -0.18801499903202057,\n                          -0.9816100001335144,\n                          -0.03304100036621094,\n                          -0.3759070038795471,\n                          -0.908607006072998,\n                          -0.00026199998683296144,\n                          -0.16623400151729584,\n                          -0.983722984790802,\n                          -0.06822899729013443,\n                          -0.33324098587036133,\n                          -0.9290030002593994,\n                          0.029803000390529633,\n                          -0.14071400463581085,\n                          -0.9862040281295776,\n                          -0.08718100190162659,\n                          -0.7198299765586853,\n                          -0.6836559772491455,\n                          -0.032017000019550323,\n                          -0.6943539977073669,\n                          -0.6943539977073669,\n                          0,\n                          -0.694034993648529,\n                          -0.694034993648529,\n                          0,\n                          -0.6955100297927856,\n                          -0.6955100297927856,\n                          0,\n                          -0.6639170050621033,\n                          -0.7306150197982788,\n                          0.029100999236106873,\n                          -0.9268649816513062,\n                          -0.35523301362991333,\n                          -0.03203999996185303,\n                          -0.9070209860801697,\n                          -0.3753649890422821,\n                          -0.000007000000096013537,\n                          -0.9065750241279602,\n                          -0.3751649856567383,\n                          0.00007300000288523734,\n                          -0.908607006072998,\n                          -0.3759070038795471,\n                          0.00026199998683296144,\n                          -0.8926259875297546,\n                          -0.4211460053920746,\n                          0.028991999104619026,\n                          -0.9924740195274353,\n                          -0.07646500319242477,\n                          0.09565100073814392,\n                          -0.9820899963378906,\n                          -0.18306200206279755,\n                          0.04457399994134903,\n                          -0.9816100001335144,\n                          -0.18801499903202057,\n                          0.03304100036621094,\n                          -0.983722984790802,\n                          -0.16623400151729584,\n                          0.06822899729013443,\n                          -0.9862040281295776,\n                          -0.14071400463581085,\n                          0.08718100190162659,\n                          -0.9924740195274353,\n                          0.07657899707555771,\n                          -0.09555599838495255,\n                          -0.9070649743080139,\n                          0.40307098627090454,\n                          -0.03255299851298332,\n                          -0.9070209860801697,\n                          0.3753640055656433,\n                          0.000007000000096013537,\n                          -0.9820899963378906,\n                          0.18306200206279755,\n                          -0.04457399994134903,\n                          -0.9065750241279602,\n                          0.3751649856567383,\n                          -0.00007400000322377309,\n                          -0.9816100001335144,\n                          0.18801499903202057,\n                          -0.03304100036621094,\n                          -0.908607006072998,\n                          0.3759070038795471,\n                          -0.00026199998683296144,\n                          -0.983722984790802,\n                          0.16623400151729584,\n                          -0.06822899729013443,\n                          -0.9290030002593994,\n                          0.33324098587036133,\n                          0.029803000390529633,\n                          -0.9862040281295776,\n                          0.14071400463581085,\n                          -0.08718100190162659,\n                          -0.6836559772491455,\n                          0.7198299765586853,\n                          -0.032017000019550323,\n                          -0.6943539977073669,\n                          0.6943539977073669,\n                          0,\n                          -0.694034993648529,\n                          0.694034993648529,\n                          0,\n                          -0.6955100297927856,\n                          0.6955100297927856,\n                          0,\n                          -0.7306150197982788,\n                          0.6639170050621033,\n                          0.029100999236106873,\n                          -0.35523301362991333,\n                          0.9268649816513062,\n                          -0.03203999996185303,\n                          -0.3753649890422821,\n                          0.9070209860801697,\n                          -0.000007000000096013537,\n                          -0.3751649856567383,\n                          0.9065750241279602,\n                          0.00007300000288523734,\n                          -0.3759070038795471,\n                          0.908607006072998,\n                          0.00026199998683296144,\n                          -0.4211460053920746,\n                          0.8926259875297546,\n                          0.028991999104619026,\n                          -0.07646500319242477,\n                          0.9924740195274353,\n                          0.09565100073814392,\n                          -0.18306200206279755,\n                          0.9820899963378906,\n                          0.04457399994134903,\n                          -0.18801499903202057,\n                          0.9816100001335144,\n                          0.03304100036621094,\n                          -0.16623400151729584,\n                          0.983722984790802,\n                          0.06822899729013443,\n                          -0.14071400463581085,\n                          0.9862040281295776,\n                          0.08718100190162659};\n\nfloat teapotBinormals[] = {0.2554270029067993,\n                           -0.05043400079011917,\n                           -0.9655119776725769,\n                           0.2302899956703186,\n                           -0.11379700154066086,\n                           -0.9664459824562073,\n                           -0.23653900623321533,\n                           0.09789499640464783,\n                           -0.9666780233383179,\n                           -0.2551180124282837,\n                           0.05037299916148186,\n                           -0.9655969738960266,\n                           -0.9201610088348389,\n                           0.38079801201820374,\n                           -0.09108299762010574,\n                           -0.9770479798316956,\n                           0.1929199993610382,\n                           -0.09032399952411652,\n                           -0.6762400269508362,\n                           0.2798590064048767,\n                           0.6814529895782471,\n                           -0.723800003528595,\n                           0.1429159939289093,\n                           0.6750479936599731,\n                           -0.4681990146636963,\n                           0.1581760048866272,\n                           0.869350016117096,\n                           -0.4902079999446869,\n                           0.09679199755191803,\n                           0.8662149906158447,\n                           0.16952399909496307,\n                           -0.1934960037469864,\n                           -0.9663439989089966,\n                           -0.18106800317764282,\n                           0.18106800317764282,\n                           -0.9666590094566345,\n                           -0.7041199803352356,\n                           0.7041199803352356,\n                           -0.09181900322437286,\n                           -0.5179349780082703,\n                           0.5179349780082703,\n                           0.6807990074157715,\n                           -0.37217798829078674,\n                           0.3260670006275177,\n                           0.8690019845962524,\n                           0.08221600204706192,\n                           -0.243368998169899,\n                           -0.9664430022239685,\n                           -0.09789499640464783,\n                           0.23653900623321533,\n                           -0.9666780233383179,\n                           -0.38079801201820374,\n                           0.9201610088348389,\n                           -0.09108199924230576,\n                           -0.2798590064048767,\n                           0.6762400269508362,\n                           0.6814540028572083,\n                           -0.21894000470638275,\n                           0.44305500388145447,\n                           0.8693490028381348,\n                           0.050822000950574875,\n                           -0.2573910057544708,\n                           -0.9649699926376343,\n                           -0.05021600052714348,\n                           0.25432100892066956,\n                           -0.965815007686615,\n                           -0.19291600584983826,\n                           0.9770249724388123,\n                           -0.09059000015258789,\n                           -0.14291299879550934,\n                           0.7237870097160339,\n                           0.6750609874725342,\n                           -0.09679199755191803,\n                           0.4902079999446869,\n                           0.8662149906158447,\n                           -0.048507001250982285,\n                           -0.2576940059661865,\n                           -0.965008020401001,\n                           -0.15833300352096558,\n                           -0.3227809965610504,\n                           -0.933135986328125,\n                           0.05656199902296066,\n                           0.13793900609016418,\n                           -0.9888240098953247,\n                           0.049150001257658005,\n                           0.2545199990272522,\n                           -0.9658179879188538,\n                           0.378387987613678,\n                           0.9173290133476257,\n                           -0.12381099909543991,\n                           0.1917950063943863,\n                           0.9772530198097229,\n                           -0.09050799906253815,\n                           0.2777239978313446,\n                           0.6716070175170898,\n                           0.6868870258331299,\n                           0.14281700551509857,\n                           0.7238019704818726,\n                           0.6750659942626953,\n                           0.15788200497627258,\n                           0.4674209952354431,\n                           0.8698220252990723,\n                           0.09679199755191803,\n                           0.4902079999446869,\n                           0.8662149906158447,\n                           -0.3139069974422455,\n                           -0.2657270133495331,\n                           -0.9115110039710999,\n                           0.05247500166296959,\n                           0.05178600177168846,\n                           -0.9972789883613586,\n                           0.699787974357605,\n                           0.6969379782676697,\n                           -0.15676100552082062,\n                           0.511929988861084,\n                           0.5116159915924072,\n                           0.6900550127029419,\n                           0.32515400648117065,\n                           0.37111398577690125,\n                           0.8697980046272278,\n                           -0.3181929886341095,\n                           -0.09987600147724152,\n                           -0.9427499771118164,\n                           0.1552799940109253,\n                           0.06176299974322319,\n                           -0.9859380125999451,\n                           0.9187250137329102,\n                           0.3751460015773773,\n                           -0.1233299970626831,\n                           0.6724870204925537,\n                           0.2775439918041229,\n                           0.6860979795455933,\n                           0.4424299895763397,\n                           0.21853800117969513,\n                           0.8697689771652222,\n                           -0.255948007106781,\n                           -0.04464200139045715,\n                           -0.9656590223312378,\n                           0.25306200981140137,\n                           0.046362001448869705,\n                           -0.9663389921188354,\n                           0.9778940081596375,\n                           0.18800100684165955,\n                           -0.09153299778699875,\n                           0.7238150238990784,\n                           0.14205799996852875,\n                           0.675212025642395,\n                           0.49017900228500366,\n                           0.0967010036110878,\n                           0.8662409782409668,\n                           -0.25491899251937866,\n                           0.05033399909734726,\n                           -0.9656509757041931,\n                           -0.2302899956703186,\n                           0.11379700154066086,\n                           -0.9664459824562073,\n                           0.23653900623321533,\n                           -0.09789499640464783,\n                           -0.9666780233383179,\n                           0.252265989780426,\n                           -0.04980999976396561,\n                           -0.9663749933242798,\n                           0.9201610088348389,\n                           -0.38079801201820374,\n                           -0.09108299762010574,\n                           0.9769039750099182,\n                           -0.19289200007915497,\n                           -0.09193000197410583,\n                           0.6762400269508362,\n                           -0.2798590064048767,\n                           0.6814529895782471,\n                           0.7236610054969788,\n                           -0.14288799464702606,\n                           0.6752020120620728,\n                           0.4681990146636963,\n                           -0.1581760048866272,\n                           0.869350016117096,\n                           0.4901660084724426,\n                           -0.09678400307893753,\n                           0.8662390112876892,\n                           -0.16952399909496307,\n                           0.1934960037469864,\n                           -0.9663439989089966,\n                           0.18106800317764282,\n                           -0.18106800317764282,\n                           -0.9666590094566345,\n                           0.7041199803352356,\n                           -0.7041199803352356,\n                           -0.09181900322437286,\n                           0.5179349780082703,\n                           -0.5179349780082703,\n                           0.6807990074157715,\n                           0.37217798829078674,\n                           -0.3260670006275177,\n                           0.8690019845962524,\n                           -0.08221600204706192,\n                           0.243368998169899,\n                           -0.9664430022239685,\n                           0.09789499640464783,\n                           -0.23653900623321533,\n                           -0.9666780233383179,\n                           0.38079801201820374,\n                           -0.9201610088348389,\n                           -0.09108199924230576,\n                           0.2798590064048767,\n                           -0.6762400269508362,\n                           0.6814540028572083,\n                           0.21894000470638275,\n                           -0.44305500388145447,\n                           0.8693490028381348,\n                           -0.05043400079011917,\n                           0.2554270029067993,\n                           -0.9655119776725769,\n                           0.05037299916148186,\n                           -0.2551180124282837,\n                           -0.9655969738960266,\n                           0.1929199993610382,\n                           -0.9770479798316956,\n                           -0.09032399952411652,\n                           0.1429159939289093,\n                           -0.723800003528595,\n                           0.6750479936599731,\n                           0.09679199755191803,\n                           -0.4902079999446869,\n                           0.8662149906158447,\n                           0.05043400079011917,\n                           0.2554270029067993,\n                           -0.9655119776725769,\n                           0.11379700154066086,\n                           0.2302899956703186,\n                           -0.9664459824562073,\n                           -0.09789499640464783,\n                           -0.23653900623321533,\n                           -0.9666780233383179,\n                           -0.05037299916148186,\n                           -0.2551180124282837,\n                           -0.9655969738960266,\n                           -0.38079801201820374,\n                           -0.9201610088348389,\n                           -0.09108299762010574,\n                           -0.1929199993610382,\n                           -0.9770479798316956,\n                           -0.09032399952411652,\n                           -0.2798590064048767,\n                           -0.6762400269508362,\n                           0.6814529895782471,\n                           -0.1429159939289093,\n                           -0.723800003528595,\n                           0.6750479936599731,\n                           -0.1581760048866272,\n                           -0.4681990146636963,\n                           0.869350016117096,\n                           -0.09679199755191803,\n                           -0.4902079999446869,\n                           0.8662149906158447,\n                           0.1934960037469864,\n                           0.16952399909496307,\n                           -0.9663439989089966,\n                           -0.18106800317764282,\n                           -0.18106800317764282,\n                           -0.9666590094566345,\n                           -0.7041199803352356,\n                           -0.7041199803352356,\n                           -0.09181900322437286,\n                           -0.5179349780082703,\n                           -0.5179349780082703,\n                           0.6807990074157715,\n                           -0.3260670006275177,\n                           -0.37217798829078674,\n                           0.8690019845962524,\n                           0.243368998169899,\n                           0.08221600204706192,\n                           -0.9664430022239685,\n                           -0.23653900623321533,\n                           -0.09789499640464783,\n                           -0.9666780233383179,\n                           -0.9201610088348389,\n                           -0.38079801201820374,\n                           -0.09108199924230576,\n                           -0.6762400269508362,\n                           -0.2798590064048767,\n                           0.6814540028572083,\n                           -0.44305500388145447,\n                           -0.21894000470638275,\n                           0.8693490028381348,\n                           0.2554270029067993,\n                           0.05043400079011917,\n                           -0.9655119776725769,\n                           -0.2551180124282837,\n                           -0.05037299916148186,\n                           -0.9655969738960266,\n                           -0.9770479798316956,\n                           -0.1929199993610382,\n                           -0.09032399952411652,\n                           -0.723800003528595,\n                           -0.1429159939289093,\n                           0.6750479936599731,\n                           -0.4902079999446869,\n                           -0.09679199755191803,\n                           0.8662149906158447,\n                           -0.4902079999446869,\n                           0.09679199755191803,\n                           0.8662149906158447,\n                           -0.44305500388145447,\n                           0.21893900632858276,\n                           0.8693490028381348,\n                           -0.37287598848342896,\n                           0.15431199967861176,\n                           0.9149600267410278,\n                           -0.4014579951763153,\n                           0.07926800101995468,\n                           0.9124410152435303,\n                           -0.3112579882144928,\n                           0.12881100177764893,\n                           0.9415550231933594,\n                           -0.33541300892829895,\n                           0.0662280023097992,\n                           0.939740002155304,\n                           -0.19015200436115265,\n                           0.07869099825620651,\n                           0.9785959720611572,\n                           -0.20517399907112122,\n                           0.040511999279260635,\n                           0.977886974811554,\n                           0.06301800161600113,\n                           -0.021289000287652016,\n                           0.9977849721908569,\n                           0.06623400002717972,\n                           -0.013078000396490097,\n                           0.9977179765701294,\n                           -0.3260670006275177,\n                           0.37217798829078674,\n                           0.8690019845962524,\n                           -0.285739004611969,\n                           0.285739004611969,\n                           0.9147170186042786,\n                           -0.23854400217533112,\n                           0.23854400217533112,\n                           0.9413790106773376,\n                           -0.14574900269508362,\n                           0.14574900269508362,\n                           0.9785270094871521,\n                           0.05011200159788132,\n                           -0.04390300065279007,\n                           0.9977779984474182,\n                           -0.1581760048866272,\n                           0.4681999981403351,\n                           0.869350016117096,\n                           -0.15431199967861176,\n                           0.37287598848342896,\n                           0.9149600267410278,\n                           -0.12881100177764893,\n                           0.3112579882144928,\n                           0.9415550231933594,\n                           -0.07869099825620651,\n                           0.19015100598335266,\n                           0.9785959720611572,\n                           0.02946699969470501,\n                           -0.05963199958205223,\n                           0.9977849721908569,\n                           -0.09679199755191803,\n                           0.4902079999446869,\n                           0.8662149906158447,\n                           -0.07926800101995468,\n                           0.4014579951763153,\n                           0.9124410152435303,\n                           -0.0662280023097992,\n                           0.33541300892829895,\n                           0.939740002155304,\n                           -0.040511999279260635,\n                           0.20517399907112122,\n                           0.977886974811554,\n                           0.013078000396490097,\n                           -0.06623400002717972,\n                           0.9977179765701294,\n                           0.09679199755191803,\n                           0.4902079999446869,\n                           0.8662149906158447,\n                           0.21858200430870056,\n                           0.4423219859600067,\n                           0.86981201171875,\n                           0.15431199967861176,\n                           0.37287598848342896,\n                           0.9149600267410278,\n                           0.07926800101995468,\n                           0.4014579951763153,\n                           0.9124410152435303,\n                           0.12881100177764893,\n                           0.3112579882144928,\n                           0.9415550231933594,\n                           0.0662280023097992,\n                           0.33541300892829895,\n                           0.939740002155304,\n                           0.07869099825620651,\n                           0.19015200436115265,\n                           0.9785959720611572,\n                           0.040511999279260635,\n                           0.20517399907112122,\n                           0.977886974811554,\n                           -0.021289000287652016,\n                           -0.06301800161600113,\n                           0.9977849721908569,\n                           -0.013078000396490097,\n                           -0.06623400002717972,\n                           0.9977179765701294,\n                           0.3711329996585846,\n                           0.3251489996910095,\n                           0.8697919845581055,\n                           0.285739004611969,\n                           0.285739004611969,\n                           0.9147170186042786,\n                           0.23854400217533112,\n                           0.23854400217533112,\n                           0.9413790106773376,\n                           0.14574900269508362,\n                           0.14574900269508362,\n                           0.9785270094871521,\n                           -0.04390300065279007,\n                           -0.05011200159788132,\n                           0.9977779984474182,\n                           0.46750199794769287,\n                           0.15794099867343903,\n                           0.8697680234909058,\n                           0.37287598848342896,\n                           0.15431199967861176,\n                           0.9149600267410278,\n                           0.3112579882144928,\n                           0.12881100177764893,\n                           0.9415550231933594,\n                           0.19015100598335266,\n                           0.07869099825620651,\n                           0.9785959720611572,\n                           -0.05963199958205223,\n                           -0.02946699969470501,\n                           0.9977849721908569,\n                           0.49017900228500366,\n                           0.0967010036110878,\n                           0.8662409782409668,\n                           0.4014579951763153,\n                           0.07926800101995468,\n                           0.9124410152435303,\n                           0.33541300892829895,\n                           0.0662280023097992,\n                           0.939740002155304,\n                           0.20517399907112122,\n                           0.040511999279260635,\n                           0.977886974811554,\n                           -0.06623400002717972,\n                           -0.013078000396490097,\n                           0.9977179765701294,\n                           0.4901660084724426,\n                           -0.09678400307893753,\n                           0.8662390112876892,\n                           0.44305500388145447,\n                           -0.21893900632858276,\n                           0.8693490028381348,\n                           0.37287598848342896,\n                           -0.15431199967861176,\n                           0.9149600267410278,\n                           0.4014579951763153,\n                           -0.07926800101995468,\n                           0.9124410152435303,\n                           0.3112579882144928,\n                           -0.12881100177764893,\n                           0.9415550231933594,\n                           0.33541300892829895,\n                           -0.0662280023097992,\n                           0.939740002155304,\n                           0.19015200436115265,\n                           -0.07869099825620651,\n                           0.9785959720611572,\n                           0.20517399907112122,\n                           -0.040511999279260635,\n                           0.977886974811554,\n                           -0.06301800161600113,\n                           0.021289000287652016,\n                           0.9977849721908569,\n                           -0.06623400002717972,\n                           0.013078000396490097,\n                           0.9977179765701294,\n                           0.3260670006275177,\n                           -0.37217798829078674,\n                           0.8690019845962524,\n                           0.285739004611969,\n                           -0.285739004611969,\n                           0.9147170186042786,\n                           0.23854400217533112,\n                           -0.23854400217533112,\n                           0.9413790106773376,\n                           0.14574900269508362,\n                           -0.14574900269508362,\n                           0.9785270094871521,\n                           -0.05011200159788132,\n                           0.04390300065279007,\n                           0.9977779984474182,\n                           0.1581760048866272,\n                           -0.4681999981403351,\n                           0.869350016117096,\n                           0.15431199967861176,\n                           -0.37287598848342896,\n                           0.9149600267410278,\n                           0.12881100177764893,\n                           -0.3112579882144928,\n                           0.9415550231933594,\n                           0.07869099825620651,\n                           -0.19015100598335266,\n                           0.9785959720611572,\n                           -0.02946699969470501,\n                           0.05963199958205223,\n                           0.9977849721908569,\n                           0.09679199755191803,\n                           -0.4902079999446869,\n                           0.8662149906158447,\n                           0.07926800101995468,\n                           -0.4014579951763153,\n                           0.9124410152435303,\n                           0.0662280023097992,\n                           -0.33541300892829895,\n                           0.939740002155304,\n                           0.040511999279260635,\n                           -0.20517399907112122,\n                           0.977886974811554,\n                           -0.013078000396490097,\n                           0.06623400002717972,\n                           0.9977179765701294,\n                           -0.09679199755191803,\n                           -0.4902079999446869,\n                           0.8662149906158447,\n                           -0.21893900632858276,\n                           -0.44305500388145447,\n                           0.8693490028381348,\n                           -0.15431199967861176,\n                           -0.37287598848342896,\n                           0.9149600267410278,\n                           -0.07926800101995468,\n                           -0.4014579951763153,\n                           0.9124410152435303,\n                           -0.12881100177764893,\n                           -0.3112579882144928,\n                           0.9415550231933594,\n                           -0.0662280023097992,\n                           -0.33541300892829895,\n                           0.939740002155304,\n                           -0.07869099825620651,\n                           -0.19015200436115265,\n                           0.9785959720611572,\n                           -0.040511999279260635,\n                           -0.20517399907112122,\n                           0.977886974811554,\n                           0.021289000287652016,\n                           0.06301800161600113,\n                           0.9977849721908569,\n                           0.013078000396490097,\n                           0.06623400002717972,\n                           0.9977179765701294,\n                           -0.37217798829078674,\n                           -0.3260670006275177,\n                           0.8690019845962524,\n                           -0.285739004611969,\n                           -0.285739004611969,\n                           0.9147170186042786,\n                           -0.23854400217533112,\n                           -0.23854400217533112,\n                           0.9413790106773376,\n                           -0.14574900269508362,\n                           -0.14574900269508362,\n                           0.9785270094871521,\n                           0.04390300065279007,\n                           0.05011200159788132,\n                           0.9977779984474182,\n                           -0.4681999981403351,\n                           -0.1581760048866272,\n                           0.869350016117096,\n                           -0.37287598848342896,\n                           -0.15431199967861176,\n                           0.9149600267410278,\n                           -0.3112579882144928,\n                           -0.12881100177764893,\n                           0.9415550231933594,\n                           -0.19015100598335266,\n                           -0.07869099825620651,\n                           0.9785959720611572,\n                           0.05963199958205223,\n                           0.02946699969470501,\n                           0.9977849721908569,\n                           -0.4902079999446869,\n                           -0.09679199755191803,\n                           0.8662149906158447,\n                           -0.4014579951763153,\n                           -0.07926800101995468,\n                           0.9124410152435303,\n                           -0.33541300892829895,\n                           -0.0662280023097992,\n                           0.939740002155304,\n                           -0.20517399907112122,\n                           -0.040511999279260635,\n                           0.977886974811554,\n                           0.06623400002717972,\n                           0.013078000396490097,\n                           0.9977179765701294,\n                           0.06623400002717972,\n                           -0.013078000396490097,\n                           0.9977179765701294,\n                           0.05963199958205223,\n                           -0.02946699969470501,\n                           0.9977849721908569,\n                           0.40303200483322144,\n                           -0.1667889952659607,\n                           0.8998590111732483,\n                           0.4339120090007782,\n                           -0.08567699790000916,\n                           0.8968719840049744,\n                           0.6326310038566589,\n                           -0.2618109881877899,\n                           0.7288579940795898,\n                           0.6777120232582092,\n                           -0.13381600379943848,\n                           0.723048985004425,\n                           0.6661339998245239,\n                           -0.27567601203918457,\n                           0.6930140256881714,\n                           0.7128540277481079,\n                           -0.14075499773025513,\n                           0.6870430111885071,\n                           0.5777599811553955,\n                           -0.19519099593162537,\n                           0.792523980140686,\n                           0.6036490201950073,\n                           -0.11919199675321579,\n                           0.7882900238037109,\n                           0.04390300065279007,\n                           -0.05011200159788132,\n                           0.9977779984474182,\n                           0.30884799361228943,\n                           -0.30884799361228943,\n                           0.8995699882507324,\n                           0.48457300662994385,\n                           -0.48457300662994385,\n                           0.7282710075378418,\n                           0.510138988494873,\n                           -0.510138988494873,\n                           0.6924710273742676,\n                           0.4591110050678253,\n                           -0.40222999453544617,\n                           0.7921029925346375,\n                           0.021289000287652016,\n                           -0.06301800161600113,\n                           0.9977849721908569,\n                           0.16678999364376068,\n                           -0.40303200483322144,\n                           0.8998590111732483,\n                           0.2618109881877899,\n                           -0.6326310038566589,\n                           0.7288579940795898,\n                           0.27567601203918457,\n                           -0.6661339998245239,\n                           0.6930140256881714,\n                           0.2701770067214966,\n                           -0.546737015247345,\n                           0.7925170063972473,\n                           0.013078000396490097,\n                           -0.06623400002717972,\n                           0.9977179765701294,\n                           0.08567599952220917,\n                           -0.4339120090007782,\n                           0.8968719840049744,\n                           0.13381600379943848,\n                           -0.6777120232582092,\n                           0.723048985004425,\n                           0.14075499773025513,\n                           -0.7128540277481079,\n                           0.6870430111885071,\n                           0.11919199675321579,\n                           -0.6036490201950073,\n                           0.7882900238037109,\n                           -0.013078000396490097,\n                           -0.06623400002717972,\n                           0.9977179765701294,\n                           -0.02946699969470501,\n                           -0.05963199958205223,\n                           0.9977849721908569,\n                           -0.1667889952659607,\n                           -0.40303200483322144,\n                           0.8998590111732483,\n                           -0.08567699790000916,\n                           -0.4339120090007782,\n                           0.8968719840049744,\n                           -0.2618109881877899,\n                           -0.6326310038566589,\n                           0.7288579940795898,\n                           -0.13381600379943848,\n                           -0.6777120232582092,\n                           0.723048985004425,\n                           -0.27567601203918457,\n                           -0.6661339998245239,\n                           0.6930140256881714,\n                           -0.14075499773025513,\n                           -0.7128540277481079,\n                           0.6870430111885071,\n                           -0.19519099593162537,\n                           -0.5777599811553955,\n                           0.792523980140686,\n                           -0.11919199675321579,\n                           -0.6036490201950073,\n                           0.7882900238037109,\n                           -0.05011200159788132,\n                           -0.04390300065279007,\n                           0.9977779984474182,\n                           -0.30884799361228943,\n                           -0.30884799361228943,\n                           0.8995699882507324,\n                           -0.48457300662994385,\n                           -0.48457300662994385,\n                           0.7282710075378418,\n                           -0.510138988494873,\n                           -0.510138988494873,\n                           0.6924710273742676,\n                           -0.40222999453544617,\n                           -0.4591110050678253,\n                           0.7921029925346375,\n                           -0.06301800161600113,\n                           -0.021289000287652016,\n                           0.9977849721908569,\n                           -0.40303200483322144,\n                           -0.16678999364376068,\n                           0.8998590111732483,\n                           -0.6326310038566589,\n                           -0.2618109881877899,\n                           0.7288579940795898,\n                           -0.6661339998245239,\n                           -0.27567601203918457,\n                           0.6930140256881714,\n                           -0.546737015247345,\n                           -0.2701770067214966,\n                           0.7925170063972473,\n                           -0.06623400002717972,\n                           -0.013078000396490097,\n                           0.9977179765701294,\n                           -0.4339120090007782,\n                           -0.08567599952220917,\n                           0.8968719840049744,\n                           -0.6777120232582092,\n                           -0.13381600379943848,\n                           0.723048985004425,\n                           -0.7128540277481079,\n                           -0.14075499773025513,\n                           0.6870430111885071,\n                           -0.6036490201950073,\n                           -0.11919199675321579,\n                           0.7882900238037109,\n                           -0.06623400002717972,\n                           0.013078000396490097,\n                           0.9977179765701294,\n                           -0.05963199958205223,\n                           0.02946699969470501,\n                           0.9977849721908569,\n                           -0.40303200483322144,\n                           0.1667889952659607,\n                           0.8998590111732483,\n                           -0.4339120090007782,\n                           0.08567699790000916,\n                           0.8968719840049744,\n                           -0.6326310038566589,\n                           0.2618109881877899,\n                           0.7288579940795898,\n                           -0.6777120232582092,\n                           0.13381600379943848,\n                           0.723048985004425,\n                           -0.6661339998245239,\n                           0.27567601203918457,\n                           0.6930140256881714,\n                           -0.7128540277481079,\n                           0.14075499773025513,\n                           0.6870430111885071,\n                           -0.5777599811553955,\n                           0.19519099593162537,\n                           0.792523980140686,\n                           -0.6036490201950073,\n                           0.11919199675321579,\n                           0.7882900238037109,\n                           -0.04390300065279007,\n                           0.05011200159788132,\n                           0.9977779984474182,\n                           -0.30884799361228943,\n                           0.30884799361228943,\n                           0.8995699882507324,\n                           -0.48457300662994385,\n                           0.48457300662994385,\n                           0.7282710075378418,\n                           -0.510138988494873,\n                           0.510138988494873,\n                           0.6924710273742676,\n                           -0.4591110050678253,\n                           0.40222999453544617,\n                           0.7921029925346375,\n                           -0.021289000287652016,\n                           0.06301800161600113,\n                           0.9977849721908569,\n                           -0.16678999364376068,\n                           0.40303200483322144,\n                           0.8998590111732483,\n                           -0.2618109881877899,\n                           0.6326310038566589,\n                           0.7288579940795898,\n                           -0.27567601203918457,\n                           0.6661339998245239,\n                           0.6930140256881714,\n                           -0.2701770067214966,\n                           0.546737015247345,\n                           0.7925170063972473,\n                           -0.013078000396490097,\n                           0.06623400002717972,\n                           0.9977179765701294,\n                           -0.08567599952220917,\n                           0.4339120090007782,\n                           0.8968719840049744,\n                           -0.13381600379943848,\n                           0.6777120232582092,\n                           0.723048985004425,\n                           -0.14075499773025513,\n                           0.7128540277481079,\n                           0.6870430111885071,\n                           -0.11919199675321579,\n                           0.6036490201950073,\n                           0.7882900238037109,\n                           0.013078000396490097,\n                           0.06623400002717972,\n                           0.9977179765701294,\n                           0.02946699969470501,\n                           0.05963199958205223,\n                           0.9977849721908569,\n                           0.1667889952659607,\n                           0.40303200483322144,\n                           0.8998590111732483,\n                           0.08567699790000916,\n                           0.4339120090007782,\n                           0.8968719840049744,\n                           0.2618109881877899,\n                           0.6326310038566589,\n                           0.7288579940795898,\n                           0.13381600379943848,\n                           0.6777120232582092,\n                           0.723048985004425,\n                           0.27567601203918457,\n                           0.6661339998245239,\n                           0.6930140256881714,\n                           0.14075499773025513,\n                           0.7128540277481079,\n                           0.6870430111885071,\n                           0.19519099593162537,\n                           0.5777599811553955,\n                           0.792523980140686,\n                           0.11919199675321579,\n                           0.6036490201950073,\n                           0.7882900238037109,\n                           0.05011200159788132,\n                           0.04390300065279007,\n                           0.9977779984474182,\n                           0.30884799361228943,\n                           0.30884799361228943,\n                           0.8995699882507324,\n                           0.48457300662994385,\n                           0.48457300662994385,\n                           0.7282710075378418,\n                           0.510138988494873,\n                           0.510138988494873,\n                           0.6924710273742676,\n                           0.40222999453544617,\n                           0.4591110050678253,\n                           0.7921029925346375,\n                           0.06301800161600113,\n                           0.021289000287652016,\n                           0.9977849721908569,\n                           0.40303200483322144,\n                           0.16678999364376068,\n                           0.8998590111732483,\n                           0.6326310038566589,\n                           0.2618109881877899,\n                           0.7288579940795898,\n                           0.6661339998245239,\n                           0.27567601203918457,\n                           0.6930140256881714,\n                           0.546737015247345,\n                           0.2701770067214966,\n                           0.7925170063972473,\n                           0.06623400002717972,\n                           0.013078000396490097,\n                           0.9977179765701294,\n                           0.4339120090007782,\n                           0.08567599952220917,\n                           0.8968719840049744,\n                           0.6777120232582092,\n                           0.13381600379943848,\n                           0.723048985004425,\n                           0.7128540277481079,\n                           0.14075499773025513,\n                           0.6870430111885071,\n                           0.6036490201950073,\n                           0.11919199675321579,\n                           0.7882900238037109,\n                           0.6036490201950073,\n                           -0.11919199675321579,\n                           0.7882900238037109,\n                           0.546737015247345,\n                           -0.2701770067214966,\n                           0.7925170063972473,\n                           0.7223830223083496,\n                           -0.2989569902420044,\n                           0.623528003692627,\n                           0.7723940014839172,\n                           -0.15251100063323975,\n                           0.616562008857727,\n                           0.9094089865684509,\n                           -0.3763520121574402,\n                           0.1770150065422058,\n                           0.9660869836807251,\n                           -0.19075599312782288,\n                           0.1740349978208542,\n                           0.9408230185508728,\n                           -0.3353259861469269,\n                           0.04907499998807907,\n                           0.9843119978904724,\n                           -0.16964000463485718,\n                           0.048493001610040665,\n                           0.9810580015182495,\n                           -0.1937119960784912,\n                           0,\n                           0.7071070075035095,\n                           -0.7071070075035095,\n                           0,\n                           0.40222999453544617,\n                           -0.4591110050678253,\n                           0.7921029925346375,\n                           0.5532029867172241,\n                           -0.5532029867172241,\n                           0.622842013835907,\n                           0.6959879994392395,\n                           -0.6959879994392395,\n                           0.17663900554180145,\n                           0.7403979897499084,\n                           -0.6703829765319824,\n                           0.048958998173475266,\n                           0.8310419917106628,\n                           -0.5562090277671814,\n                           0,\n                           0.19519099593162537,\n                           -0.5777599811553955,\n                           0.792523980140686,\n                           0.2989560067653656,\n                           -0.7223830223083496,\n                           0.623528003692627,\n                           0.3763520121574402,\n                           -0.9094089865684509,\n                           0.1770150065422058,\n                           0.4275760054588318,\n                           -0.902646005153656,\n                           0.04906899854540825,\n                           0.5562090277671814,\n                           -0.8310419917106628,\n                           0,\n                           0.11919199675321579,\n                           -0.6036490201950073,\n                           0.7882900238037109,\n                           0.15251100063323975,\n                           -0.7723940014839172,\n                           0.616562008857727,\n                           0.19075599312782288,\n                           -0.9660869836807251,\n                           0.1740349978208542,\n                           0.19348600506782532,\n                           -0.9799140095710754,\n                           0.048277001827955246,\n                           0.1937119960784912,\n                           -0.9810580015182495,\n                           0,\n                           -0.11919199675321579,\n                           -0.6036490201950073,\n                           0.7882900238037109,\n                           -0.2701770067214966,\n                           -0.546737015247345,\n                           0.7925170063972473,\n                           -0.2989569902420044,\n                           -0.7223830223083496,\n                           0.623528003692627,\n                           -0.15251100063323975,\n                           -0.7723940014839172,\n                           0.616562008857727,\n                           -0.3763520121574402,\n                           -0.9094089865684509,\n                           0.1770150065422058,\n                           -0.19075599312782288,\n                           -0.9660869836807251,\n                           0.1740349978208542,\n                           -0.3353259861469269,\n                           -0.9408230185508728,\n                           0.04907499998807907,\n                           -0.16964000463485718,\n                           -0.9843119978904724,\n                           0.04849399998784065,\n                           -0.1937119960784912,\n                           -0.9810580015182495,\n                           0,\n                           0.7071070075035095,\n                           -0.7071070075035095,\n                           0,\n                           -0.4591110050678253,\n                           -0.40222999453544617,\n                           0.7921029925346375,\n                           -0.5532029867172241,\n                           -0.5532029867172241,\n                           0.622842013835907,\n                           -0.6959879994392395,\n                           -0.6959879994392395,\n                           0.17663900554180145,\n                           -0.6703829765319824,\n                           -0.7403979897499084,\n                           0.048958998173475266,\n                           -0.5562090277671814,\n                           -0.8310419917106628,\n                           0,\n                           -0.5777599811553955,\n                           -0.19519099593162537,\n                           0.792523980140686,\n                           -0.7223830223083496,\n                           -0.2989560067653656,\n                           0.623528003692627,\n                           -0.9094089865684509,\n                           -0.3763520121574402,\n                           0.1770150065422058,\n                           -0.902646005153656,\n                           -0.4275760054588318,\n                           0.04906899854540825,\n                           -0.8310419917106628,\n                           -0.5562090277671814,\n                           0,\n                           -0.6036490201950073,\n                           -0.11919199675321579,\n                           0.7882900238037109,\n                           -0.7723940014839172,\n                           -0.15251100063323975,\n                           0.616562008857727,\n                           -0.9660869836807251,\n                           -0.19075599312782288,\n                           0.1740349978208542,\n                           -0.9799140095710754,\n                           -0.19348600506782532,\n                           0.048277001827955246,\n                           -0.9810580015182495,\n                           -0.1937119960784912,\n                           0,\n                           -0.6036490201950073,\n                           0.11919199675321579,\n                           0.7882900238037109,\n                           -0.546737015247345,\n                           0.2701770067214966,\n                           0.7925170063972473,\n                           -0.7223830223083496,\n                           0.2989569902420044,\n                           0.623528003692627,\n                           -0.7723940014839172,\n                           0.15251100063323975,\n                           0.616562008857727,\n                           -0.9094089865684509,\n                           0.3763520121574402,\n                           0.1770150065422058,\n                           -0.9660869836807251,\n                           0.19075599312782288,\n                           0.1740349978208542,\n                           -0.9408230185508728,\n                           0.3353259861469269,\n                           0.04907499998807907,\n                           -0.9843119978904724,\n                           0.16964000463485718,\n                           0.04849399998784065,\n                           -0.9810580015182495,\n                           0.1937119960784912,\n                           0,\n                           0.7071070075035095,\n                           -0.7071070075035095,\n                           0,\n                           -0.40222999453544617,\n                           0.4591110050678253,\n                           0.7921029925346375,\n                           -0.5532029867172241,\n                           0.5532029867172241,\n                           0.622842013835907,\n                           -0.6959879994392395,\n                           0.6959879994392395,\n                           0.17663900554180145,\n                           -0.7403979897499084,\n                           0.6703829765319824,\n                           0.048958998173475266,\n                           -0.8310419917106628,\n                           0.5562090277671814,\n                           0,\n                           -0.19519099593162537,\n                           0.5777599811553955,\n                           0.792523980140686,\n                           -0.2989560067653656,\n                           0.7223830223083496,\n                           0.623528003692627,\n                           -0.3763520121574402,\n                           0.9094089865684509,\n                           0.1770150065422058,\n                           -0.4275760054588318,\n                           0.902646005153656,\n                           0.04906899854540825,\n                           -0.5562090277671814,\n                           0.8310419917106628,\n                           0,\n                           -0.11919199675321579,\n                           0.6036490201950073,\n                           0.7882900238037109,\n                           -0.15251100063323975,\n                           0.7723940014839172,\n                           0.616562008857727,\n                           -0.19075599312782288,\n                           0.9660869836807251,\n                           0.1740349978208542,\n                           -0.19348600506782532,\n                           0.9799140095710754,\n                           0.048277001827955246,\n                           -0.1937119960784912,\n                           0.9810580015182495,\n                           0,\n                           0.11919199675321579,\n                           0.6036490201950073,\n                           0.7882900238037109,\n                           0.2701770067214966,\n                           0.546737015247345,\n                           0.7925170063972473,\n                           0.2989569902420044,\n                           0.7223830223083496,\n                           0.623528003692627,\n                           0.15251100063323975,\n                           0.7723940014839172,\n                           0.616562008857727,\n                           0.3763520121574402,\n                           0.9094089865684509,\n                           0.1770150065422058,\n                           0.19075599312782288,\n                           0.9660869836807251,\n                           0.1740349978208542,\n                           0.3353259861469269,\n                           0.9408230185508728,\n                           0.04907499998807907,\n                           0.16964000463485718,\n                           0.9843119978904724,\n                           0.04849399998784065,\n                           0.1937119960784912,\n                           0.9810580015182495,\n                           0,\n                           0.7071070075035095,\n                           -0.7071070075035095,\n                           0,\n                           0.4591110050678253,\n                           0.40222999453544617,\n                           0.7921029925346375,\n                           0.5532029867172241,\n                           0.5532029867172241,\n                           0.622842013835907,\n                           0.6959879994392395,\n                           0.6959879994392395,\n                           0.17663900554180145,\n                           0.6703829765319824,\n                           0.7403979897499084,\n                           0.048958998173475266,\n                           0.5562090277671814,\n                           0.8310419917106628,\n                           0,\n                           0.5777599811553955,\n                           0.19519099593162537,\n                           0.792523980140686,\n                           0.7223830223083496,\n                           0.2989560067653656,\n                           0.623528003692627,\n                           0.9094089865684509,\n                           0.3763520121574402,\n                           0.1770150065422058,\n                           0.902646005153656,\n                           0.4275760054588318,\n                           0.04906899854540825,\n                           0.8310419917106628,\n                           0.5562090277671814,\n                           0,\n                           0.6036490201950073,\n                           0.11919199675321579,\n                           0.7882900238037109,\n                           0.7723940014839172,\n                           0.15251100063323975,\n                           0.616562008857727,\n                           0.9660869836807251,\n                           0.19075599312782288,\n                           0.1740349978208542,\n                           0.9799150228500366,\n                           0.19348600506782532,\n                           0.048277001827955246,\n                           0.9810580015182495,\n                           0.1937119960784912,\n                           0,\n                           0.9999480247497559,\n                           0.006622000131756067,\n                           0.007786999922245741,\n                           0.9989290237426758,\n                           0.04125700145959854,\n                           -0.020945999771356583,\n                           0.9700260162353516,\n                           -0.18230900168418884,\n                           0.1606609970331192,\n                           0.9929869771003723,\n                           -0.1116809993982315,\n                           0.038782998919487,\n                           0.8677089810371399,\n                           -0.30993399024009705,\n                           0.38861599564552307,\n                           0.9675049781799316,\n                           -0.18179599940776825,\n                           0.17574100196361542,\n                           0.6127229928970337,\n                           -0.23797500133514404,\n                           0.753616988658905,\n                           0.781611979007721,\n                           -0.1585649996995926,\n                           0.6032750010490417,\n                           0.13049399852752686,\n                           -0.02585900016129017,\n                           0.9911119937896729,\n                           0.16583800315856934,\n                           -0.04606600105762482,\n                           0.9850770235061646,\n                           0.9847609996795654,\n                           -0.03004699945449829,\n                           -0.17129500210285187,\n                           0.9463850259780884,\n                           0.008138000033795834,\n                           0.3229379951953888,\n                           0.6942890286445618,\n                           0.06011800095438957,\n                           0.7171810269355774,\n                           0.405923992395401,\n                           0.09244199842214584,\n                           0.9092199802398682,\n                           0.1477230042219162,\n                           0.0024739999789744616,\n                           0.9890260100364685,\n                           0.991798996925354,\n                           -0.11557900160551071,\n                           -0.05454900115728378,\n                           0.9920099973678589,\n                           0.07202500104904175,\n                           0.10358300060033798,\n                           0.8882240056991577,\n                           0.2238840013742447,\n                           0.40116599202156067,\n                           0.6046879887580872,\n                           0.13691100478172302,\n                           0.7846069931983948,\n                           0.12908099591732025,\n                           -0.06111999973654747,\n                           0.989749014377594,\n                           0.9954820275306702,\n                           -0.09436299651861191,\n                           0.010502999648451805,\n                           0.9981970191001892,\n                           0.012060999870300293,\n                           0.05880200117826462,\n                           0.9550639986991882,\n                           0.09819000214338303,\n                           0.27966299653053284,\n                           0.6606940031051636,\n                           0.05169999971985817,\n                           0.7488729953765869,\n                           0.07273799926042557,\n                           -0.04034300148487091,\n                           0.9965350031852722,\n                           0.9999179840087891,\n                           0.007191000040620565,\n                           0.010560999624431133,\n                           0.9989050030708313,\n                           0.04436499997973442,\n                           -0.014883999712765217,\n                           0.9694769978523254,\n                           -0.17860299348831177,\n                           0.1679760068655014,\n                           0.9924619793891907,\n                           -0.10775599628686905,\n                           0.058378998190164566,\n                           0.8567489981651306,\n                           -0.28829601407051086,\n                           0.4276289939880371,\n                           0.9473999738693237,\n                           -0.16112199425697327,\n                           0.27653801441192627,\n                           0.5627779960632324,\n                           -0.19747799634933472,\n                           0.8026729822158813,\n                           0.6577669978141785,\n                           -0.11438000202178955,\n                           0.7444859743118286,\n                           0.07901199907064438,\n                           0.0013689999468624592,\n                           0.9968730211257935,\n                           0.07274100184440613,\n                           -0.02020600065588951,\n                           0.9971460103988647,\n                           0.9888780117034912,\n                           0.025808999314904213,\n                           -0.14647500216960907,\n                           0.9453979730606079,\n                           -0.006663000211119652,\n                           0.3258500099182129,\n                           0.6921399831771851,\n                           -0.04972299933433533,\n                           0.7200480103492737,\n                           0.3957499861717224,\n                           -0.08134900033473969,\n                           0.9147480130195618,\n                           0.13914500176906586,\n                           -0.00007899999764049426,\n                           0.9902719855308533,\n                           0.9924669861793518,\n                           -0.10311000049114227,\n                           -0.06616800278425217,\n                           0.9926300048828125,\n                           0.07926999777555466,\n                           0.09165900200605392,\n                           0.900858998298645,\n                           0.2553130090236664,\n                           0.3510949909687042,\n                           0.6513699889183044,\n                           0.18318000435829163,\n                           0.7363160252571106,\n                           0.15978699922561646,\n                           -0.02714099921286106,\n                           0.9867780208587646,\n                           0.9955620169639587,\n                           -0.09379199892282486,\n                           0.0077309999614953995,\n                           0.9991030097007751,\n                           0.01610800065100193,\n                           0.039149001240730286,\n                           0.9764699935913086,\n                           0.12068899720907211,\n                           0.17871999740600586,\n                           0.7859060168266296,\n                           0.10103499889373779,\n                           0.6100350022315979,\n                           0.16579000651836395,\n                           -0.014832000248134136,\n                           0.986050009727478,\n                           0.1655299961566925,\n                           -0.10078699886798859,\n                           0.9810410141944885,\n                           -0.0046790000051259995,\n                           -0.1750659942626953,\n                           0.9845460057258606,\n                           -0.3859579861164093,\n                           -0.06494200229644775,\n                           0.9202280044555664,\n                           -0.3219670057296753,\n                           -0.05600599944591522,\n                           0.9450929760932922,\n                           -0.6471610069274902,\n                           -0.11495299637317657,\n                           0.7536370158195496,\n                           -0.5616440176963806,\n                           -0.078855000436306,\n                           0.8236119747161865,\n                           -0.8379700183868408,\n                           -0.23749999701976776,\n                           0.4913240075111389,\n                           -0.7512590289115906,\n                           -0.1447169929742813,\n                           0.6439470052719116,\n                           -0.9052090048789978,\n                           -0.2807050049304962,\n                           0.3190630078315735,\n                           -0.8249419927597046,\n                           -0.2209009975194931,\n                           0.5202630162239075,\n                           -0.13363699615001678,\n                           0.0291920006275177,\n                           0.9905999898910522,\n                           -0.4039649963378906,\n                           0.0019519999623298645,\n                           0.9147719740867615,\n                           -0.7191359996795654,\n                           0.002443999983370304,\n                           0.6948649883270264,\n                           -0.9637579917907715,\n                           0.026884999126195908,\n                           0.26541900634765625,\n                           -0.9637719988822937,\n                           0.2207069993019104,\n                           -0.14977200329303741,\n                           0.03522900119423866,\n                           0.06716900318861008,\n                           0.9971190094947815,\n                           -0.3620629906654358,\n                           -0.01676199957728386,\n                           0.9320030212402344,\n                           -0.6534259915351868,\n                           0.007120999973267317,\n                           0.7569569945335388,\n                           -0.8528590202331543,\n                           0.11686599999666214,\n                           0.5088940262794495,\n                           -0.8814889788627625,\n                           0.3579840064048767,\n                           0.3079349994659424,\n                           0.0726580023765564,\n                           0.02018200047314167,\n                           0.9971529841423035,\n                           -0.37608298659324646,\n                           -0.025955000892281532,\n                           0.926222026348114,\n                           -0.6568350195884705,\n                           -0.015021000057458878,\n                           0.7538840174674988,\n                           -0.8238760232925415,\n                           0.03257700055837631,\n                           0.5658339858055115,\n                           -0.8688690066337585,\n                           0.13078700006008148,\n                           0.4774540066719055,\n                           0.07265599817037582,\n                           -0.07700400054454803,\n                           0.994379997253418,\n                           -0.0343950018286705,\n                           -0.151870995759964,\n                           0.9878020286560059,\n                           -0.40362000465393066,\n                           -0.05282000079751015,\n                           0.9134010076522827,\n                           -0.37586501240730286,\n                           -0.041078001260757446,\n                           0.9257640242576599,\n                           -0.6878190040588379,\n                           -0.0810059979557991,\n                           0.721347987651825,\n                           -0.6558970212936401,\n                           -0.052101001143455505,\n                           0.7530509829521179,\n                           -0.8708800077438354,\n                           -0.2062380015850067,\n                           0.44613200426101685,\n                           -0.8175939917564392,\n                           -0.12448199838399887,\n                           0.5621780157089233,\n                           -0.8926960229873657,\n                           -0.3055669963359833,\n                           0.33124300837516785,\n                           -0.8565059900283813,\n                           -0.21024300158023834,\n                           0.4713769853115082,\n                           -0.15155400335788727,\n                           -0.025412000715732574,\n                           0.9881219863891602,\n                           -0.41033700108528137,\n                           -0.0026420000940561295,\n                           0.9119300246238708,\n                           -0.7240620255470276,\n                           0.00047400000039488077,\n                           0.6897349953651428,\n                           -0.9655590057373047,\n                           -0.017078999429941177,\n                           0.2596229910850525,\n                           -0.973825991153717,\n                           -0.19711799919605255,\n                           -0.1131730005145073,\n                           0.06214199960231781,\n                           0.08235500007867813,\n                           0.9946640133857727,\n                           -0.3334290087223053,\n                           0.007625999860465527,\n                           0.9427440166473389,\n                           -0.608610987663269,\n                           0.04885999858379364,\n                           0.7919629812240601,\n                           -0.8253309726715088,\n                           0.14631199836730957,\n                           0.5453640222549438,\n                           -0.9105669856071472,\n                           0.3146660029888153,\n                           0.2680560052394867,\n                           0.16523399949073792,\n                           0.04589800164103508,\n                           0.985185980796814,\n                           -0.32260099053382874,\n                           -0.010471000336110592,\n                           0.9464769959449768,\n                           -0.5639140009880066,\n                           0.015166000463068485,\n                           0.8256940245628357,\n                           -0.758965015411377,\n                           0.05617399886250496,\n                           0.6487039923667908,\n                           -0.8382350206375122,\n                           0.14245299994945526,\n                           0.5263739824295044,\n                           0.9727830290794373,\n                           -0.019794000312685966,\n                           0.2308720052242279,\n                           0.9828159809112549,\n                           -0.036465998739004135,\n                           0.18095199763774872,\n                           0.9050639867782593,\n                           -0.02252200059592724,\n                           0.4246790111064911,\n                           0.8354039788246155,\n                           -0.03220000118017197,\n                           0.5486930012702942,\n                           0.6465700268745422,\n                           -0.045921001583337784,\n                           0.7614709734916687,\n                           0.4826749861240387,\n                           -0.04895399883389473,\n                           0.8744300007820129,\n                           0.4453999996185303,\n                           0.17256900668144226,\n                           0.8785430192947388,\n                           0.47231200337409973,\n                           0.13768500089645386,\n                           0.8706120252609253,\n                           0.4824250042438507,\n                           0.3898639976978302,\n                           0.7843930125236511,\n                           0.641398012638092,\n                           0.4275979995727539,\n                           0.6370000243186951,\n                           0.9863939881324768,\n                           0.0994419977068901,\n                           0.13091400265693665,\n                           0.9154840111732483,\n                           0.2120320051908493,\n                           0.34195101261138916,\n                           0.7246469855308533,\n                           0.245046004652977,\n                           0.6440799832344055,\n                           0.35685500502586365,\n                           0.17885500192642212,\n                           0.9168779850006104,\n                           0.14101800322532654,\n                           0.24263200163841248,\n                           0.9598140120506287,\n                           0.9366779923439026,\n                           0.16484400629997253,\n                           0.3089669942855835,\n                           0.7982620000839233,\n                           0.2441370040178299,\n                           0.5506129860877991,\n                           0.4769439995288849,\n                           0.2904820144176483,\n                           0.8295450210571289,\n                           0.4125959873199463,\n                           -0.017246000468730927,\n                           0.9107509851455688,\n                           0.341374009847641,\n                           -0.37689098715782166,\n                           0.8610560297966003,\n                           0.9026100039482117,\n                           0.14119599759578705,\n                           0.40664398670196533,\n                           0.7326020002365112,\n                           0.1491979956626892,\n                           0.6641039848327637,\n                           0.38115599751472473,\n                           0.15792299807071686,\n                           0.9109230041503906,\n                           0.5317370295524597,\n                           -0.02143399976193905,\n                           0.846638023853302,\n                           0.7915729880332947,\n                           -0.3539769947528839,\n                           0.49810999631881714,\n                           0.9087340235710144,\n                           -0.07959599792957306,\n                           0.40971601009368896,\n                           0.9386569857597351,\n                           -0.17680299282073975,\n                           0.29607900977134705,\n                           0.7781569957733154,\n                           -0.19467000663280487,\n                           0.5971400141716003,\n                           0.738847017288208,\n                           -0.07674700021743774,\n                           0.6694890260696411,\n                           0.43915998935699463,\n                           -0.22276799380779266,\n                           0.870352029800415,\n                           0.3863860070705414,\n                           -0.0790880024433136,\n                           0.918940007686615,\n                           0.3576120138168335,\n                           0.07325199991464615,\n                           0.9309930205345154,\n                           0.5227140188217163,\n                           0.16167999804019928,\n                           0.8370360136032104,\n                           0.4246380031108856,\n                           0.3233239948749542,\n                           0.845661997795105,\n                           0.733618974685669,\n                           0.48907899856567383,\n                           0.4718089997768402,\n                           0.9886019825935364,\n                           -0.10717800259590149,\n                           0.10573200136423111,\n                           0.9131960272789001,\n                           -0.22303399443626404,\n                           0.3410690128803253,\n                           0.7163559794425964,\n                           -0.25636500120162964,\n                           0.6489310264587402,\n                           0.35149699449539185,\n                           -0.15968100726604462,\n                           0.922469973564148,\n                           0.07999800145626068,\n                           -0.2107039988040924,\n                           0.9742709994316101,\n                           0.9883249998092651,\n                           0.04732999950647354,\n                           0.14482200145721436,\n                           0.9210500121116638,\n                           0.07413999736309052,\n                           0.3823229968547821,\n                           0.6804890036582947,\n                           0.11895299702882767,\n                           0.7230389714241028,\n                           0.4935390055179596,\n                           -0.10269299894571304,\n                           0.8636389970779419,\n                           0.3912479877471924,\n                           -0.4752289950847626,\n                           0.7880880236625671,\n                           0.9700270295143127,\n                           0.07970499992370605,\n                           0.2295520007610321,\n                           0.831250011920929,\n                           0.10592100024223328,\n                           0.5457149744033813,\n                           0.4774230122566223,\n                           0.13252699375152588,\n                           0.8686220049858093,\n                           0.47922399640083313,\n                           -0.0024129999801516533,\n                           0.877689003944397,\n                           0.6902980208396912,\n                           -0.29711300134658813,\n                           0.6597059965133667,\n                           0.6312130093574524,\n                           0.4550989866256714,\n                           0.628055989742279,\n                           0.26494699716567993,\n                           0.5426689982414246,\n                           0.797065019607544,\n                           0.4216960072517395,\n                           0.6728450059890747,\n                           0.6078259944915771,\n                           0.7324270009994507,\n                           0.5829970240592957,\n                           0.35166099667549133,\n                           0.5086709856987,\n                           0.8606399893760681,\n                           -0.023507000878453255,\n                           0.7640720009803772,\n                           0.6449369788169861,\n                           -0.015798000618815422,\n                           0.19029100239276886,\n                           0.2773289978504181,\n                           -0.9417420029640198,\n                           0.02588699944317341,\n                           0.0005750000127591193,\n                           -0.9996650218963623,\n                           -0.33045700192451477,\n                           -0.4387669861316681,\n                           -0.8356329798698425,\n                           -0.6271269917488098,\n                           -0.4645389914512634,\n                           -0.6252319812774658,\n                           -0.02311599999666214,\n                           0.2469020038843155,\n                           0.9687650203704834,\n                           -0.012950999662280083,\n                           0.45514100790023804,\n                           0.8903250098228455,\n                           -0.001180000021122396,\n                           0.9888520240783691,\n                           0.14889399707317352,\n                           0.019520999863743782,\n                           0.6841210126876831,\n                           -0.7291070222854614,\n                           0.012253000400960445,\n                           0.007784999907016754,\n                           -0.9998949766159058,\n                           0.3314639925956726,\n                           -0.3832260072231293,\n                           0.8621309995651245,\n                           0.08274699747562408,\n                           -0.16047699749469757,\n                           0.9835649728775024,\n                           -0.381630003452301,\n                           0.638043999671936,\n                           0.6687729954719543,\n                           -0.44988399744033813,\n                           0.787883996963501,\n                           -0.42052799463272095,\n                           -0.2780170142650604,\n                           0.5983560085296631,\n                           -0.7514500021934509,\n                           0.7378140091896057,\n                           -0.4918749928474426,\n                           0.4622659981250763,\n                           0.6153389811515808,\n                           -0.45540300011634827,\n                           0.6434019804000854,\n                           -0.43678900599479675,\n                           0.33411499857902527,\n                           0.8352140188217163,\n                           -0.7429530024528503,\n                           0.6388909816741943,\n                           -0.1995989978313446,\n                           -0.7432950139045715,\n                           0.5977380275726318,\n                           -0.3003700077533722,\n                           0.7197920083999634,\n                           0.5168960094451904,\n                           0.4633769989013672,\n                           0.22183099389076233,\n                           0.4485720098018646,\n                           0.8657789826393127,\n                           0.08203200250864029,\n                           0.15848000347614288,\n                           0.9839479923248291,\n                           0.5953459739685059,\n                           0.4811680018901825,\n                           0.6434599757194519,\n                           -0.37556400895118713,\n                           -0.6215270161628723,\n                           0.6875,\n                           -0.42666301131248474,\n                           -0.33534398674964905,\n                           0.8399419784545898,\n                           -0.44476398825645447,\n                           -0.7887529730796814,\n                           -0.42432600259780884,\n                           -0.7557309865951538,\n                           -0.6222699880599976,\n                           -0.20408600568771362,\n                           -0.4292669892311096,\n                           -0.5361850261688232,\n                           -0.7267979979515076,\n                           -0.7655900120735168,\n                           -0.5671039819717407,\n                           -0.30375200510025024,\n                           0.007348000071942806,\n                           -0.21113499999046326,\n                           0.9774289727210999,\n                           -0.01990099996328354,\n                           -0.4373210072517395,\n                           0.8990849852561951,\n                           -0.008775000460445881,\n                           -0.9864199757575989,\n                           0.16400499641895294,\n                           0.024855999276041985,\n                           -0.6829339861869812,\n                           -0.7300570011138916,\n                           0.014514000155031681,\n                           0.03655200079083443,\n                           -0.9992259740829468,\n                           0.40192899107933044,\n                           -0.4676550030708313,\n                           0.7872430086135864,\n                           0.41696101427078247,\n                           -0.6813820004463196,\n                           0.6015490293502808,\n                           0.5033609867095947,\n                           -0.8637740015983582,\n                           -0.022839000448584557,\n                           0.2058819979429245,\n                           -0.2945750057697296,\n                           -0.9331870079040527,\n                           -0.2351589947938919,\n                           0.5535579919815063,\n                           -0.7989199757575989,\n                           0.6533820033073425,\n                           -0.435588002204895,\n                           0.619156002998352,\n                           0.7555500268936157,\n                           -0.554410994052887,\n                           0.3489600121974945,\n                           0.7765160202980042,\n                           -0.6298360228538513,\n                           -0.01814199984073639,\n                           0.025975000113248825,\n                           0.008264999836683273,\n                           -0.9996280074119568,\n                           -0.6086519956588745,\n                           0.49536699056625366,\n                           -0.6198019981384277,\n                           -0.9813200235366821,\n                           0.19238099455833435,\n                           0,\n                           -0.831650972366333,\n                           0.5552989840507507,\n                           0,\n                           -0.4425640106201172,\n                           0.38308998942375183,\n                           0.8107889890670776,\n                           -0.5623509883880615,\n                           0.11026400327682495,\n                           0.8195139765739441,\n                           0.367917001247406,\n                           -0.15178599953651428,\n                           0.917385995388031,\n                           0.3960669934749603,\n                           -0.07774800062179565,\n                           0.9149240255355835,\n                           0.3283520042896271,\n                           -0.13562799990177155,\n                           0.9347670078277588,\n                           0.3530749976634979,\n                           -0.06952299922704697,\n                           0.9330080151557922,\n                           -0.5935590267181396,\n                           0.20035800337791443,\n                           0.7794510126113892,\n                           -0.6201800107955933,\n                           0.12245599925518036,\n                           0.7748429775238037,\n                           -0.5552989840507507,\n                           0.831650972366333,\n                           0,\n                           -0.2616960108280182,\n                           0.523730993270874,\n                           0.8106920123100281,\n                           0.2819640040397644,\n                           -0.2819199860095978,\n                           0.9170699715614319,\n                           0.25169798731803894,\n                           -0.25161200761795044,\n                           0.9345269799232483,\n                           -0.4710330069065094,\n                           0.41249701380729675,\n                           0.7797269821166992,\n                           -0.19238099455833435,\n                           0.9813200235366821,\n                           0,\n                           -0.04031100124120712,\n                           0.5840420126914978,\n                           0.8107219934463501,\n                           0.1517850011587143,\n                           -0.3678950071334839,\n                           0.9173960089683533,\n                           0.13561999797821045,\n                           -0.3282899856567383,\n                           0.9347900152206421,\n                           -0.27737799286842346,\n                           0.561601996421814,\n                           0.779528021812439,\n                           -1,\n                           0,\n                           0,\n                           0.29074999690055847,\n                           0.5413560271263123,\n                           0.7889220118522644,\n                           0.07767199724912643,\n                           -0.39607399702072144,\n                           0.9149270057678223,\n                           0.0693729966878891,\n                           -0.3530940115451813,\n                           0.9330130219459534,\n                           -0.12221000343561172,\n                           0.6202139854431152,\n                           0.7748550176620483,\n                           0.19238099455833435,\n                           0.9813200235366821,\n                           0,\n                           0.5552989840507507,\n                           0.831650972366333,\n                           0,\n                           0.38308998942375183,\n                           0.4425640106201172,\n                           0.8107889890670776,\n                           0.11026400327682495,\n                           0.5623509883880615,\n                           0.8195139765739441,\n                           -0.15178599953651428,\n                           -0.367917001247406,\n                           0.917385995388031,\n                           -0.07774800062179565,\n                           -0.3960669934749603,\n                           0.9149240255355835,\n                           -0.13562799990177155,\n                           -0.3283520042896271,\n                           0.9347670078277588,\n                           -0.06952299922704697,\n                           -0.3530749976634979,\n                           0.9330080151557922,\n                           0.20035800337791443,\n                           0.5935590267181396,\n                           0.7794510126113892,\n                           0.12245599925518036,\n                           0.6201800107955933,\n                           0.7748429775238037,\n                           0.831650972366333,\n                           0.5552989840507507,\n                           0,\n                           0.523730993270874,\n                           0.2616960108280182,\n                           0.8106920123100281,\n                           -0.2819199860095978,\n                           -0.2819640040397644,\n                           0.9170699715614319,\n                           -0.25161200761795044,\n                           -0.25169798731803894,\n                           0.9345269799232483,\n                           0.41249701380729675,\n                           0.4710330069065094,\n                           0.7797269821166992,\n                           0.9813200235366821,\n                           0.19238099455833435,\n                           0,\n                           0.5840420126914978,\n                           0.04031100124120712,\n                           0.8107219934463501,\n                           -0.3678950071334839,\n                           -0.1517850011587143,\n                           0.9173960089683533,\n                           -0.3282899856567383,\n                           -0.13561999797821045,\n                           0.9347900152206421,\n                           0.561601996421814,\n                           0.27737799286842346,\n                           0.779528021812439,\n                           -1,\n                           0,\n                           0,\n                           0.5413560271263123,\n                           -0.29074999690055847,\n                           0.7889220118522644,\n                           -0.39607399702072144,\n                           -0.07767199724912643,\n                           0.9149270057678223,\n                           -0.3530940115451813,\n                           -0.0693729966878891,\n                           0.9330130219459534,\n                           0.6202139854431152,\n                           0.12221000343561172,\n                           0.7748550176620483,\n                           0.9813200235366821,\n                           -0.19238099455833435,\n                           0,\n                           0.831650972366333,\n                           -0.5552989840507507,\n                           0,\n                           0.4425640106201172,\n                           -0.38308998942375183,\n                           0.8107889890670776,\n                           0.5623509883880615,\n                           -0.11026400327682495,\n                           0.8195139765739441,\n                           -0.367917001247406,\n                           0.15178599953651428,\n                           0.917385995388031,\n                           -0.3960669934749603,\n                           0.07774800062179565,\n                           0.9149240255355835,\n                           -0.3283520042896271,\n                           0.13562799990177155,\n                           0.9347670078277588,\n                           -0.3530749976634979,\n                           0.06952299922704697,\n                           0.9330080151557922,\n                           0.5935590267181396,\n                           -0.20035800337791443,\n                           0.7794510126113892,\n                           0.6201800107955933,\n                           -0.12245599925518036,\n                           0.7748429775238037,\n                           0.5552989840507507,\n                           -0.831650972366333,\n                           0,\n                           0.2616960108280182,\n                           -0.523730993270874,\n                           0.8106920123100281,\n                           -0.2819640040397644,\n                           0.2819199860095978,\n                           0.9170699715614319,\n                           -0.25169798731803894,\n                           0.25161200761795044,\n                           0.9345269799232483,\n                           0.4710330069065094,\n                           -0.41249701380729675,\n                           0.7797269821166992,\n                           0.19238099455833435,\n                           -0.9813200235366821,\n                           0,\n                           0.04031100124120712,\n                           -0.5840420126914978,\n                           0.8107219934463501,\n                           -0.1517850011587143,\n                           0.3678950071334839,\n                           0.9173960089683533,\n                           -0.13561999797821045,\n                           0.3282899856567383,\n                           0.9347900152206421,\n                           0.27737799286842346,\n                           -0.561601996421814,\n                           0.779528021812439,\n                           -1,\n                           0,\n                           0,\n                           -0.29074999690055847,\n                           -0.5413560271263123,\n                           0.7889220118522644,\n                           -0.07767199724912643,\n                           0.39607399702072144,\n                           0.9149270057678223,\n                           -0.0693729966878891,\n                           0.3530940115451813,\n                           0.9330130219459534,\n                           0.12221000343561172,\n                           -0.6202139854431152,\n                           0.7748550176620483,\n                           -0.19238099455833435,\n                           -0.9813200235366821,\n                           0,\n                           -0.5552989840507507,\n                           -0.831650972366333,\n                           0,\n                           -0.38308998942375183,\n                           -0.4425640106201172,\n                           0.8107889890670776,\n                           -0.11026400327682495,\n                           -0.5623509883880615,\n                           0.8195139765739441,\n                           0.15178599953651428,\n                           0.367917001247406,\n                           0.917385995388031,\n                           0.07774800062179565,\n                           0.3960669934749603,\n                           0.9149240255355835,\n                           0.13562799990177155,\n                           0.3283520042896271,\n                           0.9347670078277588,\n                           0.06952299922704697,\n                           0.3530749976634979,\n                           0.9330080151557922,\n                           -0.20035800337791443,\n                           -0.5935590267181396,\n                           0.7794510126113892,\n                           -0.12245599925518036,\n                           -0.6201800107955933,\n                           0.7748429775238037,\n                           -0.831650972366333,\n                           -0.5552989840507507,\n                           0,\n                           -0.523730993270874,\n                           -0.2616960108280182,\n                           0.8106920123100281,\n                           0.2819199860095978,\n                           0.2819640040397644,\n                           0.9170699715614319,\n                           0.25161200761795044,\n                           0.25169798731803894,\n                           0.9345269799232483,\n                           -0.41249701380729675,\n                           -0.4710330069065094,\n                           0.7797269821166992,\n                           -0.9813200235366821,\n                           -0.19238099455833435,\n                           0,\n                           -0.5840420126914978,\n                           -0.04031100124120712,\n                           0.8107219934463501,\n                           0.3678950071334839,\n                           0.1517850011587143,\n                           0.9173960089683533,\n                           0.3282899856567383,\n                           0.13561999797821045,\n                           0.9347900152206421,\n                           -0.561601996421814,\n                           -0.27737799286842346,\n                           0.779528021812439,\n                           -1,\n                           0,\n                           0,\n                           -0.5413560271263123,\n                           0.29074999690055847,\n                           0.7889220118522644,\n                           0.39607399702072144,\n                           0.07767199724912643,\n                           0.9149270057678223,\n                           0.3530940115451813,\n                           0.0693729966878891,\n                           0.9330130219459534,\n                           -0.6202139854431152,\n                           -0.12221000343561172,\n                           0.7748550176620483,\n                           -0.6201800107955933,\n                           0.12245599925518036,\n                           0.7748429775238037,\n                           -0.5616469979286194,\n                           0.27755099534988403,\n                           0.7794349789619446,\n                           -0.8979210257530212,\n                           0.37159600853919983,\n                           0.23590999841690063,\n                           -0.9542099833488464,\n                           0.18841099739074707,\n                           0.23234599828720093,\n                           -0.9101200103759766,\n                           0.3766449987888336,\n                           0.17268399894237518,\n                           -0.966795027256012,\n                           0.19089600443840027,\n                           0.16990099847316742,\n                           -0.8549879789352417,\n                           0.35383298993110657,\n                           0.3792079985141754,\n                           -0.9100499749183655,\n                           0.17969100177288055,\n                           0.3735229969024658,\n                           -0.8064150214195251,\n                           0.2724289894104004,\n                           0.5248600244522095,\n                           -0.8383409976959229,\n                           0.16553199291229248,\n                           0.5194069743156433,\n                           -0.4125959873199463,\n                           0.47094500064849854,\n                           0.7797279953956604,\n                           -0.687192976474762,\n                           0.687192976474762,\n                           0.23565199971199036,\n                           -0.6965190172195435,\n                           0.6965190172195435,\n                           0.17240400612354279,\n                           -0.6544880270957947,\n                           0.6544870138168335,\n                           0.37853899598121643,\n                           -0.6404970288276672,\n                           0.5611429810523987,\n                           0.5242909789085388,\n                           -0.20047900080680847,\n                           0.5933949947357178,\n                           0.7795450091362,\n                           -0.3715969920158386,\n                           0.8979210257530212,\n                           0.23590999841690063,\n                           -0.3766449987888336,\n                           0.9101200103759766,\n                           0.17268399894237518,\n                           -0.35383298993110657,\n                           0.8549879789352417,\n                           0.3792079985141754,\n                           -0.3770729899406433,\n                           0.7630789875984192,\n                           0.5249059796333313,\n                           -0.12245900183916092,\n                           0.6201940178871155,\n                           0.7748309969902039,\n                           -0.18841099739074707,\n                           0.9542099833488464,\n                           0.23234599828720093,\n                           -0.19089600443840027,\n                           0.966795027256012,\n                           0.16990099847316742,\n                           -0.17969200015068054,\n                           0.9100499749183655,\n                           0.3735229969024658,\n                           -0.16553199291229248,\n                           0.8383409976959229,\n                           0.5194069743156433,\n                           0.12245599925518036,\n                           0.6201800107955933,\n                           0.7748429775238037,\n                           0.27755099534988403,\n                           0.5616469979286194,\n                           0.7794349789619446,\n                           0.37159600853919983,\n                           0.8979210257530212,\n                           0.23590999841690063,\n                           0.18841099739074707,\n                           0.9542099833488464,\n                           0.23234599828720093,\n                           0.3766449987888336,\n                           0.9101200103759766,\n                           0.17268399894237518,\n                           0.19089600443840027,\n                           0.966795027256012,\n                           0.16990099847316742,\n                           0.35383298993110657,\n                           0.8549879789352417,\n                           0.3792079985141754,\n                           0.17969100177288055,\n                           0.9100499749183655,\n                           0.3735229969024658,\n                           0.2724289894104004,\n                           0.8064150214195251,\n                           0.5248600244522095,\n                           0.16553199291229248,\n                           0.8383409976959229,\n                           0.5194069743156433,\n                           0.47094500064849854,\n                           0.4125959873199463,\n                           0.7797279953956604,\n                           0.687192976474762,\n                           0.687192976474762,\n                           0.23565199971199036,\n                           0.6965190172195435,\n                           0.6965190172195435,\n                           0.17240400612354279,\n                           0.6544870138168335,\n                           0.6544880270957947,\n                           0.37853899598121643,\n                           0.5611429810523987,\n                           0.6404970288276672,\n                           0.5242909789085388,\n                           0.5933949947357178,\n                           0.20047900080680847,\n                           0.7795450091362,\n                           0.8979210257530212,\n                           0.3715969920158386,\n                           0.23590999841690063,\n                           0.9101200103759766,\n                           0.3766449987888336,\n                           0.17268399894237518,\n                           0.8549879789352417,\n                           0.35383298993110657,\n                           0.3792079985141754,\n                           0.7630789875984192,\n                           0.3770729899406433,\n                           0.5249059796333313,\n                           0.6201940178871155,\n                           0.12245900183916092,\n                           0.7748309969902039,\n                           0.9542099833488464,\n                           0.18841099739074707,\n                           0.23234599828720093,\n                           0.966795027256012,\n                           0.19089600443840027,\n                           0.16990099847316742,\n                           0.9100499749183655,\n                           0.17969200015068054,\n                           0.3735229969024658,\n                           0.8383409976959229,\n                           0.16553199291229248,\n                           0.5194069743156433,\n                           0.6201800107955933,\n                           -0.12245599925518036,\n                           0.7748429775238037,\n                           0.5616469979286194,\n                           -0.27755099534988403,\n                           0.7794349789619446,\n                           0.8979210257530212,\n                           -0.37159600853919983,\n                           0.23590999841690063,\n                           0.9542099833488464,\n                           -0.18841099739074707,\n                           0.23234599828720093,\n                           0.9101200103759766,\n                           -0.3766449987888336,\n                           0.17268399894237518,\n                           0.966795027256012,\n                           -0.19089600443840027,\n                           0.16990099847316742,\n                           0.8549879789352417,\n                           -0.35383298993110657,\n                           0.3792079985141754,\n                           0.9100499749183655,\n                           -0.17969100177288055,\n                           0.3735229969024658,\n                           0.8064150214195251,\n                           -0.2724289894104004,\n                           0.5248600244522095,\n                           0.8383409976959229,\n                           -0.16553199291229248,\n                           0.5194069743156433,\n                           0.4125959873199463,\n                           -0.47094500064849854,\n                           0.7797279953956604,\n                           0.687192976474762,\n                           -0.687192976474762,\n                           0.23565199971199036,\n                           0.6965190172195435,\n                           -0.6965190172195435,\n                           0.17240400612354279,\n                           0.6544880270957947,\n                           -0.6544870138168335,\n                           0.37853899598121643,\n                           0.6404970288276672,\n                           -0.5611429810523987,\n                           0.5242909789085388,\n                           0.20047900080680847,\n                           -0.5933949947357178,\n                           0.7795450091362,\n                           0.3715969920158386,\n                           -0.8979210257530212,\n                           0.23590999841690063,\n                           0.3766449987888336,\n                           -0.9101200103759766,\n                           0.17268399894237518,\n                           0.35383298993110657,\n                           -0.8549879789352417,\n                           0.3792079985141754,\n                           0.3770729899406433,\n                           -0.7630789875984192,\n                           0.5249059796333313,\n                           0.12245900183916092,\n                           -0.6201940178871155,\n                           0.7748309969902039,\n                           0.18841099739074707,\n                           -0.9542099833488464,\n                           0.23234599828720093,\n                           0.19089600443840027,\n                           -0.966795027256012,\n                           0.16990099847316742,\n                           0.17969200015068054,\n                           -0.9100499749183655,\n                           0.3735229969024658,\n                           0.16553199291229248,\n                           -0.8383409976959229,\n                           0.5194069743156433,\n                           -0.12245599925518036,\n                           -0.6201800107955933,\n                           0.7748429775238037,\n                           -0.27755099534988403,\n                           -0.5616469979286194,\n                           0.7794349789619446,\n                           -0.37159600853919983,\n                           -0.8979210257530212,\n                           0.23590999841690063,\n                           -0.18841099739074707,\n                           -0.9542099833488464,\n                           0.23234599828720093,\n                           -0.3766449987888336,\n                           -0.9101200103759766,\n                           0.17268399894237518,\n                           -0.19089600443840027,\n                           -0.966795027256012,\n                           0.16990099847316742,\n                           -0.35383298993110657,\n                           -0.8549879789352417,\n                           0.3792079985141754,\n                           -0.17969100177288055,\n                           -0.9100499749183655,\n                           0.3735229969024658,\n                           -0.2724289894104004,\n                           -0.8064150214195251,\n                           0.5248600244522095,\n                           -0.16553199291229248,\n                           -0.8383409976959229,\n                           0.5194069743156433,\n                           -0.47094500064849854,\n                           -0.4125959873199463,\n                           0.7797279953956604,\n                           -0.687192976474762,\n                           -0.687192976474762,\n                           0.23565199971199036,\n                           -0.6965190172195435,\n                           -0.6965190172195435,\n                           0.17240400612354279,\n                           -0.6544870138168335,\n                           -0.6544880270957947,\n                           0.37853899598121643,\n                           -0.5611429810523987,\n                           -0.6404970288276672,\n                           0.5242909789085388,\n                           -0.5933949947357178,\n                           -0.20047900080680847,\n                           0.7795450091362,\n                           -0.8979210257530212,\n                           -0.3715969920158386,\n                           0.23590999841690063,\n                           -0.9101200103759766,\n                           -0.3766449987888336,\n                           0.17268399894237518,\n                           -0.8549879789352417,\n                           -0.35383298993110657,\n                           0.3792079985141754,\n                           -0.7630789875984192,\n                           -0.3770729899406433,\n                           0.5249059796333313,\n                           -0.6201940178871155,\n                           -0.12245900183916092,\n                           0.7748309969902039,\n                           -0.9542099833488464,\n                           -0.18841099739074707,\n                           0.23234599828720093,\n                           -0.966795027256012,\n                           -0.19089600443840027,\n                           0.16990099847316742,\n                           -0.9100499749183655,\n                           -0.17969200015068054,\n                           0.3735229969024658,\n                           -0.8383409976959229,\n                           -0.16553199291229248,\n                           0.5194069743156433};\n\nfloat teapotTexCoords[] = {2,\n                           2,\n                           0,\n                           1.75,\n                           2,\n                           0,\n                           1.75,\n                           1.975000023841858,\n                           0,\n                           2,\n                           1.975000023841858,\n                           0,\n                           1.75,\n                           1.9500000476837158,\n                           0,\n                           2,\n                           1.9500000476837158,\n                           0,\n                           1.75,\n                           1.9249999523162842,\n                           0,\n                           2,\n                           1.9249999523162842,\n                           0,\n                           1.75,\n                           1.899999976158142,\n                           0,\n                           2,\n                           1.899999976158142,\n                           0,\n                           1.5,\n                           2,\n                           0,\n                           1.5,\n                           1.975000023841858,\n                           0,\n                           1.5,\n                           1.9500000476837158,\n                           0,\n                           1.5,\n                           1.9249999523162842,\n                           0,\n                           1.5,\n                           1.899999976158142,\n                           0,\n                           1.25,\n                           2,\n                           0,\n                           1.25,\n                           1.975000023841858,\n                           0,\n                           1.25,\n                           1.9500000476837158,\n                           0,\n                           1.25,\n                           1.9249999523162842,\n                           0,\n                           1.25,\n                           1.899999976158142,\n                           0,\n                           1,\n                           2,\n                           0,\n                           1,\n                           1.975000023841858,\n                           0,\n                           1,\n                           1.9500000476837158,\n                           0,\n                           1,\n                           1.9249999523162842,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           1,\n                           2,\n                           0,\n                           0.75,\n                           2,\n                           0,\n                           0.75,\n                           1.975000023841858,\n                           0,\n                           1,\n                           1.975000023841858,\n                           0,\n                           0.75,\n                           1.9500000476837158,\n                           0,\n                           1,\n                           1.9500000476837158,\n                           0,\n                           0.75,\n                           1.9249999523162842,\n                           0,\n                           1,\n                           1.9249999523162842,\n                           0,\n                           0.75,\n                           1.899999976158142,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           0.5,\n                           2,\n                           0,\n                           0.5,\n                           1.975000023841858,\n                           0,\n                           0.5,\n                           1.9500000476837158,\n                           0,\n                           0.5,\n                           1.9249999523162842,\n                           0,\n                           0.5,\n                           1.899999976158142,\n                           0,\n                           0.25,\n                           2,\n                           0,\n                           0.25,\n                           1.975000023841858,\n                           0,\n                           0.25,\n                           1.9500000476837158,\n                           0,\n                           0.25,\n                           1.9249999523162842,\n                           0,\n                           0.25,\n                           1.899999976158142,\n                           0,\n                           0,\n                           2,\n                           0,\n                           0,\n                           1.975000023841858,\n                           0,\n                           0,\n                           1.9500000476837158,\n                           0,\n                           0,\n                           1.9249999523162842,\n                           0,\n                           0,\n                           1.899999976158142,\n                           0,\n                           2,\n                           2,\n                           0,\n                           1.75,\n                           2,\n                           0,\n                           1.75,\n                           1.975000023841858,\n                           0,\n                           2,\n                           1.975000023841858,\n                           0,\n                           1.75,\n                           1.9500000476837158,\n                           0,\n                           2,\n                           1.9500000476837158,\n                           0,\n                           1.75,\n                           1.9249999523162842,\n                           0,\n                           2,\n                           1.9249999523162842,\n                           0,\n                           1.75,\n                           1.899999976158142,\n                           0,\n                           2,\n                           1.899999976158142,\n                           0,\n                           1.5,\n                           2,\n                           0,\n                           1.5,\n                           1.975000023841858,\n                           0,\n                           1.5,\n                           1.9500000476837158,\n                           0,\n                           1.5,\n                           1.9249999523162842,\n                           0,\n                           1.5,\n                           1.899999976158142,\n                           0,\n                           1.25,\n                           2,\n                           0,\n                           1.25,\n                           1.975000023841858,\n                           0,\n                           1.25,\n                           1.9500000476837158,\n                           0,\n                           1.25,\n                           1.9249999523162842,\n                           0,\n                           1.25,\n                           1.899999976158142,\n                           0,\n                           1,\n                           2,\n                           0,\n                           1,\n                           1.975000023841858,\n                           0,\n                           1,\n                           1.9500000476837158,\n                           0,\n                           1,\n                           1.9249999523162842,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           1,\n                           2,\n                           0,\n                           0.75,\n                           2,\n                           0,\n                           0.75,\n                           1.975000023841858,\n                           0,\n                           1,\n                           1.975000023841858,\n                           0,\n                           0.75,\n                           1.9500000476837158,\n                           0,\n                           1,\n                           1.9500000476837158,\n                           0,\n                           0.75,\n                           1.9249999523162842,\n                           0,\n                           1,\n                           1.9249999523162842,\n                           0,\n                           0.75,\n                           1.899999976158142,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           0.5,\n                           2,\n                           0,\n                           0.5,\n                           1.975000023841858,\n                           0,\n                           0.5,\n                           1.9500000476837158,\n                           0,\n                           0.5,\n                           1.9249999523162842,\n                           0,\n                           0.5,\n                           1.899999976158142,\n                           0,\n                           0.25,\n                           2,\n                           0,\n                           0.25,\n                           1.975000023841858,\n                           0,\n                           0.25,\n                           1.9500000476837158,\n                           0,\n                           0.25,\n                           1.9249999523162842,\n                           0,\n                           0.25,\n                           1.899999976158142,\n                           0,\n                           0,\n                           2,\n                           0,\n                           0,\n                           1.975000023841858,\n                           0,\n                           0,\n                           1.9500000476837158,\n                           0,\n                           0,\n                           1.9249999523162842,\n                           0,\n                           0,\n                           1.899999976158142,\n                           0,\n                           2,\n                           1.899999976158142,\n                           0,\n                           1.75,\n                           1.899999976158142,\n                           0,\n                           1.75,\n                           1.6749999523162842,\n                           0,\n                           2,\n                           1.6749999523162842,\n                           0,\n                           1.75,\n                           1.4500000476837158,\n                           0,\n                           2,\n                           1.4500000476837158,\n                           0,\n                           1.75,\n                           1.225000023841858,\n                           0,\n                           2,\n                           1.225000023841858,\n                           0,\n                           1.75,\n                           1,\n                           0,\n                           2,\n                           1,\n                           0,\n                           1.5,\n                           1.899999976158142,\n                           0,\n                           1.5,\n                           1.6749999523162842,\n                           0,\n                           1.5,\n                           1.4500000476837158,\n                           0,\n                           1.5,\n                           1.225000023841858,\n                           0,\n                           1.5,\n                           1,\n                           0,\n                           1.25,\n                           1.899999976158142,\n                           0,\n                           1.25,\n                           1.6749999523162842,\n                           0,\n                           1.25,\n                           1.4500000476837158,\n                           0,\n                           1.25,\n                           1.225000023841858,\n                           0,\n                           1.25,\n                           1,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           1,\n                           1.6749999523162842,\n                           0,\n                           1,\n                           1.4500000476837158,\n                           0,\n                           1,\n                           1.225000023841858,\n                           0,\n                           1,\n                           1,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           0.75,\n                           1.899999976158142,\n                           0,\n                           0.75,\n                           1.6749999523162842,\n                           0,\n                           1,\n                           1.6749999523162842,\n                           0,\n                           0.75,\n                           1.4500000476837158,\n                           0,\n                           1,\n                           1.4500000476837158,\n                           0,\n                           0.75,\n                           1.225000023841858,\n                           0,\n                           1,\n                           1.225000023841858,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.5,\n                           1.899999976158142,\n                           0,\n                           0.5,\n                           1.6749999523162842,\n                           0,\n                           0.5,\n                           1.4500000476837158,\n                           0,\n                           0.5,\n                           1.225000023841858,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.25,\n                           1.899999976158142,\n                           0,\n                           0.25,\n                           1.6749999523162842,\n                           0,\n                           0.25,\n                           1.4500000476837158,\n                           0,\n                           0.25,\n                           1.225000023841858,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0,\n                           1.899999976158142,\n                           0,\n                           0,\n                           1.6749999523162842,\n                           0,\n                           0,\n                           1.4500000476837158,\n                           0,\n                           0,\n                           1.225000023841858,\n                           0,\n                           0,\n                           1,\n                           0,\n                           2,\n                           1.899999976158142,\n                           0,\n                           1.75,\n                           1.899999976158142,\n                           0,\n                           1.75,\n                           1.6749999523162842,\n                           0,\n                           2,\n                           1.6749999523162842,\n                           0,\n                           1.75,\n                           1.4500000476837158,\n                           0,\n                           2,\n                           1.4500000476837158,\n                           0,\n                           1.75,\n                           1.225000023841858,\n                           0,\n                           2,\n                           1.225000023841858,\n                           0,\n                           1.75,\n                           1,\n                           0,\n                           2,\n                           1,\n                           0,\n                           1.5,\n                           1.899999976158142,\n                           0,\n                           1.5,\n                           1.6749999523162842,\n                           0,\n                           1.5,\n                           1.4500000476837158,\n                           0,\n                           1.5,\n                           1.225000023841858,\n                           0,\n                           1.5,\n                           1,\n                           0,\n                           1.25,\n                           1.899999976158142,\n                           0,\n                           1.25,\n                           1.6749999523162842,\n                           0,\n                           1.25,\n                           1.4500000476837158,\n                           0,\n                           1.25,\n                           1.225000023841858,\n                           0,\n                           1.25,\n                           1,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           1,\n                           1.6749999523162842,\n                           0,\n                           1,\n                           1.4500000476837158,\n                           0,\n                           1,\n                           1.225000023841858,\n                           0,\n                           1,\n                           1,\n                           0,\n                           1,\n                           1.899999976158142,\n                           0,\n                           0.75,\n                           1.899999976158142,\n                           0,\n                           0.75,\n                           1.6749999523162842,\n                           0,\n                           1,\n                           1.6749999523162842,\n                           0,\n                           0.75,\n                           1.4500000476837158,\n                           0,\n                           1,\n                           1.4500000476837158,\n                           0,\n                           0.75,\n                           1.225000023841858,\n                           0,\n                           1,\n                           1.225000023841858,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.5,\n                           1.899999976158142,\n                           0,\n                           0.5,\n                           1.6749999523162842,\n                           0,\n                           0.5,\n                           1.4500000476837158,\n                           0,\n                           0.5,\n                           1.225000023841858,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.25,\n                           1.899999976158142,\n                           0,\n                           0.25,\n                           1.6749999523162842,\n                           0,\n                           0.25,\n                           1.4500000476837158,\n                           0,\n                           0.25,\n                           1.225000023841858,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0,\n                           1.899999976158142,\n                           0,\n                           0,\n                           1.6749999523162842,\n                           0,\n                           0,\n                           1.4500000476837158,\n                           0,\n                           0,\n                           1.225000023841858,\n                           0,\n                           0,\n                           1,\n                           0,\n                           2,\n                           1,\n                           0,\n                           1.75,\n                           1,\n                           0,\n                           1.75,\n                           0.8500000238418579,\n                           0,\n                           2,\n                           0.8500000238418579,\n                           0,\n                           1.75,\n                           0.699999988079071,\n                           0,\n                           2,\n                           0.699999988079071,\n                           0,\n                           1.75,\n                           0.550000011920929,\n                           0,\n                           2,\n                           0.550000011920929,\n                           0,\n                           1.75,\n                           0.4000000059604645,\n                           0,\n                           2,\n                           0.4000000059604645,\n                           0,\n                           1.5,\n                           1,\n                           0,\n                           1.5,\n                           0.8500000238418579,\n                           0,\n                           1.5,\n                           0.699999988079071,\n                           0,\n                           1.5,\n                           0.550000011920929,\n                           0,\n                           1.5,\n                           0.4000000059604645,\n                           0,\n                           1.25,\n                           1,\n                           0,\n                           1.25,\n                           0.8500000238418579,\n                           0,\n                           1.25,\n                           0.699999988079071,\n                           0,\n                           1.25,\n                           0.550000011920929,\n                           0,\n                           1.25,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           1,\n                           0,\n                           1,\n                           0.8500000238418579,\n                           0,\n                           1,\n                           0.699999988079071,\n                           0,\n                           1,\n                           0.550000011920929,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.8500000238418579,\n                           0,\n                           1,\n                           0.8500000238418579,\n                           0,\n                           0.75,\n                           0.699999988079071,\n                           0,\n                           1,\n                           0.699999988079071,\n                           0,\n                           0.75,\n                           0.550000011920929,\n                           0,\n                           1,\n                           0.550000011920929,\n                           0,\n                           0.75,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.8500000238418579,\n                           0,\n                           0.5,\n                           0.699999988079071,\n                           0,\n                           0.5,\n                           0.550000011920929,\n                           0,\n                           0.5,\n                           0.4000000059604645,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.8500000238418579,\n                           0,\n                           0.25,\n                           0.699999988079071,\n                           0,\n                           0.25,\n                           0.550000011920929,\n                           0,\n                           0.25,\n                           0.4000000059604645,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.8500000238418579,\n                           0,\n                           0,\n                           0.699999988079071,\n                           0,\n                           0,\n                           0.550000011920929,\n                           0,\n                           0,\n                           0.4000000059604645,\n                           0,\n                           2,\n                           1,\n                           0,\n                           1.75,\n                           1,\n                           0,\n                           1.75,\n                           0.8500000238418579,\n                           0,\n                           2,\n                           0.8500000238418579,\n                           0,\n                           1.75,\n                           0.699999988079071,\n                           0,\n                           2,\n                           0.699999988079071,\n                           0,\n                           1.75,\n                           0.550000011920929,\n                           0,\n                           2,\n                           0.550000011920929,\n                           0,\n                           1.75,\n                           0.4000000059604645,\n                           0,\n                           2,\n                           0.4000000059604645,\n                           0,\n                           1.5,\n                           1,\n                           0,\n                           1.5,\n                           0.8500000238418579,\n                           0,\n                           1.5,\n                           0.699999988079071,\n                           0,\n                           1.5,\n                           0.550000011920929,\n                           0,\n                           1.5,\n                           0.4000000059604645,\n                           0,\n                           1.25,\n                           1,\n                           0,\n                           1.25,\n                           0.8500000238418579,\n                           0,\n                           1.25,\n                           0.699999988079071,\n                           0,\n                           1.25,\n                           0.550000011920929,\n                           0,\n                           1.25,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           1,\n                           0,\n                           1,\n                           0.8500000238418579,\n                           0,\n                           1,\n                           0.699999988079071,\n                           0,\n                           1,\n                           0.550000011920929,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.8500000238418579,\n                           0,\n                           1,\n                           0.8500000238418579,\n                           0,\n                           0.75,\n                           0.699999988079071,\n                           0,\n                           1,\n                           0.699999988079071,\n                           0,\n                           0.75,\n                           0.550000011920929,\n                           0,\n                           1,\n                           0.550000011920929,\n                           0,\n                           0.75,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.8500000238418579,\n                           0,\n                           0.5,\n                           0.699999988079071,\n                           0,\n                           0.5,\n                           0.550000011920929,\n                           0,\n                           0.5,\n                           0.4000000059604645,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.8500000238418579,\n                           0,\n                           0.25,\n                           0.699999988079071,\n                           0,\n                           0.25,\n                           0.550000011920929,\n                           0,\n                           0.25,\n                           0.4000000059604645,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.8500000238418579,\n                           0,\n                           0,\n                           0.699999988079071,\n                           0,\n                           0,\n                           0.550000011920929,\n                           0,\n                           0,\n                           0.4000000059604645,\n                           0,\n                           2,\n                           0.4000000059604645,\n                           0,\n                           1.75,\n                           0.4000000059604645,\n                           0,\n                           1.75,\n                           0.30000001192092896,\n                           0,\n                           2,\n                           0.30000001192092896,\n                           0,\n                           1.75,\n                           0.20000000298023224,\n                           0,\n                           2,\n                           0.20000000298023224,\n                           0,\n                           1.75,\n                           0.10000000149011612,\n                           0,\n                           2,\n                           0.10000000149011612,\n                           0,\n                           1.75,\n                           0,\n                           0,\n                           2,\n                           0,\n                           0,\n                           1.5,\n                           0.4000000059604645,\n                           0,\n                           1.5,\n                           0.30000001192092896,\n                           0,\n                           1.5,\n                           0.20000000298023224,\n                           0,\n                           1.5,\n                           0.10000000149011612,\n                           0,\n                           1.5,\n                           0,\n                           0,\n                           1.25,\n                           0.4000000059604645,\n                           0,\n                           1.25,\n                           0.30000001192092896,\n                           0,\n                           1.25,\n                           0.20000000298023224,\n                           0,\n                           1.25,\n                           0.10000000149011612,\n                           0,\n                           1.25,\n                           0,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           0.30000001192092896,\n                           0,\n                           1,\n                           0.20000000298023224,\n                           0,\n                           1,\n                           0.10000000149011612,\n                           0,\n                           1,\n                           0,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           0.75,\n                           0.4000000059604645,\n                           0,\n                           0.75,\n                           0.30000001192092896,\n                           0,\n                           1,\n                           0.30000001192092896,\n                           0,\n                           0.75,\n                           0.20000000298023224,\n                           0,\n                           1,\n                           0.20000000298023224,\n                           0,\n                           0.75,\n                           0.10000000149011612,\n                           0,\n                           1,\n                           0.10000000149011612,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.5,\n                           0.4000000059604645,\n                           0,\n                           0.5,\n                           0.30000001192092896,\n                           0,\n                           0.5,\n                           0.20000000298023224,\n                           0,\n                           0.5,\n                           0.10000000149011612,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0.4000000059604645,\n                           0,\n                           0.25,\n                           0.30000001192092896,\n                           0,\n                           0.25,\n                           0.20000000298023224,\n                           0,\n                           0.25,\n                           0.10000000149011612,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0,\n                           0.4000000059604645,\n                           0,\n                           0,\n                           0.30000001192092896,\n                           0,\n                           0,\n                           0.20000000298023224,\n                           0,\n                           0,\n                           0.10000000149011612,\n                           0,\n                           0,\n                           0,\n                           0,\n                           2,\n                           0.4000000059604645,\n                           0,\n                           1.75,\n                           0.4000000059604645,\n                           0,\n                           1.75,\n                           0.30000001192092896,\n                           0,\n                           2,\n                           0.30000001192092896,\n                           0,\n                           1.75,\n                           0.20000000298023224,\n                           0,\n                           2,\n                           0.20000000298023224,\n                           0,\n                           1.75,\n                           0.10000000149011612,\n                           0,\n                           2,\n                           0.10000000149011612,\n                           0,\n                           1.75,\n                           0,\n                           0,\n                           2,\n                           0,\n                           0,\n                           1.5,\n                           0.4000000059604645,\n                           0,\n                           1.5,\n                           0.30000001192092896,\n                           0,\n                           1.5,\n                           0.20000000298023224,\n                           0,\n                           1.5,\n                           0.10000000149011612,\n                           0,\n                           1.5,\n                           0,\n                           0,\n                           1.25,\n                           0.4000000059604645,\n                           0,\n                           1.25,\n                           0.30000001192092896,\n                           0,\n                           1.25,\n                           0.20000000298023224,\n                           0,\n                           1.25,\n                           0.10000000149011612,\n                           0,\n                           1.25,\n                           0,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           1,\n                           0.30000001192092896,\n                           0,\n                           1,\n                           0.20000000298023224,\n                           0,\n                           1,\n                           0.10000000149011612,\n                           0,\n                           1,\n                           0,\n                           0,\n                           1,\n                           0.4000000059604645,\n                           0,\n                           0.75,\n                           0.4000000059604645,\n                           0,\n                           0.75,\n                           0.30000001192092896,\n                           0,\n                           1,\n                           0.30000001192092896,\n                           0,\n                           0.75,\n                           0.20000000298023224,\n                           0,\n                           1,\n                           0.20000000298023224,\n                           0,\n                           0.75,\n                           0.10000000149011612,\n                           0,\n                           1,\n                           0.10000000149011612,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.5,\n                           0.4000000059604645,\n                           0,\n                           0.5,\n                           0.30000001192092896,\n                           0,\n                           0.5,\n                           0.20000000298023224,\n                           0,\n                           0.5,\n                           0.10000000149011612,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0.4000000059604645,\n                           0,\n                           0.25,\n                           0.30000001192092896,\n                           0,\n                           0.25,\n                           0.20000000298023224,\n                           0,\n                           0.25,\n                           0.10000000149011612,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0,\n                           0.4000000059604645,\n                           0,\n                           0,\n                           0.30000001192092896,\n                           0,\n                           0,\n                           0.20000000298023224,\n                           0,\n                           0,\n                           0.10000000149011612,\n                           0,\n                           0,\n                           0,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.875,\n                           1,\n                           0,\n                           0.875,\n                           0.875,\n                           0,\n                           1,\n                           0.875,\n                           0,\n                           0.875,\n                           0.75,\n                           0,\n                           1,\n                           0.75,\n                           0,\n                           0.875,\n                           0.625,\n                           0,\n                           1,\n                           0.625,\n                           0,\n                           0.875,\n                           0.5,\n                           0,\n                           1,\n                           0.5,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.875,\n                           0,\n                           0.75,\n                           0.75,\n                           0,\n                           0.75,\n                           0.625,\n                           0,\n                           0.75,\n                           0.5,\n                           0,\n                           0.625,\n                           1,\n                           0,\n                           0.625,\n                           0.875,\n                           0,\n                           0.625,\n                           0.75,\n                           0,\n                           0.625,\n                           0.625,\n                           0,\n                           0.625,\n                           0.5,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.875,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.5,\n                           0.625,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.375,\n                           1,\n                           0,\n                           0.375,\n                           0.875,\n                           0,\n                           0.5,\n                           0.875,\n                           0,\n                           0.375,\n                           0.75,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.375,\n                           0.625,\n                           0,\n                           0.5,\n                           0.625,\n                           0,\n                           0.375,\n                           0.5,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.875,\n                           0,\n                           0.25,\n                           0.75,\n                           0,\n                           0.25,\n                           0.625,\n                           0,\n                           0.25,\n                           0.5,\n                           0,\n                           0.125,\n                           1,\n                           0,\n                           0.125,\n                           0.875,\n                           0,\n                           0.125,\n                           0.75,\n                           0,\n                           0.125,\n                           0.625,\n                           0,\n                           0.125,\n                           0.5,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           1,\n                           0.5,\n                           0,\n                           0.875,\n                           0.5,\n                           0,\n                           0.875,\n                           0.375,\n                           0,\n                           1,\n                           0.375,\n                           0,\n                           0.875,\n                           0.25,\n                           0,\n                           1,\n                           0.25,\n                           0,\n                           0.875,\n                           0.125,\n                           0,\n                           1,\n                           0.125,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           0.5,\n                           0,\n                           0.75,\n                           0.375,\n                           0,\n                           0.75,\n                           0.25,\n                           0,\n                           0.75,\n                           0.125,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.625,\n                           0.5,\n                           0,\n                           0.625,\n                           0.375,\n                           0,\n                           0.625,\n                           0.25,\n                           0,\n                           0.625,\n                           0.125,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.5,\n                           0.375,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.5,\n                           0.125,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.375,\n                           0.5,\n                           0,\n                           0.375,\n                           0.375,\n                           0,\n                           0.5,\n                           0.375,\n                           0,\n                           0.375,\n                           0.25,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.375,\n                           0.125,\n                           0,\n                           0.5,\n                           0.125,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0.5,\n                           0,\n                           0.25,\n                           0.375,\n                           0,\n                           0.25,\n                           0.25,\n                           0,\n                           0.25,\n                           0.125,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.125,\n                           0.5,\n                           0,\n                           0.125,\n                           0.375,\n                           0,\n                           0.125,\n                           0.25,\n                           0,\n                           0.125,\n                           0.125,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.625,\n                           0.22499999403953552,\n                           0,\n                           0.5,\n                           0.22499999403953552,\n                           0,\n                           0.625,\n                           0.44999998807907104,\n                           0,\n                           0.5,\n                           0.44999998807907104,\n                           0,\n                           0.625,\n                           0.675000011920929,\n                           0,\n                           0.5,\n                           0.675000011920929,\n                           0,\n                           0.625,\n                           0.8999999761581421,\n                           0,\n                           0.5,\n                           0.8999999761581421,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.75,\n                           0.22499999403953552,\n                           0,\n                           0.75,\n                           0.44999998807907104,\n                           0,\n                           0.75,\n                           0.675000011920929,\n                           0,\n                           0.75,\n                           0.8999999761581421,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           0.875,\n                           0.22499999403953552,\n                           0,\n                           0.875,\n                           0.44999998807907104,\n                           0,\n                           0.875,\n                           0.675000011920929,\n                           0,\n                           0.875,\n                           0.8999999761581421,\n                           0,\n                           1,\n                           0,\n                           0,\n                           1,\n                           0.22499999403953552,\n                           0,\n                           1,\n                           0.44999998807907104,\n                           0,\n                           1,\n                           0.675000011920929,\n                           0,\n                           1,\n                           0.8999999761581421,\n                           0,\n                           0,\n                           0,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0.125,\n                           0.22499999403953552,\n                           0,\n                           0,\n                           0.22499999403953552,\n                           0,\n                           0.125,\n                           0.44999998807907104,\n                           0,\n                           0,\n                           0.44999998807907104,\n                           0,\n                           0.125,\n                           0.675000011920929,\n                           0,\n                           0,\n                           0.675000011920929,\n                           0,\n                           0.125,\n                           0.8999999761581421,\n                           0,\n                           0,\n                           0.8999999761581421,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.25,\n                           0.22499999403953552,\n                           0,\n                           0.25,\n                           0.44999998807907104,\n                           0,\n                           0.25,\n                           0.675000011920929,\n                           0,\n                           0.25,\n                           0.8999999761581421,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.375,\n                           0.22499999403953552,\n                           0,\n                           0.375,\n                           0.44999998807907104,\n                           0,\n                           0.375,\n                           0.675000011920929,\n                           0,\n                           0.375,\n                           0.8999999761581421,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.5,\n                           0.22499999403953552,\n                           0,\n                           0.5,\n                           0.44999998807907104,\n                           0,\n                           0.5,\n                           0.675000011920929,\n                           0,\n                           0.5,\n                           0.8999999761581421,\n                           0,\n                           0.5,\n                           0.8999999761581421,\n                           0,\n                           0.625,\n                           0.8999999761581421,\n                           0,\n                           0.625,\n                           0.925000011920929,\n                           0,\n                           0.5,\n                           0.925000011920929,\n                           0,\n                           0.625,\n                           0.949999988079071,\n                           0,\n                           0.5,\n                           0.949999988079071,\n                           0,\n                           0.625,\n                           0.9750000238418579,\n                           0,\n                           0.5,\n                           0.9750000238418579,\n                           0,\n                           0.625,\n                           1,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.75,\n                           0.8999999761581421,\n                           0,\n                           0.75,\n                           0.925000011920929,\n                           0,\n                           0.75,\n                           0.949999988079071,\n                           0,\n                           0.75,\n                           0.9750000238418579,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.875,\n                           0.8999999761581421,\n                           0,\n                           0.875,\n                           0.925000011920929,\n                           0,\n                           0.875,\n                           0.949999988079071,\n                           0,\n                           0.875,\n                           0.9750000238418579,\n                           0,\n                           0.875,\n                           1,\n                           0,\n                           1,\n                           0.8999999761581421,\n                           0,\n                           1,\n                           0.925000011920929,\n                           0,\n                           1,\n                           0.949999988079071,\n                           0,\n                           1,\n                           0.9750000238418579,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0,\n                           0.8999999761581421,\n                           0,\n                           0.125,\n                           0.8999999761581421,\n                           0,\n                           0.125,\n                           0.925000011920929,\n                           0,\n                           0,\n                           0.925000011920929,\n                           0,\n                           0.125,\n                           0.949999988079071,\n                           0,\n                           0,\n                           0.949999988079071,\n                           0,\n                           0.125,\n                           0.9750000238418579,\n                           0,\n                           0,\n                           0.9750000238418579,\n                           0,\n                           0.125,\n                           1,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0.25,\n                           0.8999999761581421,\n                           0,\n                           0.25,\n                           0.925000011920929,\n                           0,\n                           0.25,\n                           0.949999988079071,\n                           0,\n                           0.25,\n                           0.9750000238418579,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.375,\n                           0.8999999761581421,\n                           0,\n                           0.375,\n                           0.925000011920929,\n                           0,\n                           0.375,\n                           0.949999988079071,\n                           0,\n                           0.375,\n                           0.9750000238418579,\n                           0,\n                           0.375,\n                           1,\n                           0,\n                           0.5,\n                           0.8999999761581421,\n                           0,\n                           0.5,\n                           0.925000011920929,\n                           0,\n                           0.5,\n                           0.949999988079071,\n                           0,\n                           0.5,\n                           0.9750000238418579,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.875,\n                           1,\n                           0,\n                           0.875,\n                           0.75,\n                           0,\n                           1,\n                           0.75,\n                           0,\n                           0.875,\n                           0.5,\n                           0,\n                           1,\n                           0.5,\n                           0,\n                           0.875,\n                           0.25,\n                           0,\n                           1,\n                           0.25,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.75,\n                           0,\n                           0.75,\n                           0.5,\n                           0,\n                           0.75,\n                           0.25,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.625,\n                           1,\n                           0,\n                           0.625,\n                           0.75,\n                           0,\n                           0.625,\n                           0.5,\n                           0,\n                           0.625,\n                           0.25,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.375,\n                           1,\n                           0,\n                           0.375,\n                           0.75,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.375,\n                           0.5,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.375,\n                           0.25,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.75,\n                           0,\n                           0.25,\n                           0.5,\n                           0,\n                           0.25,\n                           0.25,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.125,\n                           1,\n                           0,\n                           0.125,\n                           0.75,\n                           0,\n                           0.125,\n                           0.5,\n                           0,\n                           0.125,\n                           0.25,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.875,\n                           1,\n                           0,\n                           0.875,\n                           0.75,\n                           0,\n                           1,\n                           0.75,\n                           0,\n                           0.875,\n                           0.5,\n                           0,\n                           1,\n                           0.5,\n                           0,\n                           0.875,\n                           0.25,\n                           0,\n                           1,\n                           0.25,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.75,\n                           0,\n                           0.75,\n                           0.5,\n                           0,\n                           0.75,\n                           0.25,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.625,\n                           1,\n                           0,\n                           0.625,\n                           0.75,\n                           0,\n                           0.625,\n                           0.5,\n                           0,\n                           0.625,\n                           0.25,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.375,\n                           1,\n                           0,\n                           0.375,\n                           0.75,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.375,\n                           0.5,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.375,\n                           0.25,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.75,\n                           0,\n                           0.25,\n                           0.5,\n                           0,\n                           0.25,\n                           0.25,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.125,\n                           1,\n                           0,\n                           0.125,\n                           0.75,\n                           0,\n                           0.125,\n                           0.5,\n                           0,\n                           0.125,\n                           0.25,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.875,\n                           1,\n                           0,\n                           0.875,\n                           0.75,\n                           0,\n                           1,\n                           0.75,\n                           0,\n                           0.875,\n                           0.5,\n                           0,\n                           1,\n                           0.5,\n                           0,\n                           0.875,\n                           0.25,\n                           0,\n                           1,\n                           0.25,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.75,\n                           0,\n                           0.75,\n                           0.5,\n                           0,\n                           0.75,\n                           0.25,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.625,\n                           1,\n                           0,\n                           0.625,\n                           0.75,\n                           0,\n                           0.625,\n                           0.5,\n                           0,\n                           0.625,\n                           0.25,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.375,\n                           1,\n                           0,\n                           0.375,\n                           0.75,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.375,\n                           0.5,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.375,\n                           0.25,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.75,\n                           0,\n                           0.25,\n                           0.5,\n                           0,\n                           0.25,\n                           0.25,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.125,\n                           1,\n                           0,\n                           0.125,\n                           0.75,\n                           0,\n                           0.125,\n                           0.5,\n                           0,\n                           0.125,\n                           0.25,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0,\n                           0,\n                           1,\n                           1,\n                           0,\n                           0.875,\n                           1,\n                           0,\n                           0.875,\n                           0.75,\n                           0,\n                           1,\n                           0.75,\n                           0,\n                           0.875,\n                           0.5,\n                           0,\n                           1,\n                           0.5,\n                           0,\n                           0.875,\n                           0.25,\n                           0,\n                           1,\n                           0.25,\n                           0,\n                           0.875,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           1,\n                           0,\n                           0.75,\n                           0.75,\n                           0,\n                           0.75,\n                           0.5,\n                           0,\n                           0.75,\n                           0.25,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.625,\n                           1,\n                           0,\n                           0.625,\n                           0.75,\n                           0,\n                           0.625,\n                           0.5,\n                           0,\n                           0.625,\n                           0.25,\n                           0,\n                           0.625,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.5,\n                           1,\n                           0,\n                           0.375,\n                           1,\n                           0,\n                           0.375,\n                           0.75,\n                           0,\n                           0.5,\n                           0.75,\n                           0,\n                           0.375,\n                           0.5,\n                           0,\n                           0.5,\n                           0.5,\n                           0,\n                           0.375,\n                           0.25,\n                           0,\n                           0.5,\n                           0.25,\n                           0,\n                           0.375,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           1,\n                           0,\n                           0.25,\n                           0.75,\n                           0,\n                           0.25,\n                           0.5,\n                           0,\n                           0.25,\n                           0.25,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0.125,\n                           1,\n                           0,\n                           0.125,\n                           0.75,\n                           0,\n                           0.125,\n                           0.5,\n                           0,\n                           0.125,\n                           0.25,\n                           0,\n                           0.125,\n                           0,\n                           0,\n                           0,\n                           1,\n                           0,\n                           0,\n                           0.75,\n                           0,\n                           0,\n                           0.5,\n                           0,\n                           0,\n                           0.25,\n                           0,\n                           0,\n                           0,\n                           0};\n\nuint16_t teapotIndices[] = {\n    0,   1,   2,   2,   3,   0,   3,   2,   4,   4,   5,   3,   5,   4,   6,\n    6,   7,   5,   7,   6,   8,   8,   9,   7,   1,   10,  11,  11,  2,   1,\n    2,   11,  12,  12,  4,   2,   4,   12,  13,  13,  6,   4,   6,   13,  14,\n    14,  8,   6,   10,  15,  16,  16,  11,  10,  11,  16,  17,  17,  12,  11,\n    12,  17,  18,  18,  13,  12,  13,  18,  19,  19,  14,  13,  15,  20,  21,\n    21,  16,  15,  16,  21,  22,  22,  17,  16,  17,  22,  23,  23,  18,  17,\n    18,  23,  24,  24,  19,  18,  25,  26,  27,  27,  28,  25,  28,  27,  29,\n    29,  30,  28,  30,  29,  31,  31,  32,  30,  32,  31,  33,  33,  34,  32,\n    26,  35,  36,  36,  27,  26,  27,  36,  37,  37,  29,  27,  29,  37,  38,\n    38,  31,  29,  31,  38,  39,  39,  33,  31,  35,  40,  41,  41,  36,  35,\n    36,  41,  42,  42,  37,  36,  37,  42,  43,  43,  38,  37,  38,  43,  44,\n    44,  39,  38,  40,  45,  46,  46,  41,  40,  41,  46,  47,  47,  42,  41,\n    42,  47,  48,  48,  43,  42,  43,  48,  49,  49,  44,  43,  50,  51,  52,\n    52,  53,  50,  53,  52,  54,  54,  55,  53,  55,  54,  56,  56,  57,  55,\n    57,  56,  58,  58,  59,  57,  51,  60,  61,  61,  52,  51,  52,  61,  62,\n    62,  54,  52,  54,  62,  63,  63,  56,  54,  56,  63,  64,  64,  58,  56,\n    60,  65,  66,  66,  61,  60,  61,  66,  67,  67,  62,  61,  62,  67,  68,\n    68,  63,  62,  63,  68,  69,  69,  64,  63,  65,  70,  71,  71,  66,  65,\n    66,  71,  72,  72,  67,  66,  67,  72,  73,  73,  68,  67,  68,  73,  74,\n    74,  69,  68,  75,  76,  77,  77,  78,  75,  78,  77,  79,  79,  80,  78,\n    80,  79,  81,  81,  82,  80,  82,  81,  83,  83,  84,  82,  76,  85,  86,\n    86,  77,  76,  77,  86,  87,  87,  79,  77,  79,  87,  88,  88,  81,  79,\n    81,  88,  89,  89,  83,  81,  85,  90,  91,  91,  86,  85,  86,  91,  92,\n    92,  87,  86,  87,  92,  93,  93,  88,  87,  88,  93,  94,  94,  89,  88,\n    90,  95,  96,  96,  91,  90,  91,  96,  97,  97,  92,  91,  92,  97,  98,\n    98,  93,  92,  93,  98,  99,  99,  94,  93,  100, 101, 102, 102, 103, 100,\n    103, 102, 104, 104, 105, 103, 105, 104, 106, 106, 107, 105, 107, 106, 108,\n    108, 109, 107, 101, 110, 111, 111, 102, 101, 102, 111, 112, 112, 104, 102,\n    104, 112, 113, 113, 106, 104, 106, 113, 114, 114, 108, 106, 110, 115, 116,\n    116, 111, 110, 111, 116, 117, 117, 112, 111, 112, 117, 118, 118, 113, 112,\n    113, 118, 119, 119, 114, 113, 115, 120, 121, 121, 116, 115, 116, 121, 122,\n    122, 117, 116, 117, 122, 123, 123, 118, 117, 118, 123, 124, 124, 119, 118,\n    125, 126, 127, 127, 128, 125, 128, 127, 129, 129, 130, 128, 130, 129, 131,\n    131, 132, 130, 132, 131, 133, 133, 134, 132, 126, 135, 136, 136, 127, 126,\n    127, 136, 137, 137, 129, 127, 129, 137, 138, 138, 131, 129, 131, 138, 139,\n    139, 133, 131, 135, 140, 141, 141, 136, 135, 136, 141, 142, 142, 137, 136,\n    137, 142, 143, 143, 138, 137, 138, 143, 144, 144, 139, 138, 140, 145, 146,\n    146, 141, 140, 141, 146, 147, 147, 142, 141, 142, 147, 148, 148, 143, 142,\n    143, 148, 149, 149, 144, 143, 150, 151, 152, 152, 153, 150, 153, 152, 154,\n    154, 155, 153, 155, 154, 156, 156, 157, 155, 157, 156, 158, 158, 159, 157,\n    151, 160, 161, 161, 152, 151, 152, 161, 162, 162, 154, 152, 154, 162, 163,\n    163, 156, 154, 156, 163, 164, 164, 158, 156, 160, 165, 166, 166, 161, 160,\n    161, 166, 167, 167, 162, 161, 162, 167, 168, 168, 163, 162, 163, 168, 169,\n    169, 164, 163, 165, 170, 171, 171, 166, 165, 166, 171, 172, 172, 167, 166,\n    167, 172, 173, 173, 168, 167, 168, 173, 174, 174, 169, 168, 175, 176, 177,\n    177, 178, 175, 178, 177, 179, 179, 180, 178, 180, 179, 181, 181, 182, 180,\n    182, 181, 183, 183, 184, 182, 176, 185, 186, 186, 177, 176, 177, 186, 187,\n    187, 179, 177, 179, 187, 188, 188, 181, 179, 181, 188, 189, 189, 183, 181,\n    185, 190, 191, 191, 186, 185, 186, 191, 192, 192, 187, 186, 187, 192, 193,\n    193, 188, 187, 188, 193, 194, 194, 189, 188, 190, 195, 196, 196, 191, 190,\n    191, 196, 197, 197, 192, 191, 192, 197, 198, 198, 193, 192, 193, 198, 199,\n    199, 194, 193, 200, 201, 202, 202, 203, 200, 203, 202, 204, 204, 205, 203,\n    205, 204, 206, 206, 207, 205, 207, 206, 208, 208, 209, 207, 201, 210, 211,\n    211, 202, 201, 202, 211, 212, 212, 204, 202, 204, 212, 213, 213, 206, 204,\n    206, 213, 214, 214, 208, 206, 210, 215, 216, 216, 211, 210, 211, 216, 217,\n    217, 212, 211, 212, 217, 218, 218, 213, 212, 213, 218, 219, 219, 214, 213,\n    215, 220, 221, 221, 216, 215, 216, 221, 222, 222, 217, 216, 217, 222, 223,\n    223, 218, 217, 218, 223, 224, 224, 219, 218, 225, 226, 227, 227, 228, 225,\n    228, 227, 229, 229, 230, 228, 230, 229, 231, 231, 232, 230, 232, 231, 233,\n    233, 234, 232, 226, 235, 236, 236, 227, 226, 227, 236, 237, 237, 229, 227,\n    229, 237, 238, 238, 231, 229, 231, 238, 239, 239, 233, 231, 235, 240, 241,\n    241, 236, 235, 236, 241, 242, 242, 237, 236, 237, 242, 243, 243, 238, 237,\n    238, 243, 244, 244, 239, 238, 240, 245, 246, 246, 241, 240, 241, 246, 247,\n    247, 242, 241, 242, 247, 248, 248, 243, 242, 243, 248, 249, 249, 244, 243,\n    250, 251, 252, 252, 253, 250, 253, 252, 254, 254, 255, 253, 255, 254, 256,\n    256, 257, 255, 257, 256, 258, 258, 259, 257, 251, 260, 261, 261, 252, 251,\n    252, 261, 262, 262, 254, 252, 254, 262, 263, 263, 256, 254, 256, 263, 264,\n    264, 258, 256, 260, 265, 266, 266, 261, 260, 261, 266, 267, 267, 262, 261,\n    262, 267, 268, 268, 263, 262, 263, 268, 269, 269, 264, 263, 265, 270, 271,\n    271, 266, 265, 266, 271, 272, 272, 267, 266, 267, 272, 273, 273, 268, 267,\n    268, 273, 274, 274, 269, 268, 275, 276, 277, 277, 278, 275, 278, 277, 279,\n    279, 280, 278, 280, 279, 281, 281, 282, 280, 282, 281, 283, 283, 284, 282,\n    276, 285, 286, 286, 277, 276, 277, 286, 287, 287, 279, 277, 279, 287, 288,\n    288, 281, 279, 281, 288, 289, 289, 283, 281, 285, 290, 291, 291, 286, 285,\n    286, 291, 292, 292, 287, 286, 287, 292, 293, 293, 288, 287, 288, 293, 294,\n    294, 289, 288, 290, 295, 296, 296, 291, 290, 291, 296, 297, 297, 292, 291,\n    292, 297, 298, 298, 293, 292, 293, 298, 299, 299, 294, 293, 300, 301, 302,\n    302, 303, 300, 303, 302, 304, 304, 305, 303, 305, 304, 306, 306, 307, 305,\n    307, 306, 308, 308, 309, 307, 301, 310, 311, 311, 302, 301, 302, 311, 312,\n    312, 304, 302, 304, 312, 313, 313, 306, 304, 306, 313, 314, 314, 308, 306,\n    310, 315, 316, 316, 311, 310, 311, 316, 317, 317, 312, 311, 312, 317, 318,\n    318, 313, 312, 313, 318, 319, 319, 314, 313, 315, 320, 321, 321, 316, 315,\n    316, 321, 322, 322, 317, 316, 317, 322, 323, 323, 318, 317, 318, 323, 324,\n    324, 319, 318, 325, 326, 327, 327, 328, 325, 328, 327, 329, 329, 330, 328,\n    330, 329, 331, 331, 332, 330, 332, 331, 333, 333, 334, 332, 326, 335, 336,\n    336, 327, 326, 327, 336, 337, 337, 329, 327, 329, 337, 338, 338, 331, 329,\n    331, 338, 339, 339, 333, 331, 335, 340, 341, 341, 336, 335, 336, 341, 342,\n    342, 337, 336, 337, 342, 343, 343, 338, 337, 338, 343, 344, 344, 339, 338,\n    340, 345, 346, 346, 341, 340, 341, 346, 347, 347, 342, 341, 342, 347, 348,\n    348, 343, 342, 343, 348, 349, 349, 344, 343, 350, 351, 352, 352, 353, 350,\n    353, 352, 354, 354, 355, 353, 355, 354, 356, 356, 357, 355, 357, 356, 358,\n    358, 359, 357, 351, 360, 361, 361, 352, 351, 352, 361, 362, 362, 354, 352,\n    354, 362, 363, 363, 356, 354, 356, 363, 364, 364, 358, 356, 360, 365, 366,\n    366, 361, 360, 361, 366, 367, 367, 362, 361, 362, 367, 368, 368, 363, 362,\n    363, 368, 369, 369, 364, 363, 365, 370, 371, 371, 366, 365, 366, 371, 372,\n    372, 367, 366, 367, 372, 373, 373, 368, 367, 368, 373, 374, 374, 369, 368,\n    375, 376, 377, 377, 378, 375, 378, 377, 379, 379, 380, 378, 380, 379, 381,\n    381, 382, 380, 382, 381, 383, 383, 384, 382, 376, 385, 386, 386, 377, 376,\n    377, 386, 387, 387, 379, 377, 379, 387, 388, 388, 381, 379, 381, 388, 389,\n    389, 383, 381, 385, 390, 391, 391, 386, 385, 386, 391, 392, 392, 387, 386,\n    387, 392, 393, 393, 388, 387, 388, 393, 394, 394, 389, 388, 390, 395, 396,\n    396, 391, 390, 391, 396, 397, 397, 392, 391, 392, 397, 398, 398, 393, 392,\n    393, 398, 399, 399, 394, 393, 400, 401, 402, 402, 403, 400, 403, 402, 404,\n    404, 405, 403, 405, 404, 406, 406, 407, 405, 407, 406, 408, 408, 409, 407,\n    401, 410, 411, 411, 402, 401, 402, 411, 412, 412, 404, 402, 404, 412, 413,\n    413, 406, 404, 406, 413, 414, 414, 408, 406, 410, 415, 416, 416, 411, 410,\n    411, 416, 417, 417, 412, 411, 412, 417, 418, 418, 413, 412, 413, 418, 419,\n    419, 414, 413, 415, 420, 421, 421, 416, 415, 416, 421, 422, 422, 417, 416,\n    417, 422, 423, 423, 418, 417, 418, 423, 424, 424, 419, 418, 425, 426, 427,\n    427, 428, 425, 428, 427, 429, 429, 430, 428, 430, 429, 431, 431, 432, 430,\n    432, 431, 433, 433, 434, 432, 426, 435, 436, 436, 427, 426, 427, 436, 437,\n    437, 429, 427, 429, 437, 438, 438, 431, 429, 431, 438, 439, 439, 433, 431,\n    435, 440, 441, 441, 436, 435, 436, 441, 442, 442, 437, 436, 437, 442, 443,\n    443, 438, 437, 438, 443, 444, 444, 439, 438, 440, 445, 446, 446, 441, 440,\n    441, 446, 447, 447, 442, 441, 442, 447, 448, 448, 443, 442, 443, 448, 449,\n    449, 444, 443, 450, 451, 452, 452, 453, 450, 453, 452, 454, 454, 455, 453,\n    455, 454, 456, 456, 457, 455, 457, 456, 458, 458, 459, 457, 451, 460, 461,\n    461, 452, 451, 452, 461, 462, 462, 454, 452, 454, 462, 463, 463, 456, 454,\n    456, 463, 464, 464, 458, 456, 460, 465, 466, 466, 461, 460, 461, 466, 467,\n    467, 462, 461, 462, 467, 468, 468, 463, 462, 463, 468, 469, 469, 464, 463,\n    465, 470, 471, 471, 466, 465, 466, 471, 472, 472, 467, 466, 467, 472, 473,\n    473, 468, 467, 468, 473, 474, 474, 469, 468, 475, 476, 477, 477, 478, 475,\n    478, 477, 479, 479, 480, 478, 480, 479, 481, 481, 482, 480, 482, 481, 483,\n    483, 484, 482, 476, 485, 486, 486, 477, 476, 477, 486, 487, 487, 479, 477,\n    479, 487, 488, 488, 481, 479, 481, 488, 489, 489, 483, 481, 485, 490, 491,\n    491, 486, 485, 486, 491, 492, 492, 487, 486, 487, 492, 493, 493, 488, 487,\n    488, 493, 494, 494, 489, 488, 490, 495, 496, 496, 491, 490, 491, 496, 497,\n    497, 492, 491, 492, 497, 498, 498, 493, 492, 493, 498, 499, 499, 494, 493,\n    500, 501, 502, 502, 503, 500, 503, 502, 504, 504, 505, 503, 505, 504, 506,\n    506, 507, 505, 507, 506, 508, 508, 509, 507, 501, 510, 511, 511, 502, 501,\n    502, 511, 512, 512, 504, 502, 504, 512, 513, 513, 506, 504, 506, 513, 514,\n    514, 508, 506, 510, 515, 516, 516, 511, 510, 511, 516, 517, 517, 512, 511,\n    512, 517, 518, 518, 513, 512, 513, 518, 519, 519, 514, 513, 515, 520, 521,\n    521, 516, 515, 516, 521, 522, 522, 517, 516, 517, 522, 523, 523, 518, 517,\n    518, 523, 524, 524, 519, 518, 525, 526, 527, 527, 528, 525, 528, 527, 529,\n    529, 530, 528, 530, 529, 531, 531, 532, 530, 532, 531, 533, 533, 534, 532,\n    526, 535, 536, 536, 527, 526, 527, 536, 537, 537, 529, 527, 529, 537, 538,\n    538, 531, 529, 531, 538, 539, 539, 533, 531, 535, 540, 541, 541, 536, 535,\n    536, 541, 542, 542, 537, 536, 537, 542, 543, 543, 538, 537, 538, 543, 544,\n    544, 539, 538, 540, 545, 546, 546, 541, 540, 541, 546, 547, 547, 542, 541,\n    542, 547, 548, 548, 543, 542, 543, 548, 549, 549, 544, 543, 550, 551, 552,\n    552, 553, 550, 553, 552, 554, 554, 555, 553, 555, 554, 556, 556, 557, 555,\n    557, 556, 558, 558, 559, 557, 551, 560, 561, 561, 552, 551, 552, 561, 562,\n    562, 554, 552, 554, 562, 563, 563, 556, 554, 556, 563, 564, 564, 558, 556,\n    560, 565, 566, 566, 561, 560, 561, 566, 567, 567, 562, 561, 562, 567, 568,\n    568, 563, 562, 563, 568, 569, 569, 564, 563, 565, 570, 571, 571, 566, 565,\n    566, 571, 572, 572, 567, 566, 567, 572, 573, 573, 568, 567, 568, 573, 574,\n    574, 569, 568, 575, 576, 577, 577, 578, 575, 578, 577, 579, 579, 580, 578,\n    580, 579, 581, 581, 582, 580, 582, 581, 583, 583, 584, 582, 576, 585, 586,\n    586, 577, 576, 577, 586, 587, 587, 579, 577, 579, 587, 588, 588, 581, 579,\n    581, 588, 589, 589, 583, 581, 585, 590, 591, 591, 586, 585, 586, 591, 592,\n    592, 587, 586, 587, 592, 593, 593, 588, 587, 588, 593, 594, 594, 589, 588,\n    590, 595, 596, 596, 591, 590, 591, 596, 597, 597, 592, 591, 592, 597, 598,\n    598, 593, 592, 593, 598, 599, 599, 594, 593, 600, 601, 602, 602, 603, 600,\n    603, 602, 604, 604, 605, 603, 605, 604, 606, 606, 607, 605, 607, 606, 608,\n    608, 609, 607, 601, 610, 611, 611, 602, 601, 602, 611, 612, 612, 604, 602,\n    604, 612, 613, 613, 606, 604, 606, 613, 614, 614, 608, 606, 610, 615, 616,\n    616, 611, 610, 611, 616, 617, 617, 612, 611, 612, 617, 618, 618, 613, 612,\n    613, 618, 619, 619, 614, 613, 615, 620, 621, 621, 616, 615, 616, 621, 622,\n    622, 617, 616, 617, 622, 623, 623, 618, 617, 618, 623, 624, 624, 619, 618,\n    625, 626, 627, 627, 628, 625, 628, 627, 629, 629, 630, 628, 630, 629, 631,\n    631, 632, 630, 632, 631, 633, 633, 634, 632, 626, 635, 636, 636, 627, 626,\n    627, 636, 637, 637, 629, 627, 629, 637, 638, 638, 631, 629, 631, 638, 639,\n    639, 633, 631, 635, 640, 641, 641, 636, 635, 636, 641, 642, 642, 637, 636,\n    637, 642, 643, 643, 638, 637, 638, 643, 644, 644, 639, 638, 640, 645, 646,\n    646, 641, 640, 641, 646, 647, 647, 642, 641, 642, 647, 648, 648, 643, 642,\n    643, 648, 649, 649, 644, 643, 650, 651, 652, 652, 653, 650, 653, 652, 654,\n    654, 655, 653, 655, 654, 656, 656, 657, 655, 657, 656, 658, 658, 659, 657,\n    651, 660, 661, 661, 652, 651, 652, 661, 662, 662, 654, 652, 654, 662, 663,\n    663, 656, 654, 656, 663, 664, 664, 658, 656, 660, 665, 666, 666, 661, 660,\n    661, 666, 667, 667, 662, 661, 662, 667, 668, 668, 663, 662, 663, 668, 669,\n    669, 664, 663, 665, 670, 671, 671, 666, 665, 666, 671, 672, 672, 667, 666,\n    667, 672, 673, 673, 668, 667, 668, 673, 674, 674, 669, 668, 675, 676, 677,\n    677, 678, 675, 678, 677, 679, 679, 680, 678, 680, 679, 681, 681, 682, 680,\n    682, 681, 683, 683, 684, 682, 676, 685, 686, 686, 677, 676, 677, 686, 687,\n    687, 679, 677, 679, 687, 688, 688, 681, 679, 681, 688, 689, 689, 683, 681,\n    685, 690, 691, 691, 686, 685, 686, 691, 692, 692, 687, 686, 687, 692, 693,\n    693, 688, 687, 688, 693, 694, 694, 689, 688, 690, 695, 696, 696, 691, 690,\n    691, 696, 697, 697, 692, 691, 692, 697, 698, 698, 693, 692, 693, 698, 699,\n    699, 694, 693, 700, 701, 702, 702, 703, 700, 703, 702, 704, 704, 705, 703,\n    705, 704, 706, 706, 707, 705, 707, 706, 708, 708, 709, 707, 701, 710, 711,\n    711, 702, 701, 702, 711, 712, 712, 704, 702, 704, 712, 713, 713, 706, 704,\n    706, 713, 714, 714, 708, 706, 710, 715, 716, 716, 711, 710, 711, 716, 717,\n    717, 712, 711, 712, 717, 718, 718, 713, 712, 713, 718, 719, 719, 714, 713,\n    715, 720, 721, 721, 716, 715, 716, 721, 722, 722, 717, 716, 717, 722, 723,\n    723, 718, 717, 718, 723, 724, 724, 719, 718, 725, 726, 727, 727, 728, 725,\n    728, 727, 729, 729, 730, 728, 730, 729, 731, 731, 732, 730, 732, 731, 733,\n    733, 734, 732, 726, 735, 736, 736, 727, 726, 727, 736, 737, 737, 729, 727,\n    729, 737, 738, 738, 731, 729, 731, 738, 739, 739, 733, 731, 735, 740, 741,\n    741, 736, 735, 736, 741, 742, 742, 737, 736, 737, 742, 743, 743, 738, 737,\n    738, 743, 744, 744, 739, 738, 740, 745, 746, 746, 741, 740, 741, 746, 747,\n    747, 742, 741, 742, 747, 748, 748, 743, 742, 743, 748, 749, 749, 744, 743,\n    750, 751, 752, 752, 753, 750, 753, 752, 754, 754, 755, 753, 755, 754, 756,\n    756, 757, 755, 757, 756, 758, 758, 759, 757, 751, 760, 761, 761, 752, 751,\n    752, 761, 762, 762, 754, 752, 754, 762, 763, 763, 756, 754, 756, 763, 764,\n    764, 758, 756, 760, 765, 766, 766, 761, 760, 761, 766, 767, 767, 762, 761,\n    762, 767, 768, 768, 763, 762, 763, 768, 769, 769, 764, 763, 765, 770, 771,\n    771, 766, 765, 766, 771, 772, 772, 767, 766, 767, 772, 773, 773, 768, 767,\n    768, 773, 774, 774, 769, 768, 775, 776, 777, 777, 778, 775, 778, 777, 779,\n    779, 780, 778, 780, 779, 781, 781, 782, 780, 782, 781, 783, 783, 784, 782,\n    776, 785, 786, 786, 777, 776, 777, 786, 787, 787, 779, 777, 779, 787, 788,\n    788, 781, 779, 781, 788, 789, 789, 783, 781, 785, 790, 791, 791, 786, 785,\n    786, 791, 792, 792, 787, 786, 787, 792, 793, 793, 788, 787, 788, 793, 794,\n    794, 789, 788, 790, 795, 796, 796, 791, 790, 791, 796, 797, 797, 792, 791,\n    792, 797, 798, 798, 793, 792, 793, 798, 799, 799, 794, 793};\n"
  },
  {
    "path": "teapots/textured-teapot/src/main/java/com/sample/helper/NDKHelper.java",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.sample.helper;\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.nio.ByteBuffer;\n\nimport javax.microedition.khronos.opengles.GL10;\n\nimport android.R.bool;\nimport android.opengl.GLES30;\n\nimport android.annotation.TargetApi;\nimport android.app.Activity;\nimport android.app.NativeActivity;\nimport android.content.Context;\nimport android.content.pm.ApplicationInfo;\nimport android.content.pm.PackageManager;\nimport android.content.pm.PackageManager.NameNotFoundException;\nimport android.graphics.Bitmap;\nimport android.graphics.Bitmap.CompressFormat;\nimport android.graphics.BitmapFactory;\nimport android.graphics.Matrix;\nimport android.media.AudioManager;\nimport android.media.AudioTrack;\nimport android.opengl.GLUtils;\nimport android.os.Build;\nimport android.util.Log;\nimport android.view.View;\nimport android.view.View.MeasureSpec;\n\n@TargetApi(Build.VERSION_CODES.GINGERBREAD)\npublic class NDKHelper {\n\n    public NDKHelper(NativeActivity act) {\n        activity = act;\n    }\n\n    public void loadLibrary(String soname) {\n        if (soname.isEmpty() == false) {\n            System.loadLibrary(soname);\n            loadedSO = true;\n        }\n    }\n\n    public static Boolean checkSOLoaded() {\n        if (loadedSO == false) {\n            Log.e(\"NDKHelper\",\n                    \"--------------------------------------------\\n\"\n                            + \".so has not been loaded. To use JUI helper, please initialize with \\n\"\n                            + \"NDKHelper::Init( ANativeActivity* activity, const char* helper_class_name, const char* native_soname);\\n\"\n                            + \"--------------------------------------------\\n\");\n            return false;\n        } else\n            return true;\n    }\n\n    private static boolean loadedSO = false;\n    NativeActivity activity;\n\n\n\n    //\n    // Load Bitmap\n    // Java helper is useful decoding PNG, TIFF etc rather than linking libPng\n    // etc separately\n    //\n    private int nextPOT(int i) {\n        int pot = 1;\n        while (pot < i)\n            pot <<= 1;\n        return pot;\n    }\n\n    private Bitmap scaleBitmap(Bitmap bitmapToScale, float newWidth,\n                               float newHeight) {\n        if (bitmapToScale == null)\n            return null;\n        // get the original width and height\n        int width = bitmapToScale.getWidth();\n        int height = bitmapToScale.getHeight();\n        // create a matrix for the manipulation\n        Matrix matrix = new Matrix();\n\n        // resize the bit map\n        matrix.postScale(newWidth / width, newHeight / height);\n\n        // recreate the new Bitmap and set it back\n        return Bitmap.createBitmap(bitmapToScale, 0, 0,\n                bitmapToScale.getWidth(), bitmapToScale.getHeight(), matrix,\n                true);\n    }\n\n    public class TextureInformation {\n        boolean ret;\n        boolean alphaChannel;\n        int originalWidth;\n        int originalHeight;\n        Object image;\n    }\n\n    public Object loadTexture(String path) {\n        Bitmap bitmap = null;\n        TextureInformation info = new TextureInformation();\n        try {\n            String str = path;\n            if (!path.startsWith(\"/\")) {\n                str = \"/\" + path;\n            }\n\n            File file = new File(activity.getExternalFilesDir(null), str);\n            if (file.canRead()) {\n                bitmap = BitmapFactory.decodeStream(new FileInputStream(file));\n            } else {\n                bitmap = BitmapFactory.decodeStream(activity.getResources()\n                        .getAssets().open(path));\n            }\n            // Matrix matrix = new Matrix();\n            // // resize the bit map\n            // matrix.postScale(-1F, 1F);\n            //\n            // // recreate the new Bitmap and set it back\n            // bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),\n            // bitmap.getHeight(), matrix, true);\n\n        } catch (Exception e) {\n            Log.w(\"NDKHelper\", \"Coundn't load a file:\" + path);\n            info.ret = false;\n            return info;\n        }\n\n        if (bitmap != null) {\n            GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);\n        }\n        info.ret = true;\n        info.alphaChannel = bitmap.hasAlpha();\n        info.originalWidth = getBitmapWidth(bitmap);\n        info.originalHeight = getBitmapHeight(bitmap);\n\n        return info;\n    }\n\n    public Object loadCubemapTexture(String path, int face, int miplevel, boolean sRGB) {\n        Bitmap bitmap = null;\n        TextureInformation info = new TextureInformation();\n        try {\n            String str = path;\n            if (!path.startsWith(\"/\")) {\n                str = \"/\" + path;\n            }\n\n            File file = new File(activity.getExternalFilesDir(null), str);\n            if (file.canRead()) {\n                bitmap = BitmapFactory.decodeStream(new FileInputStream(file));\n            } else {\n                bitmap = BitmapFactory.decodeStream(activity.getResources()\n                        .getAssets().open(path));\n            }\n        } catch (Exception e) {\n            Log.w(\"NDKHelper\", \"Coundn't load a file:\" + path);\n            info.ret = false;\n            return info;\n        }\n\n        if (bitmap != null) {\n            if (sRGB)\n            {\n//        \t\tGLUtils.texImage2D(face, miplevel, bitmap, 0);\n//        \t\tGLUtils.texImage2D(face, miplevel,\n//        \t\t\t\tGLUtils.getInternalFormat(bitmap), bitmap, 0);\n//        \t\tint i = GLUtils.getInternalFormat(bitmap);\n//        \t\tif( i == GL10.GL_RGBA)\n//        \t\t{\n//            \t\tGLUtils.texImage2D(face, miplevel,\n//            \t\t\t\tGLES30.GL_SRGB, bitmap, 0);\n//        \t\t}\n                //Leave them for now\n                GLUtils.texImage2D(face, miplevel, bitmap, 0);\n            }\n            else\n                GLUtils.texImage2D(face, miplevel, bitmap, 0);\n        }\n        info.ret = true;\n        info.alphaChannel = bitmap.hasAlpha();\n        info.originalWidth = getBitmapWidth(bitmap);\n        info.originalHeight = getBitmapHeight(bitmap);\n\n        return info;\n\n    }\n\n    public Object loadImage(String path) {\n        Bitmap bitmap = null;\n        TextureInformation info = new TextureInformation();\n        try {\n            String str = path;\n            if (!path.startsWith(\"/\")) {\n                str = \"/\" + path;\n            }\n\n            File file = new File(activity.getExternalFilesDir(null), str);\n            if (file.canRead()) {\n                bitmap = BitmapFactory.decodeStream(new FileInputStream(file));\n            } else {\n                bitmap = BitmapFactory.decodeStream(activity.getResources()\n                        .getAssets().open(path));\n            }\n        } catch (Exception e) {\n            Log.w(\"NDKHelper\", \"Coundn't load a file:\" + path);\n            info.ret = false;\n            return info;\n        }\n\n        if (bitmap != null) {\n            GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);\n        }\n        info.ret = true;\n        info.alphaChannel = bitmap.hasAlpha();\n        info.originalWidth = getBitmapWidth(bitmap);\n        info.originalHeight = getBitmapHeight(bitmap);\n\n        int iBytes = bitmap.getWidth() * bitmap.getHeight() * 4;\n        ByteBuffer buffer = ByteBuffer.allocateDirect(iBytes);\n\n        bitmap.copyPixelsToBuffer(buffer);\n        info.image = buffer;\n        return info;\n    }\n\n    public Bitmap openBitmap(String path, boolean iScalePOT) {\n        Bitmap bitmap = null;\n        try {\n            bitmap = BitmapFactory.decodeStream(activity.getResources()\n                    .getAssets().open(path));\n            if (iScalePOT) {\n                int originalWidth = getBitmapWidth(bitmap);\n                int originalHeight = getBitmapHeight(bitmap);\n                int width = nextPOT(originalWidth);\n                int height = nextPOT(originalHeight);\n                if (originalWidth != width || originalHeight != height) {\n                    // Scale it\n                    bitmap = scaleBitmap(bitmap, width, height);\n                }\n            }\n\n        } catch (Exception e) {\n            Log.w(\"NDKHelper\", \"Coundn't load a file:\" + path);\n        }\n\n        return bitmap;\n    }\n\n    public int getBitmapWidth(Bitmap bmp) {\n        return bmp.getWidth();\n    }\n\n    public int getBitmapHeight(Bitmap bmp) {\n        return bmp.getHeight();\n    }\n\n    public void getBitmapPixels(Bitmap bmp, int[] pixels) {\n        int w = bmp.getWidth();\n        int h = bmp.getHeight();\n        bmp.getPixels(pixels, 0, w, 0, 0, w, h);\n    }\n\n    public void closeBitmap(Bitmap bmp) {\n        bmp.recycle();\n    }\n\n    public String getNativeLibraryDirectory(Context appContext) {\n        ApplicationInfo ai = activity.getApplicationInfo();\n\n        Log.w(\"NDKHelper\", \"ai.nativeLibraryDir:\" + ai.nativeLibraryDir);\n\n        if ((ai.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0\n                || (ai.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {\n            return ai.nativeLibraryDir;\n        }\n        return \"/system/lib/\";\n    }\n\n    public String getApplicationName() {\n        final PackageManager pm = activity.getPackageManager();\n        ApplicationInfo ai;\n        try {\n            ai = pm.getApplicationInfo(activity.getPackageName(), 0);\n        } catch (final NameNotFoundException e) {\n            ai = null;\n        }\n        String applicationName = (String) (ai != null ? pm\n                .getApplicationLabel(ai) : \"(unknown)\");\n        return applicationName;\n    }\n\n    public String getStringResource(String resourceName)\n    {\n        int id = activity.getResources().getIdentifier(resourceName, \"string\", activity.getPackageName());\n        String value = id == 0 ? \"\" : (String)activity.getResources().getText(id);\n        return value;\n    }\n\n    //\n    // Audio related helpers\n    //\n    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)\n    public int getNativeAudioBufferSize() {\n        int SDK_INT = android.os.Build.VERSION.SDK_INT;\n        if (SDK_INT >= 17) {\n            AudioManager am = (AudioManager) activity\n                    .getSystemService(Context.AUDIO_SERVICE);\n            String framesPerBuffer = am\n                    .getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);\n            return Integer.parseInt(framesPerBuffer);\n        } else {\n            return 0;\n        }\n    }\n\n    public int getNativeAudioSampleRate() {\n        return AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_SYSTEM);\n    }\n\n    /*\n     * Helper to execute function in UIThread\n     */\n    public void runOnUIThread(final long p) {\n        if (checkSOLoaded()) {\n            activity.runOnUiThread(new Runnable() {\n                @Override\n                public void run() {\n                    RunOnUiThreadHandler(p);\n                }\n            });\n        }\n        return;\n    }\n\n    /*\n     * Native code helper for RunOnUiThread\n     */\n    native public void RunOnUiThreadHandler(long pointer);\n}\n"
  },
  {
    "path": "teapots/textured-teapot/src/main/java/com/sample/texturedteapot/TeapotApplication.java",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.sample.texturedteapot;\n\nimport javax.microedition.khronos.opengles.GL10;\n\nimport android.app.Application;\nimport android.content.Context;\nimport android.content.pm.ApplicationInfo;\nimport android.content.pm.PackageManager;\nimport android.content.pm.PackageManager.NameNotFoundException;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport android.graphics.Matrix;\nimport android.opengl.GLUtils;\nimport android.util.Log;\nimport android.widget.Toast;\n\npublic class TeapotApplication extends Application {\n    public void onCreate(){\n        super.onCreate();\t\n        Log.w(\"native-activity\", \"onCreate\");\n\n        final PackageManager pm = getApplicationContext().getPackageManager();\n        ApplicationInfo ai;\n        try {\n            ai = pm.getApplicationInfo( this.getPackageName(), 0);\n        } catch (final NameNotFoundException e) {\n            ai = null;\n        }\n        final String applicationName = (String) (ai != null ? pm.getApplicationLabel(ai) : \"(unknown)\");\n        Toast.makeText(this, applicationName, Toast.LENGTH_SHORT).show();\n    }\n}\n"
  },
  {
    "path": "teapots/textured-teapot/src/main/java/com/sample/texturedteapot/TeapotNativeActivity.java",
    "content": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.sample.texturedteapot;\n\nimport android.annotation.SuppressLint;\nimport android.annotation.TargetApi;\nimport android.app.NativeActivity;\nimport android.os.Bundle;\nimport android.view.Gravity;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup.MarginLayoutParams;\nimport android.view.WindowManager.LayoutParams;\nimport android.widget.LinearLayout;\nimport android.widget.PopupWindow;\nimport android.widget.TextView;\n\npublic class TeapotNativeActivity extends NativeActivity {\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        //Hide toolbar\n        int SDK_INT = android.os.Build.VERSION.SDK_INT;\n        if(SDK_INT >= 19)\n        {\n            setImmersiveSticky();\n\n            View decorView = getWindow().getDecorView();\n            decorView.setOnSystemUiVisibilityChangeListener\n                    (new View.OnSystemUiVisibilityChangeListener() {\n                @Override\n                public void onSystemUiVisibilityChange(int visibility) {\n                    setImmersiveSticky();\n                }\n            });\n        }\n\n    }\n\n    @TargetApi(19)    \n    protected void onResume() {\n        super.onResume();\n\n        //Hide toolbar\n        int SDK_INT = android.os.Build.VERSION.SDK_INT;\n        if(SDK_INT >= 11 && SDK_INT < 14)\n        {\n            getWindow().getDecorView().setSystemUiVisibility(View.STATUS_BAR_HIDDEN);\n        }\n        else if(SDK_INT >= 14 && SDK_INT < 19)\n        {\n            getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LOW_PROFILE);\n        }\n        else if(SDK_INT >= 19)\n        {\n            setImmersiveSticky();\n        }\n\n    }\n    // Our popup window, you will call it from your C/C++ code later\n\n    @TargetApi(19)    \n    void setImmersiveSticky() {\n        View decorView = getWindow().getDecorView();\n        decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN\n                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION\n                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY\n                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN\n                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION\n                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);\n    }\n\n    TeapotNativeActivity _activity;\n    PopupWindow _popupWindow;\n    TextView _label;\n\n    @SuppressLint(\"InflateParams\")\n    public void showUI()\n    {\n        if( _popupWindow != null )\n            return;\n\n        _activity = this;\n\n        this.runOnUiThread(new Runnable()  {\n            @Override\n            public void run()  {\n                LayoutInflater layoutInflater\n                = (LayoutInflater)getBaseContext()\n                .getSystemService(LAYOUT_INFLATER_SERVICE);\n                View popupView = layoutInflater.inflate(R.layout.widgets, null);\n                _popupWindow = new PopupWindow(\n                        popupView,\n                        LayoutParams.WRAP_CONTENT,\n                        LayoutParams.WRAP_CONTENT);\n\n                LinearLayout mainLayout = new LinearLayout(_activity);\n                MarginLayoutParams params = new MarginLayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);\n                params.setMargins(0, 0, 0, 0);\n                _activity.setContentView(mainLayout, params);\n\n                // Show our UI over NativeActivity window\n                _popupWindow.showAtLocation(mainLayout, Gravity.TOP | Gravity.START, 10, 10);\n                _popupWindow.update();\n\n                _label = (TextView)popupView.findViewById(R.id.textViewFPS);\n\n            }});\n    }\n\n    protected void onPause()\n    {\n        super.onPause();\n    }\n\n    public void updateFPS(final float fFPS)\n    {\n        if( _label == null )\n            return;\n\n        _activity = this;\n        this.runOnUiThread(new Runnable()  {\n            @Override\n            public void run()  {\n                _label.setText(String.format(\"%2.2f FPS\", fFPS));\n\n            }});\n    }\n}\n\n\n"
  },
  {
    "path": "teapots/textured-teapot/src/main/res/layout/widgets.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:gravity=\"top\"\n    android:orientation=\"vertical\" >\n\n    <TextView\n        android:id=\"@+id/textViewFPS\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"end\"\n        android:text=\"@string/fps\"\n        android:textAppearance=\"?android:attr/textAppearanceMedium\"\n        android:textColor=\"@android:color/white\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "teapots/textured-teapot/src/main/res/values/strings.xml",
    "content": "<resources>\n\n    <string name=\"app_name\">TexturedTeapot</string>\n    <string name=\"fps\">0.0 FPS</string>\n\n</resources>\n"
  },
  {
    "path": "teapots/textured-teapot/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!--\n        Base application theme, dependent on API level. This theme is replaced\n        by AppBaseTheme from res/values-vXX/styles.xml on newer devices.\n    -->\n    <style name=\"AppBaseTheme\" parent=\"android:Theme.Light\">\n        <!--\n            Theme customizations available in newer API levels can go in\n            res/values-vXX/styles.xml, while customizations related to\n            backward-compatibility can go here.\n        -->\n    </style>\n\n    <!-- Application theme. -->\n    <style name=\"AppTheme\" parent=\"AppBaseTheme\">\n        <!-- All customizations that are NOT specific to a particular API-level can go here. -->\n    </style>\n\n</resources>"
  },
  {
    "path": "teapots/textured-teapot/src/main/res/values-v11/styles.xml",
    "content": "<resources>\n\n    <!--\n        Base application theme for API 11+. This theme completely replaces\n        AppBaseTheme from res/values/styles.xml on API 11+ devices.\n    -->\n    <style name=\"AppBaseTheme\" parent=\"android:Theme.Holo.Light\">\n        <!-- API 11 theme customizations can go here. -->\n    </style>\n\n</resources>"
  },
  {
    "path": "teapots/textured-teapot/src/main/res/values-v14/styles.xml",
    "content": "<resources>\n\n    <!--\n        Base application theme for API 14+. This theme completely replaces\n        AppBaseTheme from BOTH res/values/styles.xml and\n        res/values-v11/styles.xml on API 14+ devices.\n    -->\n    <style name=\"AppBaseTheme\" parent=\"android:Theme.Holo.Light.DarkActionBar\">\n        <!-- API 14 theme customizations can go here. -->\n    </style>\n\n</resources>"
  },
  {
    "path": "unit-test/.gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n/.idea/caches\n/.idea/libraries\n/.idea/modules.xml\n/.idea/workspace.xml\n/.idea/navEditor.xml\n/.idea/assetWizardSettings.xml\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n.cxx\nlocal.properties\n"
  },
  {
    "path": "unit-test/README.md",
    "content": "# Unit Test\n\nThis Android sample shows how to write unit tests for native code with\n[googletest](https://github.com/google/googletest), and run them on-device.\n\n## Writing unit tests\n\nThis app has a very simple library containing a function to add two numbers.\n\n[adder.h](app/src/main/cpp/adder.h):\n\n```C++\n#pragma once\n\nint add(int a, int b);\n```\n\n[adder.cpp](app/src/main/cpp/adder.cpp):\n\n```C++\n#include \"adder.h\"\n\nint add(int a, int b) { return a + b; }\n```\n\n[adder_test.cpp](app/src/main/cpp/adder_test.cpp) contains a unit test for this\nfunction:\n\n```C++\n#include \"adder.h\"\n\n#include \"gtest/gtest.h\"\n\nTEST(adder, adder) { EXPECT_EQ(3, add(1, 2)); }\n```\n\n## Building and running the tests\n\nWe need to add a library for the test to\n[CMakeLists.txt](app/src/main/cpp/CMakeLists.txt), which depends on googletest\nand junit-gtest:\n\n```cmake\nfind_package(googletest REQUIRED CONFIG)\nfind_package(junit-gtest REQUIRED CONFIG)\n```\n\n```cmake\nadd_library(app_tests SHARED adder_test.cpp)\ntarget_link_libraries(app_tests\n  PRIVATE\n    $<TARGET_OBJECTS:adder>\n    googletest::gtest\n    junit-gtest::junit-gtest\n)\n```\n\nWe need to add googletest and junit-gtest as dependencies in\n[app/build.gradle](app/build.gradle). Googletest uses prefab, so we enable that.\n\n```\n    build_features {\n    \tprefab true\n    }\n```\n\n```\ndependencies {\n    implementation 'androidx.test.ext:junit-gtest:1.0.0-alpha01'\n    implementation 'com.android.ndk.thirdparty:googletest:1.11.0-beta-1'\n}\n```\n\nFinally, we need a wrapper in androidTest,\n[NativeTests.kt](app/src/androidTest/java/com/example/unittest/NativeTests.kt):\n\n```kotlin\npackage com.example.unittest\n\nimport androidx.test.ext.junitgtest.GtestRunner\nimport androidx.test.ext.junitgtest.TargetLibrary\nimport org.junit.runner.RunWith\n\n@RunWith(GtestRunner::class)\n@TargetLibrary(libraryName = \"app_tests\")\nclass NativeTests\n```\n\nYou can run the test on a phone or emulator as described in the\n[Android developer documentation](https://developer.android.com/studio/test/test-in-android-studio).\n\nTry deliberately breaking the test, like this:\n\n```C++\nEXPECT_EQ(4, add(1, 2));\n```\n\nYou should see a failure message like this:\n\n```\njava.lang.AssertionError:\n/path/to/ndk-samples/unit-test/app/src/main/cpp/adder_test.cpp:6\nExpected equality of these values:\n4\nadd(1,2)\nWhich is: 3\n```\n\n## Screenshot\n\n![screenshot](screenshot.png)\n"
  },
  {
    "path": "unit-test/app/.gitignore",
    "content": "/build"
  },
  {
    "path": "unit-test/app/build.gradle",
    "content": "plugins {\n    id \"ndksamples.android.application\"\n    id \"ndksamples.android.kotlin\"\n}\n\nandroid {\n    namespace 'com.example.unittest'\n\n    defaultConfig {\n        applicationId \"com.example.unittest\"\n        versionCode 1\n        versionName \"1.0\"\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n\n        ndk {\n            // junit-gtest and googletest don't currently (August 2025) include\n            // riscv64 libraries.\n            abiFilters.remove(\"riscv64\")\n        }\n    }\n\n    externalNativeBuild {\n        cmake {\n            path file('src/main/cpp/CMakeLists.txt')\n        }\n    }\n\n    buildFeatures {\n        viewBinding true\n        prefab true\n    }\n\n    packagingOptions {\n        jniLibs {\n            // Gradle has no way of knowing which of the libraries in our\n            // CMakeLists.txt are for the app and which are for tests, so we\n            // have to tell it which libraries are test libraries. Without\n            // this, the test libraries will end up packaged in the real API\n            // and not just the test APK.\n            //\n            // If you copy this project, be sure to update this to specify the\n            // names of your own test libraries.\n            testOnly += [\"**/libapp_tests.so\"]\n        }\n    }\n}\n\ndependencies {\n    implementation project(\":base\")\n    implementation libs.appcompat\n    implementation libs.material\n    implementation libs.androidx.constraintlayout\n    implementation libs.androidx.junit.gtest\n    implementation libs.googletest\n    testImplementation libs.junit\n    androidTestImplementation libs.ext.junit\n    androidTestImplementation libs.espresso.core\n}"
  },
  {
    "path": "unit-test/app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "unit-test/app/src/androidTest/java/com/example/unittest/NativeTests.kt",
    "content": "package com.example.unittest\n\nimport androidx.test.ext.junitgtest.GtestRunner\nimport androidx.test.ext.junitgtest.TargetLibrary\nimport org.junit.runner.RunWith\n\n@RunWith(GtestRunner::class)\n@TargetLibrary(libraryName = \"app_tests\")\nclass NativeTests\n"
  },
  {
    "path": "unit-test/app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <application\n        android:allowBackup=\"true\"\n        android:dataExtractionRules=\"@xml/data_extraction_rules\"\n        android:fullBackupContent=\"@xml/backup_rules\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:roundIcon=\"@mipmap/ic_launcher_round\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/Theme.UnitTest\"\n        tools:targetApi=\"31\">\n        <activity\n            android:name=\".MainActivity\"\n            android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n\n            <meta-data\n                android:name=\"android.app.lib_name\"\n                android:value=\"\" />\n        </activity>\n    </application>\n\n</manifest>"
  },
  {
    "path": "unit-test/app/src/main/cpp/CMakeLists.txt",
    "content": "# For more information about using CMake with Android Studio, read the\n# documentation: https://d.android.com/studio/projects/add-native-code.html\n\n# Sets the minimum version of CMake required to build the native library.\n\ncmake_minimum_required(VERSION 3.22.1)\nproject(\"unittest\")\n\ninclude(AppLibrary)\n\nfind_package(base REQUIRED CONFIG)\nfind_package(googletest REQUIRED CONFIG)\nfind_package(junit-gtest REQUIRED CONFIG)\n\nadd_app_library(adder OBJECT adder.cpp)\n\nadd_app_library(\n    unittest\n    SHARED\n    $<TARGET_OBJECTS:adder>\n    native-lib.cpp\n)\n\ntarget_link_libraries( # Specifies the target library.\n    unittest\n    PRIVATE\n    base::base\n    log\n)\n\nadd_app_library(app_tests NO_VERSION_SCRIPT SHARED adder_test.cpp)\ntarget_link_libraries(app_tests\n    PRIVATE\n    $<TARGET_OBJECTS:adder>\n    googletest::gtest\n    junit-gtest::junit-gtest\n)\n"
  },
  {
    "path": "unit-test/app/src/main/cpp/adder.cpp",
    "content": "#include \"adder.h\"\n\nint add(int a, int b) { return a + b; }"
  },
  {
    "path": "unit-test/app/src/main/cpp/adder.h",
    "content": "#pragma once\n\nint add(int a, int b);"
  },
  {
    "path": "unit-test/app/src/main/cpp/adder_test.cpp",
    "content": "#include \"adder.h\"\n\n#include \"gtest/gtest.h\"\n\nTEST(adder, adder) { EXPECT_EQ(3, add(1, 2)); }\n"
  },
  {
    "path": "unit-test/app/src/main/cpp/libunittest.map.txt",
    "content": "LIBUNITTEST {\n  global:\n    JNI_OnLoad;\n  local:\n    *;\n};\n"
  },
  {
    "path": "unit-test/app/src/main/cpp/native-lib.cpp",
    "content": "#include <base/macros.h>\n#include <jni.h>\n\n#include \"adder.h\"\n\njint Add(JNIEnv*, jobject, jint a, jint b) { return add((int)a, (int)b); }\n\nextern \"C\" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* _Nonnull vm,\n                                             void* _Nullable) {\n  JNIEnv* env;\n  if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {\n    return JNI_ERR;\n  }\n\n  jclass c = env->FindClass(\"com/example/unittest/MainActivity\");\n  if (c == nullptr) return JNI_ERR;\n\n  static const JNINativeMethod methods[] = {\n      {\"add\", \"(II)I\", reinterpret_cast<void*>(Add)},\n  };\n  int rc = env->RegisterNatives(c, methods, arraysize(methods));\n  if (rc != JNI_OK) return rc;\n\n  return JNI_VERSION_1_6;\n}\n"
  },
  {
    "path": "unit-test/app/src/main/java/com/example/unittest/MainActivity.kt",
    "content": "package com.example.unittest\n\nimport androidx.appcompat.app.AppCompatActivity\nimport android.os.Bundle\nimport android.widget.TextView\nimport com.example.unittest.databinding.ActivityMainBinding\n\nclass MainActivity : AppCompatActivity() {\n\n    private lateinit var binding: ActivityMainBinding\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        binding = ActivityMainBinding.inflate(layoutInflater)\n        setContentView(binding.root)\n\n        binding.sampleText.text = \"1 + 2 = \" + add(1, 2).toString()\n    }\n\n    /**\n     * A native method that is implemented by the 'unittest' native library,\n     * which is packaged with this application.\n     */\n    external fun add(a: Int, b: Int): Int\n\n    companion object {\n        // Used to load the 'unittest' library on application startup.\n        init {\n            System.loadLibrary(\"unittest\")\n        }\n    }\n}"
  },
  {
    "path": "unit-test/app/src/main/res/drawable/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path\n        android:fillColor=\"#3DDC84\"\n        android:pathData=\"M0,0h108v108h-108z\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M9,0L9,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,0L19,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,0L29,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,0L39,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,0L49,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,0L59,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,0L69,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,0L79,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M89,0L89,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M99,0L99,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,9L108,9\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,19L108,19\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,29L108,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,39L108,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,49L108,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,59L108,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,69L108,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,79L108,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,89L108,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,99L108,99\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,29L89,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,39L89,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,49L89,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,59L89,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,69L89,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,79L89,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,19L29,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,19L39,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,19L49,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,19L59,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,19L69,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,19L79,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n</vector>\n"
  },
  {
    "path": "unit-test/app/src/main/res/drawable-v24/ic_launcher_foreground.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path android:pathData=\"M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z\">\n        <aapt:attr name=\"android:fillColor\">\n            <gradient\n                android:endX=\"85.84757\"\n                android:endY=\"92.4963\"\n                android:startX=\"42.9492\"\n                android:startY=\"49.59793\"\n                android:type=\"linear\">\n                <item\n                    android:color=\"#44000000\"\n                    android:offset=\"0.0\" />\n                <item\n                    android:color=\"#00000000\"\n                    android:offset=\"1.0\" />\n            </gradient>\n        </aapt:attr>\n    </path>\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:fillType=\"nonZero\"\n        android:pathData=\"M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z\"\n        android:strokeWidth=\"1\"\n        android:strokeColor=\"#00000000\" />\n</vector>"
  },
  {
    "path": "unit-test/app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".MainActivity\">\n\n    <TextView\n        android:id=\"@+id/sample_text\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"Hello World!\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "unit-test/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\" />\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "unit-test/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\" />\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "unit-test/app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"purple_200\">#FFBB86FC</color>\n    <color name=\"purple_500\">#FF6200EE</color>\n    <color name=\"purple_700\">#FF3700B3</color>\n    <color name=\"teal_200\">#FF03DAC5</color>\n    <color name=\"teal_700\">#FF018786</color>\n    <color name=\"black\">#FF000000</color>\n    <color name=\"white\">#FFFFFFFF</color>\n</resources>"
  },
  {
    "path": "unit-test/app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">Unit Test</string>\n</resources>"
  },
  {
    "path": "unit-test/app/src/main/res/values/themes.xml",
    "content": "<resources xmlns:tools=\"http://schemas.android.com/tools\">\n    <!-- Base application theme. -->\n    <style name=\"Theme.UnitTest\" parent=\"Theme.MaterialComponents.DayNight.DarkActionBar\">\n        <!-- Primary brand color. -->\n        <item name=\"colorPrimary\">@color/purple_500</item>\n        <item name=\"colorPrimaryVariant\">@color/purple_700</item>\n        <item name=\"colorOnPrimary\">@color/white</item>\n        <!-- Secondary brand color. -->\n        <item name=\"colorSecondary\">@color/teal_200</item>\n        <item name=\"colorSecondaryVariant\">@color/teal_700</item>\n        <item name=\"colorOnSecondary\">@color/black</item>\n        <!-- Status bar color. -->\n        <item name=\"android:statusBarColor\">?attr/colorPrimaryVariant</item>\n        <!-- Customize your theme here. -->\n    </style>\n</resources>"
  },
  {
    "path": "unit-test/app/src/main/res/values-night/themes.xml",
    "content": "<resources xmlns:tools=\"http://schemas.android.com/tools\">\n    <!-- Base application theme. -->\n    <style name=\"Theme.UnitTest\" parent=\"Theme.MaterialComponents.DayNight.DarkActionBar\">\n        <!-- Primary brand color. -->\n        <item name=\"colorPrimary\">@color/purple_200</item>\n        <item name=\"colorPrimaryVariant\">@color/purple_700</item>\n        <item name=\"colorOnPrimary\">@color/black</item>\n        <!-- Secondary brand color. -->\n        <item name=\"colorSecondary\">@color/teal_200</item>\n        <item name=\"colorSecondaryVariant\">@color/teal_200</item>\n        <item name=\"colorOnSecondary\">@color/black</item>\n        <!-- Status bar color. -->\n        <item name=\"android:statusBarColor\">?attr/colorPrimaryVariant</item>\n        <!-- Customize your theme here. -->\n    </style>\n</resources>"
  },
  {
    "path": "unit-test/app/src/main/res/xml/backup_rules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Sample backup rules file; uncomment and customize as necessary.\n   See https://developer.android.com/guide/topics/data/autobackup\n   for details.\n   Note: This file is ignored for devices older that API 31\n   See https://developer.android.com/about/versions/12/backup-restore\n-->\n<full-backup-content>\n    <!--\n   <include domain=\"sharedpref\" path=\".\"/>\n   <exclude domain=\"sharedpref\" path=\"device.xml\"/>\n-->\n</full-backup-content>"
  },
  {
    "path": "unit-test/app/src/main/res/xml/data_extraction_rules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Sample data extraction rules file; uncomment and customize as necessary.\n   See https://developer.android.com/about/versions/12/backup-restore#xml-changes\n   for details.\n-->\n<data-extraction-rules>\n    <cloud-backup>\n        <!-- TODO: Use <include> and <exclude> to control what is backed up.\n        <include .../>\n        <exclude .../>\n        -->\n    </cloud-backup>\n    <!--\n    <device-transfer>\n        <include .../>\n        <exclude .../>\n    </device-transfer>\n    -->\n</data-extraction-rules>"
  },
  {
    "path": "vectorization/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "vectorization/README.md",
    "content": "# Vectorization\n\nThis sample shows how to implement matrix multiplication using various\nvectorization approaches.\n\nNote: You should not reuse this matrix library in your application. It was not\nwritten to be useful beyond the scope of this demo. If you're looking for a\nmatrix library, you probably want [GLM] for graphics applications, or a linear\nalgebra library such as BLAS for compute applications.\n\nThe sample app will benchmark each implementation and display the average run\ntime over 1,000,000 runs. The goal of this sample is to illustrate the trade-\noffs of each implementation in terms of flexibility, readability, and\nperformance.\n\nGiven the relatively small problem size used here (4x4 matrices and vec4s), the\nbest performing implementations in this sample are the ones that can best\nimprove over the naive implementation without large set up costs. You should not\ntake the results of this sample as authoritative: if performance is important to\nyou, you **must** benchmark your code for workloads realistic for your app.\n\nIf you're not familiar with it [Godbolt] is an invaluable tool for examining\ncompiler optimizer behavior. You could also use `$NDK_BIN/clang -S -O2 -o -`\nfrom the command line for a local workflow.\n\n## Implementations\n\nThis sample contains the following implementations. Each of their trade-offs are\ndiscussed briefly, but as mentioned above, you should not rely on the\nperformance results measured here to make a decision for your app.\n\n### Auto-vectorization\n\nSee [auto_vectorization.h] for the implementation.\n\nThis implementation is written in generic C++ and contains no explicit SIMD. The\nonly vectorization that will be performed is Clang's auto-vectorization. This\nmakes for the most portable code and readable code, but at the cost of\nperformance.\n\nSee https://llvm.org/docs/Vectorizers.html for Clang's docs about\nauto-vectorization.\n\n### std::simd\n\nThis isn't actually available yet. It's an experimental part of the C++ standard\nand is in development in libc++, but NDK r27 happened to catch it right in the\nmiddle of a rewrite, so it's not currently usable.\n\nSee https://en.cppreference.com/w/cpp/experimental/simd/simd.\n\n### Clang vectors\n\nSee [clang_vector.h] for the implementation.\n\nThis implementation uses Clang's generic vector types. This code is mostly as\nportable as the auto-vectorization implementation, with the only caveat being\nthat it is limited by the width of the vector registers for the target hardware.\nTo deal with problems that don't fit in the target's vector registers, you would\nneed to either alter the algorithm to use a [partitioned matrix multiply], or\nuse Scalable Vector Extensions (AKA [SVE]).\n\nHowever, the benefit of the portability trade-off is that this does outperform\nthe auto-vectorization implementation.\n\nSee\nhttps://clang.llvm.org/docs/LanguageExtensions.html#vectors-and-extended-vectors.\n\n### Clang matrices\n\nSee [matrix.h] for the implementation. This is the default implementation for\n`Matrix::operator*`, so unlike the others that file contains the rest of the\n`Matrix` class as well.\n\nThis implementation uses Clang's built-in matrix type. This is an experimental\nfeature in Clang, but it has the simplest code (because some kind Clang person\nwrote the hard part) and performs the best by a wide margin. There are\nimplementation defined limits on the size of the matrix, but within those limits\nthe code is as portable as the auto-vectorization implementation. The docs say\nthe feature is still under development and subject to change, so be wary of\nusing this in production, and definitely don't use these types as part of your\nABI.\n\nSee https://clang.llvm.org/docs/LanguageExtensions.html#matrix-types for more\ndetails.\n\n### OpenMP SIMD\n\nSee [omp_simd.h] for the implementation.\n\nThis implementation uses OpenMP's SIMD directive. For some reason this\nunder-performs even the auto-vectorized implementation. There are a lot of\nadditional specifiers that can be added to the simd directive that would maybe\nimprove this implementation. Patches welcome :)\n\nSee https://www.openmp.org/spec-html/5.0/openmpsu42.html for more information.\n\n## Alternatives not shown here\n\nThere are other approaches that could be used that aren't shown here.\n\n### Neon\n\nA Neon implementation would be nearly identical to the one in [clang_vector.h].\nThe only difference is how the vector type is specified. A lot of older Neon\nsample code looks substantially different because it uses the Neon intrinsics\ndefined in `arm_neon.h`, but if you look at how the intrinsics in that file are\ndefined, all they actually do (for a little endian system, and Android does not\nsupport big endian, so we can ignore that caveat) is use the `*` operator and\nleave the correct instruction selection up to Clang.\n\nIn other words, you should probably never use the Neon-specific approach. The\ngenerated code should be identical to code written with Clang's arch-generic\nvectors. If you rewrite the [clang_vector.h] implementation to use Neon's\n`float32x4_t` instead of the Clang vector, the results are identical.\n\n### SVE\n\n[SVE] scales SIMD to arbitrarily sized vectors, and the C extensions, while\nmaking for less concise code than is needed for a constrained vector size like\nwe have here, handle windowing of data to fit the hardware vector size for you.\nFor problems like the small matrix multiply we do here, it's overkill. For\nportability across various vector widths for the Arm CPUs that support SVE, it\ncan reduce the difficulty of writing SIMD code.\n\nIn practice though, most mobile hardware has no SVE support, and all the\nhardware that does support SVE only has 128-bit vector lengths. In practice,\nSVE's portability is currently only between mobile and server (because server\nSVE implementations do sometimes have larger vector lengths).\n\n### GPU acceleration\n\nGPU acceleration is a better fit for large data sets. That approach isn't shown\nhere because it's substantially more code to set up the GPU for this\ncomputation, and our data size is so small that the cost of GPU initialization\nand streaming the data to the GPU is likely to make that a net-loss. If you want\nto learn more about GPU compute, see https://vulkan-tutorial.com/Compute_Shader,\nhttps://www.khronos.org/opengl/wiki/Compute_Shader, and\nhttps://www.khronos.org/opencl/ (while OpenCL is not guaranteed to be available\nfor all Android devices, it is a very common OEM extension).\n\n## Function multi-versioning\n\nThere are two compiler attributes that can be helpful for targeting specific\nhardware features when optimizing hot code paths: [target] and [target_clones],\nboth of which may be referred to as \"function multiversioning\" or \"FMV\". Each\nsolves a slightly different but related problem.\n\nThe `target` attribute makes it easier to write multiple implementations for a\nfunction that should be selected based on the runtime hardware. If benchmarking\nshows that one implementation performs better on armv8.2 and a different\nimplementation performs better on armv8.0 (see the docs for more details on\nspecific targeting capabilities), you can write the function twice, annotate\nthem with the appropriate `__attribute__((target(...)))` tag, and the compiler\nwill auto-generate the code to select the best-fitting implementation at runtime\n(it uses ifuncs under the hood, so the branch is resolved once at library load\ntime rather than for each call).\n\nThe `target_clones` attribute, on the other hand, allows you to write the\nfunction once but instruct the compiler to generate multiple variants of the\nfunction for each requested target. This means that, for example, if you've\nrequested both `default` and `armv8.2`, the compiler will generate a default\nimplementation compatible with all Android devices, as well as a second\nimplementation that uses instructions available in armv8.2 but not available in\nthe base armv8 ABI. As with the `target` attribute, Clang will automatically\nselect the best-fitting implementation at runtime. Using `target_clones` is the\nsame as using `target` with identical function bodies.\n\nNote that with both of these approaches, testing becomes more difficult because\nyou will need a greater variety of hardware to test each code path. If you're\nalready doing fine grained targeting like this, that isn't a new problem, and\nusing one or both of these attributes may help you simplify your implementation.\n\nNeither of these techniques are shown in this sample. We don't have access to\nenough hardware to benchmark or verify multiple implementations, and (as of NDK\nr27, at least), Clang doesn't support `target_clones` on templated functions.\n\n[auto_vectorization.h]: src/main/cpp/auto_vectorization.h\n\n[clang_vector.h]: src/main/cpp/clang_vector.h\n\n[GLM]: https://github.com/g-truc/glm\n\n[Gobolt]: https://godbolt.org/\n\n[matrix.h]: src/main/cpp/matrix.h\n\n[neon.h]: src/main/cpp/neon.h\n\n[omp_simd.h]: src/main/cpp/omp_simd.h\n\n[partitioned matrix multiply]: https://en.wikipedia.org/wiki/Block_matrix#Multiplication\n\n[SVE]: https://developer.arm.com/Architectures/Scalable%20Vector%20Extensions\n\n[target_clones]: https://clang.llvm.org/docs/AttributeReference.html#target-clones\n\n[target]: https://clang.llvm.org/docs/AttributeReference.html#target\n"
  },
  {
    "path": "vectorization/build.gradle.kts",
    "content": "plugins {\n    id(\"ndksamples.android.application\")\n    id(\"ndksamples.android.kotlin\")\n}\n\nandroid {\n    namespace = \"com.android.ndk.samples.vectorization\"\n\n    defaultConfig {\n        applicationId = \"com.android.ndk.samples.vectorization\"\n\n        vectorDrawables {\n            useSupportLibrary = true\n        }\n    }\n\n    externalNativeBuild {\n        cmake {\n            path = file(\"src/main/cpp/CMakeLists.txt\")\n        }\n    }\n\n    buildFeatures {\n        compose = true\n        prefab = true\n    }\n\n    composeOptions {\n        kotlinCompilerExtensionVersion = \"1.5.1\"\n    }\n}\n\ndependencies {\n    implementation(project(\":base\"))\n    implementation(libs.androidx.core.ktx)\n    implementation(libs.androidx.lifecycle.runtime.ktx)\n    implementation(libs.androidx.activity.compose)\n    implementation(platform(libs.androidx.compose.bom))\n    implementation(libs.androidx.ui)\n    implementation(libs.androidx.ui.graphics)\n    implementation(libs.androidx.ui.tooling.preview)\n    implementation(libs.androidx.material3)\n    debugImplementation(libs.androidx.ui.tooling)\n    debugImplementation(libs.androidx.ui.test.manifest)\n}\n"
  },
  {
    "path": "vectorization/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <application\n        android:allowBackup=\"true\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:roundIcon=\"@mipmap/ic_launcher_round\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/Theme.NDKSamples\">\n        <activity\n            android:name=\".VectorizationActivity\"\n            android:exported=\"true\"\n            android:label=\"@string/app_name\"\n            android:theme=\"@style/Theme.NDKSamples\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "vectorization/src/main/cpp/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.22.1)\nproject(Vectorization LANGUAGES CXX)\n\ninclude(AppLibrary)\nfind_package(base REQUIRED CONFIG)\n\nadd_app_library(app\n    SHARED\n    benchmark.cpp\n    jni.cpp\n)\n\ntarget_compile_features(app PUBLIC cxx_std_23)\ntarget_compile_options(app PUBLIC -fenable-matrix -fopenmp)\n\ntarget_link_libraries(app\n    PRIVATE\n    base::base\n    log\n)\n"
  },
  {
    "path": "vectorization/src/main/cpp/auto_vectorization.h",
    "content": "/*\n * Copyright (C) 2024 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#pragma once\n\n#include <stdint.h>\n\n#include \"matrix.h\"\n\nnamespace samples::vectorization {\n\n/**\n * Multiplies two compatible matrices and returns the result.\n *\n * @tparam T The type of each matrix cell.\n * @tparam M The number of rows in the left operand and the result.\n * @tparam N The number of columns in the left operand, and the rows in the\n * right operand.\n * @tparam P The number of columns in the right operand and the result.\n * @param lhs The left operand.\n * @param rhs The right operand.\n * @return The result of lhs * rhs.\n */\ntemplate <typename T, size_t M, size_t N, size_t P>\nMatrix<M, P, T> MultiplyWithAutoVectorization(const Matrix<M, N, T>& lhs,\n                                              const Matrix<N, P, T>& rhs) {\n  // This may look like an unfair benchmark because this implementation uses the\n  // less vector friendly one than the others, however, using the vector\n  // friendly algorithm here actually made performance worse.\n  //\n  // This is a good illustration of why it's important to benchmark your own\n  // code and not rely on what someone else tells you about which works best: it\n  // depends.\n  //\n  // It's probably also worth mentioning that if what you need is *consistent*\n  // performance across compiler versions, the only real choice you have is\n  // writing assembly. Even the instruction intrinsics (at least for Neon) are\n  // subject to the compiler's instruction selection. That will be overkill for\n  // most users, since it's substantially more difficult to write and maintain,\n  // but is how you'll see some code bases deal with this (codecs in particular\n  // are willing to make that trade-off).\n  Matrix<M, P, T> result;\n  for (auto i = 0U; i < M; i++) {\n    for (auto j = 0U; j < P; j++) {\n      T sum = {};\n      for (auto k = 0U; k < N; k++) {\n        sum += lhs.get(i, k) * rhs[k, j];\n      }\n      result[i, j] = sum;\n    }\n  }\n  return result;\n}\n\n}  // namespace samples::vectorization\n"
  },
  {
    "path": "vectorization/src/main/cpp/benchmark.cpp",
    "content": "/*\n * Copyright (C) 2024 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"benchmark.h\"\n\n#include <base/logging.h>\n#include <stdint.h>\n\n#include <expected>\n#include <functional>\n\n#include \"auto_vectorization.h\"\n#include \"clang_vector.h\"\n#include \"matrix.h\"\n#include \"omp_simd.h\"\n\nconstexpr uint32_t kNumRuns = 1'000'000;\n\nnamespace samples::vectorization {\n\nVec4 result;\n\n/**\n * Benchmarks a given matrix multiply operation.\n *\n * The multiply is given here as a callback to try to keep Clang from folding,\n * unrolling, or inlining inconsistently across each benchmarked implementation.\n * We want Clang to do as much as possible to optimize *within* the multiply\n * function itself, but inconsistent optimization of the benchmark code itself\n * could skew results.\n *\n * @param position A position vector.\n * @param translation A translation vector.\n * @param func The multiplication function to use.\n * @return The average duration per call in nanoseconds.\n */\n[[nodiscard, clang::noinline]] std::chrono::nanoseconds Benchmark(\n    Vec4<>& position, Mat4<>& translation,\n    std::function<Vec4<>(const Vec4<>&, const Mat4<>&)> func) {\n  // TODO: Move to a unit test.\n  auto test = func(position, translation);\n  auto expected = Vec4{{20, 10, 10, 1}};\n  CHECK_EQ(test, expected);\n\n  auto begin = std::chrono::steady_clock::now();\n\n  // This is another attempt to prevent Clang from optimizing the benchmark\n  // harness inconsistently.\n#pragma clang loop unroll(disable)\n  for (auto i = 0U; i < kNumRuns; i++) {\n    result = func(position, translation);\n  }\n\n  auto end = std::chrono::steady_clock::now();\n\n  return (end - begin) / kNumRuns;\n}\n\n[[nodiscard]] std::expected<std::chrono::nanoseconds, BenchmarkError>\nBenchmarkMatrixMultiplication(Backend backend) {\n  Vec4 position{{10.0f, 10.0f, 10.0f, 1.0f}};\n  Mat4 translation{{\n      {1.0f, 0.0f, 0.0f, 10.0f},\n      {0.0f, 1.0f, 0.0f, 0.0f},\n      {0.0f, 0.0f, 1.0f, 0.0f},\n      {0.0f, 0.0f, 0.0f, 1.0f},\n  }};\n\n  switch (backend) {\n    case Backend::kAutoVectorization:\n      LOG(INFO) << \"Benchmarking auto-vectorization\";\n      return Benchmark(position, translation, [](Vec4<> p, Mat4<> t) {\n        return MultiplyWithAutoVectorization(t, p);\n      });\n    case Backend::kCxxSimd:\n#if __NDK_MAJOR__ >= 31\n#error check if std::simd works yet\n#endif\n      // The libc++ in NDK r27 has only a skeleton implementation of std::simd.\n      // Some things we can do without, but it doesn't actually have operator*,\n      // which is sort of essential :)\n      LOG(INFO) << \"Benchmarking std::simd\";\n      return std::unexpected{BenchmarkError::kNotImplemented};\n    case Backend::kClangVector:\n      LOG(INFO) << \"Benchmarking Clang vectors\";\n      return Benchmark(position, translation, [](Vec4<> p, Mat4<> t) {\n        return MultiplyWithClangVectors(t, p);\n      });\n    case Backend::kClangMatrix:\n      LOG(INFO) << \"Benchmarking Clang matrices\";\n      return Benchmark(position, translation, [](Vec4<> p, Mat4<> t) {\n        // This is the default implementation since it's the fastest.\n        return t * p;\n      });\n    case Backend::kOpenMp:\n      LOG(INFO) << \"Benchmarking OpenMP SIMD\";\n      return Benchmark(position, translation, [](Vec4<> p, Mat4<> t) {\n        return MultiplyWithOpenMP(t, p);\n      });\n    default:\n      return std::unexpected{BenchmarkError::kUnknownBackend};\n  }\n}\n\n}  // namespace samples::vectorization\n"
  },
  {
    "path": "vectorization/src/main/cpp/benchmark.h",
    "content": "/*\n * Copyright (C) 2024 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#pragma once\n\n#include <chrono>\n#include <expected>\n#include <optional>\n\nnamespace samples::vectorization {\n\n/**\n * The available backends for matrix multiplication shown in this sample.\n */\nenum class Backend : uint8_t {\n  /// Auto-vectorization only.\n  kAutoVectorization = 0,\n\n  /// C++ std::simd.\n  kCxxSimd = 1,\n\n  /// Clang's arch-generic vector types.\n  kClangVector = 2,\n\n  /// Clang's built-in matrix type.\n  kClangMatrix = 3,\n\n  /// OpenMP SIMD.\n  kOpenMp = 4,\n};\n\n/// Errors returned by BenchmarkMatrixMultiplication.\nenum class BenchmarkError : int8_t {\n  /// Indicates that the requested backend has not yet been implemented.\n  kNotImplemented = -1,\n  /// Indicates that the requested backend isn't supported for the device.\n  kNotSupported = -2,\n  /// Indicates that an unknown backend was requested.\n  kUnknownBackend = -3,\n};\n\n/**\n * Benchmarks the given matrix multiply backend.\n *\n * The chosen backend will run a predetermined number of times and return the\n * average execution time.\n *\n * @param backend The backend to benchmark.\n * @return The average execution time, or an error code.\n */\n[[nodiscard]] std::expected<std::chrono::nanoseconds, BenchmarkError>\nBenchmarkMatrixMultiplication(Backend backend);\n\n}  // namespace samples::vectorization\n"
  },
  {
    "path": "vectorization/src/main/cpp/clang_vector.h",
    "content": "/*\n * Copyright (C) 2024 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#pragma once\n\n#include <stdint.h>\n\n#include \"matrix.h\"\n\nnamespace samples::vectorization {\n\n/**\n * Multiplies two compatible matrices and returns the result.\n *\n * @tparam T The type of each matrix cell.\n * @tparam M The number of rows in the left operand and the result.\n * @tparam N The number of columns in the left operand, and the rows in the\n * right operand.\n * @tparam P The number of columns in the right operand and the result.\n * @param lhs The left operand.\n * @param rhs The right operand.\n * @return The result of lhs * rhs.\n */\ntemplate <typename T, size_t M, size_t N, size_t P>\nMatrix<M, P, T> MultiplyWithClangVectors(const Matrix<M, N, T>& lhs,\n                                         const Matrix<N, P, T>& rhs) {\n  // The rearrangement of the matrix multiplication algorithm here allows us to\n  // avoid reducing vectors to scalar stores. Instead we compute the partial\n  // result for each (result) column as a vector, accumulate partial results\n  // there, and then store the resulting row with a single vector store.\n  //\n  // This implementation only works if your columns (or rows, if you restructure\n  // this and the data to work in row-major order) fit within your vector\n  // registers. If you have larger data, you can tile the algorithm to fit the\n  // vector size.\n  //\n  // See https://mbernste.github.io/posts/matrix_vector_mult/ for a more\n  // thorough explanation.\n  typedef T Vec __attribute__((__vector_size__(M * sizeof(T))));\n  Matrix<M, P, T> result;\n  for (auto result_column_index = 0U; result_column_index < P;\n       result_column_index++) {\n    Vec result_column = {};\n    for (auto lhs_column_index = 0U; lhs_column_index < N; lhs_column_index++) {\n      auto c = lhs.column(lhs_column_index);\n      Vec lhs_column = *reinterpret_cast<const Vec*>(c.data());\n      result_column += lhs_column * rhs[lhs_column_index, result_column_index];\n    }\n    *reinterpret_cast<Vec*>(result.column(result_column_index).data()) =\n        result_column;\n  }\n  return result;\n}\n\n}  // namespace samples::vectorization\n"
  },
  {
    "path": "vectorization/src/main/cpp/jni.cpp",
    "content": "/*\n * Copyright (C) 2024 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include <base/logging.h>\n#include <jni.h>\n\n#include <expected>\n#include <optional>\n\n#include \"benchmark.h\"\n\nusing samples::vectorization::Backend;\nusing samples::vectorization::BenchmarkMatrixMultiplication;\n\nstatic jlong BenchmarkMatrixMultiplyJni(JNIEnv* _Nonnull /* env */,\n                                        jobject _Nonnull /* this */,\n                                        jint backend) {\n  auto result = BenchmarkMatrixMultiplication(static_cast<Backend>(backend));\n  if (result.has_value()) {\n    return result->count();\n  }\n  return static_cast<jlong>(result.error());\n}\n\nJNIEXPORT jint JNI_OnLoad(JavaVM* _Nonnull vm,\n                          void* _Nullable reserved __unused) {\n  JNIEnv* env;\n  if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {\n    return JNI_ERR;\n  }\n\n  jclass c = env->FindClass(\"com/android/ndk/samples/vectorization/AppJni\");\n  if (c == nullptr) return JNI_ERR;\n\n  static const JNINativeMethod methods[] = {\n      {\"benchmarkMatrixMultiply\", \"(I)J\",\n       reinterpret_cast<void*>(BenchmarkMatrixMultiplyJni)},\n  };\n  int rc = env->RegisterNatives(c, methods, arraysize(methods));\n  if (rc != JNI_OK) return rc;\n\n  return JNI_VERSION_1_6;\n}"
  },
  {
    "path": "vectorization/src/main/cpp/libapp.map.txt",
    "content": "LIBAPP {\n  global:\n    JNI_OnLoad;\n  local:\n    *;\n};\n"
  },
  {
    "path": "vectorization/src/main/cpp/matrix.h",
    "content": "/*\n * Copyright (C) 2024 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#pragma once\n\n#include <base/logging.h>\n\n#include <array>\n#include <cstdint>\n#include <iostream>\n#include <ostream>\n#include <span>\n\nnamespace samples::vectorization {\n\ntemplate <size_t Rows, size_t Columns, typename T = float>\nclass Matrix {\n public:\n  Matrix() = default;\n  Matrix(T (&&cells)[Rows][Columns]) {\n    for (size_t row = 0; row < Rows; row++) {\n      for (size_t column = 0; column < Columns; column++) {\n        (*this)[row, column] = cells[row][column];\n      }\n    }\n  }\n\n  // Convenience constructor for vectors so callers don't need to use\n  // `{{x}, {y}, {z}}`.\n  Matrix(const std::array<T, Rows> cells)\n    requires(Columns == 1)\n      : cells_(cells) {}\n\n  [[nodiscard, clang::always_inline]] constexpr const T* _Nonnull data() const {\n    return cells_.data();\n  }\n\n  [[nodiscard, clang::always_inline]] constexpr T* _Nonnull data() {\n    return cells_.data();\n  }\n\n  [[nodiscard, clang::always_inline]] constexpr T& get(size_t row,\n                                                       size_t column) {\n    return cells_[column * Rows + row];\n  }\n\n  [[nodiscard, clang::always_inline]] constexpr const T& get(\n      size_t row, size_t column) const {\n    return cells_[column * Rows + row];\n  }\n\n  [[nodiscard, clang::always_inline]] constexpr T& operator[](size_t row,\n                                                              size_t column) {\n    return get(row, column);\n  }\n\n  [[nodiscard, clang::always_inline]] constexpr const T& operator[](\n      size_t row, size_t column) const {\n    return get(row, column);\n  }\n\n  [[nodiscard, clang::always_inline]] constexpr const std::span<const T> column(\n      size_t column) const {\n    return std::span{&get(0, column), Rows};\n  }\n\n  [[nodiscard, clang::always_inline]] constexpr std::span<T> column(\n      size_t column) {\n    return std::span{&get(0, column), Rows};\n  }\n\n  bool operator==(const Matrix<Rows, Columns, T>& rhs) const {\n    return cells_ == rhs.cells_;\n  }\n\n  friend std::ostream& operator<<(std::ostream& stream,\n                                  const Matrix<Rows, Columns, T>& m) {\n    stream << \"{\" << std::endl;\n    for (size_t row = 0; row < Rows; row++) {\n      stream << \"\\t{\";\n      for (size_t column = 0; column < Columns; column++) {\n        stream << m[row, column];\n        if (column != Columns - 1) {\n          stream << \", \";\n        }\n      }\n      stream << \"}\" << std::endl;\n    }\n    stream << \"}\";\n    return stream;\n  }\n\n  /**\n   * Multiplies two compatible matrices and returns the result.\n   *\n   * @tparam T The type of each matrix cell.\n   * @tparam M The number of rows in the left operand and the result.\n   * @tparam N The number of columns in the left operand, and the rows in the\n   * right operand.\n   * @tparam P The number of columns in the right operand and the result.\n   * @param lhs The left operand.\n   * @param rhs The right operand.\n   * @return The result of lhs * rhs.\n   */\n  template <size_t OtherRows, size_t OtherColumns>\n  Matrix<Rows, OtherColumns, T> operator*(\n      const Matrix<OtherRows, OtherColumns, T>& rhs) const\n    requires(OtherRows == Columns)\n  {\n    auto m_lhs =\n        __builtin_matrix_column_major_load(data(), Rows, Columns, Rows);\n    auto m_rhs = __builtin_matrix_column_major_load(rhs.data(), OtherRows,\n                                                    OtherColumns, OtherRows);\n    auto m_result = m_lhs * m_rhs;\n\n    Matrix<Rows, OtherColumns, T> result;\n    __builtin_matrix_column_major_store(m_result, result.data(), Rows);\n    return result;\n  }\n\n private:\n  std::array<T, Rows * Columns> cells_ = {};\n};\n\n// Enables automatic deduction of definitions like `Matrix m{{1, 0}, {0, 1}}`\n// without needing to specify `Matrix<2, 2, int>`.\ntemplate <size_t Rows, size_t Columns, typename T>\nMatrix(T (&&)[Rows][Columns]) -> Matrix<Rows, Columns, T>;\n\ntemplate <typename T = float>\nusing Mat4 = Matrix<4, 4, T>;\n\ntemplate <typename T = float>\nusing Vec4 = Matrix<4, 1, T>;\n\n}  // namespace samples::vectorization\n"
  },
  {
    "path": "vectorization/src/main/cpp/omp_simd.h",
    "content": "/*\n * Copyright (C) 2024 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#pragma once\n\n#include <stdint.h>\n\n#include \"matrix.h\"\n\nnamespace samples::vectorization {\n\n/**\n * Multiplies two compatible matrices and returns the result.\n *\n * @tparam T The type of each matrix cell.\n * @tparam M The number of rows in the left operand and the result.\n * @tparam N The number of columns in the left operand, and the rows in the\n * right operand.\n * @tparam P The number of columns in the right operand and the result.\n * @param lhs The left operand.\n * @param rhs The right operand.\n * @return The result of lhs * rhs.\n */\ntemplate <typename T, size_t M, size_t N, size_t P>\nMatrix<M, P, T> MultiplyWithOpenMP(const Matrix<M, N, T>& lhs,\n                                   const Matrix<N, P, T>& rhs) {\n  Matrix<M, P, T> result;\n#pragma omp simd\n  for (auto result_column_index = 0U; result_column_index < P;\n       result_column_index++) {\n    for (auto lhs_column_index = 0U; lhs_column_index < N; lhs_column_index++) {\n      auto lhs_column = lhs.column(lhs_column_index);\n      const T& scalar = rhs[lhs_column_index, result_column_index];\n      for (auto row = 0U; row < lhs_column.size(); row++) {\n        result[row, result_column_index] += lhs_column[row] * scalar;\n      }\n    }\n  }\n  return result;\n}\n\n}  // namespace samples::vectorization\n"
  },
  {
    "path": "vectorization/src/main/java/com/android/ndk/samples/vectorization/VectorizationActivity.kt",
    "content": "package com.android.ndk.samples.vectorization\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.activity.enableEdgeToEdge\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.material3.Scaffold\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.mutableStateMapOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.snapshots.SnapshotStateMap\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.tooling.preview.Preview\nimport com.android.ndk.samples.vectorization.ui.theme.NDKSamplesTheme\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.withContext\nimport kotlin.time.Duration\nimport kotlin.time.Duration.Companion.nanoseconds\n\n// Keep in sync with the definition in benchmark.h.\nenum class Backend(val id: Int, val label: String) {\n    AUTO_VECTORIZATION(0, \"Auto-vectorization\"),\n    CXX_SIMD(1, \"std::simd\"),\n    CLANG_VECTORS(2, \"Clang Vectors\"),\n    CLANG_MATRICES(3, \"Clang Matrices\"),\n    OPEN_MP(4, \"OpenMP\"),\n}\n\nclass VectorizationActivity : ComponentActivity() {\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        enableEdgeToEdge()\n        setContent {\n            NDKSamplesTheme {\n                Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->\n                    Column(\n                        modifier = Modifier\n                            .padding(innerPadding)\n                            .fillMaxWidth()\n                    ) {\n                        Text(text = \"Average times for 10,000,000 runs\")\n                        BenchmarkTable()\n                    }\n                }\n            }\n        }\n    }\n\n    init {\n        System.loadLibrary(\"app\")\n    }\n}\n\nsealed interface BenchmarkResult {\n    class Success(private val duration: Duration) : BenchmarkResult {\n        override fun toString(): String = duration.toString()\n    }\n\n    class Failure(private val message: String) : BenchmarkResult {\n        override fun toString(): String = message\n    }\n}\n\nobject AppJni {\n    fun benchmarkMatrixMultiply(backend: Backend): BenchmarkResult {\n        val result = benchmarkMatrixMultiply(backend.id)\n        if (result >= 0) {\n            return BenchmarkResult.Success(result.nanoseconds)\n        }\n\n        return BenchmarkResult.Failure(\n            when (result) {\n                -1L -> \"Not implemented\"\n                -2L -> \"Not supported\"\n                -3L -> \"Invalid backend\"\n                else -> \"Unknown error\"\n            }\n        )\n    }\n\n    private external fun benchmarkMatrixMultiply(backend: Int): Long\n}\n\n@Composable\nfun BenchmarkTable(modifier: Modifier = Modifier) {\n    val status: SnapshotStateMap<Backend, String> = remember {\n        mutableStateMapOf(*Backend.entries.map { it to \"Not started\" }\n            .toTypedArray())\n    }\n\n    LaunchedEffect(true) {\n        withContext(Dispatchers.Default) {\n            Backend.entries.forEach {\n                status[it] = \"Running...\"\n                status[it] = AppJni.benchmarkMatrixMultiply(it).toString()\n            }\n        }\n    }\n\n    Column(\n        modifier = modifier\n    ) {\n        status.toSortedMap().forEach { (backend, status) ->\n            BenchmarkResult(name = backend.label, duration = status)\n        }\n    }\n}\n\n@Composable\nfun BenchmarkResult(name: String, duration: String) {\n    Row(modifier = Modifier.fillMaxWidth()) {\n        Text(text = name)\n        Spacer(modifier = Modifier.weight(1f))\n        Text(text = duration)\n    }\n}\n\n@Preview(showBackground = true)\n@Composable\nfun BenchmarkResultPreview() {\n    NDKSamplesTheme {\n        BenchmarkResult(\"Auto-vectorization\", \"00m10s\")\n    }\n}"
  },
  {
    "path": "vectorization/src/main/java/com/android/ndk/samples/vectorization/ui/theme/Color.kt",
    "content": "package com.android.ndk.samples.vectorization.ui.theme\n\nimport androidx.compose.ui.graphics.Color\n\nval Purple80 = Color(0xFFD0BCFF)\nval PurpleGrey80 = Color(0xFFCCC2DC)\nval Pink80 = Color(0xFFEFB8C8)\n\nval Purple40 = Color(0xFF6650a4)\nval PurpleGrey40 = Color(0xFF625b71)\nval Pink40 = Color(0xFF7D5260)"
  },
  {
    "path": "vectorization/src/main/java/com/android/ndk/samples/vectorization/ui/theme/Theme.kt",
    "content": "package com.android.ndk.samples.vectorization.ui.theme\n\nimport android.app.Activity\nimport android.os.Build\nimport androidx.compose.foundation.isSystemInDarkTheme\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.darkColorScheme\nimport androidx.compose.material3.dynamicDarkColorScheme\nimport androidx.compose.material3.dynamicLightColorScheme\nimport androidx.compose.material3.lightColorScheme\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.platform.LocalContext\n\nprivate val DarkColorScheme = darkColorScheme(\n    primary = Purple80,\n    secondary = PurpleGrey80,\n    tertiary = Pink80\n)\n\nprivate val LightColorScheme = lightColorScheme(\n    primary = Purple40,\n    secondary = PurpleGrey40,\n    tertiary = Pink40\n\n    /* Other default colors to override\n    background = Color(0xFFFFFBFE),\n    surface = Color(0xFFFFFBFE),\n    onPrimary = Color.White,\n    onSecondary = Color.White,\n    onTertiary = Color.White,\n    onBackground = Color(0xFF1C1B1F),\n    onSurface = Color(0xFF1C1B1F),\n    */\n)\n\n@Composable\nfun NDKSamplesTheme(\n    darkTheme: Boolean = isSystemInDarkTheme(),\n    // Dynamic color is available on Android 12+\n    dynamicColor: Boolean = true,\n    content: @Composable () -> Unit\n) {\n    val colorScheme = when {\n        dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {\n            val context = LocalContext.current\n            if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)\n        }\n\n        darkTheme -> DarkColorScheme\n        else -> LightColorScheme\n    }\n\n    MaterialTheme(\n        colorScheme = colorScheme,\n        typography = Typography,\n        content = content\n    )\n}"
  },
  {
    "path": "vectorization/src/main/java/com/android/ndk/samples/vectorization/ui/theme/Type.kt",
    "content": "package com.android.ndk.samples.vectorization.ui.theme\n\nimport androidx.compose.material3.Typography\nimport androidx.compose.ui.text.TextStyle\nimport androidx.compose.ui.text.font.FontFamily\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.unit.sp\n\n// Set of Material typography styles to start with\nval Typography = Typography(\n    bodyLarge = TextStyle(\n        fontFamily = FontFamily.Default,\n        fontWeight = FontWeight.Normal,\n        fontSize = 24.sp,\n        lineHeight = 24.sp,\n        letterSpacing = 0.5.sp\n    )\n    /* Other default text styles to override\n    titleLarge = TextStyle(\n        fontFamily = FontFamily.Default,\n        fontWeight = FontWeight.Normal,\n        fontSize = 22.sp,\n        lineHeight = 28.sp,\n        letterSpacing = 0.sp\n    ),\n    labelSmall = TextStyle(\n        fontFamily = FontFamily.Default,\n        fontWeight = FontWeight.Medium,\n        fontSize = 11.sp,\n        lineHeight = 16.sp,\n        letterSpacing = 0.5.sp\n    )\n    */\n)"
  },
  {
    "path": "vectorization/src/main/res/drawable/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path\n        android:fillColor=\"#3DDC84\"\n        android:pathData=\"M0,0h108v108h-108z\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M9,0L9,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,0L19,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,0L29,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,0L39,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,0L49,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,0L59,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,0L69,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,0L79,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M89,0L89,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M99,0L99,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,9L108,9\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,19L108,19\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,29L108,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,39L108,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,49L108,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,59L108,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,69L108,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,79L108,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,89L108,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,99L108,99\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,29L89,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,39L89,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,49L89,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,59L89,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,69L89,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,79L89,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,19L29,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,19L39,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,19L49,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,19L59,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,19L69,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,19L79,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n</vector>\n"
  },
  {
    "path": "vectorization/src/main/res/drawable-v24/ic_launcher_foreground.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path android:pathData=\"M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z\">\n        <aapt:attr name=\"android:fillColor\">\n            <gradient\n                android:endX=\"85.84757\"\n                android:endY=\"92.4963\"\n                android:startX=\"42.9492\"\n                android:startY=\"49.59793\"\n                android:type=\"linear\">\n                <item\n                    android:color=\"#44000000\"\n                    android:offset=\"0.0\" />\n                <item\n                    android:color=\"#00000000\"\n                    android:offset=\"1.0\" />\n            </gradient>\n        </aapt:attr>\n    </path>\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:fillType=\"nonZero\"\n        android:pathData=\"M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z\"\n        android:strokeWidth=\"1\"\n        android:strokeColor=\"#00000000\" />\n</vector>"
  },
  {
    "path": "vectorization/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\" />\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\n    <monochrome android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "vectorization/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\" />\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\n    <monochrome android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "vectorization/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"purple_200\">#FFBB86FC</color>\n    <color name=\"purple_500\">#FF6200EE</color>\n    <color name=\"purple_700\">#FF3700B3</color>\n    <color name=\"teal_200\">#FF03DAC5</color>\n    <color name=\"teal_700\">#FF018786</color>\n    <color name=\"black\">#FF000000</color>\n    <color name=\"white\">#FFFFFFFF</color>\n</resources>"
  },
  {
    "path": "vectorization/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">vectorization</string>\n</resources>"
  },
  {
    "path": "vectorization/src/main/res/values/themes.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"Theme.NDKSamples\" parent=\"android:Theme.Material.Light.NoActionBar\" />\n</resources>"
  }
]