Full Code of p-lr/MapCompose for AI

master 969062913203 cached
163 files
653.9 KB
198.1k tokens
1 requests
Download .txt
Showing preview only (711K chars total). Download the full file or copy to clipboard to get everything.
Repository: p-lr/MapCompose
Branch: master
Commit: 969062913203
Files: 163
Total size: 653.9 KB

Directory structure:
gitextract_n5gon859/

├── .gitignore
├── LICENSE
├── Readme.md
├── build.gradle
├── demo/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── assets/
│       │   │   └── tracks/
│       │   │       ├── track1.txt
│       │   │       ├── track2.txt
│       │   │       └── track3.txt
│       │   ├── java/
│       │   │   └── ovh/
│       │   │       └── plrapps/
│       │   │           └── mapcompose/
│       │   │               └── demo/
│       │   │                   ├── MainActivity.kt
│       │   │                   ├── providers/
│       │   │                   │   └── TileStreamProviderFactory.kt
│       │   │                   ├── ui/
│       │   │                   │   ├── MapComposeDemoApp.kt
│       │   │                   │   ├── NavGraph.kt
│       │   │                   │   ├── screens/
│       │   │                   │   │   ├── AddingMarkerDemo.kt
│       │   │                   │   │   ├── AnimationDemo.kt
│       │   │                   │   │   ├── CalloutDemo.kt
│       │   │                   │   │   ├── CenteringOnMarkerDemo.kt
│       │   │                   │   │   ├── CustomDraw.kt
│       │   │                   │   │   ├── Home.kt
│       │   │                   │   │   ├── HttpTilesDemo.kt
│       │   │                   │   │   ├── InfiniteScrollDemo.kt
│       │   │                   │   │   ├── LayersDemo.kt
│       │   │                   │   │   ├── MarkersClusteringDemo.kt
│       │   │                   │   │   ├── MarkersLazyLoadingDemo.kt
│       │   │                   │   │   ├── OsmDemo.kt
│       │   │                   │   │   ├── PathsDemo.kt
│       │   │                   │   │   ├── RotationDemo.kt
│       │   │                   │   │   ├── SimpleDemo.kt
│       │   │                   │   │   └── VisibleAreaPaddingDemo.kt
│       │   │                   │   ├── theme/
│       │   │                   │   │   ├── Color.kt
│       │   │                   │   │   ├── Theme.kt
│       │   │                   │   │   └── Type.kt
│       │   │                   │   └── widgets/
│       │   │                   │       ├── Callout.kt
│       │   │                   │       └── Marker.kt
│       │   │                   ├── utils/
│       │   │                   │   ├── Metrics.kt
│       │   │                   │   ├── Random.kt
│       │   │                   │   └── WebMercator.kt
│       │   │                   └── viewmodels/
│       │   │                       ├── AddingMarkerVM.kt
│       │   │                       ├── AnimationDemoVM.kt
│       │   │                       ├── CalloutVM.kt
│       │   │                       ├── CenteringOnMarkerVM.kt
│       │   │                       ├── CustomDrawVM.kt
│       │   │                       ├── HttpTilesVM.kt
│       │   │                       ├── InfiniteScrollVM.kt
│       │   │                       ├── LayersVM.kt
│       │   │                       ├── MarkersClusteringVM.kt
│       │   │                       ├── MarkersLazyLoadingVM.kt
│       │   │                       ├── OsmVM.kt
│       │   │                       ├── PathsVM.kt
│       │   │                       ├── RotationVM.kt
│       │   │                       ├── SimpleDemoVM.kt
│       │   │                       └── VisibleAreaPaddingVM.kt
│       │   └── res/
│       │       ├── drawable/
│       │       │   ├── ic_launcher_background.xml
│       │       │   └── map_marker.xml
│       │       ├── drawable-v24/
│       │       │   └── ic_launcher_foreground.xml
│       │       ├── mipmap-anydpi-v26/
│       │       │   ├── ic_launcher.xml
│       │       │   └── ic_launcher_round.xml
│       │       └── values/
│       │           ├── colors.xml
│       │           ├── strings.xml
│       │           └── themes.xml
│       └── test/
│           └── java/
│               └── ovh/
│                   └── plrapps/
│                       └── mapcompose/
│                           └── demo/
│                               └── utils/
│                                   └── WebMercatorTest.kt
├── doc/
│   └── mapcompose/
│       └── MapCompose.drawio
├── gradle/
│   ├── gradle-daemon-jvm.properties
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── mapcompose/
│   ├── build.gradle
│   ├── gradle.properties
│   └── src/
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   └── java/
│       │       └── ovh/
│       │           └── plrapps/
│       │               └── mapcompose/
│       │                   ├── api/
│       │                   │   ├── Annotation.kt
│       │                   │   ├── ApiDefaults.kt
│       │                   │   ├── Common.kt
│       │                   │   ├── DefaultCanvas.kt
│       │                   │   ├── GesturesApi.kt
│       │                   │   ├── LayerApi.kt
│       │                   │   ├── LayoutApi.kt
│       │                   │   ├── MarkerApi.kt
│       │                   │   ├── Model.kt
│       │                   │   ├── PathApi.kt
│       │                   │   ├── RenderApi.kt
│       │                   │   └── UtilsApi.kt
│       │                   ├── core/
│       │                   │   ├── ColorFilterProvider.kt
│       │                   │   ├── Debounce.kt
│       │                   │   ├── GestureConfiguration.kt
│       │                   │   ├── Layer.kt
│       │                   │   ├── Throttle.kt
│       │                   │   ├── Tile.kt
│       │                   │   ├── TileCollector.kt
│       │                   │   ├── TileStreamProvider.kt
│       │                   │   ├── Viewport.kt
│       │                   │   └── VisibleTilesResolver.kt
│       │                   ├── ui/
│       │                   │   ├── MapUI.kt
│       │                   │   ├── gestures/
│       │                   │   │   ├── GestureDetector.kt
│       │                   │   │   ├── TapGestureDetector.kt
│       │                   │   │   └── model/
│       │                   │   │       └── HitType.kt
│       │                   │   ├── layout/
│       │                   │   │   ├── MinimumScaleMode.kt
│       │                   │   │   ├── Rendering.kt
│       │                   │   │   └── ZoomPanRotate.kt
│       │                   │   ├── markers/
│       │                   │   │   ├── Clusterer.kt
│       │                   │   │   ├── LazyLoader.kt
│       │                   │   │   ├── MarkerComposer.kt
│       │                   │   │   └── MarkerLayout.kt
│       │                   │   ├── paths/
│       │                   │   │   ├── PathComposer.kt
│       │                   │   │   ├── RamerDouglaPeucker.kt
│       │                   │   │   └── model/
│       │                   │   │       ├── Cap.kt
│       │                   │   │       └── PatternItem.kt
│       │                   │   ├── state/
│       │                   │   │   ├── MapState.kt
│       │                   │   │   ├── PathState.kt
│       │                   │   │   ├── TileCanvasState.kt
│       │                   │   │   ├── ZoomPanRotateState.kt
│       │                   │   │   └── markers/
│       │                   │   │       ├── MarkerRenderState.kt
│       │                   │   │       ├── MarkerState.kt
│       │                   │   │       └── model/
│       │                   │   │           ├── ClusterClickBehavior.kt
│       │                   │   │           ├── MarkerData.kt
│       │                   │   │           ├── MarkerType.kt
│       │                   │   │           └── RenderingStrategy.kt
│       │                   │   └── view/
│       │                   │       └── TileCanvas.kt
│       │                   └── utils/
│       │                       ├── AnimUtils.kt
│       │                       ├── ApiUtils.kt
│       │                       ├── BoundingBoxUtils.kt
│       │                       ├── Collections.kt
│       │                       ├── Dp.kt
│       │                       ├── Flow.kt
│       │                       ├── Geometry.kt
│       │                       ├── Point.kt
│       │                       ├── RotationUtils.kt
│       │                       └── VisibleAreaUtils.kt
│       └── test/
│           └── java/
│               └── ovh/
│                   └── plrapps/
│                       └── mapcompose/
│                           ├── core/
│                           │   ├── TileCollectorTest.kt
│                           │   └── VisibleTilesResolverTest.kt
│                           ├── state/
│                           │   └── TileCanvasStateTest.kt
│                           ├── ui/
│                           │   └── paths/
│                           │       └── PathComposerTest.kt
│                           └── utils/
│                               ├── GeometryTest.kt
│                               └── VisibleAreaUtilsTest.kt
├── settings.gradle
└── testapp/
    ├── .gitignore
    ├── build.gradle
    ├── proguard-rules.pro
    └── src/
        ├── main/
        │   ├── AndroidManifest.xml
        │   ├── java/
        │   │   └── ovh/
        │   │       └── plrapps/
        │   │           └── mapcompose/
        │   │               └── testapp/
        │   │                   ├── MainActivity.kt
        │   │                   ├── core/
        │   │                   │   └── ui/
        │   │                   │       ├── MapComposeTestApp.kt
        │   │                   │       ├── nav/
        │   │                   │       │   └── NavDestinations.kt
        │   │                   │       └── theme/
        │   │                   │           ├── Color.kt
        │   │                   │           ├── Theme.kt
        │   │                   │           └── Type.kt
        │   │                   ├── features/
        │   │                   │   ├── clustering/
        │   │                   │   │   ├── MarkerClusteringUi.kt
        │   │                   │   │   └── MarkersClusteringViewModel.kt
        │   │                   │   ├── home/
        │   │                   │   │   └── Home.kt
        │   │                   │   └── layerswitch/
        │   │                   │       ├── LayerSwitchTest.kt
        │   │                   │       └── LayerSwitchViewModel.kt
        │   │                   └── utils/
        │   │                       └── Random.kt
        │   └── res/
        │       ├── drawable/
        │       │   ├── ic_launcher_background.xml
        │       │   └── map_marker.xml
        │       ├── drawable-v24/
        │       │   └── ic_launcher_foreground.xml
        │       ├── mipmap-anydpi-v26/
        │       │   ├── ic_launcher.xml
        │       │   └── ic_launcher_round.xml
        │       └── values/
        │           ├── colors.xml
        │           ├── strings.xml
        │           └── themes.xml
        └── test/
            └── java/
                └── ovh/
                    └── plrapps/
                        └── mapcompose/
                            └── testapp/
                                └── ExampleUnitTest.kt

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
build
/captures
.idea
.externalNativeBuild
publish-mavenCentral.sh
compile_and_install_demo_release.sh
/publishErrors.txt


================================================
FILE: LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: Readme.md
================================================
[![Maven Central](https://img.shields.io/maven-central/v/ovh.plrapps/mapcompose)](https://central.sonatype.com/artifact/ovh.plrapps/mapcompose)
[![GitHub License](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](http://www.apache.org/licenses/LICENSE-2.0)
[![](https://img.shields.io/badge/ComposeBOM-2026.02.01-brightgreen)](https://developer.android.com/jetpack/compose/bom/bom)

🎉 News:
- `3.1.0` now supports infinite scroll (#119).
- `3.0.0` is released. The library is now capable of handling much bigger maps, such as world-wide
OpenStreetMap at zoom level 17 with a maximum scale of 8. See [Migrate from 2.x.x](#migrate-from-2xx).
- Memory footprint has been dramatically reduced on Android 10 and above, by leveraging [Hardware Bitmaps](https://bumptech.github.io/glide/doc/hardwarebitmaps.html).
- MapCompose Multiplatform is officially released: https://github.com/p-lr/MapComposeMP \
  Works on iOS, MacOS, Windows, Linux, and Android.

# MapCompose

MapCompose is a fast, memory efficient Jetpack compose library to display tiled maps with minimal effort.
It shows the visible part of a tiled map with support of markers and paths, and various gestures
(flinging, dragging, scaling, and rotating).

An example of setting up:

```kotlin
/* Inside your view-model */
val tileStreamProvider = TileStreamProvider { row, col, zoomLvl ->
    FileInputStream(File("path/{$zoomLvl}/{$row}/{$col}.jpg")) // or it can be a remote HTTP fetch
}

val state = MapState(4, 4096, 4096).apply {
    addLayer(tileStreamProvider)
    enableRotation()
}

/* Inside a composable */
@Composable
fun MapContainer(
    modifier: Modifier = Modifier, viewModel: YourViewModel
) {
    MapUI(modifier, state = viewModel.state)
}
```

This project holds the source code of this library, plus a demo app - which is useful to get started.
To test the demo, just clone the repo and launch the demo app from Android Studio.

## Clustering

Marker clustering regroups markers of close proximity into clusters. The video below shows how it works.

https://github.com/p-lr/MapCompose/assets/15638794/de48cb1b-396b-44d3-b47a-e3d719e8f38a

The sample below shows the relevant part of the code. We can still add regular markers (not managed by a clusterer), such as the red marker in the video.
See the [full code](demo/src/main/java/ovh/plrapps/mapcompose/demo/viewmodels/MarkersClusteringVM.kt).

```kotlin
/* Add clusterer */
state.addClusterer("default") { ids ->
   { Cluster(size = ids.size) }
}

/* Add marker managed by the clusterer */
state.addMarker(
    id = "marker",
    x = 0.2,
    y = 0.3,
    renderingStrategy = RenderingStrategy.Clustering("default"),
) {
    Marker()
}
```

There's an example in the demo app.


## Installation

Add this to your module's build.gradle
```groovy
implementation 'ovh.plrapps:mapcompose:3.2.7'
```

Starting with v.2.4.1, the library is using the 
[compose BOM](https://developer.android.com/jetpack/compose/bom/bom). The version of the BOM is
specified in the release notes. The demo app shows an example of how to use it.

## Basics

MapCompose is optimized to display maps that have several levels, like this:

<p align="center">
<img src="doc/readme-files/pyramid.png" width="400">
</p>

Each next level is twice bigger than the former, and provides more details. Overall, this looks like
 a pyramid. Another common name is "deep-zoom" map.
This library comes with a demo app featuring various use-cases such as using markers, paths,
map rotation, etc. All examples use the same map stored in the assets, which is a great example of
deep-zoom map.

MapCompose can also be used with single level maps.

### Usage

In a typical application, you create a `MapState` instance inside a `ViewModel` (or whatever
component which survives device rotation). Your `MapState` should then be passed to the `MapUI`
composable. The code sample at the top of this readme shows an example. Then, whenever you need to
update the map (add a marker, a path, change the scale, etc.), you invoke APIs on your `MapState`
instance. As its name suggests, `MapState` also _owns_ the state. Therefore, composables will always
render consistently - even after a device rotation.

All public APIs are located under the [api](mapcompose/src/main/java/ovh/plrapps/mapcompose/api) 
package. The following sections provide details on the `MapState` class, and give examples of how to
add markers, callouts, and paths. 

All apis should be invoked from the main thread.

### MapState

The `MapState` class expects three parameters for its construction:
* `levelCount`: The number of levels of the map,
* `fullWidth`: The width of the map at scale 1.0, which is the width of last level,
* `fullHeight`: The height of the map at scale 1.0, which is the height of last level

### Layers

MapCompose supports layers - e.g it's possible to add several tile pyramids. Each level is made of
the superposition of tiles from all pyramids at the given level. For example, at the second level
(starting from the lowest scale), tiles would look like the image below when three layers are added.

<p align="center">
<img src="doc/readme-files/layer.png" width="200">
</p>

Your implementation of the `TileStreamProvider` interface (see below) is what defines a tile
pyramid. It provides `InputStream`s of image files (png, jpg). MapCompose will request tiles using
the convention that the origin is at the top-left corner. For example, the tile requested with
`row` = 0, and `col = 0` will be positioned at the top-left corner.

```kotlin
fun interface TileStreamProvider {
    suspend fun getTileStream(row: Int, col: Int, zoomLvl: Int): InputStream?
}
```

Depending on your configuration, your `TileStreamProvider` implementation might fetch local files,
as well as performing remote HTTP requests - it's up to you. You don't have to worry about threading,
MapCompose takes care of that (the main thread isn't blocked by `getTileStream` calls). However, in
case of HTTP requests, it's advised to create a `MapState` with a higher than default `workerCount`.
That optional parameter defines the size of the dedicated thread pool for fetching tiles, and defaults
to the number of cores minus one. Typically, you would want to set `workerCount` to 16 when performing
HTTP requests. Otherwise, you can safely leave it to its default.

To add a layer, use the `addLayer` on your `MapState` instance. There are others APIs for reordering,
removing, setting alpha - all dynamically.

### Markers

To add a marker, use the [addMarker](https://github.com/p-lr/MapCompose/blob/982caf29ab5e86b58c56812735f60bfe405638ea/mapcompose/src/main/java/ovh/plrapps/mapcompose/api/MarkerApi.kt#L30)
API, like so:

```kotlin
/* Add a marker at the center of the map */
mapState.addMarker("id", x = 0.5, y = 0.5) {
    Icon(
        painter = painterResource(id = R.drawable.map_marker),
        contentDescription = null,
        modifier = Modifier.size(50.dp),
        tint = Color(0xCC2196F3)
    )
}
```

<p align="center">
<img src="doc/readme-files/marker.png">
</p>

A marker is a composable that you supply (in the example above, it's an `Icon`). It can be
whatever composable you like. A marker does not scale, but it's position updates as the map scales,
so it's always attached to the original position. A marker has an anchor point defined - the point
which is fixed relatively to the map. This anchor point is defined using relative offsets, which are
applied to the width and height of the marker. For example, to have a marker centered horizontally 
and aligned at the bottom edge (like a typical map pin would do), you'd pass -0.5f and -1.0f as
relative offsets (left position is offset by half the width, and top is offset by the full height).
If necessary, an absolute offset expressed in pixels can be applied, in addition to the
relative offset.

Markers can be moved, removed, and be draggable. See the following APIs: [moveMarker](https://github.com/p-lr/MapCompose/blob/2fbf0967290ffe01d63a6c65a3022568ef48b9dd/mapcompose/src/main/java/ovh/plrapps/mapcompose/api/MarkerApi.kt#L72),
[removeMarker](https://github.com/p-lr/MapCompose/blob/2fbf0967290ffe01d63a6c65a3022568ef48b9dd/mapcompose/src/main/java/ovh/plrapps/mapcompose/api/MarkerApi.kt#L61),
[enableMarkerDrag](https://github.com/p-lr/MapCompose/blob/2fbf0967290ffe01d63a6c65a3022568ef48b9dd/mapcompose/src/main/java/ovh/plrapps/mapcompose/api/MarkerApi.kt#L89).

### Callouts

Callouts are typically message popups which are, like markers, attached to a specific position.
However, they automatically dismiss on touch down. This default behavior can be changed. 
To add a callout, use [addCallout](https://github.com/p-lr/MapCompose/blob/2fbf0967290ffe01d63a6c65a3022568ef48b9dd/mapcompose/src/main/java/ovh/plrapps/mapcompose/api/MarkerApi.kt#L220).

<p align="center">
<img src="doc/readme-files/callout.png">
</p>

Callouts can be programmatically removed (if automatic dismiss was disabled).

### Paths

To add a path, use the `addPath` api:

```kotlin
mapState.addPath("pathId", color = Color(0xFF448AFF)) {
  addPoints(points)
}
```

The demo app shows a complete example.

<p align="center">
<img src="doc/readme-files/path.png">
</p>

## Animate state change

It's pretty common to programmatically animate the scroll and/or the scale, or even the rotation of
the map.

*scroll and/or scale animation*

When animating the scale, we generally do so while maintaining the center of the screen at
a specific position. Likewise, when animating the scroll position, we can do so with or without 
animating the scale altogether, using [scrollTo](https://github.com/p-lr/MapCompose/blob/08c0f68f654c1ce27a295f3fb6c25e9cf4274de9/mapcompose/src/main/java/ovh/plrapps/mapcompose/api/LayoutApi.kt#L188)
and [snapScrollTo](https://github.com/p-lr/MapCompose/blob/08c0f68f654c1ce27a295f3fb6c25e9cf4274de9/mapcompose/src/main/java/ovh/plrapps/mapcompose/api/LayoutApi.kt#L161).

*rotation animation*

For animating the rotation while keeping the current scale and scroll, use the
[rotateTo](https://github.com/p-lr/MapCompose/blob/08c0f68f654c1ce27a295f3fb6c25e9cf4274de9/mapcompose/src/main/java/ovh/plrapps/mapcompose/api/LayoutApi.kt#L149) API.

Both `scrollTo` and `rotateTo` are suspending functions. Therefore, you know exactly when
an animation finishes, and you can easily chain animations inside a coroutine.

```kotlin
// Inside a ViewModel
viewModelScope.launch {
    mapState.scrollTo(0.8, 0.8, destScale = 2f)
    mapState.rotateTo(180f, TweenSpec(2000, easing = FastOutSlowInEasing))
}
```

For a detailed example, see the "AnimationDemo".

## Design changes and differences with MapView

* In MapView, you had to define bounds before you could add markers. There's no such concept
in MapCompose anymore. Now, coordinates are normalized. For example, (x=0.5, y=0.5) is a point located at
the center of the map. Normalized coordinates are easier to reason about, and application code can
still translate this coordinate system to a custom one.

* In MapView, you had to build a configuration and use that configuration to create a `MapView`
instance. There's no such thing in MapCompose. Now, you create a `MapState` object with required
parameters.

* A lot of things which couldn't change after MapView configuration can now be changed dynamically
in MapCompose. For example, the `zIndex` of a marker, or the minimum scale mode can be changed at
runtime.

## Migrate from `2.x.x`

* All apis taking the scale as parameter now require `Double` values instead of `Float`.

* A few low-level apis taking the scroll in pixels now require `Double` values instead of `Float`.

* The `addMarker` api now longer has the parameter `clipShape`.

## Contributors

Marcin (@Nohus) has contributed and fixed some issues. He also thoroughly tested the new layers 
feature – which made `MapCompose` better.



================================================
FILE: build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    ext {
        kotlin_version = "2.2.21"
        coroutine_version = '1.10.2'
    }
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:9.2.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}


================================================
FILE: demo/.gitignore
================================================
/build

================================================
FILE: demo/build.gradle
================================================
import org.jetbrains.kotlin.gradle.dsl.JvmTarget

plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id "org.jetbrains.kotlin.plugin.compose" version "$kotlin_version"
    id 'kotlin-parcelize'
}

android {
    compileSdk = 36

    defaultConfig {
        applicationId "ovh.plrapps.mapcompose.demo"
        minSdk = 23
        targetSdk = 36
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        vectorDrawables {
            useSupportLibrary = true
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
        targetCompatibility JavaVersion.VERSION_17
    }
    buildFeatures {
        compose = true
    }
    namespace = 'ovh.plrapps.mapcompose.demo'
}

kotlin {
    compilerOptions {
        freeCompilerArgs.addAll([
                '-Xopt-in=androidx.compose.foundation.layout.ExperimentalLayoutApi',
                '-Xopt-in=androidx.compose.foundation.ExperimentalFoundationApi',
        ])
        jvmTarget = JvmTarget.JVM_17
    }
}

dependencies {

    implementation 'androidx.core:core-ktx:1.18.0'
    implementation 'androidx.appcompat:appcompat:1.7.1'

    // Compose - See https://developer.android.com/jetpack/compose/setup#bom-version-mapping
    implementation platform('androidx.compose:compose-bom:2026.04.01')
    implementation "androidx.compose.ui:ui"
    implementation "androidx.compose.material:material"
    implementation "androidx.compose.material3:material3"
    implementation "androidx.compose.ui:ui-tooling-preview"
    debugImplementation "androidx.compose.ui:ui-tooling"

    implementation 'androidx.navigation:navigation-compose:2.9.8'
    implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.10.0'
    implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.10.0'
    implementation project(':mapcompose')
    testImplementation 'junit:junit:4.13.2'
}

================================================
FILE: demo/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

================================================
FILE: demo/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyApplication">
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:windowSoftInputMode="adjustResize"
            android:theme="@style/Theme.MyApplication">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

================================================
FILE: demo/src/main/assets/tracks/track1.txt
================================================
0.6044638908531056,0.23086354170969253
0.6044638908531056,0.230781790986988
0.6075361613235069,0.22873802292007173
0.6100394928179091,0.23168104893644745
0.6137944900595099,0.23225330399520489
0.6170374422227098,0.2303730373736396
0.6207355455667128,0.230945292432339
0.624376755013113,0.23135404604574544
0.628074858357116,0.23168104893644745
0.6307488715443168,0.23429707206217923
0.6302368264659158,0.23797585458272147
0.6306919776467139,0.24165463710326368
0.6304644020563174,0.24533341962380592
0.6329677335507197,0.24811294419488875
0.6345038687859178,0.25154647454737544
0.6371778819731186,0.2539989962276982
0.640762197521921,0.25514350634521316
0.644460300865924,0.2553887585132687
0.6474756774387223,0.25326323972364784
0.6511168868851224,0.2524457324968349
0.654473626843528,0.250974219488618
0.6572614278259298,0.24852169780823716
0.6569200644403274,0.2522004803287794
0.6597078654227291,0.24974795864845659
0.66238187860993,0.25236398177413033
0.6607319555795311,0.2557157614039706
0.6585699874707263,0.25874053814310893
0.6622680908147293,0.2582500338069979
0.665567936875532,0.25653326863078363
0.6686971012435311,0.25457125128645564
0.6675592232915333,0.25816828308435147
0.6662506636467317,0.2617653148821892
0.6641455894355297,0.2647900916213275
0.665567936875532,0.2682236219738142
0.66602308805633,0.2718206537716519
0.6679574805747335,0.2750089319561412
0.6685833134483302,0.2786877144766834
0.6696642975027303,0.2822847462745211
0.6711435388403354,0.28563652590436134
0.6748416421843334,0.28604527951770975
0.6752967933651366,0.28972406203825196
0.6733624008467333,0.2929123402227413
0.671314220533134,0.2959371169618215
0.6712573266355312,0.2996976502050683
0.6736468703347327,0.3025589254987975
0.6751830055699358,0.30591070512863777
0.6756950506483369,0.3096712383718265
0.6719969473043338,0.30983473981717746
0.6691522524243343,0.31220551077485376
0.6700625547859305,0.31580254257274953
0.672964143563533,0.3181733135304258
0.6755812628531361,0.32070758593345317
0.6778001248595338,0.32373236267253336
0.6796207295827364,0.3270023915797272
0.6781983821427341,0.3304359219322139
0.6746709604915347,0.3292096610920525
0.6726796740755335,0.33231618855383727
0.6712004327379333,0.335749718906324
0.6747847482867356,0.33673072757842987
0.6725658862803328,0.3396737535948636
0.6764346713171344,0.3397555043175682
0.6800189868659366,0.3412270173257851
0.6838308780051404,0.3409817651577296
0.6817258037939384,0.34400654189686786
0.678767321118738,0.3461320606864887
0.6774587614739365,0.34964734176167994
0.6754674750579353,0.3527538692234647
0.6733624008467333,0.35577864596254494
0.6696642975027303,0.3556151445171939
0.6663075575443296,0.35398013006362605
0.6626663480979295,0.3545523851223836
0.6598785471155277,0.35700490680276437
0.6576027912115271,0.3598661820964936
0.6592527142419259,0.3632179617263339
0.658683775265927,0.3668967442468762
0.6565787010547249,0.3699215209859564
0.655554610897928,0.37351855278379403
0.6580010484947273,0.37629807735487686
0.6572614278259298,0.37989510915277264
0.6594233959347295,0.38300163661455744
0.6608457433747269,0.3863534162443396
0.6636335443571286,0.3888876886473669
0.6673316477011316,0.3892146915381269
0.6706314937619344,0.3908497059916948
0.6719969473043338,0.3942832363441815
0.6756950506483369,0.3942832363441815
0.6789948967091346,0.3959182507977494
0.6813844404083361,0.39877952609147865
0.685082543752339,0.3984525232007767
0.6886668593011412,0.39755326525131723
0.6923649626451444,0.39722626236061526
0.6948114002419437,0.4000875376543445
0.6977129890195461,0.4023765578893744
0.7014110923635442,0.40286706222542734
0.7051091957075472,0.4029488129481319
0.7060194980691484,0.39935178115023606
0.7067022248403481,0.39567299862969385
0.7091486624371475,0.39297522478131564
0.7122778268051516,0.39093145671434126
0.7137570681427517,0.38757967708455904
0.7152932033779499,0.38422789745471875
0.718934412824355,0.38406439600936776
0.7225756222707551,0.3834921409506103
0.7259892561267536,0.38193887721968894
0.7286632693139545,0.3794046048166616
0.7302562984467555,0.37605282518687944
0.7325889482483592,0.37319154989309206
0.7357750065139611,0.3712295325488223
0.7380507624179619,0.36836825725509303
0.7416919718643619,0.3691857644818479
0.7451624996179633,0.3705755267673603
0.7484054517811631,0.37221054122098624
0.7518190856371667,0.373682054229145
0.7555171889811698,0.37417255856525605
0.7592152923251677,0.37458131217866253
0.7625720322835734,0.3730280484477411
0.7644495309043738,0.3698397702632518
0.7672373318867706,0.36738724858292904
0.7697406633811728,0.36460772401184627
0.7730974033395734,0.3629727095582784
0.7764541432979791,0.36150119655006147
0.7798677771539776,0.36002968354184456
0.7827124720339772,0.3577406633068728
0.7851589096307816,0.35487938801308544
0.783907243883578,0.35144585766059877
0.7822004269555812,0.34817582875346303
0.7803798222323787,0.3449057998463273
0.7783316419187796,0.341881023107189
0.7762265677075776,0.33877449564540424
0.7741783873939734,0.335749718906324
0.7717319497971741,0.3330519450579457
0.7695130877907762,0.3300271683188074
0.7670666501939719,0.32724764374772464
0.764392637006771,0.3247133713446973
0.7624582444883726,0.3215250931602661
0.7598411251987696,0.3189090700345343
0.7562568096499673,0.3178463106397239
0.7529000696915666,0.31629304690880244
0.7503398442995666,0.31367702378307066
0.747438255521964,0.3114697542707453
0.744252197256362,0.30958948764918
0.7420902291475622,0.30656471091004167
0.7419764413523613,0.3028859283894995
0.7447642423347631,0.30043340670917673
0.7473813616243662,0.2978173835834449
0.7497140114259647,0.2948743575670111
0.7525587063059643,0.29258533733203934
0.7551758255955674,0.289887563483603
0.7576222631923667,0.28710803891257825
0.7600118068915682,0.28424676361879087
0.7617755177171729,0.2809767347116552
0.7649046820851719,0.2789329666446808
0.7687734671219736,0.2781154594179259
0.7686027854291749,0.27427317545203267
0.769114830507576,0.27059439293149046
0.7724715704659767,0.26912287992327355
0.7756576287315786,0.26658860752024627
0.777592021249977,0.2633185786131106
0.7804936100275794,0.26094780765543424
0.7827693659315802,0.25767777874824044
0.7836227743955786,0.2539172455050518
0.7827124720339772,0.24999321081645404
0.7837934560883772,0.24623267757326536
0.7843055011667782,0.24255389505272312
0.7848744401427822,0.23879336180953445
0.7841917133715774,0.23503282856628768
0.7835089866003777,0.23127229532309904
0.7831676232147804,0.2275935128025568
0.7868657265587834,0.22685775629844837
0.786524363173181,0.22317897377790613
0.7868657265587834,0.21941844053465936
0.7886294373843831,0.21614841162752363
0.7906776176979822,0.21304188416573885
0.7914172383667848,0.20936310164519664
0.793408524782786,0.2062565741834119
0.7952860234035866,0.20306829599898066
0.7980738243859831,0.20053402359595338
0.8004633680851847,0.19767274830216605
0.8024546545011859,0.19448447011773484
0.8055269249715871,0.1924407020507605
0.8079733625683915,0.18933417458897572
0.8110456330387926,0.18729040652200138
0.8143454790995904,0.1856553920684335
0.8181004763411963,0.18557364134572896
0.8216278979923956,0.18688165290859488
0.8252122135411978,0.18573714279113804
0.8261225159027992,0.18214011099324226
0.8293085741683961,0.18025984437161888
0.8330066775123991,0.17976934003556594
0.8363065235732018,0.18148610521183833
0.837785764910802,0.1848378848416205
0.8392650062484022,0.18827141519416532
0.8415407621524029,0.18532838917773156
0.8419390194356031,0.18156785593448477
0.8430200034900031,0.17797082413664708
0.8456371227796061,0.18066859798502535
0.8466612129364032,0.18426562978292113
0.8483111359668071,0.18091385015308087
0.8485387115572087,0.17723506763253866
0.8482542420692042,0.17347453438934998
0.8463767434484036,0.17028625620486068
0.8471732580148043,0.166689224407023
0.8480835603764055,0.16301044188648076
0.8480266664788076,0.15933165936593852
0.8483680298644051,0.15557112612269178
0.8453526532916068,0.15344560733307094
0.848880074942806,0.15213759577020505
0.8485387115572087,0.1484588132496628
0.848424923762008,0.14469828000647417
0.8492783322260062,0.1411012482085784
0.8455802288820032,0.14101949748593193
0.8419959133332061,0.14191875543539134
0.8385253855796047,0.1431450162755527
0.8357944784948007,0.140528993149879
0.832494632433998,0.1388122279736066
0.8287965290900001,0.1386487265282556
0.827146606059596,0.1420005061580959
0.8247001684627968,0.14469828000647417
0.8210589590163967,0.14551578723322905
0.8179866885459955,0.1475595553002034
0.8142316913043947,0.14764130602290793
0.8105904818579894,0.14829531180431182
0.8068923785139915,0.1487858161403648
0.8033649568627871,0.15001207698058425
0.7996668535187842,0.1502573291485817
0.7996099596211863,0.146496795905393
0.7962532196627857,0.14813181035896086
0.798187612181184,0.1449435321744716
0.7949446600179841,0.14322676699825726
0.7943757210419852,0.1394662337550105
0.7913603444691819,0.14167350326733585
0.7888001190771817,0.1443712771157722
0.7852158035283795,0.14518878434252708
0.7814608062867786,0.14543403651058262
0.7785023236115782,0.14764130602290793
0.7748611141651781,0.1484588132496628
0.771788843694777,0.15066608276198817
0.7682614220435726,0.15172884215679858
0.7646202125971725,0.15270985082896252
0.7609790031507725,0.1535273580557755
0.7576791570899696,0.15508062178663884
0.758589459451571,0.15148358998880113
0.7557447645715664,0.1539361116691239
0.7525587063059643,0.15573462756804274
0.7499415870163664,0.1584324014164791
0.7485761334739669,0.1618659317689658
0.7472675738291653,0.16538121284415708
0.7465848470579657,0.16897824464199476
0.7449349240275618,0.1722482735491305
0.7412937145811617,0.17322928222129444
0.7376525051347615,0.1739650387254029
0.7339544017907585,0.17445554306145583
0.7312803886035576,0.17698981546448314
0.7288339510067582,0.17976934003556594
0.7254772110483576,0.18148610521183833
0.7223480466803535,0.18352987327881268
0.7193326701075553,0.18581889351378447
0.7162035057395512,0.1877809108580543
0.7137570681427517,0.19072393687448808
0.7115382061363489,0.19366696289092186
0.708352147870747,0.19562898023519168
0.7055074529907474,0.19808150191557253
0.7022076069299447,0.19979826709184492
0.6994766998451458,0.19726399468881764
0.6974285195315417,0.19423921794967933
0.6937873100851415,0.19366696289092186
0.6913408724883422,0.19080568759719263
0.6884392837107397,0.19317645855486892
0.6851394376499369,0.1948114730084368
0.6822947427699373,0.1924407020507605
0.6786535333235372,0.1916231948239475
0.6749554299795343,0.19178669626929848
0.6715417961235357,0.1933399600002199
0.6692091463219321,0.19620123529394914
0.6671040721107301,0.19930776275573392
0.6644300589235291,0.2018420351588193
0.6634059687667322,0.20543906695665698
0.6613008945555301,0.20846384369573723
0.6582286240851289,0.2105893624854161
0.6548718841267283,0.21214262621627944
0.6512306746803231,0.2127148812750369
0.6475325713363251,0.21345063777914536
0.6441189374803216,0.2148404000646577
0.6405346219315193,0.21598491018217264
0.6371778819731186,0.21761992463574054
0.6337642481171152,0.21917318836666197
0.6304644020563174,0.22088995354287627
0.6272783437907155,0.2229337216098506
0.6244336489107158,0.22530449256752694
0.6215889540307112,0.22783876497055422
0.6189149408435103,0.2303730373736396
0.6157857764755112,0.23110879387774805

================================================
FILE: demo/src/main/assets/tracks/track2.txt
================================================
0.5442701471922805,0.22415998245007007
0.5441563593970797,0.22415998245007007
0.5443839349874813,0.22407823172736555
0.5443839349874813,0.223996481004661
0.5442132532946826,0.22391473028201458
0.5443839349874813,0.22407823172736555
0.5443270410898784,0.22424173317271653
0.5441563593970797,0.22415998245007007
0.5443270410898784,0.2244052346180675
0.5441563593970797,0.22456873606341848
0.5442132532946826,0.22456873606341848
0.5442132532946826,0.22448698534077202
0.544042571601879,0.2243234838954211
0.543530526523478,0.2244052346180675
0.5431322692402777,0.2243234838954211
0.542961587547479,0.22407823172736555
0.5429046936498813,0.223996481004661
0.5420512851858778,0.2226884694418532
0.5419943912882799,0.22260671871914864
0.5415392401074818,0.2222797158284467
0.5409703011314778,0.22170746076968925
0.5409134072338799,0.2216257100469847
0.5401737865650773,0.2212169564336363
0.5398893170770779,0.2212169564336363
0.5400599987698765,0.22129870715628275
0.5400599987698765,0.2213804578789873
0.5401737865650773,0.2212169564336363
0.5399462109746808,0.22088995354287627
0.5396617414866762,0.22064470137487885
0.539263484203481,0.2205629506521743
0.5392065903058781,0.22048119992952786
0.5388083330226778,0.22015419703876782
0.5378980306610767,0.2199089448707704
0.5377842428658759,0.21982719414806587
0.5364756832210794,0.2193366898120129
0.5364187893234764,0.2193366898120129
0.5352809113714786,0.21884618547595996
0.5352809113714786,0.21892793619860643
0.5351102296786748,0.21876443475325547
0.535053335781077,0.21860093330790448
0.5349395479858762,0.21770167535844506
0.5349395479858762,0.21761992463574054
0.5347688662930775,0.21721117102239212
0.534541290702676,0.21688416813163208
0.5342568212146765,0.2163119130728746
0.5342568212146765,0.21623016235022818
0.5336878822386776,0.21492215078736224
0.5336309883410747,0.2148404000646577
0.5333465188530752,0.21451339717395576
0.5328913676722771,0.21353238850184988
0.5328344737746742,0.21345063777914536
0.5327775798770763,0.21320538561108984
0.5324931103890769,0.2128783827203879
0.5324931103890769,0.21263313055239044
0.5323224286962782,0.21255137982968594
0.5321517470034745,0.21214262621627944
0.5320948531058766,0.212060875493633
0.5317534897202741,0.21157037115752197
0.5313552324370739,0.21116161754417356
0.5311845507442753,0.21132511898952455
0.5311845507442753,0.21132511898952455
0.530843187358673,0.21132511898952455
0.5307293995634772,0.211406869712171
0.5303880361778749,0.212060875493633
0.530331142280277,0.21214262621627944
0.5301035666898753,0.2128783827203879
0.5296484155090723,0.2133688870564989
0.5295915216114744,0.21345063777914536
0.5293070521234748,0.21385939139255183
0.5290225826354754,0.21418639428325378
0.5288519009426768,0.2144316464513093
0.5287950070450739,0.2145951478966603
0.528738113147476,0.21467689861930675
0.5289087948402746,0.21492215078736224
0.5288519009426768,0.21508565223271323
0.5289087948402746,0.21533090440076874
0.5286243253522752,0.21582140873682168
0.5286243253522752,0.21598491018217264
0.5286243253522752,0.21623016235022818
0.5285105375570743,0.2167206666862811
0.5281122802738741,0.21721117102239212
0.5280553863762762,0.21729292174503856
0.5279415985810755,0.21761992463574054
0.5275433412978752,0.21851918258519992
0.5274864474002723,0.21860093330790448
0.5268606145266755,0.21950019125736392
0.5267468267314747,0.21982719414806587
0.5266899328338718,0.2199089448707704
0.526576145038671,0.22015419703876782
0.5262347816530737,0.2205629506521743
0.526064099960275,0.2209717042655808
0.5259503121650742,0.2210534549882853
0.526007206062672,0.2212169564336363
0.5259503121650742,0.2212169564336363
0.5257796304722705,0.22170746076968925
0.5254951609842711,0.2218709622150402
0.5251537975986738,0.22195271293774474
0.5249262220082722,0.22219796510574216
0.5248693281106743,0.22219796510574216
0.5244710708274741,0.22260671871914864
0.5243003891346704,0.22260671871914864
0.52390213185147,0.2229337216098506
0.5237883440562744,0.2229337216098506
0.5227073600018693,0.2237512288366636
0.5225935722066736,0.22383297955931003
0.5221953149234734,0.223996481004661
0.5220246332306696,0.223996481004661
0.5212850125618721,0.22424173317271653
0.5211712247666712,0.22424173317271653
0.5208867552786718,0.2243234838954211
0.520204028507472,0.22407823172736555
0.5198057712242719,0.22415998245007007
0.519748877326669,0.22415998245007007
0.5193506200434688,0.22424173317271653
0.5188954688626706,0.22407823172736555
0.5184403176818725,0.22407823172736555
0.5183834237842696,0.22407823172736555
0.5178144848082706,0.22424173317271653
0.5170179702418701,0.22407823172736555
0.5169041824466694,0.22415998245007007
0.5166766068562677,0.2243234838954211
0.5154249411090691,0.2243234838954211
0.5153111533138683,0.22424173317271653
0.5142301692594684,0.2244052346180675
0.513945699771469,0.2243234838954211
0.5138319119762681,0.2243234838954211
0.5131491852050685,0.22407823172736555
0.5125233523314666,0.22407823172736555
0.5124664584338688,0.22407823172736555
0.5122388828434672,0.22415998245007007
0.5114423682770667,0.22407823172736555
0.5112147926866651,0.22415998245007007
0.5111010048914694,0.22424173317271653
0.5101907025298681,0.2243234838954211
0.5098493391442657,0.2244052346180675
0.5097924452466678,0.22448698534077202
0.5090528245778652,0.22424173317271653
0.5085407794994641,0.2244052346180675
0.5084838856018662,0.2244052346180675
0.5074597954450643,0.22456873606341848
0.5074029015474664,0.22465048678612304
0.5073460076498635,0.22473223750876944
0.5071753259570648,0.224977489676825
0.507061538161864,0.22489573895417853
0.5067770686738645,0.22448698534077202
0.5063219174930664,0.2244052346180675
0.5062081296978657,0.2244052346180675
0.5047857822578633,0.22415998245007007
0.5047288883602654,0.22407823172736555
0.5043306310770651,0.22391473028201458
0.5039323737938649,0.2244052346180675
0.5039323737938649,0.22415998245007007
0.5041030554866636,0.22407823172736555
0.5042168432818643,0.22383297955931003
0.5041599493842664,0.22391473028201458
0.5042168432818643,0.22383297955931003
0.5042737371794622,0.22407823172736555
0.5042168432818643,0.22415998245007007
0.504444418872266,0.22415998245007007
0.504387524974663,0.2243234838954211
0.5042168432818643,0.22424173317271653
0.5037616921010662,0.22424173317271653
0.5037047982034633,0.2243234838954211
0.5033065409202631,0.22456873606341848
0.5028513897394649,0.22522274184488048
0.502794495841862,0.22530449256752694
0.5019410873778637,0.22587674762628437
0.5018272995826629,0.22620375051698632
0.5018272995826629,0.22636725196233734
0.5016566178898643,0.22653075340774637
0.5013152545042618,0.22669425485309738
0.5010307850162624,0.22702125774379933
0.5008601033234638,0.22718475918915032
0.5008601033234638,0.2274300113572058
0.5008032094258609,0.22751176207985227
0.4997222253714609,0.22816576786131426
0.4996084375762601,0.22824751858396072
0.4993808619858635,0.22832926930666525
0.4992101802930598,0.22832926930666525
0.4989257108050604,0.22800226641596327
0.49829987793146363,0.22816576786131426
0.49824298403386064,0.22824751858396072
0.4979585145458612,0.22832926930666525
0.4979016206482633,0.22824751858396072
0.49773093895545967,0.22783876497055422
0.4976171511602639,0.22775701424790776
0.49744646946746013,0.2275935128025568
0.4972188938770637,0.22767526352520323
0.4971619999794607,0.22767526352520323
0.4968775304914613,0.22783876497055422
0.4965361671058589,0.22792051569325877
0.4961948037202616,0.22816576786131426
0.4957396525394584,0.22824751858396072
0.49562586474426273,0.22832926930666525
0.4942604112018582,0.2284927707520162
0.4942035173042604,0.22841102002931168
0.4936914722258593,0.22832926930666525
0.49289495765945884,0.2284927707520162
0.4927811698642581,0.2284927707520162
0.4913019285266578,0.22832926930666525
0.49124503462905994,0.22832926930666525
0.49056230785786026,0.22857452147466267
0.4900502627794592,0.22881977364271816
0.4899933688818563,0.22890152436542271
0.48891238482745636,0.22988253303752856
0.48885549092985847,0.22988253303752856
0.4886279153394568,0.2301277852055841
0.48817276415865873,0.23127229532309904
0.48811587026105585,0.23127229532309904
0.4878882946706593,0.23192630110450294
0.4878882946706593,0.23225330399520489
0.4877176129778556,0.2326620576086114
0.4876038251826548,0.23274380833131592
0.4872624617970575,0.2330708112220179
0.4872055678994596,0.23339781411271984
0.48669352282105854,0.23380656772612632
0.48663662892345566,0.23380656772612632
0.4864090533330591,0.23397006917147728
0.4856125387666586,0.23413357061682827
0.48538496317625707,0.23429707206217923
0.48527117538105624,0.23429707206217923
0.484872918097856,0.23437882278488378
0.4845315547122536,0.2347875763982322
0.4841332974290534,0.23495107784364128
0.48407640353145553,0.23503282856628768
0.4837350401458582,0.23535983145698963
0.48322299506745714,0.23560508362504518
0.4829385255794577,0.23593208651574712
0.48282473778425683,0.23593208651574712
0.4818575415250527,0.23601383723845165
0.4815161781394554,0.23625908940644907
0.4814023903442545,0.23634084012915363
0.4807196635730549,0.23683134446520654
0.48083345136825567,0.23691309518791107
0.4807765574706527,0.23707659663326205
0.480605875777854,0.23724009807861302
0.48054898188025624,0.23732184880131757
0.47958178562105197,0.23756710096931496
0.4791835283378517,0.2378123531373705
0.4791266344402539,0.2378123531373705
0.47861458936185286,0.238057605305426
0.4781594381810548,0.23838460819612795
0.47787496869305524,0.23838460819612795
0.47781807479545235,0.2384663589187744
0.4770784541266547,0.2386298603641254
0.47645262125305293,0.23838460819612795
0.4763957273554551,0.23830285747342342
0.4756561066866524,0.23838460819612795
0.47514406160825146,0.23871161108682992
0.47514406160825146,0.23871161108682992
0.47520095550585434,0.23895686325488544
0.4748595921202519,0.23903861397753187
0.4741768653490523,0.23961086903628934
0.4740630775538514,0.2396926197589939
0.4736079263730533,0.23985612120434485
0.4725838362162512,0.24001962264969584
0.47252694231865344,0.24001962264969584
0.472185578933051,0.23985612120434485
0.47207179113785025,0.23993787192699131
0.47201489724025236,0.2401013733723423
0.47207179113785025,0.24051012698574875
0.4722993667282518,0.24051012698574875
0.47241315452345256,0.24051012698574875
0.47286830570425076,0.2407553791538043
0.47326656298745096,0.2414093849352082
0.47326656298745096,0.24157288638055918
0.4733803507826517,0.2424721443300186
0.47349413857785255,0.24296264866612963
0.47349413857785255,0.24296264866612963
0.47349413857785255,0.24361665444753353
0.4733803507826517,0.24378015589288451
0.47286830570425076,0.24402540806094003
0.47286830570425076,0.24410715878364456
0.47252694231865344,0.24467941384234393
0.47241315452345256,0.24541517034645238
0.4723562606258497,0.2454969210691569
0.4719011094450516,0.2459056746825634
0.4717873216498507,0.24606917612791437
0.47173042775225293,0.24639617901861632
0.4715028521618513,0.24647792974132085
0.4715028521618513,0.2465596804639673
0.4717873216498507,0.2468049326320228
0.4715028521618513,0.24705018480002025
0.47121838267385185,0.2472136862454293
0.47099080708345026,0.2473771876907803
0.4709339131858524,0.24745893841342675
0.47070633759545083,0.24754068913613125
0.47019429251704975,0.24754068913613125
0.4700236108242511,0.24762243985877772
0.46973914133625166,0.24794944274953776
0.4696822474386488,0.2480311934721842
0.4695684596434479,0.2482764456402397
0.46934088405305147,0.24852169780823716
0.4692270962578506,0.2488487006989972
0.4690564145650519,0.24901220214434816
0.46899952066744904,0.24925745431234558
0.46899952066744904,0.2493392050350501
0.46865815728185173,0.24966620792575206
0.4683167938962493,0.24974795864845659
0.46820300610104854,0.24982970937110305
0.4680323244082499,0.2502384629845096
0.4680323244082499,0.2503202137072141
0.46797543051064694,0.2505654658752115
0.4676340671250496,0.25130122237931996
0.46752027932984885,0.25154647454737544
0.46752027932984885,0.25154647454737544
0.4672927037394473,0.25170997599272643
0.46672376476344835,0.25154647454737544
0.4660979318898465,0.25146472382467094
0.4659841440946507,0.25146472382467094
0.46507384173304944,0.250974219488618
0.46478937224505,0.250974219488618
0.46467558444984924,0.250974219488618
0.46404975157624745,0.2508924687659134
0.4634239187026456,0.25146472382467094
0.4633670248050477,0.25154647454737544
0.46319634311224905,0.25170997599272643
0.4630825553170483,0.25236398177413033
0.4629118736242445,0.25252748321953944
0.462684298033848,0.2524457324968349
0.462684298033848,0.25236398177413033
0.462684298033848,0.2522004803287794
0.46274119193144586,0.2519552281607819
0.46285497972664663,0.2518734774380774
0.4630256614194453,0.251791726715431
0.46331013090744483,0.2521187296061329
0.46325323700984694,0.2519552281607819
0.4633670248050477,0.25170997599272643
0.4633670248050477,0.2516282252700219
0.4634808126002485,0.2508924687659134
0.4638221759858458,0.2502384629845096
0.4638790698834488,0.250156712261805
0.4641635393714482,0.24974795864845659
0.4648462661426479,0.24942095575775464
0.46467558444984924,0.24925745431234558
0.4646186905522463,0.24917570358969915
0.4642204332690461,0.24917570358969915
0.4643342210642469,0.24925745431234558
0.4645617966546484,0.24893045142164363
0.46501694783544656,0.24876694997629265
0.46507384173304944,0.24876694997629265
0.465301417323446,0.24868519925364618
0.4654152051186468,0.24852169780823716
0.46547209901624975,0.24835819636288614
0.4655858868114505,0.2481946949175352
0.4656996746066463,0.2478676920268332
0.46581346240184707,0.24762243985877772
0.46587035629944995,0.24762243985877772
0.4659841440946507,0.24713193552272478
0.4659841440946507,0.24696843407737382
0.4659841440946507,0.2467231819093183
0.46621171968504727,0.24623267757326536
0.46626861358265026,0.2461509268505608
0.4663824013778459,0.24566042251450787
0.4663824013778459,0.24533341962380592
0.46678065866104623,0.24492466601039942
0.46678065866104623,0.24492466601039942
0.46695134035385,0.24467941384234393
0.46706512814905077,0.24435241095164198
0.4673495976370502,0.24410715878364456
0.46746338543225097,0.24386190661558904
0.46752027932984885,0.24378015589288451
0.4674064915346481,0.24361665444753353
0.4673495976370502,0.24345315300218254
0.4664392952754489,0.24386190661558904
0.4663824013778459,0.24386190661558904
0.46552899291384764,0.24410715878364456
0.465301417323446,0.2444341616743465
0.46507384173304944,0.24459766311969747
0.46501694783544656,0.24467941384234393
0.4649031600402458,0.24508816745575043
0.4643342210642469,0.2459056746825634
0.4642204332690461,0.2459056746825634
0.4637652820882479,0.24606917612791437
0.4633670248050477,0.2461509268505608
0.46285497972664663,0.24582392395985886
0.46279808582904874,0.24582392395985886
0.4623429346482456,0.24566042251450787
0.4620015712626483,0.24516991817845496
0.46177399567224675,0.24508816745575043
0.4616033139794481,0.24541517034645238
0.46148952618424727,0.2454969210691569
0.46103437500344413,0.24582392395985886
0.46097748110584624,0.24623267757326536
0.4606361177202438,0.2465596804639673
0.46052232992504816,0.24664143118667187
0.4606361177202438,0.24688668335466926
0.46057922382264593,0.24705018480002025
0.4607499055154446,0.24745893841342675
0.4604085421298473,0.24794944274953776
0.4603516482322444,0.2480311934721842
0.4599533909490441,0.24811294419488875
0.4595551336658439,0.24835819636288614
0.4593844519730452,0.2488487006989972
0.45932755807544734,0.2488487006989972
0.45915687638264363,0.2490939528669946
0.45824657402104746,0.24966620792575206
0.45824657402104746,0.24974795864845659
0.4575638472498426,0.2503202137072141
0.4572793777618432,0.250647216597916
0.4572224838642453,0.2507289673205625
0.456881120478643,0.2513829731020245
0.45671043878584433,0.25154647454737544
0.45665354488824644,0.2519552281607819
0.45665354488824644,0.25203697888342835
0.45636907540024196,0.2524457324968349
0.45642596929784485,0.2530997382782388
0.4563121815026441,0.25334499044629427
0.4562552876050462,0.2534267411689988
0.4560277120146446,0.25350849189164526
0.4557432425266451,0.2539172455050518
0.45511740965304337,0.2539989962276982
0.45511740965304337,0.2539989962276982
0.4548898340626417,0.2539172455050518
0.45471915236984306,0.2539172455050518
0.4546053645746423,0.2539989962276982
0.4540364255986433,0.2541624976731073
0.4537519561106439,0.2540807469504027
0.453695062213041,0.2540807469504027
0.45346748662264447,0.2540807469504027
0.45329680492984076,0.25457125128645564
0.452670972056244,0.2548165034545112
0.452614078158641,0.2548165034545112
0.4519882452850443,0.25514350634521316
0.45170377579704485,0.2554705092359151
0.4514762002066432,0.2554705092359151
0.4514193063090403,0.2553887585132687
0.4509641551282421,0.2554705092359151
0.45045211004984115,0.2557975121266751
0.4502814283570425,0.2557975121266751
0.45016764056184166,0.2557975121266751
0.44976938327864147,0.2559610135720261
0.4492573382002404,0.2557157614039706
0.4488590809170402,0.2557157614039706
0.4488021870194423,0.2557975121266751
0.44811946024824256,0.2559610135720261
0.4482901419410412,0.25604276429467254
0.44868839922424153,0.2558792628493216
0.44891597481464307,0.2558792628493216
0.44897286871224096,0.2558792628493216
0.44937112599544116,0.2554705092359151
0.4497124893810436,0.2547347527318067
0.44982627717623935,0.2547347527318067
0.45011074666424383,0.25448950056380926
0.4507365795378406,0.25375374405970075
0.45079347343544346,0.2536719933369963
0.4514193063090403,0.2526092339421858
0.4514762002066432,0.2524457324968349
0.4515330941042411,0.2519552281607819
0.45164688189944185,0.251791726715431
0.4518175635922405,0.2516282252700219
0.4522158208754408,0.25146472382467094
0.4523296086706416,0.25130122237931996
0.4523865025682445,0.25121947165667347
0.45250029036344025,0.250974219488618
0.4523296086706416,0.250647216597916
0.45244339646584236,0.2502384629845096
0.4523865025682445,0.25007496153915854
0.45244339646584236,0.24982970937110305
0.45244339646584236,0.24974795864845659
0.45215892697784293,0.24925745431234558
0.45204513918264216,0.24868519925364618
0.45204513918264216,0.24835819636288614
0.4519882452850443,0.2482764456402397
0.45204513918264216,0.2480311934721842
0.4519313513874413,0.24770419058148224
0.4519882452850443,0.2473771876907803
0.4519882452850443,0.2472136862454293
0.45210203308024505,0.24696843407737382
0.45215892697784293,0.24688668335466926
0.4522727147730437,0.24664143118667187
0.452614078158641,0.24623267757326536
0.45295544154424344,0.24574217323721242
0.45301233544184133,0.24566042251450787
0.45341059272504153,0.24557867179186146
0.4535243805202423,0.2454969210691569
0.4536381683154431,0.24508816745575043
0.4536381683154431,0.24467941384234393
0.45358127441784524,0.24459766311969747
0.4535243805202423,0.24435241095164198
0.45329680492984076,0.2431261501114806
0.45329680492984076,0.2431261501114806
0.45284165374904267,0.24271739649807408
0.452670972056244,0.24198163999396566
0.452670972056244,0.24189988927131922
0.452614078158641,0.24157288638055918
0.452670972056244,0.24083712987645073
0.4527847598514448,0.24067362843109974
0.4527278659538418,0.24042837626310234
0.4527278659538418,0.24042837626310234
0.4527847598514448,0.23993787192699131
0.45295544154424344,0.2396926197589939
0.4530692293394442,0.2391203647002364
0.4531261232370421,0.23903861397753187
0.4531261232370421,0.23895686325488544
0.4530692293394442,0.23879336180953445
0.4531261232370421,0.2386298603641254
0.4530692293394442,0.23830285747342342
0.45323991103224287,0.23789410386001697
0.45323991103224287,0.23756710096931496
0.45323991103224287,0.23748535024666856
0.453183017134645,0.2371583473559666
0.45329680492984076,0.23699484591055753
0.4535243805202423,0.2367495937425601
0.4536381683154431,0.23609558796109809
0.4536381683154431,0.23609558796109809
0.4536381683154431,0.23576858507039614
0.4535243805202423,0.2356868343477497
0.45329680492984076,0.2356868343477497
0.45301233544184133,0.23593208651574712
0.45284165374904267,0.23601383723845165
0.45284165374904267,0.23625908940644907
0.4527847598514448,0.23634084012915363
0.452614078158641,0.23650434157450456
0.4522158208754408,0.23666784301985558
0.45170377579704485,0.23732184880131757
0.45164688189944185,0.237403599523964
0.45130551851384454,0.23773060241466595
0.451077942923443,0.23813935602807246
0.451077942923443,0.23830285747342342
0.45102104902584006,0.2384663589187744
0.45090726123064434,0.23854810964147896
0.45085036733304135,0.23854810964147896
0.4506227917426398,0.23871161108682992
0.45045211004984115,0.2391203647002364
0.4497124893810436,0.2391203647002364
0.4495987015858428,0.2391203647002364
0.4492573382002404,0.23944736759093835
0.44902976260983885,0.2401013733723423
0.4488021870194423,0.2403466255403978
0.4488021870194423,0.2403466255403978
0.44817635414584045,0.24100063132185978
0.44811946024824256,0.24116413276721077
0.44794877855543885,0.24116413276721077
0.44783499076024313,0.2414093849352082
0.44783499076024313,0.24149113565791275
0.4477780968626402,0.24165463710326368
0.44760741516984154,0.2418181385486147
0.4470953700914405,0.24206339071667018
0.44681090060344103,0.24239039360737213
0.44675400670583815,0.2424721443300186
0.4465833250130395,0.24271739649807408
0.4461281738322413,0.24296264866612963
0.4460712799346384,0.24328965155683158
0.4460712799346384,0.24361665444753353
0.4460712799346384,0.24361665444753353
0.4460143860370405,0.24410715878364456
0.44590059824183975,0.2444341616743465
0.44544544706104167,0.24476116456504846
0.44538855316343867,0.244842915287753
0.4453316592658408,0.24508816745575043
0.44504718977784136,0.24533341962380592
0.444705826392239,0.24541517034645238
0.4443075691090388,0.24533341962380592
0.444193781313838,0.24533341962380592
0.44322658505463886,0.24516991817845496
0.4430559033618402,0.24525166890110142
0.443112797259438,0.2454969210691569
0.44316969115704097,0.2454969210691569
0.44316969115704097,0.24533341962380592
0.4426576460786399,0.24500641673310397
0.4420318132050381,0.24492466601039942
0.4419749193074402,0.24492466601039942
0.4411215108434368,0.24476116456504846
0.4407801474578395,0.24500641673310397
0.44055257186743785,0.24508816745575043
0.44049567796984007,0.24508816745575043
0.44009742068663976,0.24492466601039942
0.4391871183250385,0.24533341962380592
0.43913022442743554,0.24541517034645238
0.4388457549394361,0.24541517034645238
0.43873196714423535,0.24557867179186146
0.43782166478263906,0.24566042251450787
0.4377078769874383,0.24566042251450787
0.43736651360183587,0.24582392395985886
0.43702515021623856,0.2459056746825634
0.4367406807282341,0.24606917612791437
0.4364562112402346,0.2461509268505608
0.4363993173426367,0.24623267757326536
0.4360579539570344,0.24631442829591182
0.4350907576978352,0.24631442829591182
0.4349769699026344,0.24631442829591182
0.4345787126194342,0.24647792974132085
0.43361151636023504,0.2468049326320228
0.43355462246263715,0.2468049326320228
0.43292878958903536,0.2468049326320228
0.43213227502263485,0.24705018480002025
0.43207538112503185,0.24705018480002025
0.43133576045623434,0.2473771876907803
0.43122197266103357,0.24754068913613125
0.4311650787634357,0.24770419058148224
0.4309943970706319,0.2478676920268332
0.43093750317303403,0.24794944274953776
0.43053924588983383,0.2480311934721842
0.43042545809463306,0.2481946949175352
0.4302547764018344,0.2482764456402397
0.4301409886066336,0.24852169780823716
0.42979962522103127,0.24868519925364618
0.4297427313234334,0.24876694997629265
0.4296289435282326,0.24893045142164363
0.4292875801426353,0.24917570358969915
0.428889322859435,0.24917570358969915
0.42854795947383256,0.2495027064804011
0.4284910655762348,0.2495027064804011
0.4280928082930345,0.24966620792575206
0.4277514449074321,0.24991146009380757
0.42758076321463345,0.24991146009380757
0.42752386931703057,0.2504019644298605
0.4274100815218348,0.25048371515256507
0.4272393998290311,0.25048371515256507
0.4264997791602335,0.2504019644298605
0.42610152187703326,0.2502384629845096
0.42598773408183244,0.250156712261805
0.4258170523890338,0.250156712261805
0.42564637069623007,0.24999321081645404
0.4252481134130298,0.24991146009380757
0.4247360683346288,0.24999321081645404
0.4246791744370309,0.24999321081645404
0.4242240232562328,0.24991146009380757
0.4240533415634291,0.24974795864845659
0.4237119781778318,0.24974795864845659
0.42337061479222937,0.24958445720310563
0.42331372089463154,0.24958445720310563
0.42337061479222937,0.24974795864845659
0.4231999330994307,0.24982970937110305
0.4229154636114313,0.2495027064804011
0.4223465246354324,0.2493392050350501
0.42228963073782944,0.24925745431234558
0.42166379786422764,0.2490939528669946
0.42115175278583167,0.24876694997629265
0.42092417719543007,0.24876694997629265
0.4208672832978322,0.24876694997629265
0.42046902601463193,0.2488487006989972
0.41955872365303065,0.24860344853094166
0.41955872365303065,0.24860344853094166
0.41933114806262906,0.24868519925364618
0.4189897846770267,0.24876694997629265
0.41870531518902726,0.24852169780823716
0.4185346334962286,0.24852169780823716
0.4182501640082291,0.24868519925364618
0.4181932701106262,0.24868519925364618
0.41694160436342753,0.24835819636288614
0.4168847104658297,0.24835819636288614
0.4164295592850265,0.2480311934721842
0.41625887759222785,0.24811294419488875
0.4161450897970271,0.2482764456402397
0.4160313020018263,0.24868519925364618
0.4160313020018263,0.24868519925364618
0.4157468325138268,0.24942095575775464
0.41557615082102817,0.24999321081645404
0.41557615082102817,0.25007496153915854
0.41557615082102817,0.2503202137072141
0.4154054691282295,0.2504019644298605
0.41534857523062657,0.25105597021132253
0.4152347874354258,0.25130122237931996
0.4152347874354258,0.2513829731020245
0.4147227423570247,0.2519552281607819
0.4144382728690253,0.2524457324968349
0.4144382728690253,0.2526092339421858
0.4143813789714274,0.25301798755559235
0.41421069727862875,0.2530997382782388
0.4135848644050269,0.25350849189164526
0.41352797050742907,0.25350849189164526
0.413015925429028,0.25383549478234724
0.41284524373622433,0.2539989962276982
0.41273145594102856,0.25383549478234724
0.4122763047602254,0.25383549478234724
0.41221941086262753,0.2539172455050518
0.41199183527222594,0.25383549478234724
0.41187804747702517,0.2536719933369963
0.41165047188662357,0.25350849189164526
0.41096774511542383,0.25350849189164526
0.41096774511542383,0.25350849189164526
0.4097729732658231,0.25334499044629427
0.4097160793682253,0.2530997382782388
0.4096591854706274,0.25301798755559235
0.40994365495862684,0.2524457324968349
0.41028501834422415,0.2522004803287794
0.4103988061394249,0.2518734774380774
0.41045570003702786,0.2518734774380774
0.41074016952502734,0.25154647454737544
0.4107970634226252,0.250810718043267
0.41096774511542383,0.2505654658752115
0.41096774511542383,0.25048371515256507
0.4111384268082276,0.24999321081645404
0.41119532070582543,0.2493392050350501
0.41130910850102625,0.24917570358969915
0.4113660023986241,0.2490939528669946
0.41153668409142785,0.24893045142164363
0.4115935779890257,0.24876694997629265
0.4114797901938249,0.2484399470855907
0.41165047188662357,0.2477859413041287
0.41165047188662357,0.24770419058148224
0.41153668409142785,0.24754068913613125
0.4114797901938249,0.2472136862454293
0.41153668409142785,0.2465596804639673
0.41153668409142785,0.24631442829591182
0.4114797901938249,0.24623267757326536
0.4117073657842265,0.24557867179186146
0.4120487291698238,0.24508816745575043
0.41221941086262753,0.24492466601039942
0.41221941086262753,0.24492466601039942
0.4123900925554262,0.24467941384234393
0.412503880350627,0.24427066022899552
0.4123900925554262,0.24410715878364456
0.4126176681458278,0.24386190661558904
0.412503880350627,0.24410715878364456
0.4124469864530241,0.24410715878364456
0.4120487291698238,0.24451591239699297
0.4117073657842265,0.24467941384234393
0.41130910850102625,0.24492466601039942
0.4112522146034233,0.24500641673310397
0.41102463901302677,0.24516991817845496
0.4106832756274244,0.24525166890110142
0.4100005488562247,0.24574217323721242
0.40994365495862684,0.24574217323721242
0.4086919892114232,0.24647792974132085
0.4086350953138253,0.24647792974132085
0.40857820141622236,0.24631442829591182
0.4086350953138253,0.2461509268505608
0.4089195648018248,0.24574217323721242
0.40903335259702556,0.24533341962380592
0.40903335259702556,0.24533341962380592
0.40903335259702556,0.24508816745575043
0.4092040342898242,0.24459766311969747
0.4092040342898242,0.24435241095164198
0.40931782208502504,0.24394365733823548
0.40937471598262287,0.24386190661558904
0.40954539767542664,0.24369840517023808
0.4097729732658231,0.24296264866612963
0.4097729732658231,0.24255389505272312
0.4097729732658231,0.2424721443300186
0.40982986716342606,0.24222689216202117
0.41022812444662626,0.24206339071667018
0.41045570003702786,0.24157288638055918
0.41022812444662626,0.24157288638055918
0.4101712305490234,0.24165463710326368
0.4097160793682253,0.24206339071667018
0.4092040342898242,0.24230864288466764
0.4088626709042269,0.24230864288466764
0.40880577700662396,0.24222689216202117
0.4080661563378264,0.24255389505272312
0.4075541112594253,0.24296264866612963
0.4075541112594253,0.2430443993887761
0.4072696417714259,0.24328965155683158
0.40709896007862223,0.24337140227953613
0.4068713844882257,0.24328965155683158
0.40675759669302486,0.24345315300218254
0.40653002110262326,0.24345315300218254
0.40647312720502543,0.24361665444753353
0.405619718741022,0.244188909506291
0.40550593094582116,0.24435241095164198
0.4051076736626209,0.24451591239699297
0.4048232041746215,0.24476116456504846
0.40459562858422493,0.24516991817845496
0.40453873468662205,0.24525166890110142
0.40431115909622045,0.24541517034645238
0.4042542651986226,0.24566042251450787
0.404026689608221,0.24598742540520985
0.4035715384274229,0.24639617901861632
0.4035715384274229,0.24639617901861632
0.40317328114422263,0.24688668335466926
0.40294570555382103,0.24688668335466926
0.4028888116562232,0.24664143118667187
0.40300259945142397,0.24639617901861632
0.40305949334902186,0.24631442829591182
0.40328706893942345,0.24623267757326536
0.4034577506322221,0.2459056746825634
0.4034008567346242,0.24525166890110142
0.40351464452982505,0.24500641673310397
0.40351464452982505,0.24500641673310397
0.40351464452982505,0.24467941384234393
0.4034577506322221,0.24492466601039942
0.4034008567346242,0.24476116456504846
0.4034008567346242,0.244188909506291
0.40317328114422263,0.24435241095164198
0.40317328114422263,0.2444341616743465
0.40305949334902186,0.24467941384234393
0.4026612360658216,0.24500641673310397
0.40226297878262135,0.24557867179186146
0.40220608488502346,0.24557867179186146
0.40163714590901956,0.2459056746825634
0.40135267642102007,0.24639617901861632
0.40106820693302064,0.24647792974132085
0.40101131303542276,0.2465596804639673
0.40049926795702173,0.24688668335466926
0.4003285862642231,0.2468049326320228
0.4006699496498204,0.2465596804639673
0.40049926795702173,0.24631442829591182
0.40049926795702173,0.24623267757326536
0.40055616185461956,0.24582392395985886
0.4006699496498204,0.24598742540520985
0.40084063134261905,0.24606917612791437
0.40078373744502116,0.2459056746825634
0.40078373744502116,0.2454969210691569
0.40078373744502116,0.24541517034645238
0.40101131303542276,0.24476116456504846
0.4011251008306235,0.24402540806094003
0.4011251008306235,0.24394365733823548
0.4012957825234222,0.24345315300218254
0.4011819947282214,0.2431261501114806
0.40101131303542276,0.2431261501114806
0.40072684354742333,0.24345315300218254
0.4006699496498204,0.24353490372488706
0.3995320716978225,0.24451591239699297
0.3994751778002196,0.24451591239699297
0.3989631327218186,0.24492466601039942
0.3983941937458197,0.24500641673310397
0.3981666181554181,0.24492466601039942
0.3980528303602224,0.24492466601039942
0.3976545730770221,0.24508816745575043
0.3974838913842184,0.24516991817845496
0.3974269974866205,0.24541517034645238
0.39725631579382187,0.2454969210691569
0.3968580585106216,0.2454969210691569
0.3968011646130187,0.24557867179186146
0.39628911953461765,0.24631442829591182
0.3961753317394219,0.24664143118667187
0.3958908622514174,0.2467231819093183
0.3958339683538195,0.2468049326320228
0.3953219232754185,0.24696843407737382
0.3952081354802177,0.2465596804639673
0.3953219232754185,0.2461509268505608
0.3953219232754185,0.2459056746825634
0.3953219232754185,0.24582392395985886
0.39560639276341797,0.24541517034645238
0.39628911953461765,0.24492466601039942
0.3964029073298184,0.24476116456504846
0.3964029073298184,0.24476116456504846
0.3964029073298184,0.24467941384234393
0.396118437841819,0.24459766311969747
0.39600465004661817,0.24467941384234393
0.3958339683538195,0.24467941384234393
0.3955494988658201,0.24492466601039942
0.3952081354802177,0.24525166890110142
0.3952081354802177,0.24533341962380592
0.39480987819701746,0.24606917612791437
0.39446851481142015,0.2461509268505608
0.3943547270162193,0.24639617901861632
0.3942978331186164,0.24647792974132085
0.39344442465461804,0.24754068913613125
0.39338753075702015,0.24762243985877772
0.3933306368594172,0.24811294419488875
0.3931030612690207,0.2484399470855907
0.39287548567861913,0.24893045142164363
0.39281859178101625,0.24901220214434816
0.39247722839541893,0.24925745431234558
0.39224965280501733,0.24974795864845659
0.39190828941942,0.25007496153915854
0.39190828941942,0.250156712261805
0.39151003213621977,0.2505654658752115
0.39111177485301946,0.25130122237931996
0.39111177485301946,0.2513829731020245
0.3909979870578187,0.2516282252700219
0.3907704114674171,0.2518734774380774
0.3907704114674171,0.2521187296061329
0.3905428358770155,0.25236398177413033
0.3904290480818147,0.2526909846648904
0.3904290480818147,0.2526909846648904
0.3900876846962174,0.25326323972364784
0.3900307907986145,0.25301798755559235
0.3901445785938153,0.2529362368328878
0.3901445785938153,0.2526909846648904
0.3900307907986145,0.25252748321953944
0.3900307907986145,0.2524457324968349
0.389803215208218,0.2522822310514839
0.3894618518226156,0.2526909846648904
0.38894980674421453,0.2530997382782388
0.38889291284661665,0.2530997382782388
0.3884946555634164,0.2534267411689988
0.3882670799730148,0.2534267411689988
0.3884946555634164,0.2530997382782388
0.3884946555634164,0.2529362368328878
0.3884946555634164,0.25285448611024136
0.38843776166581856,0.2526092339421858
0.3885515494610143,0.2524457324968349
0.38843776166581856,0.2521187296061329
0.3885515494610143,0.251791726715431
0.3883808677682156,0.2516282252700219
0.38832397387061773,0.25170997599272643
0.38832397387061773,0.251791726715431
0.388153292177814,0.2522004803287794
0.3879257165874175,0.25252748321953944
0.3879257165874175,0.2526909846648904
0.38775503489461377,0.25285448611024136
0.3875274593042172,0.25285448611024136
0.3875274593042172,0.25285448611024136
0.38747056540661434,0.2526909846648904
0.38764124709941805,0.25252748321953944
0.38764124709941805,0.25236398177413033
0.3875843532018151,0.2522004803287794
0.38764124709941805,0.2519552281607819
0.3875843532018151,0.251791726715431
0.38775503489461377,0.25154647454737544
0.38775503489461377,0.25146472382467094
0.3879257165874175,0.25121947165667347
0.3879257165874175,0.250647216597916
0.3882670799730148,0.2504019644298605
0.3882670799730148,0.25007496153915854
0.3882670799730148,0.25007496153915854
0.38821018607541696,0.24982970937110305
0.38786882268981454,0.24999321081645404
0.38747056540661434,0.24999321081645404
0.38747056540661434,0.24958445720310563
0.38747056540661434,0.24958445720310563
0.3872998837138157,0.24893045142164363
0.3870723081234141,0.2488487006989972
0.38690162643061543,0.2488487006989972
0.3869585203282133,0.24925745431234558
0.3869585203282133,0.2493392050350501
0.38678783863541466,0.24974795864845659
0.38656026304501306,0.25007496153915854
0.3865033691474152,0.2502384629845096
0.3863326874546165,0.250156712261805
0.3863326874546165,0.24991146009380757
0.3863326874546165,0.24982970937110305
0.38621889965941575,0.2495027064804011
0.3862757935570136,0.2493392050350501
0.3861620057618128,0.24876694997629265
0.3861620057618128,0.24835819636288614
0.3861620057618128,0.2482764456402397
0.3861051118642149,0.2480311934721842
0.38599132406901415,0.2478676920268332
0.3858775362738133,0.24794944274953776
0.3858206423762155,0.2484399470855907
0.38570685458101467,0.24852169780823716
0.3854792789906131,0.24852169780823716
0.38542238509301524,0.24860344853094166
0.38513791560501576,0.24917570358969915
0.3852517034002166,0.24974795864845659
0.3850810217074128,0.24991146009380757
0.385024127809815,0.24991146009380757
0.385024127809815,0.24999321081645404
0.3847965522194134,0.24999321081645404
0.3846827644242126,0.24982970937110305
0.38462587052661473,0.24958445720310563
0.38485344611701633,0.24966620792575206
0.38485344611701633,0.2495027064804011
0.38485344611701633,0.24925745431234558
0.3846827644242126,0.2490939528669946
0.3846827644242126,0.24901220214434816
0.38462587052661473,0.2484399470855907
0.3846827644242126,0.2480311934721842
0.38451208273141396,0.2477859413041287
0.3844551888338161,0.2477859413041287
0.3843982949362132,0.2477859413041287
0.3841707193458166,0.24917570358969915
0.3841138254482137,0.24925745431234558
0.3838293559602143,0.24982970937110305
0.38371556816501345,0.24991146009380757
0.3835448864722148,0.24982970937110305
0.3836017803698127,0.24942095575775464
0.3836586742674156,0.2493392050350501
0.38348799257461186,0.24917570358969915
0.3828621597010151,0.24958445720310563
0.3827483719058143,0.24942095575775464
0.3828621597010151,0.24925745431234558
0.3828621597010151,0.24917570358969915
0.3829759474962159,0.2488487006989972
0.3829759474962159,0.2484399470855907
0.3828052658034122,0.2484399470855907
0.38246390241781486,0.24876694997629265
0.3824070085202119,0.24876694997629265
0.3821794329298154,0.24917570358969915
0.3821794329298154,0.24901220214434816
0.3824070085202119,0.24868519925364618
0.3827483719058143,0.2484399470855907
0.3827483719058143,0.2484399470855907
0.38257769021301563,0.2484399470855907
0.38246390241781486,0.24860344853094166
0.3817811756466151,0.24893045142164363
0.3816104939538114,0.2490939528669946
0.3815536000562135,0.2490939528669946
0.38143981226101276,0.2495027064804011
0.38143981226101276,0.24991146009380757
0.3815536000562135,0.24974795864845659
0.3816104939538114,0.2493392050350501
0.3816104939538114,0.24925745431234558
0.38143981226101276,0.2490939528669946
0.3812691305682141,0.2490939528669946
0.38109844887541544,0.24917570358969915
0.38104155497781256,0.2493392050350501
0.3808708732850139,0.2495027064804011
0.3808708732850139,0.2490939528669946
0.3808708732850139,0.24901220214434816
0.3808708732850139,0.24860344853094166
0.38081397938741096,0.24835819636288614
0.38018814651381416,0.24893045142164363
0.3801312526162112,0.24893045142164363
0.38001746482101045,0.24917570358969915
0.37996057092341257,0.2495027064804011
0.3798467831282118,0.24982970937110305
0.3796761014354131,0.24999321081645404
0.37939163194741365,0.25007496153915854
0.3793347380498107,0.25007496153915854
0.37927784415221283,0.24999321081645404
0.37944852584501154,0.24982970937110305
0.3795623136402123,0.24893045142164363
0.3796761014354131,0.24876694997629265
0.3796761014354131,0.24868519925364618
0.3797898892306139,0.2484399470855907
0.37996057092341257,0.2484399470855907
0.38018814651381416,0.24811294419488875
0.3807001915922152,0.2477859413041287
0.3807001915922152,0.2477859413041287
0.38092776718261173,0.24762243985877772
0.38104155497781256,0.24745893841342675
0.38115534277301333,0.24729543696807577
0.381326024465812,0.24647792974132085
0.381326024465812,0.24647792974132085
0.38149670615861564,0.24582392395985886
0.38172428174901224,0.2454969210691569
0.381838069544213,0.24500641673310397
0.381838069544213,0.24492466601039942
0.3818949634418159,0.24467941384234393
0.38166738785141435,0.24459766311969747
0.381326024465812,0.24508816745575043
0.38115534277301333,0.24516991817845496
0.3812122366706112,0.24533341962380592
0.3812122366706112,0.24533341962380592
0.38104155497781256,0.24541517034645238
0.38092776718261173,0.24582392395985886
0.3806432976946123,0.24606917612791437
0.3805295098994115,0.24623267757326536
0.3803588282066128,0.24639617901861632
0.38030193430901493,0.24631442829591182
0.38024504041141205,0.24606917612791437
0.3805864037970144,0.24582392395985886
0.3806432976946123,0.24566042251450787
0.3806432976946123,0.2454969210691569
0.3805295098994115,0.24533341962380592
0.3803588282066128,0.24525166890110142
0.3803588282066128,0.24525166890110142
0.37996057092341257,0.2454969210691569
0.37996057092341257,0.24582392395985886
0.3799036770258147,0.24598742540520985
0.37944852584501154,0.24623267757326536
0.37939163194741365,0.24623267757326536
0.3788795868690126,0.24647792974132085
0.3787089051762139,0.24688668335466926
0.3783675417906116,0.24705018480002025
0.3783106478930137,0.24713193552272478
0.3780830723026121,0.24713193552272478
0.37768481501941187,0.24713193552272478
0.37694519435060925,0.24745893841342675
0.37688830045301136,0.24754068913613125
0.37660383096501193,0.24762243985877772
0.3764331492722133,0.24754068913613125
0.37631936147701245,0.24729543696807577
0.3770020882482122,0.24696843407737382
0.37705898214581,0.24688668335466926
0.3773434516338095,0.2465596804639673
0.37711587604341296,0.2465596804639673
0.37694519435060925,0.2467231819093183
0.37660383096501193,0.2468049326320228
0.37637625537461034,0.24688668335466926
0.37631936147701245,0.24696843407737382
0.3758073163986114,0.24713193552272478
0.3750676957298088,0.24754068913613125
0.37501080183221097,0.24754068913613125
0.37523837742261257,0.24696843407737382
0.3754090591154112,0.24664143118667187
0.3754090591154112,0.24647792974132085
0.37518148352500963,0.24664143118667187
0.37518148352500963,0.24664143118667187
0.3747832262418094,0.24705018480002025
0.3743849689586091,0.24729543696807577
0.37410049947060964,0.24762243985877772
0.37410049947060964,0.24762243985877772
0.3740436055730118,0.24729543696807577
0.37410049947060964,0.24713193552272478
0.37455565065141283,0.24639617901861632
0.3746125445490107,0.24631442829591182
0.3747832262418094,0.24606917612791437
0.37466943844660855,0.2459056746825634
0.3741573933682126,0.24606917612791437
0.373929817777811,0.2461509268505608
0.3738160299826102,0.24639617901861632
0.3738160299826102,0.24639617901861632
0.3735884543922086,0.24647792974132085
0.37313330321141047,0.24696843407737382
0.3725643642354116,0.2472136862454293
0.3725074703378087,0.24729543696807577
0.3722798947474071,0.24729543696807577
0.37222300084980925,0.24713193552272478
0.3722798947474071,0.24688668335466926
0.37279193982580816,0.24664143118667187
0.37290572762100893,0.24647792974132085
0.37284883372341104,0.24639617901861632
0.3726212581330095,0.24631442829591182
0.3724505764402108,0.24639617901861632
0.3723936825426079,0.2465596804639673
0.371824743566609,0.2467231819093183
0.37193853136180977,0.24647792974132085
0.37199542525940765,0.24647792974132085
0.37233678864501,0.24623267757326536
0.3725643642354116,0.2459056746825634
0.3730764093138076,0.2454969210691569
0.3730764093138076,0.2454969210691569
0.37364534828981155,0.24492466601039942
0.3737022421874094,0.24459766311969747
0.3737022421874094,0.24435241095164198
0.3737022421874094,0.24427066022899552
0.3737591360850123,0.24378015589288451
0.37330398490420913,0.24435241095164198
0.3730195154162097,0.24451591239699297
0.37290572762100893,0.24451591239699297
0.37233678864501,0.24467941384234393
0.3718816374642119,0.24500641673310397
0.37165406187381034,0.24500641673310397
0.3715971679762074,0.24500641673310397
0.371824743566609,0.24476116456504846
0.37193853136180977,0.24459766311969747
0.37199542525940765,0.24402540806094003
0.3717678496690111,0.24402540806094003
0.37171095577140817,0.24402540806094003
0.37165406187381034,0.24427066022899552
0.37136959238581085,0.24451591239699297
0.37136959238581085,0.24435241095164198
0.37171095577140817,0.24386190661558904
0.37171095577140817,0.24378015589288451
0.3720523191570106,0.24361665444753353
0.3723936825426079,0.2431261501114806
0.3724505764402108,0.24279914722077864
0.3724505764402108,0.24271739649807408
0.3726212581330095,0.2424721443300186
0.3729626215186118,0.2424721443300186
0.37336087880181207,0.24230864288466764
0.37341777269940996,0.24206339071667018
0.3734746665970078,0.24189988927131922
0.37341777269940996,0.2418181385486147
0.37319019710900836,0.24165463710326368
0.37267815203060733,0.24189988927131922
0.3721092130546084,0.24198163999396566
0.3720523191570106,0.24206339071667018
0.3717678496690111,0.24239039360737213
0.37136959238581085,0.2430443993887761
0.37114201679540926,0.2430443993887761
0.37114201679540926,0.24296264866612963
0.37114201679540926,0.24288089794342507
0.37136959238581085,0.24214514143931665
0.37142648628340874,0.24149113565791275
0.37142648628340874,0.24149113565791275
0.37165406187381034,0.2412458834898572
0.37216610695221136,0.24116413276721077
0.3721092130546084,0.24100063132185978
0.37233678864501,0.24067362843109974
0.3723936825426079,0.2405918777084533
0.3726212581330095,0.2397743704816403
0.3725643642354116,0.2391203647002364
0.3725074703378087,0.23903861397753187
0.3725074703378087,0.23879336180953445
0.37267815203060733,0.2384663589187744
0.3727350459282103,0.23797585458272147
0.3726212581330095,0.23773060241466595
0.3725643642354116,0.23773060241466595
0.3725074703378087,0.23773060241466595
0.371824743566609,0.23879336180953445
0.3717678496690111,0.2388751125321809
0.3710282290002085,0.2392838661455874
0.3708006534098069,0.2396926197589939
0.3709713351026106,0.23985612120434485
0.3709713351026106,0.23985612120434485
0.3705161839218074,0.2401831240950468
0.36994724494580855,0.2401831240950468
0.36971966935540695,0.2403466255403978
0.36966277545780907,0.24042837626310234
0.3695489876626083,0.2405918777084533
0.3692645181746088,0.24132763421256173
0.36915073037940804,0.2414093849352082
0.36892315478900645,0.2412458834898572
0.3689800486866094,0.24116413276721077
0.36920762427700593,0.24083712987645073
0.3694920937650104,0.23993787192699131
0.3695489876626083,0.23985612120434485
0.36971966935540695,0.2391203647002364
0.3696058815602062,0.2388751125321809
0.36971966935540695,0.2384663589187744
0.36977656325300984,0.23838460819612795
0.36994724494580855,0.23756710096931496
0.36977656325300984,0.23756710096931496
0.36966277545780907,0.23797585458272147
0.36966277545780907,0.238057605305426
0.36937830596980964,0.23830285747342342
0.36863868530100696,0.23895686325488544
0.36858179140340913,0.23903861397753187
0.36829732191540965,0.2392838661455874
0.3677852768370086,0.2401013733723423
0.3677283829394057,0.2401831240950468
0.36761459514420997,0.2403466255403978
0.36744391345140626,0.24051012698574875
0.3672732317586076,0.24051012698574875
0.3671025500658089,0.24042837626310234
0.3673301256562055,0.2401013733723423
0.36744391345140626,0.2397743704816403
0.36750080734900914,0.2396926197589939
0.36761459514420997,0.23895686325488544
0.367557701246607,0.23838460819612795
0.367557701246607,0.23830285747342342
0.367557701246607,0.23764885169201952
0.36784217073460646,0.23683134446520654
0.36784217073460646,0.23683134446520654
0.36784217073460646,0.23650434157450456
0.36812664022260594,0.23625908940644907
0.36829732191540965,0.23576858507039614
0.3682404280178067,0.23552333290234062
0.3682404280178067,0.2354415821796942
0.3684111097106105,0.23470582567558573
0.3682404280178067,0.23454232423023477
0.36806974632500805,0.23470582567558573
0.3684111097106105,0.23495107784364128
0.3684111097106105,0.23495107784364128
0.3678990646322094,0.23552333290234062
0.36761459514420997,0.23576858507039614
0.36738701955380837,0.23585033579310066
0.3672732317586076,0.23585033579310066
0.367045656168206,0.23593208651574712
0.36687497447540734,0.23650434157450456
0.36664739888500575,0.23650434157450456
0.36641982329460926,0.23609558796109809
0.36641982329460926,0.23609558796109809
0.36630603549940843,0.2356868343477497
0.36619224770420766,0.23552333290234062
0.36619224770420766,0.23527808073434323
0.36607845990900684,0.23511457928899224
0.36573709652340447,0.2354415821796942
0.36573709652340447,0.2354415821796942
0.36562330872820875,0.23585033579310066
0.36528194534260633,0.23683134446520654
0.36528194534260633,0.23691309518791107
0.36516815754740556,0.23756710096931496
0.3649974758546069,0.23789410386001697
0.36482679416180824,0.23797585458272147
0.36482679416180824,0.23773060241466595
0.3648836880594061,0.23764885169201952
0.3648836880594061,0.237403599523964
0.3647699002642053,0.23724009807861302
0.36459921857140665,0.23732184880131757
0.36459921857140665,0.23773060241466595
0.36437164298100505,0.23813935602807246
0.36437164298100505,0.238221106750777
0.36437164298100505,0.2384663589187744
0.364428536878608,0.23903861397753187
0.36431474908340716,0.23920211542288286
0.3641440673906085,0.2391203647002364
0.36397338569780485,0.2388751125321809
0.36397338569780485,0.23879336180953445
0.363859597902604,0.23854810964147896
0.363859597902604,0.23838460819612795
0.3637458101074083,0.237403599523964
0.3638027040050062,0.237403599523964
0.3637458101074083,0.23707659663326205
0.3638027040050062,0.23691309518791107
0.36363202231220754,0.23699484591055753
0.3635182345170067,0.23707659663326205
0.36340444672180594,0.23748535024666856
0.3632906589266051,0.23764885169201952
0.3632337650290073,0.23773060241466595
0.36283550774580703,0.238221106750777
0.3627217199506062,0.23895686325488544
0.3627217199506062,0.23903861397753187
0.36260793215540543,0.23985612120434485
0.36238035656500384,0.24042837626310234
0.36232346266740595,0.24051012698574875
0.3619252053842057,0.24108238204450624
0.3618114175890049,0.24132763421256173
0.3616407358962062,0.2414093849352082
0.36152694810100544,0.24116413276721077
0.36147005420340755,0.24116413276721077
0.3616976297938041,0.2403466255403978
0.36158384199860333,0.2396926197589939
0.36152694810100544,0.2396926197589939
0.36141316030580467,0.23944736759093835
0.36152694810100544,0.2391203647002364
0.36141316030580467,0.23879336180953445
0.361242478613006,0.2386298603641254
0.36107179692020736,0.2388751125321809
0.36107179692020736,0.2388751125321809
0.36107179692020736,0.2396926197589939
0.3609580091250066,0.23985612120434485
0.36101490302260447,0.24026487481775136
0.3609580091250066,0.2403466255403978
0.360730433534605,0.24083712987645073
0.36055975184180633,0.24100063132185978
0.3603890701490026,0.24083712987645073
0.3602183884562039,0.24051012698574875
0.3601614945586061,0.24042837626310234
0.36010460066100314,0.23936561686823385
0.35999081286580237,0.23903861397753187
0.35999081286580237,0.23895686325488544
0.3599339189682045,0.23871161108682992
0.359649449480205,0.23797585458272147
0.3595925555826021,0.23756710096931496
0.3595925555826021,0.23748535024666856
0.359649449480205,0.2367495937425601
0.35982013117300365,0.23609558796109809
0.3598770250706066,0.23601383723845165
0.36004770676340525,0.23560508362504518
0.35982013117300365,0.23552333290234062
0.3597063433778029,0.23593208651574712
0.35936497999220557,0.2361773386838026
0.35936497999220557,0.23625908940644907
0.35902361660660315,0.23634084012915363
0.3587960410162016,0.2367495937425601
0.3583408898354035,0.23724009807861302
0.35828399593780563,0.23732184880131757
0.35805642034740404,0.23764885169201952
0.35771505696180167,0.2378123531373705
0.3576581630642038,0.23797585458272147
0.357544375269003,0.23838460819612795
0.357544375269003,0.23838460819612795
0.3574305874738022,0.2386298603641254
0.35737369357620435,0.23895686325488544
0.3573167996786014,0.2391203647002364
0.3573167996786014,0.2395291183136429
0.35725990578100353,0.2397743704816403
0.3572030118834057,0.2397743704816403
0.3569754362930041,0.23944736759093835
0.3566909668050046,0.23895686325488544
0.3565202851122009,0.23936561686823385
0.356463391214603,0.23936561686823385
0.3564064973170052,0.23961086903628934
0.3564064973170052,0.23993787192699131
0.3562358156242014,0.2401013733723423
0.3561789217266036,0.23985612120434485
0.3561789217266036,0.2396926197589939
0.35612202782900065,0.23944736759093835
0.35606513393140277,0.23944736759093835
0.3558375583410012,0.23936561686823385
0.35566687664820257,0.2396926197589939
0.3550410437746007,0.2401831240950468
0.3549841498770029,0.24026487481775136
0.35481346818420423,0.2403466255403978
0.35452899869620474,0.24067362843109974
0.35435831700340104,0.24067362843109974
0.3539600597202008,0.2407553791538043
0.35373248412980424,0.2407553791538043
0.35361869633460347,0.2407553791538043
0.35282218176820296,0.24067362843109974
0.35282218176820296,0.24051012698574875
0.3531066512562024,0.2401831240950468
0.3531635451538003,0.2401831240950468
0.3531635451538003,0.23993787192699131
0.3529928634610016,0.2397743704816403
0.35196877330419957,0.23993787192699131
0.3519118794066017,0.23993787192699131
0.35117225873779906,0.2395291183136429
0.35111536484020117,0.23920211542288286
0.3509446831474025,0.23903861397753187
0.3508877892497996,0.23903861397753187
0.3507171075570009,0.2386298603641254
0.3507740014545988,0.2384663589187744
0.35100157704500035,0.2384663589187744
0.3515705160209993,0.238221106750777
0.3515705160209993,0.23813935602807246
0.3517980916114009,0.23797585458272147
0.3523670305873998,0.23813935602807246
0.35265150007539925,0.23797585458272147
0.35282218176820296,0.2378123531373705
0.35282218176820296,0.23789410386001697
0.35293596956340373,0.237403599523964
0.3529928634610016,0.23764885169201952
0.3531066512562024,0.23756710096931496
0.3530497573585995,0.23748535024666856
0.35293596956340373,0.23789410386001697
0.35259460617780136,0.23789410386001697
0.35219634889460116,0.2378123531373705
0.35202566720180245,0.23756710096931496
0.35202566720180245,0.23756710096931496
0.35185498550899874,0.23724009807861302
0.351741197713803,0.23707659663326205
0.3515136221234014,0.23707659663326205
0.3513998343282006,0.23691309518791107
0.35128604653299983,0.23650434157450456
0.35122915263540194,0.23642259085185816
0.35066021365940303,0.23503282856628768
0.3506033197618001,0.23495107784364128
0.3502619563762028,0.23446057350753022
0.3500343807858012,0.23364306628077533
0.3500343807858012,0.2335613155580708
0.3502619563762028,0.23331606339007338
0.35111536484020117,0.23388831844877275
0.35122915263540194,0.23413357061682827
0.35122915263540194,0.23413357061682827
0.35134294043060277,0.23405181989412374
0.3513998343282006,0.23380656772612632
0.35117225873779906,0.23347956483542437
0.35117225873779906,0.23282555905396235
0.35117225873779906,0.23274380833131592
0.35111536484020117,0.2324985561632604
0.35128604653299983,0.23233505471790944
0.35122915263540194,0.23159929821380099
0.35117225873779906,0.23135404604574544
0.35111536484020117,0.23127229532309904
0.3509446831474025,0.23086354170969253
0.3502619563762028,0.23020953592823054
0.35020506247859984,0.23020953592823054
0.34935165401460155,0.2301277852055841
0.3492947601169986,0.22996428376023312
0.34889650283379836,0.2297190315921776
0.3488396089362005,0.2297190315921776
0.34827066996020156,0.22922852725612466
0.3482137760625986,0.22898327508806915
0.3481568821650008,0.22857452147466267
0.3481568821650008,0.22857452147466267
0.34832756385779945,0.2284927707520162
0.3484982455505981,0.2280840171386097
0.3486120333457989,0.22792051569325877
0.34901029062899913,0.22792051569325877
0.34912407842419996,0.22775701424790776
0.34906718452660207,0.22775701424790776
0.34901029062899913,0.22775701424790776
0.3486120333457989,0.22775701424790776
0.34827066996020156,0.22751176207985227
0.3478724126770013,0.22702125774379933
0.34781551877939837,0.22693950702109478
0.3476448370865997,0.22677600557574382
0.34724657980339946,0.22669425485309738
0.34679142862260137,0.22644900268504187
0.34656385303219983,0.22628550123969088
0.34656385303219983,0.22628550123969088
0.3465069591345969,0.22612199979433992
0.3463931713394012,0.22612199979433992
0.3462224896465974,0.22620375051698632
0.345938020158598,0.22661250413039283
0.3457104445681964,0.22677600557574382
0.3456535506705985,0.22669425485309738
0.34536908118259907,0.22628550123969088
0.34536908118259907,0.2260402490716354
0.3455397628753977,0.2257132461809334
0.34559665677300067,0.2254679940128779
0.34559665677300067,0.22538624329023146
0.345938020158598,0.22407823172736555
0.345938020158598,0.223996481004661
0.3461655957489996,0.22358772739131264
0.34627938354420035,0.2225249679964441
0.34627938354420035,0.22244321727379768
0.3465069591345969,0.22211621438309573
0.34684832252019926,0.22195271293774474
0.3471327920081987,0.22195271293774474
0.34730347370099734,0.22211621438309573
0.3473603675986003,0.22219796510574216
0.34753104929139894,0.22236146655109315
0.3478724126770013,0.2222797158284467
0.34804309436979997,0.22236146655109315
0.34855513944820105,0.22277022016449965
0.3486120333457989,0.22277022016449965
0.34957922960499804,0.22317897377790613
0.34974991129780175,0.22342422594596165
0.34974991129780175,0.22342422594596165
0.3502619563762028,0.22342422594596165
0.3509446831474025,0.2237512288366636
0.35100157704500035,0.2237512288366636
0.35185498550899874,0.2237512288366636
0.35185498550899874,0.22358772739131264
0.3515136221234014,0.22326072450055257
0.3514567282257985,0.22326072450055257
0.35122915263540194,0.2229337216098506
0.35117225873779906,0.2222797158284467
0.35111536484020117,0.2220344636603912
0.3510584709426033,0.22195271293774474
0.3508308953522017,0.22195271293774474
0.3507740014545988,0.22178921149239375
0.3507171075570009,0.2216257100469847
0.3507171075570009,0.2213804578789873
0.35054642586420226,0.22129870715628275
0.35054642586420226,0.22088995354287627
0.35054642586420226,0.2208082028202298
0.3507171075570009,0.22023594776147234
0.35066021365940303,0.21950019125736392
0.3506033197618001,0.21941844053465936
0.35066021365940303,0.218028678249147
0.35066021365940303,0.21794692752644249
0.3507171075570009,0.21753817391309407
0.3509446831474025,0.21729292174503856
0.3508877892497996,0.2167206666862811
0.3509446831474025,0.2167206666862811
0.35100157704500035,0.21663891596363463
0.35100157704500035,0.2160666609048772
0.3508877892497996,0.2156579072914707
0.35043263806900143,0.2156579072914707
0.35037574417139855,0.21557615656876614
0.35031885027380066,0.21557615656876614
0.35043263806900143,0.21541265512341518
0.3507740014545988,0.2152491536780642
0.3509446831474025,0.21516740295541775
0.35128604653299983,0.21516740295541775
0.3515136221234014,0.2150039015100668
0.3515136221234014,0.21492215078736224
0.3517980916114009,0.21467689861930675
0.35231013668980193,0.2144316464513093
0.3524239244850027,0.21418639428325378
0.35265150007539925,0.21402289283790285
0.35265150007539925,0.21402289283790285
0.35293596956340373,0.21361413922449635
0.35293596956340373,0.2133688870564989
0.3530497573585995,0.2129601334430924
0.3530497573585995,0.2127148812750369
0.3530497573585995,0.21255137982968594
0.35322043905140316,0.21214262621627944
0.353334226846604,0.21197912477092845
0.35350490853940264,0.21197912477092845
0.3536755902322013,0.21214262621627944
0.35361869633460347,0.21255137982968594
0.35361869633460347,0.21263313055239044
0.35361869633460347,0.2128783827203879
0.3537893780274021,0.2133688870564989
0.3540169536178037,0.21345063777914536
0.3542445292082002,0.21304188416573885
0.35430142310580315,0.21304188416573885
0.35452899869620474,0.2128783827203879
0.35509793767220366,0.2128783827203879
0.3552686193650023,0.21304188416573885
0.35566687664820257,0.2131236348884434
0.35572377054580046,0.2131236348884434
0.356463391214603,0.21345063777914536
0.35691854239540116,0.21361413922449635
0.3569754362930041,0.21361413922449635
0.3584546776306043,0.21418639428325378
0.35856846542580506,0.21418639428325378
0.3589667227090053,0.21418639428325378
0.359649449480205,0.2139411421151983
0.3598770250706066,0.21402289283790285
0.3599339189682045,0.21402289283790285
0.36055975184180633,0.21418639428325378
0.3612993725106039,0.2137776406698473
0.3613562664082068,0.21369588994720085
0.36175452369140704,0.21345063777914536
0.3619252053842057,0.21353238850184988
0.36260793215540543,0.21320538561108984
0.36266482605300326,0.21320538561108984
0.3627786138482041,0.2131236348884434
0.3627217199506062,0.2133688870564989
0.36289240164340486,0.2133688870564989
0.3630630833362035,0.2133688870564989
0.36340444672180594,0.21304188416573885
0.36363202231220754,0.21279663199774146
0.36368891620980537,0.21279663199774146
0.3649974758546069,0.21189737404828202
0.36505436975220473,0.2118156233255775
0.3652250514450085,0.21157037115752197
0.36539573313780715,0.21157037115752197
0.3656802026258066,0.21173387260287296
0.3659077782162082,0.2118156233255775
0.3662491416018055,0.2114886204348755
0.3663629293970063,0.2114886204348755
0.3664767171922071,0.21116161754417356
0.36693186837300523,0.2105893624854161
0.3669887622706081,0.2103441103173606
0.367045656168206,0.21026235959465606
0.367045656168206,0.21018060887200962
0.3669887622706081,0.21009885814930507
0.36664739888500575,0.20944485236790117
0.3665905049874079,0.20969010453595668
0.3667611866802066,0.2099353567039541
0.36681808057780946,0.21001710742665863
0.3669887622706081,0.21009885814930507
0.3672163378610097,0.21009885814930507
0.3681835341202089,0.20969010453595668
0.36829732191540965,0.20960835381325216
0.3690369425842072,0.20936310164519664
0.36915073037940804,0.20919960019984568
0.3693214120722067,0.20919960019984568
0.3695489876626083,0.20919960019984568
0.3696058815602062,0.20919960019984568
0.36989035104821066,0.20919960019984568
0.3700610327410093,0.2086273451410882
0.3701179266386072,0.20887259730914373
0.3704592900242095,0.20854559441844175
0.3705161839218074,0.20854559441844175
0.3708575473074098,0.20838209297309077
0.37091444120500766,0.20821859152773978
0.3708575473074098,0.20805509008238882
0.37108512289781137,0.20772808719162877
0.3713126984882079,0.20756458574627779
0.37142648628340874,0.20756458574627779
0.3720523191570106,0.20699233068752032
0.3724505764402108,0.20682882924216933
0.3725643642354116,0.20666532779681837
0.3726212581330095,0.20666532779681837
0.3723936825426079,0.20666532779681837
0.3722798947474071,0.2067470785195229
0.3729626215186118,0.20601132201541444
0.3730195154162097,0.20601132201541444
0.3732470910066113,0.20584782057006348
0.3734746665970078,0.20552081767930344
0.3734746665970078,0.20535731623395245
0.3737591360850123,0.2050303133432505
0.3738160299826102,0.204785061175195
0.37387292388020804,0.20470331045254855
0.3740436055730118,0.20429455683914205
0.3744987567538099,0.2038040525030891
0.3747263323442115,0.20339529888968264
0.3747832262418094,0.20339529888968264
0.37512458962741174,0.20315004672162712
0.3752952713202104,0.20282304383092517
0.37575042250100854,0.20241429021751867
0.3758073163986114,0.2023325394948722
0.3758642102962093,0.20192378588146576
0.37569352860341065,0.20151503226805925
0.37512458962741174,0.2016785337134102
0.37512458962741174,0.2016785337134102
0.3743849689586091,0.20176028443611477
0.37398671167540887,0.2016785337134102
0.3737591360850123,0.20176028443611477
0.3737022421874094,0.20176028443611477
0.3734746665970078,0.20192378588146576
0.3729626215186118,0.2018420351588193
0.37290572762100893,0.2016785337134102
0.3729626215186118,0.20151503226805925
0.3729626215186118,0.20135153082270826
0.3729626215186118,0.20126978010006183
0.3730195154162097,0.20086102648665533
0.37313330321141047,0.20045227287324888
0.3730764093138076,0.20004351925984237
0.3730764093138076,0.19979826709184492
0.37313330321141047,0.19971651636914042
0.3735884543922086,0.19849025552897903
0.3735884543922086,0.19840850480627448
0.3737022421874094,0.19816325263827708
0.3735884543922086,0.197999751192868
0.3740436055730118,0.19742749613416863
0.37410049947060964,0.1971822439661131
0.37410049947060964,0.1971004932434086
0.37444186285621206,0.19595598312595175
0.37455565065141283,0.19571073095789623
0.3746125445490107,0.19562898023519168
0.37518148352500963,0.19432096867238385
0.37523837742261257,0.19423921794967933
0.3752952713202104,0.19391221505897738
0.37546595301300906,0.19391221505897738
0.37575042250100854,0.19358521216827543
0.37609178588661085,0.19317645855486892
0.37614867978420874,0.1930947078321644
0.37631936147701245,0.1929312063868134
0.3764900431698111,0.19260420349611146
0.3764331492722133,0.191868446992003
0.3764900431698111,0.19178669626929848
0.37683140655541353,0.19154144410130106
0.37683140655541353,0.19105093976519003
0.3767745126578106,0.19056043542913711
0.3767745126578106,0.19047868470649065
0.37688830045301136,0.19006993109308418
0.37688830045301136,0.1897429282023822
0.37683140655541353,0.1894976760343267
0.37694519435060925,0.18900717169827377
0.37694519435060925,0.18892542097556925
0.37694519435060925,0.18827141519416532
0.37683140655541353,0.18810791374881433
0.37683140655541353,0.18794441230340528
0.37705898214581,0.18761740941270333
0.37711587604341296,0.18753565869005687
0.37745723942901027,0.18622764712719098
0.37745723942901027,0.18614589640448642
0.37768481501941187,0.18581889351378447
0.37768481501941187,0.18557364134572896
0.37774170891700976,0.18581889351378447
0.37774170891700976,0.18516488773238055
0.37774170891700976,0.18508313700967605
0.37796928450741135,0.1843473805055676
0.3780261784050143,0.18377512544681013
0.3780830723026121,0.18369337472416367
0.3783106478930137,0.18336637183340362
0.3788795868690126,0.1831211196654062
0.37922095025460995,0.18279411677470425
0.3793347380498107,0.18271236605199973
0.37944852584501154,0.1824671138839442
0.37996057092341257,0.1818948588252448
0.3801312526162112,0.18148610521183833
0.38018814651381416,0.18132260376648734
0.3807001915922152,0.18042334581702793
0.3807570854898131,0.18001459220362143
0.3807570854898131,0.17993284148091693
0.38092776718261173,0.17952408786751042
0.38092776718261173,0.17870658064075554
0.38092776718261173,0.178624829918051
0.3808708732850139,0.17854307919540455
0.38092776718261173,0.17837957775005356
0.381326024465812,0.17829782702734906
0.38149670615861564,0.17813432558199807
0.3818949634418159,0.17813432558199807
0.38166738785141435,0.17797082413664708
0.38166738785141435,0.17788907341394256
0.38115534277301333,0.1764993111284302
0.38115534277301333,0.17641756040572568
0.38098466108021467,0.17617230823772823
0.38109844887541544,0.17600880679237726
0.3808708732850139,0.17568180390161722
0.3808708732850139,0.17551830245626623
0.3808708732850139,0.17510954884291785
0.3808708732850139,0.17502779812021332
0.38092776718261173,0.1747825459521578
0.38143981226101276,0.17470079522951135
0.38115534277301333,0.17453729378416036
0.3808708732850139,0.17453729378416036
0.38081397938741096,0.17453729378416036
0.3804726160018136,0.17421029089340032
0.3804157221042107,0.17404678944804935
0.3805295098994115,0.17388328800269837
0.3807001915922152,0.1739650387254029
0.38104155497781256,0.1737197865573474
0.38104155497781256,0.17363803583470094
0.3812691305682141,0.17339278366664546
0.38138291836341487,0.17347453438934998
0.38149670615861564,0.1733110329439409
0.38138291836341487,0.1724117749944815
0.38138291836341487,0.1724117749944815
0.3812691305682141,0.17167601849037303
0.38115534277301333,0.17151251704502207
0.3812122366706112,0.17077676054091362
0.3812122366706112,0.17069500981826716
0.38115534277301333,0.17020450548215615
0.38138291836341487,0.1698775025914542
0.3815536000562135,0.16979575186880774
0.3817811756466151,0.1698775025914542
0.38200875123701167,0.16979575186880774
0.3820656451346146,0.16971400114610322
0.3822932207250162,0.16963225042345675
0.3827483719058143,0.1693052475326967
0.3827483719058143,0.16914174608734575
0.3828621597010151,0.16889649391934833
0.3830897352914116,0.16873299247393925
0.38320352308661243,0.16873299247393925
0.3833173108818132,0.1685694910285883
0.3835448864722148,0.16816073741523987
0.3836017803698127,0.16799723596983082
0.3836017803698127,0.1675884823564824
0.3836017803698127,0.16750673163377788
0.3836017803698127,0.1671797287430759
0.3837724620626164,0.16693447657502042
0.3836586742674156,0.16677097512966943
0.3837724620626164,0.16660747368431844
0.3838862498578121,0.16644397223896745
0.3838862498578121,0.16619872007091196
0.3838862498578121,0.16611696934826553
0.3841707193458166,0.16578996645756355
0.3841707193458166,0.1656264650121545
0.3840569315506158,0.16513596067610156
0.3837724620626164,0.16497245923075057
0.38371556816501345,0.16497245923075057
0.3836017803698127,0.16472720706269506
0.38371556816501345,0.16464545634004862
0.3835448864722148,0.16407320128129116
0.38348799257461186,0.16366444766788468
0.38348799257461186,0.16358269694523822
0.38337420477941614,0.1633374447771827
0.383431098677014,0.16309219260912722
0.3838862498578121,0.1626834389957207
0.38400003765301294,0.16227468538237233
0.38400003765301294,0.16219293465966778
0.38394314375541505,0.1617841810462613
0.3838293559602143,0.1616206796009103
0.3837724620626164,0.16113017526485737
0.3836017803698127,0.16080317237415542
0.3836017803698127,0.1607214216514509
0.38326041698421537,0.15998566514734244
0.3828621597010151,0.1596586622566405
0.3827483719058143,0.1596586622566405
0.3824070085202119,0.15933165936593852
0.38223632682741326,0.1584324014164791
0.38223632682741326,0.15835065069377458
0.3821794329298154,0.15761489418966612
0.3822932207250162,0.15696088840826222
0.38235011462261403,0.1568791376855577
0.38257769021301563,0.15679738696291123
0.3827483719058143,0.15679738696291123
0.38291905359861295,0.15696088840826222
0.38303284139381377,0.1573696420216687
0.38337420477941614,0.15761489418966612
0.383431098677014,0.15761489418966612
0.3836586742674156,0.1577783956350171
0.3838293559602143,0.15769664491237068
0.3838862498578121,0.1573696420216687
0.3838293559602143,0.15720614057625965
0.38371556816501345,0.15671563624020668
0.38371556816501345,0.15663388551756025
0.3836586742674156,0.15540762467734082
0.3838862498578121,0.15532587395469435
0.38394314375541505,0.15532587395469435
0.38485344611701633,0.15597987973609825
0.3849672339122171,0.15622513190415377
0.3849672339122171,0.1563068826268002
0.38513791560501576,0.15655213479485572
0.3852517034002166,0.15638863334950476
0.3853085972978144,0.15606163045880278
0.385536172888216,0.15606163045880278
0.3858775362738133,0.1563068826268002
0.38593443017141627,0.15638863334950476
0.38656026304501306,0.15704263913090866
0.38678783863541466,0.15745139274431513
0.38684473253301754,0.1575331434670197
0.3870723081234141,0.15810539852571906
0.3871860959186149,0.1584324014164791
0.3875274593042172,0.15875940430718105
0.3875843532018151,0.15875940430718105
0.3878119287922167,0.15892290575253204
0.3886653372562151,0.1596586622566405
0.388722231153818,0.1596586622566405
0.3895756396178164,0.16047616948345347
0.38968942741301715,0.16063967092880443
0.38974632131061504,0.1607214216514509
0.39025836638901606,0.16129367671020836
0.3904290480818147,0.1613754274329129
0.390827305365015,0.16129367671020836
0.39094109316021575,0.16129367671020836
0.39116866875061734,0.16129367671020836
0.39139624434101894,0.16145717815555932
0.3915669260338176,0.16145717815555932
0.3918513955218171,0.16129367671020836
0.39202207721461574,0.16129367671020836
0.39202207721461574,0.16113017526485737
0.39190828941942,0.16104842454215285
0.3918513955218171,0.16104842454215285
0.3914531382386168,0.1607214216514509
0.39116866875061734,0.16023091731539796
0.3909979870578187,0.16023091731539796
0.3907704114674171,0.16014916659269343
0.3907135175698192,0.16006741587004697
0.3905428358770155,0.15982216370199148
0.39059972977461843,0.15957691153393594
0.39031526028661895,0.1588411550298275
0.39031526028661895,0.15875940430718105
0.3901445785938153,0.15835065069377458
0.3900876846962174,0.1579418970803681
0.3901445785938153,0.1577783956350171
0.39037215418421684,0.1577783956350171
0.39059972977461843,0.1580236478030726
0.3906566236722163,0.1580236478030726
0.3909979870578187,0.15835065069377458
0.3915669260338176,0.1584324014164791
0.39196518331701785,0.15859590286183006
0.39202207721461574,0.15859590286183006
0.39270480398582047,0.15875940430718105
0.39276169788341836,0.15851415213912556
0.39224965280501733,0.15810539852571906
0.39224965280501733,0.15810539852571906
0.3920789711122187,0.15786014635772164
0.39219275890741945,0.15769664491237068
0.3923634406002181,0.15761489418966612
0.39270480398582047,0.1579418970803681
0.39315995516661856,0.15810539852571906
0.39321684906421644,0.15810539852571906
0.3932737429618194,0.15810539852571906
0.3933306368594172,0.1579418970803681
0.39315995516661856,0.15769664491237068
0.3931030612690207,0.1571243898536132
0.3933306368594172,0.1571243898536132
0.39338753075702015,0.15720614057625965
0.3938426819378183,0.1575331434670197
0.39395646973301907,0.1571243898536132
0.3938995758354161,0.15696088840826222
0.39395646973301907,0.15671563624020668
0.39395646973301907,0.15663388551756025
0.39401336363061695,0.15622513190415377
0.39395646973301907,0.15606163045880278
0.3936151063474167,0.15532587395469435
0.3936151063474167,0.15532587395469435
0.39321684906421644,0.1545901174505859
0.39287548567861913,0.15434486528253039
0.392932379576217,0.1541813638371794
0.392932379576217,0.1540996131144749
0.392932379576217,0.1541813638371794
0.39287548567861913,0.1540996131144749
0.3926479100882176,0.15385436094647748
0.39253412229301676,0.15344560733307094
0.39224965280501733,0.15287335227431348
0.39219275890741945,0.15287335227431348
0.3921358650098165,0.152464598660907
0.39202207721461574,0.15189234360214954
0.3917945016242192,0.15148358998880113
0.3917945016242192,0.1514018392660966
0.3915669260338176,0.15099308565269012
0.39151003213621977,0.15042083059393266
0.3916807138290184,0.15042083059393266
0.39196518331701785,0.15042083059393266
0.39202207721461574,0.15050258131663719
0.39276169788341836,0.1507478334846927
0.39281859178101625,0.15091133493004366
0.39281859178101625,0.15066608276198817
0.39270480398582047,0.15042083059393266
0.39270480398582047,0.15042083059393266
0.39247722839541893,0.14976682481252873
0.392420334497816,0.14960332336717774
0.3923634406002181,0.14919456975377127
0.3923065467026203,0.14894931758577384
0.39224965280501733,0.14894931758577384
0.3917945016242192,0.1482135610816654
0.3916807138290184,0.14764130602290793
0.3916807138290184,0.1475595553002034
0.3915669260338176,0.14739605385485244
0.3915669260338176,0.14723255240950145
0.39139624434101894,0.1469055495187995
0.39139624434101894,0.14674204807344854
0.3915669260338176,0.14657854662803946
0.39173760772661625,0.14682379879609497
0.39173760772661625,0.14682379879609497
0.392932379576217,0.14764130602290793
0.3929892734738199,0.1475595553002034
0.3930461673714178,0.1475595553002034
0.39281859178101625,0.14723255240950145
0.39276169788341836,0.14666029735074398
0.39287548567861913,0.14625154373733748
0.39281859178101625,0.14616979301469105
0.39276169788341836,0.14592454084663553
0.39270480398582047,0.14551578723322905
0.39281859178101625,0.14469828000647417
0.39281859178101625,0.1446165292837696
0.39281859178101625,0.14420777567036314
0.3929892734738199,0.14379902205701472
0.3933306368594172,0.14322676699825726
0.3933306368594172,0.14322676699825726
0.3935582124498188,0.14306326555290627
0.3936151063474167,0.14281801338485078
0.3937857880402204,0.14273626266214623
0.39418404532342066,0.14208225688074233
0.39424093922101855,0.14208225688074233
0.39446851481142015,0.14175525399004038
0.39446851481142015,0.14191875543539134
0.3942978331186164,0.1420005061580959
0.39424093922101855,0.1426545119394998
0.39418404532342066,0.14273626266214623
0.3943547270162193,0.1431450162755527
0.3944116209138172,0.1437172713343102
0.3946391965042188,0.1441260249477167
0.3946391965042188,0.14420777567036314
0.39469609040181663,0.14445302783841862
0.39480987819701746,0.1446165292837696
0.39498055988982117,0.14486178145182513
0.3951512415826198,0.1449435321744716
0.3953219232754185,0.1447800307291206
0.3953788171730214,0.14453477856112318
0.3953219232754185,0.14445302783841862
0.3951512415826198,0.14404427422501215
0.3952081354802177,0.14379902205701472
0.3953219232754185,0.14355376988895924
0.3954357110706193,0.1431450162755527
0.3954357110706193,0.14306326555290627
0.39572018055861874,0.14298151483020174
0.396118437841819,0.1424910104941488
0.39645980122742136,0.14298151483020174
0.39645980122742136,0.14298151483020174
0.39668737681781785,0.1431450162755527
0.39691495240821945,0.1431450162755527
0.39697184630581733,0.14355376988895924
0.39702874020342027,0.1437172713343102
0.39719942189621893,0.14388077277966116
0.3974269974866205,0.14388077277966116
0.3974838913842184,0.14388077277966116
0.3981666181554181,0.14404427422501215
0.39873555713142206,0.14404427422501215
0.3989062388242207,0.14428952639306766
0.3989062388242207,0.1443712771157722
0.3989631327218186,0.14445302783841862
0.39919070831222014,0.14445302783841862
0.39919070831222014,0.1447800307291206
0.3990200266194215,0.14486178145182513
0.39856487543861835,0.14453477856112318
0.39850798154102046,0.14445302783841862
0.3981097242578202,0.1441260249477167
0.39793904256502155,0.1441260249477167
0.39776836087221784,0.14420777567036314
0.3975407852818213,0.1441260249477167
0.3973132096914197,0.14379902205701472
0.39725631579382187,0.1437172713343102
0.39719942189621893,0.14347201916625468
0.39668737681781785,0.14322676699825726
0.39663048292022,0.14306326555290627
0.39668737681781785,0.14281801338485078
0.39663048292022,0.14257276121679527
0.39657358902262213,0.1424910104941488
0.3964029073298184,0.14232750904879785
0.3964029073298184,0.14191875543539134
0.39634601343222053,0.14175525399004038
0.39645980122742136,0.1411012482085784
0.39645980122742136,0.1411012482085784
0.3965166951250192,0.14085599604058097
0.39645980122742136,0.14044724242717446
0.39657358902262213,0.1401202395364725
0.39691495240821945,0.13979323664577056
0.39691495240821945,0.13979323664577056
0.39719942189621893,0.13938448303236406
0.3976545730770221,0.13897572941895758
0.3976545730770221,0.13873047725090204
0.3975407852818213,0.13848522508290464
0.3975407852818213,0.13840347436020012
0.3973701035890176,0.13840347436020012
0.3970856341010181,0.13889397869625303
0.39657358902262213,0.13922098158701307
0.39645980122742136,0.13922098158701307
0.39572018055861874,0.1393027323096595
0.3950943476850169,0.13938448303236406
0.39503745378741906,0.1394662337550105
0.3945823026066209,0.139874987368417
0.3943547270162193,0.13954798447771505
0.3942978331186164,0.1393027323096595
0.3942978331186164,0.1390574801416621
0.3942978331186164,0.1390574801416621
0.3943547270162193,0.1386487265282556
0.39424093922101855,0.13848522508290464
0.39424093922101855,0.13832172363755368
0.394525408709018,0.1377494685787962
0.394525408709018,0.1377494685787962
0.39498055988982117,0.1377494685787962
0.39526502937782065,0.1373407149653897
0.3954357110706193,0.1369319613519832
0.3954357110706193,0.1369319613519832
0.3957770744562216,0.13660495846128126
0.3957770744562216,0.13635970629322575
0.39572018055861874,0.13578745123446828
0.3959477561490203,0.1356239497891173
0.3959477561490203,0.1356239497891173
0.39623222563701976,0.1352151961757689
0.39634601343222053,0.1348064425623624
0.3968011646130187,0.13439768894895593
0.3968011646130187,0.13439768894895593
0.39719942189621893,0.13374368316755203
0.3974269974866205,0.13317142810879457
0.3974269974866205,0.13308967738609
0.3975407852818213,0.13292617594073902
0.3974269974866205,0.1326809237726835
0.39776836087221784,0.13219041943663057
0.39771146697461995,0.13169991510057766
0.39776836087221784,0.1316181643778731
0.39799593646261944,0.1311276600418202
0.3981666181554181,0.13039190353771174
0.39822351205302103,0.13031015281500719
0.39822351205302103,0.1300649006470098
0.3981666181554181,0.12916564269755038
0.39799593646261944,0.1290021412521994
0.39793904256502155,0.12892039052949483
0.3976545730770221,0.12802113258003545
0.3974269974866205,0.12769412968933347
0.3973701035890176,0.12769412968933347
0.39691495240821945,0.12753062824398248
0.3968580585106216,0.12736712679857343
0.39657358902262213,0.12663137029446497
0.39657358902262213,0.12654961957181854
0.39645980122742136,0.12630436740376302
0.39634601343222053,0.12614086595841206
0.39623222563701976,0.12556861089965457
0.39628911953461765,0.12532335873165715
0.39628911953461765,0.12524160800895262
0.39634601343222053,0.1245876022275487
0.39628911953461765,0.12417884861414222
0.39634601343222053,0.1239335964460867
0.39634601343222053,0.1239335964460867
0.39657358902262213,0.12319783994197826
0.39691495240821945,0.12270733560592534
0.39697184630581733,0.1226255848832208
0.39714252799862104,0.12238033271522336
0.39776836087221784,0.12164457621111494
0.3978252547698208,0.1215628254884104
0.3981097242578202,0.12123582259770845
0.3982804059506189,0.12099057042965293
0.39856487543861835,0.12082706898430196
0.39873555713142206,0.12058181681630452
0.39879245102901995,0.12050006609359999
0.3989062388242207,0.12033656464824902
0.39919070831222014,0.11968255886678701
0.39941828390262174,0.11935555597608506
0.39941828390262174,0.11927380525343861
0.3995889655954204,0.1190285530853831
0.3995320716978225,0.11927380525343861
0.3993613900050188,0.11911030380808764
0.39941828390262174,0.11894680236267857
0.39919070831222014,0.11861979947197661
0.39913381441462226,0.11861979947197661
0.39884934492662283,0.11829279658127466
0.39862176933622123,0.11829279658127466
0.39822351205302103,0.11804754441321914
0.3980528303602224,0.11821104585857013
0.3981097242578202,0.11845629802662563
0.3981097242578202,0.11845629802662563
0.39799593646261944,0.11829279658127466
0.3976545730770221,0.11804754441321914
0.3973701035890176,0.1177205415225172
0.39719942189621893,0.1177205415225172
0.39702874020342027,0.11747528935451976
0.39697184630581733,0.11747528935451976
0.39691495240821945,0.11755704007716622
0.39691495240821945,0.11698478501840874
0.39668737681781785,0.11665778212770678
0.3965166951250192,0.11673953285041132
0.3965166951250192,0.11698478501840874
0.39645980122742136,0.11706653574111328
0.3958908622514174,0.11739353863181523
0.3957770744562216,0.11731178790911069
0.3958908622514174,0.11698478501840874
0.3958908622514174,0.11673953285041132
0.3958908622514174,0.11665778212770678
0.3958339683538195,0.1162490285143003
0.3958908622514174,0.11608552706894933
0.3958339683538195,0.11584027490089381
0.3957770744562216,0.11526801984219442
0.3958339683538195,0.1151862691194899
0.3961753317394219,0.11445051261538144
0.3958339683538195,0.11428701117003047
0.39566328666102085,0.11445051261538144
0.39566328666102085,0.11445051261538144
0.39572018055861874,0.11428701117003047
0.39566328666102085,0.11404175900197497
0.39526502937782065,0.1141235097246795
0.3952081354802177,0.11387825755662398
0.3953788171730214,0.11379650683397755
0.39549260496821714,0.11355125466592203
0.39549260496821714,0.11355125466592203
0.39572018055861874,0.11330600249786651
0.39572018055861874,0.11306075032986909
0.3960615439442211,0.11232499382576065
0.3960615439442211,0.11232499382576065
0.39645980122742136,0.11158923732165221
0.39657358902262213,0.11093523154019021
0.39657358902262213,0.11085348081754376
0.39663048292022,0.1102812257587863
0.39657358902262213,0.11011772431343532
0.3965166951250192,0.10954546925467784
0.3965166951250192,0.10946371853197331
0.39645980122742136,0.10913671564127135
0.3965166951250192,0.10864621130521843
0.39657358902262213,0.1081557069691074
0.3965166951250192,0.10807395624646095
0.3965166951250192,0.10791045480110997
0.39657358902262213,0.10750170118770348
0.39634601343222053,0.10717469829700153
0.39645980122742136,0.10676594468359504
0.3965166951250192,0.1066841939608905
0.3967442707154208,0.10635719107018855
0.3970856341010181,0.10619368962483756
0.3973132096914197,0.10553968384343367
0.3973132096914197,0.10553968384343367
0.3976545730770221,0.1049674287846762
0.3976545730770221,0.10423167228056776
0.3976545730770221,0.10423167228056776
0.3976545730770221,0.10365941722181028
0.39776836087221784,0.10382291866716126
0.39771146697461995,0.10325066360840379
0.39771146697461995,0.10316891288575734
0.3976545730770221,0.10276015927235085
0.39771146697461995,0.10259665782699989
0.39793904256502155,0.10251490710429535
0.3981097242578202,0.10186090132289144
0.3981097242578202,0.10177915060018691
0.3981097242578202,0.1013703969868385
0.3983372998482218,0.10145214770948494
0.3983941937458197,0.10120689554142943
0.39879245102901995,0.1007163912053765
0.39879245102901995,0.1007163912053765
0.3981666181554181,0.10063464048273005
0.3982804059506189,0.100471139037321
0.39850798154102046,0.100471139037321
0.39850798154102046,0.10030763759197
0.39873555713142206,0.10030763759197
0.39873555713142206,0.10038938831467455
0.3989631327218186,0.10030763759197
0.3990200266194215,0.10014413614661903
0.39913381441462226,0.09998063470126806
0.39919070831222014,0.09957188108786157
0.3994751778002196,0.0992448781971596
0.3994751778002196,0.0992448781971596
0.39964585949302334,0.09908137675180864
0.39964585949302334,0.09875437386110666
0.3998734350834199,0.09875437386110666
0.4000441167762236,0.09891787530645765
0.40021479846902225,0.09883612458375313
0.4003285862642231,0.0985908724157557
0.4003285862642231,0.0985908724157557
0.40049926795702173,0.09826386952499566
0.40084063134261905,0.09777336518894272
0.4012388886258193,0.0975281130209453
0.4012957825234222,0.0975281130209453
0.40135267642102007,0.09744636229824077
0.401409570318623,0.09728286085288979
0.4012388886258193,0.09720111013018526
0.4012388886258193,0.09695585796218784
0.40135267642102007,0.09679235651683685
0.40169403980662244,0.0966288550714278
0.40192161539702403,0.09671060579413232
0.40197850929462187,0.09671060579413232
0.40220608488502346,0.09654710434878135
0.4023198726802243,0.09638360290343036
0.4023198726802243,0.09605660001272841
0.40249055437302295,0.0954025942312664
0.40249055437302295,0.09532084350861997
0.4025474482706208,0.09507559134056445
0.4027750238610224,0.09474858844986249
0.4027750238610224,0.09442158555910245
0.40300259945142397,0.09409458266840048
0.40305949334902186,0.09409458266840048
0.40328706893942345,0.09393108122304952
0.40351464452982505,0.09344057688699658
0.40351464452982505,0.0932770754416456
0.4036853262226237,0.09311357399629462
0.40385600791542237,0.09295007255094365
0.4039129018130202,0.09286832182823912
0.4042542651986226,0.09245956821483262
0.4050507797650231,0.09213256532413067
0.4051076736626209,0.09205081460142614
0.40539214315062544,0.09196906387877968
0.4065869150002262,0.09213256532413067
0.4066438088978241,0.09221431604683519
0.4069282783858235,0.09221431604683519
0.4072696417714259,0.09213256532413067
0.4072696417714259,0.09188731315607515
0.40738342956662166,0.09172381171072418
0.40772479295222397,0.0915603102653732
0.4078385807474248,0.0915603102653732
0.40829373192822294,0.09131505809731769
0.4083506258258258,0.0911515566519667
0.4086919892114232,0.09090630448396929
0.40880577700662396,0.09074280303861831
0.4088626709042269,0.09066105231591379
0.4094316098802258,0.09041580014785826
0.4097160793682253,0.09008879725715631
0.4100574427538276,0.08976179436645436
0.4101143366514255,0.08976179436645436
0.4107970634226252,0.0894347914757524
0.4112522146034233,0.08902603786234592
0.4112522146034233,0.08894428713964138
0.41165047188662357,0.08853553352629298
0.412503880350627,0.08837203208094199
0.41256077424822485,0.08829028135823747
0.41278834983862644,0.08820853063553294
0.4132435010194246,0.08820853063553294
0.41335728881462536,0.08804502919018195
0.41352797050742907,0.0879632784675355
0.4136986522002277,0.08804502919018195
0.4138693338930264,0.08788152774483098
0.4138693338930264,0.08788152774483098
0.4136986522002277,0.08771802629948
0.4138124399954285,0.08755452485412901
0.41375554609782556,0.08739102340877804
0.4144382728690253,0.08698226979537155
0.4144382728690253,0.08698226979537155
0.41432448507382447,0.08673701762731603
0.41449516676662823,0.0866552669046696
0.4148934240498285,0.0866552669046696
0.4154054691282295,0.08632826401396765
0.4154623630258274,0.08632826401396765
0.4159744081042284,0.08600126112326567
0.416714028773026,0.08583775967785662
0.4167709226706289,0.08583775967785662
0.41716917995382913,0.0855925075098592
0.4177381189298281,0.08493850172839719
0.4180225884178275,0.08485675100575074
0.41807948231543046,0.08485675100575074
0.4189328907794288,0.08485675100575074
0.41910357247222746,0.08477500028304621
0.4193880419602269,0.08436624666963971
0.4194449358578298,0.08436624666963971
0.42001387483382874,0.0841209945016423
0.42035523821943116,0.08395749305629133
0.42081038940022925,0.08403924377893776
0.4208672832978322,0.08403924377893776
0.42137932837622816,0.0838757423335868
0.4217206917618305,0.08354873944288482
0.4221189490450308,0.0834669887201803
0.42228963073782944,0.08330348727482932
0.42228963073782944,0.08330348727482932
0.4224603124306281,0.08313998582947835
0.42285856971382835,0.08305823510683188
0.42302925140663206,0.08297648438412736
0.42365508428022886,0.08281298293877638
0.42359819038263097,0.08281298293877638
0.4240533415634291,0.08273123221607186
0.4242240232562328,0.08232247860272346
0.4243947049490315,0.08224072788001892
0.4247929622322317,0.08215897715731438
0.4247929622322317,0.08215897715731438
0.4253619012082306,0.08199547571196342
0.42530500731063275,0.081750223543966
0.425703264593833,0.08134146993055949
0.425703264593833,0.08125971920785496
0.42587394628663167,0.08134146993055949
0.4260446279794303,0.08142322065326403
0.4264428852626306,0.08134146993055949
0.42706871813623243,0.08134146993055949
0.4271825059314332,0.08134146993055949
0.42860485337143045,0.08117796848520853
0.42860485337143045,0.08109621776250399
0.428889322859435,0.08109621776250399
0.4287755350642342,0.08125971920785496
0.42934447404023307,0.08109621776250399
0.4292306862450323,0.08093271631715301
0.42900311065463076,0.08085096559450657
0.42900311065463076,0.08076921487180203
0.4284341716786318,0.08076921487180203
0.4277514449074321,0.08044221198110008
0.42763765711223134,0.08044221198110008
0.4272393998290311,0.08036046125839555
0.4276945510098342,0.08019695981304456
0.4280928082930345,0.0802787105357491
0.42814970219063236,0.08036046125839555
0.42814970219063236,0.08052396270374652
0.428320383883431,0.08060571342645105
0.4288324289618321,0.08068746414915559
0.4287186411666312,0.08052396270374652
0.42894621675703287,0.08052396270374652
0.42900311065463076,0.08060571342645105
0.4292306862450323,0.08076921487180203
0.4296289435282326,0.08076921487180203
0.4299703069138349,0.08093271631715301
0.4300272008114328,0.08076921487180203
0.43019788250423147,0.08068746414915559
0.43019788250423147,0.08068746414915559
0.43042545809463306,0.08060571342645105
0.4309943970706319,0.08085096559450657
0.4311650787634357,0.08068746414915559
0.4311650787634357,0.0802787105357491
0.4311650787634357,0.0802787105357491
0.43173401773943454,0.08011520909039813
0.4319615933298362,0.08003345836769359
0.43207538112503185,0.08019695981304456
0.4319615933298362,0.08036046125839555
0.4319615933298362,0.08052396270374652
0.4320184872274341,0.08060571342645105
0.43213227502263485,0.08060571342645105
0.4323029567154335,0.08076921487180203
0.4332132590770348,0.08085096559450657
0.4334408346674364,0.08101446703985754
0.4334977285650342,0.08101446703985754
0.4337821980530337,0.08109621776250399
0.4340666675410331,0.08134146993055949
0.4345218187218363,0.08199547571196342
0.4345218187218363,0.08199547571196342
0.4346356065170371,0.08215897715731438
0.43480628820983575,0.08232247860272346
0.4350338638002374,0.08264948149342541
0.43554590887863337,0.08305823510683188
0.43560280277623625,0.08313998582947835
0.43594416616183357,0.08363049016553128
0.43628552954743594,0.0838757423335868
0.43656999903543536,0.08420274522428875
0.43662689293303836,0.08420274522428875
0.436797574625837,0.08436624666963971
0.43702515021623856,0.08436624666963971
0.43713893801143433,0.08452974811504879
0.4372527258066351,0.08502025245110173
0.43736651360183587,0.08526550461915723
0.43736651360183587,0.08534725534180368
0.4375940891922375,0.08534725534180368
0.4381630281682364,0.08485675100575074
0.43833370986103504,0.08493850172839719
0.43839060375863803,0.08518375389645269
0.43839060375863803,0.08518375389645269
0.4385043915538388,0.08567425823250563
0.4384474976562359,0.08583775967785662
0.4385043915538388,0.08624651329126311
0.43839060375863803,0.0866552669046696
0.43839060375863803,0.08673701762731603
0.4384474976562359,0.08698226979537155
0.43878886104183823,0.08706402051807607
0.43913022442743554,0.08681876835002057
0.43930090612023925,0.08690051907272511
0.4394715878130379,0.0866552669046696
0.4394715878130379,0.08657351618196506
0.43964226950583657,0.08641001473661408
0.4398698450962382,0.08641001473661408
0.4398129511986352,0.08714577124072254
0.4398698450962382,0.08739102340877804
0.4398698450962382,0.08739102340877804
0.4398698450962382,0.08763627557683355
0.439926738993836,0.08779977702218453
0.439983632891439,0.08812677991288648
0.4403249962770363,0.08861728424893942
0.4403818901746392,0.08869903497164394
0.44066635966263873,0.08869903497164394
0.4404387840722371,0.08820853063553294
0.4404387840722371,0.0879632784675355
0.44055257186743785,0.08755452485412901
0.44055257186743785,0.08755452485412901
0.4408370413554374,0.08690051907272511
0.4408370413554374,0.08649176545931861
0.4407801474578395,0.08608301184591213
0.4407801474578395,0.08608301184591213
0.4408370413554374,0.08591951040056114
0.4410646169458389,0.08583775967785662
0.44095082915063816,0.08575600895521017
0.44100772304823604,0.08551075678715467
0.4411215108434368,0.08518375389645269
0.4412921925362405,0.08493850172839719
0.4412921925362405,0.08493850172839719
0.441519768126637,0.08452974811504879
0.4411784047410397,0.08379399161094034
0.4411784047410397,0.08354873944288482
0.4411215108434368,0.0834669887201803
0.44095082915063816,0.08313998582947835
0.44095082915063816,0.08297648438412736
0.4410646169458389,0.08281298293877638
0.4411784047410397,0.08215897715731438
0.4412352986386376,0.08215897715731438
0.441519768126637,0.081586722098615
0.44157666202423995,0.08101446703985754
0.441519768126637,0.08076921487180203
0.441519768126637,0.08076921487180203
0.4417473437170386,0.08068746414915559
0.4419180254098373,0.08125971920785496
0.44214560100023886,0.08166847282126145
0.44214560100023886,0.08191372498931696
0.44214560100023886,0.08199547571196342
0.4422593887954397,0.0824042293253699
0.44288522166903643,0.08313998582947835
0.4429421155666393,0.08322173655218287
0.44322658505463886,0.08354873944288482
0.4434541606450404,0.0834669887201803
0.4435110545426383,0.08371224088823581
0.4433403728498396,0.08379399161094034
0.44322658505463886,0.08395749305629133
0.44316969115704097,0.08420274522428875
0.44322658505463886,0.08420274522428875
0.44362484233783905,0.08477500028304621
0.4437386301330398,0.08469324956039978
0.4437386301330398,0.08420274522428875
0.4437386301330398,0.0841209945016423
0.4437955240306377,0.08354873944288482
0.44368173623543694,0.08273123221607186
0.44368173623543694,0.08264948149342541
0.44362484233783905,0.08166847282126145
0.44368173623543694,0.08150497137591048
0.4439093118258385,0.081586722098615
0.4439662057234415,0.08166847282126145
0.4445920385970382,0.0824042293253699
0.44476272028984193,0.08289473366142283
0.44476272028984193,0.08297648438412736
0.4449334019826406,0.08338523799753386
0.44504718977784136,0.0834669887201803
0.44510408367543924,0.08363049016553128
0.44521787147064,0.08379399161094034
0.4451609775730421,0.08420274522428875
0.44521787147064,0.08428449594699328
0.4452747653682379,0.08452974811504879
0.4451609775730421,0.08469324956039978
0.4451609775730421,0.08485675100575074
0.4452747653682379,0.0855925075098592
0.4452747653682379,0.08567425823250563
0.4453316592658408,0.08649176545931861
0.44538855316343867,0.08673701762731603
0.44544544706104167,0.08690051907272511
0.4456161287538403,0.08706402051807607
0.4456730226514382,0.08698226979537155
0.4456730226514382,0.08690051907272511
0.4456730226514382,0.08641001473661408
0.4460143860370405,0.08575600895521017
0.4460712799346384,0.08551075678715467
0.4461281738322413,0.0854290060645082
0.44641264332024083,0.08510200317374816
0.4466402189106424,0.08502025245110173
0.4469815822962397,0.08444799739234425
0.4469815822962397,0.08436624666963971
0.4469815822962397,0.0841209945016423
0.4470384761938426,0.08395749305629133
0.4470384761938426,0.0834669887201803
0.4469815822962397,0.08322173655218287
0.4470384761938426,0.08297648438412736
0.4470384761938426,0.08297648438412736
0.4472660517842392,0.08264948149342541
0.4473229456818421,0.08232247860272346
0.44755052127223865,0.081750223543966
0.44760741516984154,0.08166847282126145
0.44755052127223865,0.08109621776250399
0.44692468839864186,0.08060571342645105
0.4468677945010389,0.08052396270374652
0.4466402189106424,0.0802787105357491
0.4464695372178387,0.07986995692234261
0.4465264311154416,0.07970645547699162
0.4464695372178387,0.07954295403164066
0.4465264311154416,0.07905244969552963
0.4465833250130395,0.07897069897288318
0.4466402189106424,0.07880719752753221
0.44669711280824026,0.07839844391412572
0.44681090060344103,0.07823494246877474
0.44692468839864186,0.07766268741001728
0.44692468839864186,0.07758093668737082
0.4470384761938426,0.07717218307396434
0.4469815822962397,0.07692693090590882
0.44720915788664134,0.07692693090590882
0.44755052127223865,0.07643642656985589
0.44760741516984154,0.07635467584715136
0.447891884657841,0.07586417151109842
0.4482901419410412,0.07545541789769195
0.448403929736242,0.07529191645234096
0.4484608236338399,0.07521016572963643
0.44868839922424153,0.07463791067093704
0.4488590809170402,0.0739021541668286
0.4488590809170402,0.07382040344412406
0.44897286871224096,0.07275764404931367
0.44908665650744173,0.07234889043590717
0.4491435504050396,0.07226713971326074
0.4492004443026425,0.07210363826785166
0.44902976260983885,0.07202188754520522
0.44902976260983885,0.07267589332660913
0.44908665650744173,0.07308464694001562
0.44908665650744173,0.07316639766272015
0.4491435504050396,0.07357515127606856
0.44902976260983885,0.07414740633482603
0.44902976260983885,0.0745561599482325
0.44902976260983885,0.0745561599482325
0.4492573382002404,0.07463791067093704
0.4493142320978434,0.07529191645234096
0.4492573382002404,0.07545541789769195
0.44942801989303904,0.07570067006574745
0.44942801989303904,0.07570067006574745
0.4496555954834407,0.07570067006574745
0.44988317107384224,0.07651817729250233
0.45011074666424383,0.07643642656985589
0.45022453445943955,0.07668167873785331
0.4502814283570425,0.07676342946055784
0.45045211004984115,0.07692693090590882
0.4506227917426398,0.07741743524196176
0.4509641551282421,0.07798969030071923
0.45102104902584006,0.07798969030071923
0.45119173071864377,0.07823494246877474
0.4513624124114424,0.07880719752753221
0.45170377579704485,0.07937945258628967
0.4517606696946426,0.07946120330893612
0.4523296086706416,0.08036046125839555
0.45244339646584236,0.08076921487180203
0.45244339646584236,0.08085096559450657
0.45250029036344025,0.08093271631715301
0.45289854764664045,0.08101446703985754
0.4530692293394442,0.08117796848520853
0.453183017134645,0.08134146993055949
0.45329680492984076,0.08199547571196342
0.45335369882744364,0.08199547571196342
0.45341059272504153,0.08248598004807443
0.4535243805202423,0.08281298293877638
0.4535243805202423,0.0834669887201803
0.45358127441784524,0.0834669887201803
0.4536381683154431,0.08371224088823581
0.4537519561106439,0.08428449594699328
0.4536381683154431,0.08444799739234425
0.4537519561106439,0.08493850172839719
0.4538088500082418,0.08493850172839719
0.45386574390584467,0.08518375389645269
0.4537519561106439,0.08551075678715467
0.4537519561106439,0.08567425823250563
0.4540933194962412,0.08616476256861666
0.4541502133938441,0.08616476256861666
0.45392263780344255,0.08616476256861666
0.45392263780344255,0.08632826401396765
0.454207107291442,0.08657351618196506
0.454207107291442,0.08690051907272511
0.45437778898424575,0.08714577124072254
0.45437778898424575,0.08714577124072254
0.45432089508664275,0.08739102340877804
0.4546622584722452,0.08755452485412901
0.45477604626744594,0.0879632784675355
0.45483294016504383,0.08812677991288648
0.45471915236984306,0.08829028135823747
0.45477604626744594,0.08837203208094199
0.45477604626744594,0.08837203208094199
0.4549467279602446,0.08918953930769688
0.4550036218578425,0.08935304075304787
0.45483294016504383,0.08976179436645436
0.45483294016504383,0.0898435450891589
0.45477604626744594,0.08992529581180533
0.4549467279602446,0.08992529581180533
0.4550036218578425,0.09033404942521181
0.45517430355064625,0.09057930159320925
0.45523119744824414,0.09106980592932026
0.45523119744824414,0.09106980592932026
0.4554018791410428,0.09090630448396929
0.4554018791410428,0.09074280303861831
0.45551566693624357,0.09106980592932026
0.45551566693624357,0.09139680882002223
0.4557432425266451,0.09139680882002223
0.455800136424243,0.09139680882002223
0.45585703032184594,0.09139680882002223
0.45562945473144434,0.09139680882002223
0.455800136424243,0.09180556243342872
0.4559139242194438,0.09196906387877968
0.4560846059122425,0.09229606676948166
0.4560846059122425,0.09245956821483262
0.4560277120146446,0.09254131893753716
0.45597081811704165,0.09278657110553458
0.4560846059122425,0.09295007255094365
0.45614149980984536,0.09311357399629462
0.4562552876050462,0.0930318232735901
0.45648286319544273,0.09319532471894107
0.45642596929784485,0.09352232760964302
0.45642596929784485,0.09360407833234756
0.45642596929784485,0.09393108122304952
0.4560846059122425,0.09417633339110502
0.4562552876050462,0.09409458266840048
0.45642596929784485,0.09417633339110502
0.45642596929784485,0.09458508700451151
0.45648286319544273,0.09466683772715795
0.4565966509906435,0.09499384061785993
0.4565966509906435,0.09532084350861997
0.45676733268344216,0.09564784639932192
0.4568242265810451,0.09597484929002387
0.4568242265810451,0.09605660001272841
0.456881120478643,0.09630185218072582
0.45705180217144664,0.0964653536260768
0.45705180217144664,0.0966288550714278
0.45745005945464695,0.09679235651683685
0.4576776350450435,0.09720111013018526
0.4576776350450435,0.09728286085288979
0.4577345289426464,0.0975281130209453
0.45790521063544504,0.09769161446629628
0.4576776350450435,0.09777336518894272
0.4576207411474456,0.09793686663429368
0.4580758923282437,0.09834562024770019
0.4581327862258467,0.09842737097040472
0.45830346791864535,0.09908137675180864
0.45870172520184554,0.09981713325591707
0.45875861909944343,0.09981713325591707
0.45892930079224714,0.10006238542397258
0.45870172520184554,0.09998063470126806
0.458986194689845,0.10022588686932357
0.4593844519730452,0.1007163912053765
0.4594413458706431,0.10079814192808104
0.45966892146104465,0.1013703969868385
0.46006717874424496,0.10194265204553787
0.46012407264184785,0.10194265204553787
0.4602378604370436,0.10235140565894436
0.4602378604370436,0.10276015927235085
0.4604085421298473,0.1028419099949973
0.46052232992504816,0.10325066360840379
0.46052232992504816,0.10325066360840379
0.46057922382264593,0.10300541144040637
0.4606361177202438,0.1028419099949973
0.4606361177202438,0.10259665782699989
0.4607499055154446,0.1024331563816489
0.461091268901047,0.1030871621630528
0.461091268901047,0.10316891288575734
0.4611481627986449,0.10341416505375478
0.461091268901047,0.10398642011251225
0.46097748110584624,0.10365941722181028
0.46097748110584624,0.10390466938986578
0.46097748110584624,0.10390466938986578
0.4612050566962478,0.10406817083521677
0.46126195059384567,0.10382291866716126
0.4616033139794481,0.10365941722181028
0.46171710177464886,0.10374116794451482
0.461660207877046,0.10414992155786322
0.461660207877046,0.10423167228056776
0.46171710177464886,0.10472217661662069
0.46183088956984464,0.10488567806197166
0.4618877834674475,0.10570318528878464
0.4618877834674475,0.10578493601143109
0.4620584651602462,0.1064389417928931
0.4622860407506478,0.107092947574297
0.4622860407506478,0.10717469829700153
0.4622860407506478,0.10741995046499896
0.4621153590578491,0.10741995046499896
0.4620584651602462,0.10782870407840545
0.46222914685304484,0.1081557069691074
0.46245672244344643,0.10807395624646095
0.46245672244344643,0.10807395624646095
0.46279808582904874,0.10799220552375642
0.4630825553170483,0.10799220552375642
0.46365149429304714,0.10766520263305446
0.4637652820882479,0.10766520263305446
0.46410664547384534,0.10766520263305446
0.46444800885944765,0.10782870407840545
0.46450490275704553,0.10807395624646095
0.46450490275704553,0.10823745769181194
0.46439111496184976,0.10848270985986744
0.4643342210642469,0.10856446058251389
0.464277327166649,0.10889146347321585
0.4643342210642469,0.1090549649186249
0.46496005393784867,0.10946371853197331
0.46507384173304944,0.10954546925467784
0.4654152051186468,0.11003597359073078
0.465358311221049,0.11044472720413727
0.4655858868114505,0.11085348081754376
0.4655858868114505,0.11085348081754376
0.4657565685042492,0.11109873298554118
0.4660979318898465,0.11068997937219277
0.4664392952754489,0.11060822864948824
0.4666099769682476,0.11052647792678372
0.46666687086585046,0.11044472720413727
0.46672376476344835,0.11036297648143273
0.46695134035385,0.11077173009483923
0.4673495976370502,0.11077173009483923
0.4676909610226475,0.11077173009483923
0.4678047488178483,0.11060822864948824
0.4678047488178483,0.11060822864948824
0.4679185366130491,0.11068997937219277
0.46774785492025045,0.11085348081754376
0.46757717322744674,0.11077173009483923
0.4683736877938472,0.11085348081754376
0.4683736877938472,0.11093523154019021
0.46860126338424873,0.11109873298554118
0.46848747558904796,0.11118048370824571
0.46945467184825224,0.11134398515359668
0.4695115657458501,0.11142573587630122
0.4700236108242511,0.11150748659894767
0.4703649742098484,0.11167098804429865
0.47099080708345026,0.11158923732165221
0.47099080708345026,0.11158923732165221
0.4719011094450516,0.1119979909350006
0.4722993667282518,0.1119979909350006
0.4723562606258497,0.1119979909350006
0.4725838362162512,0.11207974165770514
0.4734372446802496,0.11281549816181358
0.47349413857785255,0.11289724888451812
0.4741768653490523,0.113714756111273
0.47429065314425306,0.11396000827932852
0.47423375924665007,0.11396000827932852
0.47423375924665007,0.11404175900197497
0.47429065314425306,0.11420526044732594
0.4746320165298504,0.11436876189267692
0.47508716771065357,0.11469576478343696
0.47520095550585434,0.11494101695143438
0.47520095550585434,0.11502276767413892
0.47548542499385377,0.11616727779165385
0.4754285310962509,0.11641252995965128
0.4754285310962509,0.1164942806823558
0.4756561066866524,0.11731178790911069
0.4757130005842503,0.1179657936905727
0.47576989448185325,0.11804754441321914
0.4758267883794511,0.11878330091732758
0.475371637198653,0.11935555597608506
0.4753147433010501,0.11943730669878959
0.47514406160825146,0.12025481392554448
0.4753147433010501,0.12082706898430196
0.4753147433010501,0.1209088197070065
0.47554231889145165,0.12107232115235747
0.475883682277054,0.12066356753895097
0.47605436396985273,0.12058181681630452
0.47645262125305293,0.12066356753895097
0.47656640904825376,0.12066356753895097
0.47696466633145396,0.12082706898430196
0.47736292361465427,0.12172632693376137
0.47741981751225204,0.12172632693376137
0.477988756488251,0.12238033271522336
0.4785008015666521,0.12270733560592534
0.47861458936185286,0.12270733560592534
0.479069740542656,0.12278908632857177
0.4794111039282533,0.12303433849662729
0.47969557341625274,0.1232795906646828
0.47975246731385573,0.12344309211003378
0.47969557341625274,0.12352484283268021
0.47963867951865485,0.12360659355538475
0.4795248917234541,0.12385184572344025
0.47969557341625274,0.12385184572344025
0.4803214062898546,0.12344309211003378
0.480605875777854,0.12336134138732924
0.4807196635730549,0.12336134138732924
0.4810610269586522,0.12344309211003378
0.4815161781394554,0.12377009500073573
0.4819144354226556,0.12377009500073573
0.4820282232178564,0.12377009500073573
0.4829385255794577,0.12352484283268021
0.483279888965055,0.12352484283268021
0.4833936767602558,0.12352484283268021
0.48441776691705785,0.12377009500073573
0.484872918097856,0.12377009500073573
0.48498670589305676,0.12368834427808928
0.48527117538105624,0.12368834427808928
0.48532806927865413,0.12360659355538475

================================================
FILE: demo/src/main/assets/tracks/track3.txt
================================================
0.4961379098226587,0.3391014985361062
0.5002342704498619,0.33877449564540424
0.5047288883602654,0.3378752376959448
0.5054116151314652,0.3382839913093513
0.5058098724146654,0.33836574203199776
0.5066632808786637,0.3382839913093513
0.5074029015474664,0.33779348697329836
0.5076873710354658,0.33730298263718733
0.5078011588306666,0.3364037246877279
0.5073460076498635,0.3355044667382685
0.5066632808786637,0.33501396240221554
0.5060943419026648,0.33485046095686455
0.5054685090290629,0.33493221167951104
0.5033065409202631,0.3343599566207536
0.5023393446610639,0.3343599566207536
0.4983567718290615,0.335586217460973
0.49545518305145897,0.3361584725197305
0.49391904781626084,0.3364037246877279
0.48703488620665586,0.3365672261330789
0.4856694326642565,0.3364037246877279
0.4846453425074544,0.3359949710743214
0.48401950963385765,0.33542271601562207
0.48316610116985426,0.3343599566207536
0.4816299659346562,0.3318256842177263
0.48049208798265325,0.3321526871084282
0.4741199714514493,0.3299454175961029
0.4700236108242511,0.3280651509745376
0.4664392952754489,0.3261848843529142
0.465301417323446,0.3255308785715103
0.46285497972664663,0.32373236267253336
0.46217225295544695,0.32356886122718237
0.4618877834674475,0.32324185833648045
0.461091268901047,0.32307835689112946
0.4588155129970463,0.32291485544577847
0.45779142284024427,0.322506101832372
0.45710869606904453,0.32201559749631903
0.45295544154424344,0.3178463106397239
0.4448196141874398,0.32626663507561876
0.4381630281682364,0.3321526871084282
0.4331563651794369,0.3368942290238389
0.43247363840823216,0.33779348697329836
0.43218916892023274,0.33861099420005325
0.4327012139986337,0.341554020216487
0.43218916892023274,0.34179927238454255
0.4322460628178356,0.3431890346700549
0.4320184872274341,0.34417004334221885
0.43173401773943454,0.3449057998463273
0.4296289435282326,0.3471948200812991
0.4217775856594284,0.35422538223168154
0.4180225884178275,0.35782241402951925
0.4078385807474248,0.36656974135611614
0.4060748699218252,0.368204755809684
0.39964585949302334,0.37261929483433465
0.3858206423762155,0.38193887721968894
0.38212253903221244,0.3847184017907717
0.3819518573394138,0.3845549003454207
0.38138291836341487,0.3845549003454207
0.38115534277301333,0.3846366510681253
0.38098466108021467,0.3850454046814737
0.38098466108021467,0.3852906568495292
0.37944852584501154,0.38602641335363763
0.36835421581300754,0.3923212189999116
0.354415210901004,0.40098679560380396
0.35350490853940264,0.4017225521079124
0.35231013668980193,0.4030305636707783
0.3510584709426033,0.40499258101504815
0.3483844577553973,0.4113691373840267
0.34724657980339946,0.413576406896294
0.34559665677300067,0.4159471778540284
0.34332090086899997,0.4181544473662956
0.34030552429619665,0.42036171687862095
0.33353515048179244,0.42453100373527425
0.32636651938419303,0.4304170557680837
0.32374940009458997,0.4321338209443561
0.31117584872498577,0.43859212803598113
0.3077622148689822,0.44071764682560194
0.30747774538098277,0.44047239465760446
0.30668123081458226,0.4403906439348999
0.3062260796337842,0.44055414538025095
0.3059985040433826,0.44088114827095287
0.3058278223505839,0.44145340332971034
0.30332449085618163,0.44202565838846786
0.2987160851505773,0.44267966416987176
0.296269647553778,0.44251616272452077
0.2939369977521794,0.4421074091111724
0.28386677787697245,0.4391643830947386
0.2817617036657704,0.4391643830947386
0.2809651890993699,0.43924613381738503
0.2796566294545734,0.4396548874307915
0.2773808735505727,0.44071764682560194
0.27556026882737017,0.44137165260706396
0.27191905938097005,0.4421891598338188
0.267196865880165,0.44292491633792724
0.2641245954097638,0.4433336699513337
0.25615944974576393,0.4427614148925763
0.253485436558563,0.44292491633792724
0.25018559049776024,0.44374242356474025
0.24785294069615657,0.44472343223684613
0.24625991156335558,0.44586794235436106
0.24415483735215862,0.4478299596986309
0.24227733873135818,0.4491379712614968
0.24005847672495534,0.4503642321016581
0.23766893302575387,0.45126349005117566
0.23641726727855525,0.45159049294187764
0.22776939484335063,0.4523262494459861
0.22372992811375028,0.452816753782039
0.2167888726065474,0.4532255073954455
0.21166842182254206,0.45420651606755136
0.21155463402734126,0.45404301462220037
0.21109948284654315,0.45371601173149845
0.21058743776814212,0.4538795131768494
0.21030296828014267,0.4542882667902559
0.21035986217774053,0.45461526968095783
0.21070122556334292,0.45502402329436437
0.21041675607534346,0.4553510261850663
0.2062066076529394,0.4574765449747452
0.19812767419373872,0.46238158833544873
0.19602259998253668,0.4640166027890167
0.19351926848813442,0.4663056230239884
0.1927227539217339,0.46728663169615237
0.18794366652333097,0.4739084402331284
0.18396109369133354,0.48044849804739986
0.18310768522733012,0.4800397444339934
0.1825387462513312,0.4800397444339934
0.18020609644973265,0.4808572516608064
0.17940958188333214,0.48077550093810184
0.1788406429073282,0.48036674732475343
0.17861306731693166,0.4794674893752359
0.178954430702529,0.47873173287112747
0.18117329270893182,0.47644271263615573
0.18231117066092964,0.47488944890523427
0.18242495845613044,0.47448069529188586
0.18242495845613044,0.4739084402331284
0.18219738286572884,0.47358143734242647
0.17935268798572926,0.4707201620486391
0.17832859782892715,0.4701479069898816
0.17639420531052885,0.4696574026538287
0.175768372436927,0.47039315915793717
0.17480117617772786,0.4713741678301011
0.17406155550892524,0.472518677947558
0.17400466161132735,0.47292743156096445
0.17406155550892524,0.4739901909557749
0.17457360058732627,0.4755434546866963
0.17457360058732627,0.47627921119080474
0.17434602499692975,0.4770149676949132
0.17411844940652815,0.4773419705856151
0.1721840568881248,0.4788952343165365
0.16825837795372522,0.4815112574422103
0.16450338071212436,0.4842907820132931
0.1602932322897203,0.4862527993575629
0.15750543130731856,0.48739730947507787
0.1538642218609185,0.4883783181472418
0.1521574049329167,0.4883783181472418
0.15107642087851678,0.4881330659791863
0.14692316635371563,0.48617104863491645
0.14618354568491806,0.48592579646686096
0.14544392501611542,0.4858440457442145
0.14430604706411762,0.48633455008026744
0.14413536537131388,0.486579802248323
0.1433388508049134,0.48633455008026744
0.14214407895531267,0.4864163008029139
0.1385597634065155,0.4872338080297269
0.13793393053291367,0.4871520573070223
0.13628400750250974,0.4864980515256184
0.13213075297770863,0.4841272805679421
0.12405181951850794,0.4778324749216681
0.11944341381290363,0.47382668951042384
0.11711076401130507,0.4712106663847501
0.11540394708330329,0.46843114181366735
0.11437985692650121,0.46589686941064
0.11341266066730205,0.46156408110863584
0.11250235830570077,0.4568225391932832
0.11170584373930029,0.4542882667902559
0.11090932917289978,0.45257150161398346
0.10954387563050036,0.4503642321016581
0.10652849905770212,0.446685449581174
0.10436653094889717,0.44259791344722527
0.10294418350889989,0.44055414538025095
0.10066842760489919,0.4385103773132766
0.09429631107369525,0.43417758901133047
0.0931015392240945,0.43295132817116905
0.09179297957929297,0.4300083021547353
0.0910533589104954,0.4287820413145158
0.08837934572329446,0.42493975734862255
0.08798108844009422,0.4242040008445142
0.08763972505449184,0.42224198350024433
0.0865587410000919,0.42019821543326996
0.08581912033128927,0.4180726966436492
0.08559154474089273,0.4177456937529472
0.08388472781289097,0.4162741807447303
0.08104003293289136,0.4133311547282965
0.07927632210728666,0.4112873866613222
0.07677299061288943,0.40867136353559036
0.07609026384168469,0.40801735775418646
0.073302462859288,0.4061370911325631
0.06442701483368177,0.3985342739234812
0.06146853215848138,0.39534599573899193
0.05714459594088159,0.38929644226077337
0.05572224850087926,0.3868439205804506
0.05287755362087966,0.3813666221609895
0.049691495355277684,0.37580757301882395
0.04741573945127699,0.3709025296581203
0.04622096760167625,0.36877701086844145
0.04468483236647314,0.3667332428014671
0.040133320558471755,0.3621552023314654
0.0383696097328721,0.3601931849871956
0.03751620126887374,0.3590486748696806
0.03637832331687087,0.35700490680276437
0.03535423316006879,0.3545523851223836
0.03484218808166775,0.3527538692234647
0.034557718593668296,0.35095535332454586
0.034443930798467505,0.349156837425627
0.034614612491271214,0.34629556213183965
0.035183551467270126,0.3435977882834614
0.036890368395271905,0.33771173625059386
0.037231731780869234,0.33607672179702597
0.03762998906406948,0.33329719722594314
0.0376868829616724,0.3317439334950798
0.03745930737127082,0.32904615964664347
0.036890368395271905,0.3264301365209697
0.035923172136072754,0.3239776148405889
0.034330143003271765,0.3210345888241551
0.028640753243267512,0.31261426438826023
0.026706360724869198,0.30991649053988196
0.025397801080067665,0.30819972536360957
0.022723787892866727,0.30542020079258486
0.018798108958462127,0.3019049197173936
0.017375761518464858,0.3010056617679342
0.011458796168059018,0.2977356328607404
0.011117432782461696,0.297326879247392
0.01094675108965798,0.29675462418863446
0.01094675108965798,0.2955283633484731
0.011174326680059563,0.2951196097350666
0.011857053451259265,0.2946291053989556
0.012198416836861643,0.2944656039536046
0.01265356801765976,0.2946291053989556
0.013620764276858915,0.2952831111804176
0.015498262897664414,0.29691812563398545
0.016408565259260644,0.29740862997003836
0.0177740188016651,0.2978173835834449
0.01868432116326134,0.29838963864220236
0.02340651466406643,0.302313673330742
0.024203029230466924,0.30321293128025956
0.025625376670464196,0.3059924558512842
0.02625120954406603,0.30623770801933975
0.02727529970086811,0.30607420657398876
0.027730450881666226,0.30542020079258486
0.027787344779269148,0.30476619501112284
0.027673556984068357,0.30435744139771637
0.0273890874960689,0.3040304385070144
0.024203029230466924,0.3019049197173936
0.01936704793446609,0.2978173835834449
0.018456745572864804,0.29724512852468743
0.01657924695206436,0.29642762129793254
0.016010307976060397,0.2958553662391751
0.01572583848806094,0.29520136045771306
0.015384475102463619,0.2936480967268497
0.015498262897664414,0.29242183588668835
0.015782732385663866,0.2916860793825799
0.01663614084966223,0.2904598185423604
0.01726197372326406,0.289887563483603
0.01822916998246322,0.28956056059290103
0.01931015403686317,0.28947880987025454
0.026820148520064938,0.2906233199877114
0.02744598139366677,0.29054156926506497
0.028185602062469395,0.290378067819714
0.028754541038468306,0.29005106492895394
0.02920969221926642,0.28956056059290103
0.029664843400069592,0.2888248040887926
0.029949312888069044,0.2875985432486312
0.029778631195270383,0.28130373760235716
0.028868328833669098,0.2781154594179259
0.02744598139366677,0.27435492617467916
0.02522711938726395,0.26642510607489533
0.02465818041126504,0.2630733264450551
0.024259923128064794,0.2616018134368382
0.022837575688067522,0.2583317845297024
0.02221174281446569,0.25628801646272803
0.021244546555266534,0.25236398177413033
0.021016970964864948,0.24982970937110305
0.021073864862462818,0.24794944274953776
0.021642803838466777,0.24353490372488706
0.01891189675366292,0.2156579072914707
0.017944700494463763,0.21173387260287296
0.01822916998246322,0.2116521218802265
0.018627427265663465,0.21107986682146906
0.018627427265663465,0.21075286393076706
0.018513639470462674,0.2104258610400651
0.018001594392061636,0.21009885814930507
0.0177740188016651,0.21009885814930507
0.0177740188016651,0.20887259730914373
0.017944700494463763,0.20715583213287128
0.014644854433660995,0.1739650387254029
0.014019021560059162,0.17126726487702462
0.012369098529660304,0.16922349681005028
0.010889857192060107,0.16799723596983082
0.003948801684857246,0.1641549520039376
0.0014454701904549755,0.16227468538237233
-0.0015130124847454185,0.1609666738195064
-0.004585282955146604,0.16006741587004697
-0.03957502997916037,0.1573696420216687
-0.04355760281116284,0.15761489418966612
-0.04606093430556512,0.15867765358447655
-0.057041456542368314,0.16366444766788468
-0.05823622839196906,0.16399145055858663
-0.060113727012769506,0.16390969983594017
-0.06182054394077128,0.16341919549982914
-0.06716857031517318,0.1607214216514509
-0.06819266047197017,0.16006741587004697
-0.0709804614543719,0.15875940430718105
-0.07337000515357339,0.15851415213912556
-0.07644227562397457,0.15875940430718105
-0.07951454609437575,0.1581871492484236
-0.0821885592815767,0.1573696420216687
-0.08412295179998008,0.15704263913090866
-0.08742279786078283,0.1571243898536132
-0.08856067581278065,0.15679738696291123
-0.08958476596958273,0.1563068826268002
-0.09077953781918346,0.15532587395469435
-0.09191741577118129,0.15450836672788137
-0.09305529372318416,0.1539361116691239
-0.09533104962718486,0.15336385661036644
-0.09595688250078163,0.15303685371966447
-0.09692407875998585,0.15221934649290958
-0.0986877895855855,0.1500938277032307
-0.09993945533278409,0.1479683089136099
-0.10102043938718408,0.1464150451826885
-0.10312551359838609,0.1446165292837696
-0.10392202816478657,0.1428997641075553
-0.10426339155038897,0.14036549170446994
-0.10471854273118708,0.13897572941895758
-0.1054581633999897,0.13807647146949814
-0.10631157186398807,0.13742246568809424
-0.1088717972559882,0.13619620484787476
-0.10961141792479082,0.1352151961757689
-0.11063550808158787,0.13276267449538803
-0.11126134095518969,0.13210866871398413
-0.11188717382879151,0.1317816658232241
-0.11461808091359033,0.1316181643778731
-0.11547148937759374,0.13120941076446663
-0.11934027441439543,0.12916564269755038
-0.12019368287839377,0.12802113258003545
-0.12116087913759294,0.1256503616223591
-0.12150224252319533,0.12254383416057436
-0.1222418631919929,0.12180807765646591
-0.12320905945119712,0.12148107476576395
-0.12747610177119903,0.12148107476576395
-0.12884155531359842,0.1211540718750039
-0.1341895816880003,0.11927380525343861
-0.13572571692319838,0.11829279658127466
-0.13709117046560282,0.11714828646375972
-0.13828594231520355,0.11502276767413892
-0.14135821278560476,0.10840095913716291
-0.14477184664160325,0.1043134230032142
-0.14727517813600552,0.1007163912053765
-0.14852684388320414,0.09957188108786157
-0.14926646455200676,0.0992448781971596
-0.151257750968008,0.0989996260291041
-0.1520542655344085,0.09916312747451317
-0.15683335293281145,0.10104339409607846
-0.1579143369872114,0.10177915060018691
-0.16115728915041125,0.1049674287846762
-0.16257963659041358,0.1062754403475421
-0.16639152772961233,0.10782870407840545
-0.16838281414561357,0.10840095913716291
-0.17043099445921267,0.10930021708662234
-0.17373084052001547,0.11036297648143273
-0.17794098894241953,0.11207974165770514
-0.18175288008161827,0.1124067445484071
-0.18357348480482086,0.11175273876700319
-0.1860768162992231,0.10897321419592038
-0.18738537594401958,0.107746953355759
-0.18840946610082165,0.10750170118770348
-0.18988870743842187,0.10758345191040802
-0.19091279759522395,0.10733819974235251
-0.19261961452322574,0.10611193890219113
-0.19347302298722407,0.10570318528878464
-0.19432643145122247,0.10562143456608011
-0.19569188499362689,0.10594843745684016
-0.1966021873552231,0.1066841939608905
-0.20121059306082748,0.11085348081754376
-0.20439665132642942,0.11355125466592203
-0.20684308892322875,0.11543152128754541
-0.20832233026082897,0.11641252995965128
-0.21116702514083363,0.11739353863181523
-0.21184975191203334,0.1179657936905727
-0.21236179699043436,0.11870155019468115
-0.21264626647843382,0.1200913124801935
-0.21213422140003277,0.1243423500594932
-0.21219111529763066,0.12646786884911398
-0.21241869088803225,0.1281846340253864
-0.21440997730403347,0.13210866871398413
-0.21497891628003238,0.1328444252180926
-0.2154909613584334,0.133253178831441
-0.21605990033443231,0.1334984309994965
-0.21714088438883225,0.1334984309994965
-0.21953042808803377,0.13317142810879457
-0.22066830604003665,0.13366193244484748
-0.2212941389136334,0.13423418750360494
-0.22169239619683365,0.13488819328500884
-0.22260269855843492,0.13856697580555108
-0.22305784973923812,0.1394662337550105
-0.2237974704080357,0.14003848881376796
-0.2248215605648378,0.14044724242717446
-0.22544739343843959,0.140528993149879
-0.226812846980839,0.1401202395364725
-0.22846277001123785,0.13856697580555108
-0.23107988930084092,0.13652320773857674
-0.23335564520484162,0.1345611903943069
-0.23420905366883996,0.133907184612903
-0.23517624992803912,0.1334984309994965
-0.23591587059684174,0.13333492955414553
-0.2398415495312413,0.13415243678090039
-0.24115010917604282,0.13415243678090039
-0.24627055996004818,0.13341668027679196
-0.24854631586404888,0.13259917305003707
-0.24939972432804722,0.13251742232733255
-0.2519599497200473,0.13308967738609
-0.254804644600052,0.1334984309994965
-0.2556580530640504,0.13374368316755203
-0.2586734296368537,0.13635970629322575
-0.2596406258960528,0.13701371207468777
-0.2604940343600512,0.13742246568809424
-0.26225774518565087,0.13742246568809424
-0.26584206073445305,0.13717721352003873
-0.2668092569936522,0.1373407149653897
-0.26771955935525354,0.1377494685787962
-0.26828849833125745,0.1381582221921446
-0.26891433120485425,0.13979323664577056
-0.2699953152592542,0.14142825109933843
-0.2723279650608578,0.1431450162755527
-0.27420546368165827,0.14420777567036314
-0.2747175087600593,0.14469828000647417
-0.2738641002960559,0.14469828000647417
-0.27289690403685674,0.14404427422501215
-0.2713038749040557,0.14339026844360825
-0.268004028843253,0.14224575832609332
-0.26453350108965157,0.14069249459522998
-0.26322494144485503,0.14036549170446994
-0.2620301695952543,0.14044724242717446
-0.26055092825765414,0.1407742453178764
-0.25702350660644974,0.14208225688074233
-0.2561132042448485,0.14232750904879785
-0.25491843239524775,0.1420005061580959
-0.2529271459792465,0.1411012482085784
-0.2524151009008505,0.14101949748593193
-0.25201684361765025,0.1411829989312829
-0.2517323741296508,0.14175525399004038
-0.2524151009008505,0.1441260249477167
-0.253211615467251,0.14616979301469105
-0.2543494934192488,0.14854056397236737
-0.25554426526884955,0.15001207698058425
-0.2564545676304509,0.15058433203934174
-0.25759244558244865,0.15082958420733916
-0.25946994420324915,0.15082958420733916
-0.26453350108965157,0.1503390798712862
-0.2653300156560521,0.1503390798712862
-0.26612653022245253,0.15082958420733916
-0.26629721191525624,0.15156534071144762
-0.2662403180176533,0.15230109721555604
-0.26584206073445305,0.15287335227431348
-0.2644197132944558,0.1536908595011265
-0.26003888317925306,0.15589812901345182
-0.2595837319984499,0.15663388551756025
-0.25946994420324915,0.15745139274431513
-0.2598113075888515,0.1581871492484236
-0.26066471605284985,0.15908640719788303
-0.264305925499255,0.16104842454215285
-0.2662403180176533,0.16153892887826388
-0.26715062037925463,0.16145717815555932
-0.26823160443365457,0.1612119259875619
-0.26971084577125476,0.1612119259875619
-0.2703366786448566,0.1613754274329129
-0.27073493592805686,0.1618659317689658
-0.2707918298256547,0.16235643610501876
-0.27073493592805686,0.16309219260912722
-0.27039357254245444,0.16341919549982914
-0.26971084577125476,0.16374619839058918
-0.266979938686456,0.16423670272664215
-0.26453350108965157,0.1654629635668035
-0.26385077431845183,0.16570821573485903
-0.26299736585445344,0.16570821573485903
-0.26038024656485037,0.1652177113988061
-0.25918547471524966,0.1652177113988061
-0.25713729440165056,0.1650542099534551
-0.2562838859376522,0.1650542099534551
-0.2538374483408478,0.16578996645756355
-0.2519599497200473,0.16644397223896745
-0.253211615467251,0.16767023307912884
-0.2545770690096504,0.16824248813788634
-0.25486153849764986,0.1685694910285883
-0.2564545676304509,0.17216652282648406
-0.25719418829924845,0.17322928222129444
-0.2652162278608563,0.185246638455027
-0.2703366786448566,0.19235895132805594
-0.2705642542352582,0.19358521216827543
-0.2704504664400574,0.19432096867238385
-0.2714176626992565,0.19464797156308583
-0.27238485895845566,0.19546547878984072
-0.2990680969328672,0.23437882278488378
-0.3051557439760717,0.24296264866612963
-0.30595225854247216,0.24386190661558904
-0.3061229402352708,0.24353490372488706
-0.3063505158256724,0.24337140227953613
-0.3066918792112697,0.24345315300218254
-0.30709013649447,0.24369840517023808
-0.30726081818727374,0.244188909506291
-0.30726081818727374,0.244842915287753
-0.30703324259687215,0.24516991817845496
-0.30674877310887266,0.24525166890110142
-0.3168189929840746,0.2674061147470012
-0.33513882801128086,0.30689171380074365
-0.33536640360168246,0.30836322680896056
-0.3357077669872849,0.3090172325904226
-0.33616291816808297,0.30926248475847806
-0.3367887510416848,0.30983473981717746
-0.33690253883688565,0.3106522470439904
-0.3366180693488811,0.3114697542707453
-0.33701632663208136,0.31261426438826023
-0.3374145839152816,0.31343177161507324
-0.33934897643368495,0.316374797631507
-0.34105579336168673,0.3195630758159382
-0.3439573821392842,0.32561262929415674
-0.345664199067286,0.32945491326004994
-0.34737101599528775,0.33288844361253667
-0.35823775043689016,0.35692315608005987
-0.3650650181488973,0.3723740426663372
-0.3654063815344946,0.37482656434666
-0.3651219120464952,0.37736083674968723
-0.36478054866089277,0.37776959036309377
-0.3646098669680941,0.3787505990352577
-0.3647236547632949,0.381121369992934
-0.36495123035369653,0.3825928830011509
-0.3681941825168964,0.38300163661455744
-0.36876312149289525,0.38300163661455744
-0.37331463330089665,0.38063086565688103
-0.37564728310250023,0.3799768598754191
-0.3822469752241007,0.3776060889177427
-0.3827590203025018,0.3771973353043363
-0.38292970199530046,0.37646157880022785
-0.38332795927850066,0.37613457590952587
-0.3846934128209052,0.37621632663223037
-0.3851485640017033,0.37646157880022785
-0.3854330334897027,0.3767885816909879
-0.3849778823089046,0.37801484253114925
-0.38520545789930116,0.37948635553936616
-0.38571750297770213,0.3800586105981236
-0.38787947108650206,0.3808761178248785
-0.3891311368337057,0.38185712649704245
-0.39009833309290487,0.38300163661455744
-0.39248787679210634,0.38520890612688274
-0.39328439135850685,0.3861081640763422
-0.39334128525610473,0.3864351669670441
-0.3931706035633061,0.387252674193799
-0.39248787679210634,0.38749792636185454
-0.391634468328108,0.387252674193799
-0.38901734903850493,0.3852906568495292
-0.38833462226730525,0.38512715540417825
-0.38787947108650206,0.38512715540417825
-0.38748121380330686,0.38537240757223373
-0.38708295652010666,0.38586291190828664
-0.38713985041770443,0.3865986684123951
-0.387424319905704,0.3871709234711525
-0.3882208344721045,0.38823368286596294
-0.3894725002193031,0.3891329408154224
-0.39675491911210836,0.3925664711679091
-0.39721007029290645,0.39297522478131564
-0.39760832757610665,0.3939562334534796
-0.3976652214737096,0.39510074357093644
-0.39726696419050933,0.3961635029658049
-0.3966980252145105,0.39689925946991333
-0.3957877228529091,0.3984525232007767
-0.3885621978577068,0.4036028187295358
-0.3837831104593038,0.40523783318310364
-0.38179182404330264,0.4062188418552676
-0.3814504606577002,0.40679109691402504
-0.381564248452901,0.40760860414078
-0.38264523250730104,0.4093253693170524
-0.3837831104593038,0.41014287654380727
-0.3850916701041054,0.41071513160256473
-0.3864571236465048,0.41046987943450924
-0.38787947108650206,0.4098976243758098
-0.3891311368337057,0.40957062148504975
-0.389529394116906,0.4096523722077543
-0.38987075750250333,0.4099793750984563
-0.3899845452977041,0.41038812871186275
-0.3899845452977041,0.4107968823252693
-0.3896431819121068,0.4112056359386177
-0.3876518954961055,0.41202314316543065
-0.38662780533930347,0.41259539822418806
-0.38355553486890226,0.4166011836354323
-0.3779799329040988,0.4201164647106236
-0.37684205495210105,0.4210974733827294
-0.37604554038570054,0.42158797771884043
-0.37496455633130055,0.42183322988683786
-0.3718922858608994,0.4213427255507849
-0.37064062011369575,0.42150622699613594
-0.3681941825168964,0.42224198350024433
-0.36546327543209756,0.4226507371136508
-0.36495123035369653,0.4229777400043528
-0.3647236547632949,0.42346824434040575
-0.36478054866089277,0.42395874867651673

================================================
FILE: demo/src/main/java/ovh/plrapps/mapcompose/demo/MainActivity.kt
================================================
package ovh.plrapps.mapcompose.demo

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import ovh.plrapps.mapcompose.demo.ui.MapComposeDemoApp
import ovh.plrapps.mapcompose.demo.ui.theme.MapComposeTheme

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        enableEdgeToEdge()
        super.onCreate(savedInstanceState)
        setContent {
            MapComposeTheme {
                MapComposeDemoApp()
            }
        }
    }
}

@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
    MapComposeTheme {
        MapComposeDemoApp()
    }
}

================================================
FILE: demo/src/main/java/ovh/plrapps/mapcompose/demo/providers/TileStreamProviderFactory.kt
================================================
package ovh.plrapps.mapcompose.demo.providers

import android.content.Context
import ovh.plrapps.mapcompose.core.TileStreamProvider

fun makeTileStreamProvider(appContext: Context) =
    TileStreamProvider { row, col, zoomLvl ->
        try {
            appContext.assets?.open("tiles/mont_blanc_layered/$zoomLvl/$row/$col.jpg")
        } catch (e: Exception) {
            null
        }
    }


================================================
FILE: demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/MapComposeDemoApp.kt
================================================
package ovh.plrapps.mapcompose.demo.ui

import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.runtime.Composable
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import ovh.plrapps.mapcompose.demo.ui.screens.AddingMarkerDemo
import ovh.plrapps.mapcompose.demo.ui.screens.AnimationDemo
import ovh.plrapps.mapcompose.demo.ui.screens.CalloutDemo
import ovh.plrapps.mapcompose.demo.ui.screens.CenteringOnMarkerDemo
import ovh.plrapps.mapcompose.demo.ui.screens.CustomDrawDemo
import ovh.plrapps.mapcompose.demo.ui.screens.Home
import ovh.plrapps.mapcompose.demo.ui.screens.HttpTilesDemo
import ovh.plrapps.mapcompose.demo.ui.screens.InfiniteScrollDemo
import ovh.plrapps.mapcompose.demo.ui.screens.LayersDemoSimple
import ovh.plrapps.mapcompose.demo.ui.screens.MapDemoSimple
import ovh.plrapps.mapcompose.demo.ui.screens.MarkersClusteringDemo
import ovh.plrapps.mapcompose.demo.ui.screens.MarkersLazyLoadingDemo
import ovh.plrapps.mapcompose.demo.ui.screens.OsmDemo
import ovh.plrapps.mapcompose.demo.ui.screens.PathsDemo
import ovh.plrapps.mapcompose.demo.ui.screens.RotationDemo
import ovh.plrapps.mapcompose.demo.ui.screens.VisibleAreaPaddingDemo
import ovh.plrapps.mapcompose.demo.ui.theme.MapComposeTheme

@Composable
fun MapComposeDemoApp() {
    val navController = rememberNavController()

    MapComposeTheme {
        NavHost(navController, startDestination = HOME) {
            composable(HOME) {
                Home(demoListState = rememberLazyListState()) {
                    navController.navigate(it.name)
                }
            }
            composable(MainDestinations.MAP_ALONE.name) {
                MapDemoSimple()
            }
            composable(MainDestinations.LAYERS_DEMO.name) {
                LayersDemoSimple()
            }
            composable(MainDestinations.MAP_WITH_ROTATION_CONTROLS.name) {
                RotationDemo()
            }
            composable(MainDestinations.ADDING_MARKERS.name) {
                AddingMarkerDemo()
            }
            composable(MainDestinations.CENTERING_ON_MARKER.name) {
                CenteringOnMarkerDemo()
            }
            composable(MainDestinations.PATHS.name) {
                PathsDemo()
            }
            composable(MainDestinations.CUSTOM_DRAW.name) {
                CustomDrawDemo()
            }
            composable(MainDestinations.CALLOUT_DEMO.name) {
                CalloutDemo()
            }
            composable(MainDestinations.ANIMATION_DEMO.name) {
                AnimationDemo()
            }
            composable(MainDestinations.INFINITE_SCROLL.name) {
                InfiniteScrollDemo()
            }
            composable(MainDestinations.OSM_DEMO.name) {
                OsmDemo()
            }
            composable(MainDestinations.HTTP_TILES_DEMO.name) {
                HttpTilesDemo()
            }
            composable(MainDestinations.VISIBLE_AREA_PADDING.name) {
                VisibleAreaPaddingDemo()
            }
            composable(MainDestinations.MARKERS_CLUSTERING.name) {
                MarkersClusteringDemo()
            }
            composable(MainDestinations.MARKERS_LAZY_LOADING.name) {
                MarkersLazyLoadingDemo()
            }
        }
    }
}

================================================
FILE: demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/NavGraph.kt
================================================
package ovh.plrapps.mapcompose.demo.ui

const val HOME = "home"

enum class MainDestinations(val title: String) {
    MAP_ALONE("Simple map"),
    LAYERS_DEMO("Layers demo"),
    MAP_WITH_ROTATION_CONTROLS("Map with rotation controls"),
    ADDING_MARKERS("Adding markers"),
    CENTERING_ON_MARKER("Centering on marker"),
    PATHS("Map with paths"),
    CUSTOM_DRAW("Map with custom drawings"),
    CALLOUT_DEMO("Callout (tap markers)"),
    ANIMATION_DEMO("Animation demo"),
    INFINITE_SCROLL("Infinite scroll demo"),
    OSM_DEMO("Open Street Map demo"),
    HTTP_TILES_DEMO("Remote HTTP tiles"),
    VISIBLE_AREA_PADDING("Visible area padding"),
    MARKERS_CLUSTERING("Markers clustering"),
    MARKERS_LAZY_LOADING("Markers lazy loading")
}


================================================
FILE: demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/screens/AddingMarkerDemo.kt
================================================
@file:OptIn(ExperimentalMaterial3Api::class)

package ovh.plrapps.mapcompose.demo.ui.screens

import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Button
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import ovh.plrapps.mapcompose.demo.ui.MainDestinations
import ovh.plrapps.mapcompose.demo.viewmodels.AddingMarkerVM
import ovh.plrapps.mapcompose.ui.MapUI

@Composable
fun AddingMarkerDemo(
    modifier: Modifier = Modifier,
    viewModel: AddingMarkerVM = viewModel(),
) {
    Scaffold(
        topBar = {
            TopAppBar(
                title = { Text(MainDestinations.ADDING_MARKERS.title) },
            )
        }
    ) { padding ->
        Column(
            modifier
                .padding(padding)
                .fillMaxSize()) {
            MapUI(
                modifier.weight(2f),
                state = viewModel.state
            )
            Row(verticalAlignment = Alignment.CenterVertically) {
                Button(onClick = {
                    viewModel.addMarker()
                }, Modifier.padding(8.dp)) {
                    Text(text = "Add marker")
                }

                Text("Drag markers with finger")
            }
        }
    }
}

================================================
FILE: demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/screens/AnimationDemo.kt
================================================
@file:OptIn(ExperimentalMaterial3Api::class)

package ovh.plrapps.mapcompose.demo.ui.screens

import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Button
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import ovh.plrapps.mapcompose.demo.ui.MainDestinations
import ovh.plrapps.mapcompose.demo.viewmodels.AnimationDemoVM
import ovh.plrapps.mapcompose.ui.MapUI


@Composable
fun AnimationDemo(
    viewModel: AnimationDemoVM = viewModel(),
    onRestart: () -> Unit = viewModel::startAnimation
) {
    Scaffold(
        topBar = {
            TopAppBar(
                title = { Text(MainDestinations.ANIMATION_DEMO.title) },
            )
        }
    ) { padding ->
        Column(
            Modifier
                .padding(padding)
                .fillMaxSize()) {
            MapUI(
                Modifier.weight(1f),
                state = viewModel.state
            )
            Button(onClick = {
                onRestart()
            }, Modifier.padding(8.dp)) {
                Text(text = "Start")
            }
        }
    }
}


================================================
FILE: demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/screens/CalloutDemo.kt
================================================
@file:OptIn(ExperimentalMaterial3Api::class)

package ovh.plrapps.mapcompose.demo.ui.screens

import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.lifecycle.viewmodel.compose.viewModel
import ovh.plrapps.mapcompose.demo.ui.MainDestinations
import ovh.plrapps.mapcompose.demo.viewmodels.CalloutVM
import ovh.plrapps.mapcompose.ui.MapUI

@Composable
fun CalloutDemo(
    viewModel: CalloutVM = viewModel()
) {
    Scaffold(
        topBar = {
            TopAppBar(
                title = { Text(MainDestinations.CALLOUT_DEMO.title) },
            )
        }
    ) { padding ->
        Column(
            Modifier
                .padding(padding)
                .fillMaxSize()) {
            MapUI(state = viewModel.state)
        }
    }
}


================================================
FILE: demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/screens/CenteringOnMarkerDemo.kt
================================================
@file:OptIn(ExperimentalMaterial3Api::class)

package ovh.plrapps.mapcompose.demo.ui.screens

import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Button
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import ovh.plrapps.mapcompose.demo.ui.MainDestinations
import ovh.plrapps.mapcompose.demo.viewmodels.CenteringOnMarkerVM
import ovh.plrapps.mapcompose.ui.MapUI

@Composable
fun CenteringOnMarkerDemo(
    modifier: Modifier = Modifier,
    viewModel: CenteringOnMarkerVM = viewModel(),
    onCenter: () -> Unit = viewModel::onCenter
) {
    Scaffold(
        topBar = {
            TopAppBar(
                title = { Text(MainDestinations.CENTERING_ON_MARKER.title) },
            )
        }
    ) { padding ->
        Column(
            modifier
                .padding(padding)
                .fillMaxSize()) {
            MapUI(
                modifier.weight(1f),
                state = viewModel.state
            )
            Button(onClick = onCenter, Modifier.padding(8.dp)) {
                Text(text = "Center on marker")
            }
        }
    }
}

================================================
FILE: demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/screens/CustomDraw.kt
================================================
@file:OptIn(ExperimentalMaterial3Api::class)

package ovh.plrapps.mapcompose.demo.ui.screens

import androidx.compose.foundation.Canvas
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableFloatStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.StrokeCap
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import ovh.plrapps.mapcompose.api.DefaultCanvas
import ovh.plrapps.mapcompose.api.fullSize
import ovh.plrapps.mapcompose.api.scale
import ovh.plrapps.mapcompose.demo.ui.MainDestinations
import ovh.plrapps.mapcompose.demo.utils.pxToDp
import ovh.plrapps.mapcompose.demo.viewmodels.CustomDrawVM
import ovh.plrapps.mapcompose.ui.MapUI
import ovh.plrapps.mapcompose.ui.state.MapState
import kotlin.math.log10
import kotlin.math.pow

/**
 * This demo shows how to embed custom drawings inside [MapUI].
 */
@Composable
fun CustomDrawDemo(viewModel: CustomDrawVM = viewModel()) {
    Scaffold(
        topBar = {
            TopAppBar(
                title = { Text(MainDestinations.CUSTOM_DRAW.title) },
            )
        }
    ) { padding ->
        CustomDraw(Modifier.padding(padding), viewModel)
    }
}

/**
 * This demo shows how to embed custom drawings inside [MapUI].
 */
@Composable
private fun CustomDraw(
    modifier: Modifier = Modifier, viewModel: CustomDrawVM
) {
    Box(modifier) {
        MapUI(state = viewModel.state) {
            Square(
                modifier = Modifier,
                mapState = viewModel.state,
                position = Offset(
                    viewModel.state.fullSize.width / 2f - 300f,
                    viewModel.state.fullSize.height / 2f - 300f
                ),
                color = Color(0xff5c6bc0),
                isScaling = true
            )
            Square(
                modifier = Modifier,
                mapState = viewModel.state,
                position = Offset(
                    viewModel.state.fullSize.width / 2f,
                    viewModel.state.fullSize.height / 2f
                ),
                color = Color(0xff087f23),
                isScaling = false
            )
            Line(
                modifier = Modifier,
                mapState = viewModel.state,
                color = Color(0xAAF44336),
                p1 = with(viewModel) {
                    Offset(
                        (p1x * state.fullSize.width).toFloat(),
                        (p1y * state.fullSize.height).toFloat()
                    )
                },
                p2 = with(viewModel) {
                    Offset(
                        (p2x * state.fullSize.width).toFloat(),
                        (p2y * state.fullSize.height).toFloat()
                    )
                }
            )
        }
        ScaleIndicator(
            controller = viewModel.scaleIndicatorController,
            lineColor = Color.Black
        )
    }
}

@Composable
fun ScaleIndicator(
    controller: ScaleIndicatorController,
    lineColor: Color
) {
    Box(Modifier.height(50.dp)) {
        Canvas(
            modifier = Modifier
                .alpha(0.8f)
                .padding(5.dp)
                .size(pxToDp(controller.widthPx).dp, 15.dp)
        ) {
            val width = controller.widthPx * controller.widthRatio
            val height = size.height
            drawLine(lineColor, Offset(0f, height / 2), Offset(width, height / 2), 2.dp.toPx())
            drawLine(
                lineColor,
                Offset(0f, 0f),
                Offset(0f, height),
                2.dp.toPx(),
                cap = StrokeCap.Round
            )
            drawLine(
                lineColor,
                Offset(width, 0f),
                Offset(width, height),
                2.dp.toPx(),
                cap = StrokeCap.Round
            )
        }
        Text(
            text = controller.scaleText,
            color = Color.White,
            modifier = Modifier
                .padding(start = 16.dp, top = 20.dp)
                .background(color = Color(0x885D4037), shape = RoundedCornerShape(4.dp))
                .padding(start = 5.dp, end = 5.dp)
        )
    }
}

class ScaleIndicatorController(val widthPx: Int, initScale: Double) {
    var widthRatio by mutableFloatStateOf(0f)
    var scaleText by mutableStateOf("")

    private var snapScale: Double = initScale
    private var snapWidthRatio = 0f

    init {
        snapToNewValue(initScale)
    }

    fun onScaleChanged(scale: Double) {
        val ratio = (scale / snapScale).toFloat()
        if (widthRatio * ratio in 0.5f..1f) {
            widthRatio = snapWidthRatio * ratio
        } else {
            snapToNewValue(scale)
        }
    }

    private fun snapToNewValue(scale: Double) {
        val distance = distanceForPx(widthPx, scale)
        val snap = computeSnapValue(distance) ?: return
        snapScale = scale
        widthRatio = snap.toFloat() / distance
        snapWidthRatio = widthRatio
        scaleText = formatDistance(snap)
    }

    /**
     * Computes the distance in meters, given a size in pixels.
     */
    private fun distanceForPx(nPx: Int, scale: Double): Int {
        // TODO: This a simplified calculation
        return (widthPx * 5 / scale).toInt()
    }

    private fun formatDistance(d: Int): String {
        return "$d m"
    }

    /**
     * A snap value is an entire multiple of power of 10, which is lower than [input].
     * The first digit of a snap value is either 1, 2, 3, or 5.
     * For example: 835 -> 500, 480 -> 300, 270 -> 200, 114 -> 100
     * The snap value is always greater than half of [input].
     */
    private fun computeSnapValue(input: Int): Int? {
        if (input <= 1) return null

        // Lowest entire power of 10
        val power = (log10(input.toDouble())).toInt()

        val power10 = 10.0.pow(power)
        val mostSignificantDigit = (input / power10).toInt()

        return when {
            mostSignificantDigit >= 5 -> 5 * power10
            mostSignificantDigit >= 3 -> 3 * power10
            mostSignificantDigit >= 2 -> 2 * power10
            else -> power10
        }.toInt()
    }
}


/**
 * Here, we define a square with various inputs such as [position], [color], and [isScaling].
 * Our custom composable is based on [DefaultCanvas], which is provided by the MapCompose library.
 * Since [DefaultCanvas] moves, scales, and rotates with the map, so does our custom square composable.
 */
@Composable
fun Square(
    modifier: Modifier,
    mapState: MapState,
    position: Offset,
    color: Color,
    isScaling: Boolean
) {
    DefaultCanvas(
        modifier = modifier,
        mapState = mapState
    ) {
        val side = if (isScaling) 300f else (300f / mapState.scale).toFloat()
        drawRect(
            color,
            topLeft = position,
            size = Size(side, side)
        )
    }
}

@Composable
fun Line(
    modifier: Modifier,
    mapState: MapState,
    color: Color,
    p1: Offset,
    p2: Offset
) {
    DefaultCanvas(
        modifier = modifier,
        mapState = mapState
    ) {
        drawLine(color, start = p1, end = p2, strokeWidth = (8.0 / mapState.scale).toFloat())
    }
}

================================================
FILE: demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/screens/Home.kt
================================================
@file:OptIn(ExperimentalMaterial3Api::class)

package ovh.plrapps.mapcompose.demo.ui.screens

import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.material3.Button
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import ovh.plrapps.mapcompose.demo.R
import ovh.plrapps.mapcompose.demo.ui.MainDestinations

@Composable
fun Home(demoListState: LazyListState, onDemoSelected: (dest: MainDestinations) -> Unit) {
    Scaffold(
        topBar = {
            TopAppBar(
                title = { Text(stringResource(R.string.app_name)) },
            )
        }
    ) { padding ->
        LazyColumn(
            Modifier.padding(padding).fillMaxWidth(),
            state = demoListState,
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            MainDestinations.entries.map { dest ->
                item {
                    Button(
                        onClick = { onDemoSelected.invoke(dest) }
                    ) {
                        Text(text = dest.title)
                    }
                }
            }
        }
    }
}

================================================
FILE: demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/screens/HttpTilesDemo.kt
================================================
@file:OptIn(ExperimentalMaterial3Api::class)

package ovh.plrapps.mapcompose.demo.ui.screens

import androidx.compose.foundation.layout.padding
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.lifecycle.viewmodel.compose.viewModel
import ovh.plrapps.mapcompose.demo.ui.MainDestinations
import ovh.plrapps.mapcompose.demo.viewmodels.HttpTilesVM
import ovh.plrapps.mapcompose.ui.MapUI

@Composable
fun HttpTilesDemo(
    modifier: Modifier = Modifier, viewModel: HttpTilesVM = viewModel()
) {
    Scaffold(
        topBar = {
            TopAppBar(
                title = { Text(MainDestinations.HTTP_TILES_DEMO.title) },
            )
        }
    ) { padding ->
        MapUI(
            modifier.padding(padding),
            state = viewModel.state
        )
    }
}

================================================
FILE: demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/screens/InfiniteScrollDemo.kt
================================================
@file:OptIn(ExperimentalMaterial3Api::class)

package ovh.plrapps.mapcompose.demo.ui.screens

import androidx.compose.foundation.layout.padding
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.lifecycle.viewmodel.compose.viewModel
import ovh.plrapps.mapcompose.demo.ui.MainDestinations
import ovh.plrapps.mapcompose.demo.viewmodels.InfiniteScrollVM
import ovh.plrapps.mapcompose.ui.MapUI


@Composable
fun InfiniteScrollDemo(
    modifier: Modifier = Modifier, viewModel: InfiniteScrollVM = viewModel()
) {
    Scaffold(
        topBar = {
            TopAppBar(
                title = { Text(MainDestinations.INFINITE_SCROLL.title) },
            )
        }
    ) { padding ->
        MapUI(modifier.padding(padding), state = viewModel.state)
    }
}


================================================
FILE: demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/screens/LayersDemo.kt
================================================
@file:OptIn(ExperimentalMaterial3Api::class)

package ovh.plrapps.mapcompose.demo.ui.screens

import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Slider
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableFloatStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import ovh.plrapps.mapcompose.demo.ui.MainDestinations
import ovh.plrapps.mapcompose.demo.viewmodels.LayersVM
import ovh.plrapps.mapcompose.ui.MapUI
import ovh.plrapps.mapcompose.ui.state.MapState

@Composable
fun LayersDemoSimple(viewModel: LayersVM = viewModel()) {
    Scaffold(
        topBar = {
            TopAppBar(
                title = { Text(MainDestinations.LAYERS_DEMO.title) },
            )
        }
    ) { padding ->
        LayersDemoScreen(
            Modifier.padding(padding),
            viewModel.state,
            onSlopesOpacity = viewModel::setSlopesOpacity,
            onRoadOpacity = viewModel::setRoadOpacity
        )
    }
}

@Composable
fun LayersDemoScreen(
    modifier: Modifier = Modifier,
    mapState: MapState,
    onSlopesOpacity: (Float) -> Unit,
    onRoadOpacity: (Float) -> Unit
) {
    var slopesSliderValue by remember {
        mutableFloatStateOf(0.6f)
    }

    var roadSliderValue by remember {
        mutableFloatStateOf(1f)
    }

    Column(modifier) {
        MapUI(Modifier.weight(1f), state = mapState)
        LayerSlider(
            name = "Slopes",
            value = slopesSliderValue,
            onValueChange = {
                slopesSliderValue = it
                onSlopesOpacity(it)
            }
        )
        LayerSlider(
            name = "Roads",
            value = roadSliderValue,
            onValueChange = {
                roadSliderValue = it
                onRoadOpacity(it)
            }
        )
    }
}

@Composable
private fun LayerSlider(name: String, value: Float, onValueChange: (Float) -> Unit) {
    Row(
        Modifier
            .height(50.dp)
            .padding(horizontal = 16.dp)) {
        Row(verticalAlignment = Alignment.CenterVertically) {
            Text(text = name, Modifier.padding(horizontal = 16.dp))
            Slider(
                value = value,
                onValueChange = onValueChange
            )
        }
    }
}

================================================
FILE: demo/src/main/java/ovh/
Download .txt
gitextract_n5gon859/

├── .gitignore
├── LICENSE
├── Readme.md
├── build.gradle
├── demo/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── assets/
│       │   │   └── tracks/
│       │   │       ├── track1.txt
│       │   │       ├── track2.txt
│       │   │       └── track3.txt
│       │   ├── java/
│       │   │   └── ovh/
│       │   │       └── plrapps/
│       │   │           └── mapcompose/
│       │   │               └── demo/
│       │   │                   ├── MainActivity.kt
│       │   │                   ├── providers/
│       │   │                   │   └── TileStreamProviderFactory.kt
│       │   │                   ├── ui/
│       │   │                   │   ├── MapComposeDemoApp.kt
│       │   │                   │   ├── NavGraph.kt
│       │   │                   │   ├── screens/
│       │   │                   │   │   ├── AddingMarkerDemo.kt
│       │   │                   │   │   ├── AnimationDemo.kt
│       │   │                   │   │   ├── CalloutDemo.kt
│       │   │                   │   │   ├── CenteringOnMarkerDemo.kt
│       │   │                   │   │   ├── CustomDraw.kt
│       │   │                   │   │   ├── Home.kt
│       │   │                   │   │   ├── HttpTilesDemo.kt
│       │   │                   │   │   ├── InfiniteScrollDemo.kt
│       │   │                   │   │   ├── LayersDemo.kt
│       │   │                   │   │   ├── MarkersClusteringDemo.kt
│       │   │                   │   │   ├── MarkersLazyLoadingDemo.kt
│       │   │                   │   │   ├── OsmDemo.kt
│       │   │                   │   │   ├── PathsDemo.kt
│       │   │                   │   │   ├── RotationDemo.kt
│       │   │                   │   │   ├── SimpleDemo.kt
│       │   │                   │   │   └── VisibleAreaPaddingDemo.kt
│       │   │                   │   ├── theme/
│       │   │                   │   │   ├── Color.kt
│       │   │                   │   │   ├── Theme.kt
│       │   │                   │   │   └── Type.kt
│       │   │                   │   └── widgets/
│       │   │                   │       ├── Callout.kt
│       │   │                   │       └── Marker.kt
│       │   │                   ├── utils/
│       │   │                   │   ├── Metrics.kt
│       │   │                   │   ├── Random.kt
│       │   │                   │   └── WebMercator.kt
│       │   │                   └── viewmodels/
│       │   │                       ├── AddingMarkerVM.kt
│       │   │                       ├── AnimationDemoVM.kt
│       │   │                       ├── CalloutVM.kt
│       │   │                       ├── CenteringOnMarkerVM.kt
│       │   │                       ├── CustomDrawVM.kt
│       │   │                       ├── HttpTilesVM.kt
│       │   │                       ├── InfiniteScrollVM.kt
│       │   │                       ├── LayersVM.kt
│       │   │                       ├── MarkersClusteringVM.kt
│       │   │                       ├── MarkersLazyLoadingVM.kt
│       │   │                       ├── OsmVM.kt
│       │   │                       ├── PathsVM.kt
│       │   │                       ├── RotationVM.kt
│       │   │                       ├── SimpleDemoVM.kt
│       │   │                       └── VisibleAreaPaddingVM.kt
│       │   └── res/
│       │       ├── drawable/
│       │       │   ├── ic_launcher_background.xml
│       │       │   └── map_marker.xml
│       │       ├── drawable-v24/
│       │       │   └── ic_launcher_foreground.xml
│       │       ├── mipmap-anydpi-v26/
│       │       │   ├── ic_launcher.xml
│       │       │   └── ic_launcher_round.xml
│       │       └── values/
│       │           ├── colors.xml
│       │           ├── strings.xml
│       │           └── themes.xml
│       └── test/
│           └── java/
│               └── ovh/
│                   └── plrapps/
│                       └── mapcompose/
│                           └── demo/
│                               └── utils/
│                                   └── WebMercatorTest.kt
├── doc/
│   └── mapcompose/
│       └── MapCompose.drawio
├── gradle/
│   ├── gradle-daemon-jvm.properties
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── mapcompose/
│   ├── build.gradle
│   ├── gradle.properties
│   └── src/
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   └── java/
│       │       └── ovh/
│       │           └── plrapps/
│       │               └── mapcompose/
│       │                   ├── api/
│       │                   │   ├── Annotation.kt
│       │                   │   ├── ApiDefaults.kt
│       │                   │   ├── Common.kt
│       │                   │   ├── DefaultCanvas.kt
│       │                   │   ├── GesturesApi.kt
│       │                   │   ├── LayerApi.kt
│       │                   │   ├── LayoutApi.kt
│       │                   │   ├── MarkerApi.kt
│       │                   │   ├── Model.kt
│       │                   │   ├── PathApi.kt
│       │                   │   ├── RenderApi.kt
│       │                   │   └── UtilsApi.kt
│       │                   ├── core/
│       │                   │   ├── ColorFilterProvider.kt
│       │                   │   ├── Debounce.kt
│       │                   │   ├── GestureConfiguration.kt
│       │                   │   ├── Layer.kt
│       │                   │   ├── Throttle.kt
│       │                   │   ├── Tile.kt
│       │                   │   ├── TileCollector.kt
│       │                   │   ├── TileStreamProvider.kt
│       │                   │   ├── Viewport.kt
│       │                   │   └── VisibleTilesResolver.kt
│       │                   ├── ui/
│       │                   │   ├── MapUI.kt
│       │                   │   ├── gestures/
│       │                   │   │   ├── GestureDetector.kt
│       │                   │   │   ├── TapGestureDetector.kt
│       │                   │   │   └── model/
│       │                   │   │       └── HitType.kt
│       │                   │   ├── layout/
│       │                   │   │   ├── MinimumScaleMode.kt
│       │                   │   │   ├── Rendering.kt
│       │                   │   │   └── ZoomPanRotate.kt
│       │                   │   ├── markers/
│       │                   │   │   ├── Clusterer.kt
│       │                   │   │   ├── LazyLoader.kt
│       │                   │   │   ├── MarkerComposer.kt
│       │                   │   │   └── MarkerLayout.kt
│       │                   │   ├── paths/
│       │                   │   │   ├── PathComposer.kt
│       │                   │   │   ├── RamerDouglaPeucker.kt
│       │                   │   │   └── model/
│       │                   │   │       ├── Cap.kt
│       │                   │   │       └── PatternItem.kt
│       │                   │   ├── state/
│       │                   │   │   ├── MapState.kt
│       │                   │   │   ├── PathState.kt
│       │                   │   │   ├── TileCanvasState.kt
│       │                   │   │   ├── ZoomPanRotateState.kt
│       │                   │   │   └── markers/
│       │                   │   │       ├── MarkerRenderState.kt
│       │                   │   │       ├── MarkerState.kt
│       │                   │   │       └── model/
│       │                   │   │           ├── ClusterClickBehavior.kt
│       │                   │   │           ├── MarkerData.kt
│       │                   │   │           ├── MarkerType.kt
│       │                   │   │           └── RenderingStrategy.kt
│       │                   │   └── view/
│       │                   │       └── TileCanvas.kt
│       │                   └── utils/
│       │                       ├── AnimUtils.kt
│       │                       ├── ApiUtils.kt
│       │                       ├── BoundingBoxUtils.kt
│       │                       ├── Collections.kt
│       │                       ├── Dp.kt
│       │                       ├── Flow.kt
│       │                       ├── Geometry.kt
│       │                       ├── Point.kt
│       │                       ├── RotationUtils.kt
│       │                       └── VisibleAreaUtils.kt
│       └── test/
│           └── java/
│               └── ovh/
│                   └── plrapps/
│                       └── mapcompose/
│                           ├── core/
│                           │   ├── TileCollectorTest.kt
│                           │   └── VisibleTilesResolverTest.kt
│                           ├── state/
│                           │   └── TileCanvasStateTest.kt
│                           ├── ui/
│                           │   └── paths/
│                           │       └── PathComposerTest.kt
│                           └── utils/
│                               ├── GeometryTest.kt
│                               └── VisibleAreaUtilsTest.kt
├── settings.gradle
└── testapp/
    ├── .gitignore
    ├── build.gradle
    ├── proguard-rules.pro
    └── src/
        ├── main/
        │   ├── AndroidManifest.xml
        │   ├── java/
        │   │   └── ovh/
        │   │       └── plrapps/
        │   │           └── mapcompose/
        │   │               └── testapp/
        │   │                   ├── MainActivity.kt
        │   │                   ├── core/
        │   │                   │   └── ui/
        │   │                   │       ├── MapComposeTestApp.kt
        │   │                   │       ├── nav/
        │   │                   │       │   └── NavDestinations.kt
        │   │                   │       └── theme/
        │   │                   │           ├── Color.kt
        │   │                   │           ├── Theme.kt
        │   │                   │           └── Type.kt
        │   │                   ├── features/
        │   │                   │   ├── clustering/
        │   │                   │   │   ├── MarkerClusteringUi.kt
        │   │                   │   │   └── MarkersClusteringViewModel.kt
        │   │                   │   ├── home/
        │   │                   │   │   └── Home.kt
        │   │                   │   └── layerswitch/
        │   │                   │       ├── LayerSwitchTest.kt
        │   │                   │       └── LayerSwitchViewModel.kt
        │   │                   └── utils/
        │   │                       └── Random.kt
        │   └── res/
        │       ├── drawable/
        │       │   ├── ic_launcher_background.xml
        │       │   └── map_marker.xml
        │       ├── drawable-v24/
        │       │   └── ic_launcher_foreground.xml
        │       ├── mipmap-anydpi-v26/
        │       │   ├── ic_launcher.xml
        │       │   └── ic_launcher_round.xml
        │       └── values/
        │           ├── colors.xml
        │           ├── strings.xml
        │           └── themes.xml
        └── test/
            └── java/
                └── ovh/
                    └── plrapps/
                        └── mapcompose/
                            └── testapp/
                                └── ExampleUnitTest.kt
Condensed preview — 163 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (704K chars).
[
  {
    "path": ".gitignore",
    "chars": 287,
    "preview": "*.iml\n.gradle\n/local.properties\n/.idea/caches\n/.idea/libraries\n/.idea/modules.xml\n/.idea/workspace.xml\n/.idea/navEditor."
  },
  {
    "path": "LICENSE",
    "chars": 11357,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "Readme.md",
    "chars": 11882,
    "preview": "[![Maven Central](https://img.shields.io/maven-central/v/ovh.plrapps/mapcompose)](https://central.sonatype.com/artifact/"
  },
  {
    "path": "build.gradle",
    "chars": 562,
    "preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\nbuildscript {\n    ex"
  },
  {
    "path": "demo/.gitignore",
    "chars": 6,
    "preview": "/build"
  },
  {
    "path": "demo/build.gradle",
    "chars": 2132,
    "preview": "import org.jetbrains.kotlin.gradle.dsl.JvmTarget\n\nplugins {\n    id 'com.android.application'\n    id 'kotlin-android'\n   "
  },
  {
    "path": "demo/proguard-rules.pro",
    "chars": 750,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "demo/src/main/AndroidManifest.xml",
    "chars": 916,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <uses-"
  },
  {
    "path": "demo/src/main/assets/tracks/track1.txt",
    "chars": 11221,
    "preview": "0.6044638908531056,0.23086354170969253\n0.6044638908531056,0.230781790986988\n0.6075361613235069,0.22873802292007173\n0.610"
  },
  {
    "path": "demo/src/main/assets/tracks/track2.txt",
    "chars": 107544,
    "preview": "0.5442701471922805,0.22415998245007007\n0.5441563593970797,0.22415998245007007\n0.5443839349874813,0.22407823172736555\n0.5"
  },
  {
    "path": "demo/src/main/assets/tracks/track3.txt",
    "chars": 23928,
    "preview": "0.4961379098226587,0.3391014985361062\n0.5002342704498619,0.33877449564540424\n0.5047288883602654,0.3378752376959448\n0.505"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/MainActivity.kt",
    "chars": 816,
    "preview": "package ovh.plrapps.mapcompose.demo\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/providers/TileStreamProviderFactory.kt",
    "chars": 396,
    "preview": "package ovh.plrapps.mapcompose.demo.providers\n\nimport android.content.Context\nimport ovh.plrapps.mapcompose.core.TileStr"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/MapComposeDemoApp.kt",
    "chars": 3374,
    "preview": "package ovh.plrapps.mapcompose.demo.ui\n\nimport androidx.compose.foundation.lazy.rememberLazyListState\nimport androidx.co"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/NavGraph.kt",
    "chars": 750,
    "preview": "package ovh.plrapps.mapcompose.demo.ui\n\nconst val HOME = \"home\"\n\nenum class MainDestinations(val title: String) {\n    MA"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/screens/AddingMarkerDemo.kt",
    "chars": 1718,
    "preview": "@file:OptIn(ExperimentalMaterial3Api::class)\n\npackage ovh.plrapps.mapcompose.demo.ui.screens\n\nimport androidx.compose.fo"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/screens/AnimationDemo.kt",
    "chars": 1490,
    "preview": "@file:OptIn(ExperimentalMaterial3Api::class)\n\npackage ovh.plrapps.mapcompose.demo.ui.screens\n\nimport androidx.compose.fo"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/screens/CalloutDemo.kt",
    "chars": 1124,
    "preview": "@file:OptIn(ExperimentalMaterial3Api::class)\n\npackage ovh.plrapps.mapcompose.demo.ui.screens\n\nimport androidx.compose.fo"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/screens/CenteringOnMarkerDemo.kt",
    "chars": 1513,
    "preview": "@file:OptIn(ExperimentalMaterial3Api::class)\n\npackage ovh.plrapps.mapcompose.demo.ui.screens\n\nimport androidx.compose.fo"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/screens/CustomDraw.kt",
    "chars": 8015,
    "preview": "@file:OptIn(ExperimentalMaterial3Api::class)\n\npackage ovh.plrapps.mapcompose.demo.ui.screens\n\nimport androidx.compose.fo"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/screens/Home.kt",
    "chars": 1551,
    "preview": "@file:OptIn(ExperimentalMaterial3Api::class)\n\npackage ovh.plrapps.mapcompose.demo.ui.screens\n\nimport androidx.compose.fo"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/screens/HttpTilesDemo.kt",
    "chars": 1002,
    "preview": "@file:OptIn(ExperimentalMaterial3Api::class)\n\npackage ovh.plrapps.mapcompose.demo.ui.screens\n\nimport androidx.compose.fo"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/screens/InfiniteScrollDemo.kt",
    "chars": 985,
    "preview": "@file:OptIn(ExperimentalMaterial3Api::class)\n\npackage ovh.plrapps.mapcompose.demo.ui.screens\n\nimport androidx.compose.fo"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/screens/LayersDemo.kt",
    "chars": 2852,
    "preview": "@file:OptIn(ExperimentalMaterial3Api::class)\n\npackage ovh.plrapps.mapcompose.demo.ui.screens\n\nimport androidx.compose.fo"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/screens/MarkersClusteringDemo.kt",
    "chars": 999,
    "preview": "@file:OptIn(ExperimentalMaterial3Api::class)\n\npackage ovh.plrapps.mapcompose.demo.ui.screens\n\nimport androidx.compose.fo"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/screens/MarkersLazyLoadingDemo.kt",
    "chars": 1004,
    "preview": "@file:OptIn(ExperimentalMaterial3Api::class)\n\npackage ovh.plrapps.mapcompose.demo.ui.screens\n\nimport androidx.compose.fo"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/screens/OsmDemo.kt",
    "chars": 977,
    "preview": "@file:OptIn(ExperimentalMaterial3Api::class)\n\npackage ovh.plrapps.mapcompose.demo.ui.screens\n\nimport androidx.compose.fo"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/screens/PathsDemo.kt",
    "chars": 980,
    "preview": "@file:OptIn(ExperimentalMaterial3Api::class)\n\npackage ovh.plrapps.mapcompose.demo.ui.screens\n\nimport androidx.compose.fo"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/screens/RotationDemo.kt",
    "chars": 2218,
    "preview": "@file:OptIn(ExperimentalMaterial3Api::class)\n\npackage ovh.plrapps.mapcompose.demo.ui.screens\n\nimport androidx.compose.fo"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/screens/SimpleDemo.kt",
    "chars": 966,
    "preview": "@file:OptIn(ExperimentalMaterial3Api::class)\n\npackage ovh.plrapps.mapcompose.demo.ui.screens\n\nimport androidx.compose.fo"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/screens/VisibleAreaPaddingDemo.kt",
    "chars": 8078,
    "preview": "@file:OptIn(ExperimentalMaterial3Api::class)\n\npackage ovh.plrapps.mapcompose.demo.ui.screens\n\nimport androidx.compose.an"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/theme/Color.kt",
    "chars": 10906,
    "preview": "package ovh.plrapps.mapcompose.demo.ui.theme\n\nimport androidx.compose.ui.graphics.Color\n\nval primaryLight = Color(0xFF41"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/theme/Theme.kt",
    "chars": 12048,
    "preview": "package ovh.plrapps.mapcompose.demo.ui.theme\n\nimport android.os.Build\nimport androidx.compose.foundation.isSystemInDarkT"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/theme/Type.kt",
    "chars": 125,
    "preview": "package ovh.plrapps.mapcompose.demo.ui.theme\n\nimport androidx.compose.material3.Typography\n\nval AppTypography = Typograp"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/widgets/Callout.kt",
    "chars": 2885,
    "preview": "package ovh.plrapps.mapcompose.demo.ui.widgets\n\nimport android.animation.TimeInterpolator\nimport android.view.animation."
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/ui/widgets/Marker.kt",
    "chars": 565,
    "preview": "package ovh.plrapps.mapcompose.demo.ui.widgets\n\nimport androidx.compose.foundation.layout.size\nimport androidx.compose.m"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/utils/Metrics.kt",
    "chars": 337,
    "preview": "package ovh.plrapps.mapcompose.demo.utils\n\nimport android.content.res.Resources\n\n/**\n * Convert px to dp\n */\nfun pxToDp("
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/utils/Random.kt",
    "chars": 224,
    "preview": "package ovh.plrapps.mapcompose.demo.utils\n\nimport kotlin.random.Random.Default.nextDouble\n\nfun randomDouble(center: Doub"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/utils/WebMercator.kt",
    "chars": 1640,
    "preview": "package ovh.plrapps.mapcompose.demo.utils\n\nimport kotlin.math.PI\nimport kotlin.math.atan\nimport kotlin.math.exp\nimport k"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/viewmodels/AddingMarkerVM.kt",
    "chars": 1913,
    "preview": "package ovh.plrapps.mapcompose.demo.viewmodels\n\nimport android.app.Application\nimport androidx.compose.foundation.layout"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/viewmodels/AnimationDemoVM.kt",
    "chars": 2414,
    "preview": "package ovh.plrapps.mapcompose.demo.viewmodels\n\nimport android.app.Application\nimport androidx.compose.animation.core.Fa"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/viewmodels/CalloutVM.kt",
    "chars": 3139,
    "preview": "package ovh.plrapps.mapcompose.demo.viewmodels\n\nimport android.app.Application\nimport androidx.compose.foundation.layout"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/viewmodels/CenteringOnMarkerVM.kt",
    "chars": 1552,
    "preview": "package ovh.plrapps.mapcompose.demo.viewmodels\n\nimport android.app.Application\nimport androidx.compose.foundation.layout"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/viewmodels/CustomDrawVM.kt",
    "chars": 3246,
    "preview": "package ovh.plrapps.mapcompose.demo.viewmodels\n\nimport android.app.Application\nimport androidx.compose.foundation.backgr"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/viewmodels/HttpTilesVM.kt",
    "chars": 1512,
    "preview": "package ovh.plrapps.mapcompose.demo.viewmodels\n\nimport androidx.lifecycle.ViewModel\nimport ovh.plrapps.mapcompose.api.ad"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/viewmodels/InfiniteScrollVM.kt",
    "chars": 1049,
    "preview": "package ovh.plrapps.mapcompose.demo.viewmodels\n\nimport android.app.Application\nimport android.content.Context\nimport and"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/viewmodels/LayersVM.kt",
    "chars": 2098,
    "preview": "package ovh.plrapps.mapcompose.demo.viewmodels\n\nimport android.app.Application\nimport android.content.Context\nimport and"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/viewmodels/MarkersClusteringVM.kt",
    "chars": 3517,
    "preview": "package ovh.plrapps.mapcompose.demo.viewmodels\n\nimport android.app.Application\nimport androidx.compose.foundation.backgr"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/viewmodels/MarkersLazyLoadingVM.kt",
    "chars": 2624,
    "preview": "package ovh.plrapps.mapcompose.demo.viewmodels\n\nimport android.app.Application\nimport androidx.compose.foundation.layout"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/viewmodels/OsmVM.kt",
    "chars": 2658,
    "preview": "package ovh.plrapps.mapcompose.demo.viewmodels\n\nimport androidx.compose.foundation.layout.size\nimport androidx.compose.m"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/viewmodels/PathsVM.kt",
    "chars": 4358,
    "preview": "package ovh.plrapps.mapcompose.demo.viewmodels\n\nimport android.app.Application\nimport androidx.compose.runtime.getValue\n"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/viewmodels/RotationVM.kt",
    "chars": 1333,
    "preview": "package ovh.plrapps.mapcompose.demo.viewmodels\n\nimport android.app.Application\nimport androidx.lifecycle.AndroidViewMode"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/viewmodels/SimpleDemoVM.kt",
    "chars": 728,
    "preview": "package ovh.plrapps.mapcompose.demo.viewmodels\n\nimport android.app.Application\nimport androidx.lifecycle.AndroidViewMode"
  },
  {
    "path": "demo/src/main/java/ovh/plrapps/mapcompose/demo/viewmodels/VisibleAreaPaddingVM.kt",
    "chars": 800,
    "preview": "package ovh.plrapps.mapcompose.demo.viewmodels\n\nimport android.app.Application\nimport androidx.lifecycle.AndroidViewMode"
  },
  {
    "path": "demo/src/main/res/drawable/ic_launcher_background.xml",
    "chars": 5606,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "demo/src/main/res/drawable/map_marker.xml",
    "chars": 435,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:height=\"24dp\"\n        android:width=\""
  },
  {
    "path": "demo/src/main/res/drawable-v24/ic_launcher_foreground.xml",
    "chars": 1702,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    "
  },
  {
    "path": "demo/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "chars": 272,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <b"
  },
  {
    "path": "demo/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "chars": 272,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <b"
  },
  {
    "path": "demo/src/main/res/values/colors.xml",
    "chars": 378,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"purple_200\">#FFBB86FC</color>\n    <color name=\"purpl"
  },
  {
    "path": "demo/src/main/res/values/strings.xml",
    "chars": 77,
    "preview": "<resources>\n    <string name=\"app_name\">MapCompose Demo</string>\n</resources>"
  },
  {
    "path": "demo/src/main/res/values/themes.xml",
    "chars": 155,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"Theme.MyApplication\" parent=\"android:Theme.Material"
  },
  {
    "path": "demo/src/test/java/ovh/plrapps/mapcompose/demo/utils/WebMercatorTest.kt",
    "chars": 497,
    "preview": "package ovh.plrapps.mapcompose.demo.utils\n\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\n\n\nclass WebMercato"
  },
  {
    "path": "doc/mapcompose/MapCompose.drawio",
    "chars": 3985,
    "preview": "<mxfile modified=\"2021-06-28T06:43:05.033Z\" host=\"app.diagrams.net\" agent=\"5.0 (X11; Linux x86_64) AppleWebKit/537.36 (K"
  },
  {
    "path": "gradle/gradle-daemon-jvm.properties",
    "chars": 1164,
    "preview": "#This file is generated by updateDaemonJvm\ntoolchainUrl.FREE_BSD.AARCH64=https\\://api.foojay.io/disco/v3.0/ids/29ee363f7"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "chars": 233,
    "preview": "#Wed Apr 21 20:01:30 CEST 2021\ndistributionBase=GRADLE_USER_HOME\ndistributionUrl=https\\://services.gradle.org/distributi"
  },
  {
    "path": "gradle.properties",
    "chars": 1641,
    "preview": "# Project-wide Gradle settings.\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will ov"
  },
  {
    "path": "gradlew",
    "chars": 5296,
    "preview": "#!/usr/bin/env sh\n\n##############################################################################\n##\n##  Gradle start up"
  },
  {
    "path": "gradlew.bat",
    "chars": 2176,
    "preview": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem "
  },
  {
    "path": "mapcompose/build.gradle",
    "chars": 3203,
    "preview": "import com.vanniktech.maven.publish.AndroidSingleVariantLibrary\nimport org.jetbrains.kotlin.gradle.dsl.JvmTarget\n\nplugin"
  },
  {
    "path": "mapcompose/gradle.properties",
    "chars": 721,
    "preview": "GROUP=ovh.plrapps\nVERSION_NAME=3.2.7\nARTIFACT_ID=mapcompose\n\nPOM_NAME=MapCompose\nPOM_ARTIFACT_ID=library\nPOM_DESCRIPTION"
  },
  {
    "path": "mapcompose/src/main/AndroidManifest.xml",
    "chars": 72,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" />\n"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/api/Annotation.kt",
    "chars": 357,
    "preview": "package ovh.plrapps.mapcompose.api\n\n@RequiresOptIn(message = \"This API is experimental. It is likely to change before be"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/api/ApiDefaults.kt",
    "chars": 130,
    "preview": "package ovh.plrapps.mapcompose.api\n\ninternal const val maxAnimationsRetries = 6\ninternal const val animationsRetriesInte"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/api/Common.kt",
    "chars": 830,
    "preview": "package ovh.plrapps.mapcompose.api\n\nimport androidx.compose.ui.unit.IntOffset\nimport ovh.plrapps.mapcompose.ui.state.Vis"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/api/DefaultCanvas.kt",
    "chars": 1694,
    "preview": "package ovh.plrapps.mapcompose.api\n\nimport androidx.compose.foundation.Canvas\nimport androidx.compose.runtime.Composable"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/api/GesturesApi.kt",
    "chars": 2622,
    "preview": "@file:Suppress(\"unused\")\n\npackage ovh.plrapps.mapcompose.api\n\nimport androidx.compose.ui.platform.ViewConfiguration\nimpo"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/api/LayerApi.kt",
    "chars": 5848,
    "preview": "@file:Suppress(\"unused\")\n\npackage ovh.plrapps.mapcompose.api\n\nimport ovh.plrapps.mapcompose.core.*\nimport ovh.plrapps.ma"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/api/LayoutApi.kt",
    "chars": 22070,
    "preview": "@file:Suppress(\"unused\")\n\npackage ovh.plrapps.mapcompose.api\n\nimport androidx.compose.animation.core.AnimationSpec\nimpor"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/api/MarkerApi.kt",
    "chars": 24485,
    "preview": "@file:Suppress(\"unused\")\n\npackage ovh.plrapps.mapcompose.api\n\nimport androidx.compose.animation.core.Animatable\nimport a"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/api/Model.kt",
    "chars": 2558,
    "preview": "package ovh.plrapps.mapcompose.api\n\nimport ovh.plrapps.mapcompose.core.Layer\nimport ovh.plrapps.mapcompose.core.TileStre"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/api/PathApi.kt",
    "chars": 10730,
    "preview": "@file:Suppress(\"unused\")\n\npackage ovh.plrapps.mapcompose.api\n\nimport androidx.compose.ui.graphics.Color\nimport androidx."
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/api/RenderApi.kt",
    "chars": 3061,
    "preview": "@file:Suppress(\"unused\")\n\npackage ovh.plrapps.mapcompose.api\n\nimport androidx.compose.ui.graphics.Color\nimport androidx."
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/api/UtilsApi.kt",
    "chars": 833,
    "preview": "@file:Suppress(\"unused\")\n\npackage ovh.plrapps.mapcompose.api\n\nimport ovh.plrapps.mapcompose.ui.state.MapState\nimport ovh"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/core/ColorFilterProvider.kt",
    "chars": 320,
    "preview": "package ovh.plrapps.mapcompose.core\n\nimport androidx.compose.ui.graphics.ColorFilter\n\n\n/**\n * Provides a [ColorFilter] f"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/core/Debounce.kt",
    "chars": 932,
    "preview": "package ovh.plrapps.mapcompose.core\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.FlowPreview\nimpo"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/core/GestureConfiguration.kt",
    "chars": 565,
    "preview": "package ovh.plrapps.mapcompose.core\n\nimport android.view.ViewConfiguration\n\n/**\n * Configuration of various gestures.\n *"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/core/Layer.kt",
    "chars": 476,
    "preview": "package ovh.plrapps.mapcompose.core\n\nimport java.util.*\n\ninternal data class Layer(\n    val id: String,\n    val tileStre"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/core/Throttle.kt",
    "chars": 810,
    "preview": "package ovh.plrapps.mapcompose.core\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.channels.Channel"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/core/Tile.kt",
    "chars": 1511,
    "preview": "package ovh.plrapps.mapcompose.core\n\nimport android.graphics.Bitmap\nimport androidx.compose.runtime.getValue\nimport andr"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/core/TileCollector.kt",
    "chars": 12865,
    "preview": "package ovh.plrapps.mapcompose.core\n\nimport android.graphics.Bitmap\nimport android.graphics.Bitmap.Config\nimport android"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/core/TileStreamProvider.kt",
    "chars": 1046,
    "preview": "package ovh.plrapps.mapcompose.core\n\nimport java.io.InputStream\n\n/**\n * Defines how tiles should be fetched. It must be "
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/core/Viewport.kt",
    "chars": 284,
    "preview": "package ovh.plrapps.mapcompose.core\n\nimport ovh.plrapps.mapcompose.utils.AngleRad\n\n\n/**\n * Denotes an area on the screen"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/core/VisibleTilesResolver.kt",
    "chars": 11106,
    "preview": "package ovh.plrapps.mapcompose.core\n\nimport ovh.plrapps.mapcompose.utils.rotateX\nimport ovh.plrapps.mapcompose.utils.rot"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/ui/MapUI.kt",
    "chars": 1965,
    "preview": "package ovh.plrapps.mapcompose.ui\n\nimport androidx.compose.foundation.background\nimport androidx.compose.runtime.Composa"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/ui/gestures/GestureDetector.kt",
    "chars": 7519,
    "preview": "package ovh.plrapps.mapcompose.ui.gestures\n\nimport androidx.compose.foundation.gestures.*\nimport androidx.compose.ui.geo"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/ui/gestures/TapGestureDetector.kt",
    "chars": 9917,
    "preview": "package ovh.plrapps.mapcompose.ui.gestures\n\nimport androidx.compose.foundation.gestures.GestureCancellationException\nimp"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/ui/gestures/model/HitType.kt",
    "chars": 93,
    "preview": "package ovh.plrapps.mapcompose.ui.gestures.model\n\nenum class HitType {\n    Click, LongPress\n}"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/ui/layout/MinimumScaleMode.kt",
    "chars": 479,
    "preview": "package ovh.plrapps.mapcompose.ui.layout\n\nsealed class MinimumScaleMode\n\n/**\n * Limit the minimum scale to no less than "
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/ui/layout/Rendering.kt",
    "chars": 119,
    "preview": "package ovh.plrapps.mapcompose.ui.layout\n\n/* We assume no device has a screen wider than this */\nconst val grid = 65536"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/ui/layout/ZoomPanRotate.kt",
    "chars": 4562,
    "preview": "package ovh.plrapps.mapcompose.ui.layout\n\nimport androidx.compose.animation.core.DecayAnimationSpec\nimport androidx.comp"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/ui/markers/Clusterer.kt",
    "chars": 19871,
    "preview": "package ovh.plrapps.mapcompose.ui.markers\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.sn"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/ui/markers/LazyLoader.kt",
    "chars": 3622,
    "preview": "package ovh.plrapps.mapcompose.ui.markers\n\nimport androidx.compose.ui.unit.Dp\nimport androidx.compose.ui.unit.IntOffset\n"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/ui/markers/MarkerComposer.kt",
    "chars": 6895,
    "preview": "package ovh.plrapps.mapcompose.ui.markers\n\nimport androidx.compose.foundation.gestures.detectDragGestures\nimport android"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/ui/markers/MarkerLayout.kt",
    "chars": 5526,
    "preview": "package ovh.plrapps.mapcompose.ui.markers\n\nimport androidx.compose.foundation.background\nimport androidx.compose.foundat"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/ui/paths/PathComposer.kt",
    "chars": 13092,
    "preview": "package ovh.plrapps.mapcompose.ui.paths\n\nimport android.graphics.DashPathEffect\nimport android.graphics.Paint\nimport and"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/ui/paths/RamerDouglaPeucker.kt",
    "chars": 1956,
    "preview": "package ovh.plrapps.mapcompose.ui.paths\n\nimport ovh.plrapps.mapcompose.utils.Point\nimport kotlin.math.hypot\n\n\ninternal f"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/ui/paths/model/Cap.kt",
    "chars": 378,
    "preview": "package ovh.plrapps.mapcompose.ui.paths.model\n\nenum class Cap  {\n    /** The stroke ends with the path, and does not pro"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/ui/paths/model/PatternItem.kt",
    "chars": 246,
    "preview": "package ovh.plrapps.mapcompose.ui.paths.model\n\nimport androidx.compose.ui.unit.Dp\n\nsealed interface PatternItem {\n    da"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/ui/state/MapState.kt",
    "chars": 12506,
    "preview": "package ovh.plrapps.mapcompose.ui.state\n\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutabl"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/ui/state/PathState.kt",
    "chars": 10614,
    "preview": "package ovh.plrapps.mapcompose.ui.state\n\nimport androidx.compose.runtime.derivedStateOf\nimport androidx.compose.runtime."
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/ui/state/TileCanvasState.kt",
    "chars": 21534,
    "preview": "package ovh.plrapps.mapcompose.ui.state\n\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.ge"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/ui/state/ZoomPanRotateState.kt",
    "chars": 25708,
    "preview": "package ovh.plrapps.mapcompose.ui.state\n\nimport androidx.compose.animation.core.*\nimport androidx.compose.runtime.*\nimpo"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/ui/state/markers/MarkerRenderState.kt",
    "chars": 7092,
    "preview": "package ovh.plrapps.mapcompose.ui.state.markers\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runt"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/ui/state/markers/MarkerState.kt",
    "chars": 7769,
    "preview": "package ovh.plrapps.mapcompose.ui.state.markers\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.g"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/ui/state/markers/model/ClusterClickBehavior.kt",
    "chars": 435,
    "preview": "package ovh.plrapps.mapcompose.ui.state.markers.model\n\ninternal sealed interface ClusterClickBehavior\ninternal data obje"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/ui/state/markers/model/MarkerData.kt",
    "chars": 3230,
    "preview": "package ovh.plrapps.mapcompose.ui.state.markers.model\n\nimport androidx.compose.runtime.Composable\nimport androidx.compos"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/ui/state/markers/model/MarkerType.kt",
    "chars": 265,
    "preview": "package ovh.plrapps.mapcompose.ui.state.markers.model\n\ninternal sealed interface MarkerType {\n    data object Marker : M"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/ui/state/markers/model/RenderingStrategy.kt",
    "chars": 282,
    "preview": "package ovh.plrapps.mapcompose.ui.state.markers.model\n\n\nsealed interface RenderingStrategy {\n    data object Default : R"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/ui/view/TileCanvas.kt",
    "chars": 7147,
    "preview": "package ovh.plrapps.mapcompose.ui.view\n\nimport android.graphics.Paint\nimport android.graphics.Rect\nimport android.graphi"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/utils/AnimUtils.kt",
    "chars": 273,
    "preview": "package ovh.plrapps.mapcompose.utils\n\n/**\n * Calculates a number between two numbers at a specific increment.\n */\nfun le"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/utils/ApiUtils.kt",
    "chars": 311,
    "preview": "package ovh.plrapps.mapcompose.utils\n\nimport kotlinx.coroutines.delay\n\ninternal suspend fun withRetry(maxRetry: Int, int"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/utils/BoundingBoxUtils.kt",
    "chars": 857,
    "preview": "package ovh.plrapps.mapcompose.utils\n\nimport ovh.plrapps.mapcompose.api.BoundingBox\n\ninternal fun BoundingBox.scaleAxis("
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/utils/Collections.kt",
    "chars": 333,
    "preview": "package ovh.plrapps.mapcompose.utils\n\nfun <T> MutableCollection<T>.removeFirst(predicate: (T) -> Boolean): Boolean {\n   "
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/utils/Dp.kt",
    "chars": 156,
    "preview": "package ovh.plrapps.mapcompose.utils\n\nimport android.content.res.Resources\n\nfun dpToPx(dp: Float): Float = dp * Resource"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/utils/Flow.kt",
    "chars": 876,
    "preview": "package ovh.plrapps.mapcompose.utils\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.channels.Channe"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/utils/Geometry.kt",
    "chars": 1737,
    "preview": "package ovh.plrapps.mapcompose.utils\n\nimport kotlin.math.hypot\n\ninternal fun getDistance(x: Double, y: Double, x1: Doubl"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/utils/Point.kt",
    "chars": 85,
    "preview": "package ovh.plrapps.mapcompose.utils\n\ndata class Point(val x: Double, val y: Double)\n"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/utils/RotationUtils.kt",
    "chars": 1693,
    "preview": "package ovh.plrapps.mapcompose.utils\n\nimport kotlin.math.cos\nimport kotlin.math.sin\n\ntypealias AngleDegree = Float\ntypea"
  },
  {
    "path": "mapcompose/src/main/java/ovh/plrapps/mapcompose/utils/VisibleAreaUtils.kt",
    "chars": 3247,
    "preview": "package ovh.plrapps.mapcompose.utils\n\nimport ovh.plrapps.mapcompose.api.VisibleArea\nimport kotlin.math.abs\nimport kotlin"
  },
  {
    "path": "mapcompose/src/test/java/ovh/plrapps/mapcompose/core/TileCollectorTest.kt",
    "chars": 3984,
    "preview": "package ovh.plrapps.mapcompose.core\n\nimport android.graphics.Bitmap\nimport android.graphics.BitmapFactory\nimport android"
  },
  {
    "path": "mapcompose/src/test/java/ovh/plrapps/mapcompose/core/VisibleTilesResolverTest.kt",
    "chars": 17768,
    "preview": "package ovh.plrapps.mapcompose.core\n\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertTrue\nimport org."
  },
  {
    "path": "mapcompose/src/test/java/ovh/plrapps/mapcompose/state/TileCanvasStateTest.kt",
    "chars": 5488,
    "preview": "@file:OptIn(ExperimentalCoroutinesApi::class)\n\npackage ovh.plrapps.mapcompose.state\n\nimport android.os.Build\nimport kotl"
  },
  {
    "path": "mapcompose/src/test/java/ovh/plrapps/mapcompose/ui/paths/PathComposerTest.kt",
    "chars": 2306,
    "preview": "package ovh.plrapps.mapcompose.ui.paths\n\nimport androidx.compose.ui.unit.Density\nimport androidx.compose.ui.unit.dp\nimpo"
  },
  {
    "path": "mapcompose/src/test/java/ovh/plrapps/mapcompose/utils/GeometryTest.kt",
    "chars": 620,
    "preview": "package ovh.plrapps.mapcompose.utils\n\nimport junit.framework.TestCase.assertEquals\nimport org.junit.Test\n\nclass Geometry"
  },
  {
    "path": "mapcompose/src/test/java/ovh/plrapps/mapcompose/utils/VisibleAreaUtilsTest.kt",
    "chars": 2398,
    "preview": "package ovh.plrapps.mapcompose.utils\n\nimport junit.framework.TestCase.assertFalse\nimport junit.framework.TestCase.assert"
  },
  {
    "path": "settings.gradle",
    "chars": 398,
    "preview": "plugins {\n    id 'org.gradle.toolchains.foojay-resolver-convention' version '1.0.0'\n}\ndependencyResolutionManagement {\n "
  },
  {
    "path": "testapp/.gitignore",
    "chars": 6,
    "preview": "/build"
  },
  {
    "path": "testapp/build.gradle",
    "chars": 2003,
    "preview": "import org.jetbrains.kotlin.gradle.dsl.JvmTarget\n\nplugins {\n    id 'com.android.application'\n    id 'kotlin-android'\n   "
  },
  {
    "path": "testapp/proguard-rules.pro",
    "chars": 750,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "testapp/src/main/AndroidManifest.xml",
    "chars": 848,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <appli"
  },
  {
    "path": "testapp/src/main/java/ovh/plrapps/mapcompose/testapp/MainActivity.kt",
    "chars": 615,
    "preview": "package ovh.plrapps.mapcompose.testapp\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport andro"
  },
  {
    "path": "testapp/src/main/java/ovh/plrapps/mapcompose/testapp/core/ui/MapComposeTestApp.kt",
    "chars": 1279,
    "preview": "package ovh.plrapps.mapcompose.testapp.core.ui\n\nimport androidx.compose.foundation.lazy.rememberLazyListState\nimport and"
  },
  {
    "path": "testapp/src/main/java/ovh/plrapps/mapcompose/testapp/core/ui/nav/NavDestinations.kt",
    "chars": 301,
    "preview": "package ovh.plrapps.mapcompose.testapp.core.ui.nav\n\nimport androidx.annotation.StringRes\nimport ovh.plrapps.mapcompose.t"
  },
  {
    "path": "testapp/src/main/java/ovh/plrapps/mapcompose/testapp/core/ui/theme/Color.kt",
    "chars": 10914,
    "preview": "package ovh.plrapps.mapcompose.testapp.core.ui.theme\n\nimport androidx.compose.ui.graphics.Color\n\nval primaryLight = Colo"
  },
  {
    "path": "testapp/src/main/java/ovh/plrapps/mapcompose/testapp/core/ui/theme/Theme.kt",
    "chars": 12056,
    "preview": "package ovh.plrapps.mapcompose.testapp.core.ui.theme\n\nimport android.os.Build\nimport androidx.compose.foundation.isSyste"
  },
  {
    "path": "testapp/src/main/java/ovh/plrapps/mapcompose/testapp/core/ui/theme/Type.kt",
    "chars": 133,
    "preview": "package ovh.plrapps.mapcompose.testapp.core.ui.theme\n\nimport androidx.compose.material3.Typography\n\nval AppTypography = "
  },
  {
    "path": "testapp/src/main/java/ovh/plrapps/mapcompose/testapp/features/clustering/MarkerClusteringUi.kt",
    "chars": 978,
    "preview": "@file:OptIn(ExperimentalMaterial3Api::class)\n\npackage ovh.plrapps.mapcompose.testapp.features.clustering\n\nimport android"
  },
  {
    "path": "testapp/src/main/java/ovh/plrapps/mapcompose/testapp/features/clustering/MarkersClusteringViewModel.kt",
    "chars": 3648,
    "preview": "package ovh.plrapps.mapcompose.testapp.features.clustering\n\nimport android.app.Application\nimport android.content.Contex"
  },
  {
    "path": "testapp/src/main/java/ovh/plrapps/mapcompose/testapp/features/home/Home.kt",
    "chars": 1825,
    "preview": "@file:OptIn(ExperimentalMaterial3Api::class)\n\npackage ovh.plrapps.mapcompose.testapp.features.home\n\nimport androidx.comp"
  },
  {
    "path": "testapp/src/main/java/ovh/plrapps/mapcompose/testapp/features/layerswitch/LayerSwitchTest.kt",
    "chars": 967,
    "preview": "@file:OptIn(ExperimentalMaterial3Api::class)\n\npackage ovh.plrapps.mapcompose.testapp.features.layerswitch\n\nimport androi"
  },
  {
    "path": "testapp/src/main/java/ovh/plrapps/mapcompose/testapp/features/layerswitch/LayerSwitchViewModel.kt",
    "chars": 2175,
    "preview": "package ovh.plrapps.mapcompose.testapp.features.layerswitch\n\nimport android.app.Application\nimport android.content.Conte"
  },
  {
    "path": "testapp/src/main/java/ovh/plrapps/mapcompose/testapp/utils/Random.kt",
    "chars": 227,
    "preview": "package ovh.plrapps.mapcompose.testapp.utils\n\nimport kotlin.random.Random.Default.nextDouble\n\nfun randomDouble(center: D"
  },
  {
    "path": "testapp/src/main/res/drawable/ic_launcher_background.xml",
    "chars": 5606,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "testapp/src/main/res/drawable/map_marker.xml",
    "chars": 435,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:height=\"24dp\"\n        android:width=\""
  },
  {
    "path": "testapp/src/main/res/drawable-v24/ic_launcher_foreground.xml",
    "chars": 1702,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    "
  },
  {
    "path": "testapp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "chars": 272,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <b"
  },
  {
    "path": "testapp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "chars": 272,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <b"
  },
  {
    "path": "testapp/src/main/res/values/colors.xml",
    "chars": 378,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"purple_200\">#FFBB86FC</color>\n    <color name=\"purpl"
  },
  {
    "path": "testapp/src/main/res/values/strings.xml",
    "chars": 221,
    "preview": "<resources>\n    <string name=\"app_name\">MapCompose Test App</string>\n    <string name=\"layers_switch_test\">Layers switch"
  },
  {
    "path": "testapp/src/main/res/values/themes.xml",
    "chars": 155,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"Theme.MyApplication\" parent=\"android:Theme.Material"
  },
  {
    "path": "testapp/src/test/java/ovh/plrapps/mapcompose/testapp/ExampleUnitTest.kt",
    "chars": 354,
    "preview": "package ovh.plrapps.mapcompose.testapp\n\nimport org.junit.Test\n\nimport org.junit.Assert.*\n\n/**\n * Example local unit test"
  }
]

// ... and 1 more files (download for full content)

About this extraction

This page contains the full source code of the p-lr/MapCompose GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 163 files (653.9 KB), approximately 198.1k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!